Skip to content

Commit ada6303

Browse files
authored
Merge pull request #225 from laravel/refactor/test_cleaner
Streamline ToolResult assertions in tests
2 parents 1d3fbfe + d7b7f14 commit ada6303

11 files changed

+300
-340
lines changed

tests/Feature/Mcp/Tools/ApplicationInfoTest.php

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Laravel\Boost\Install\GuidelineAssist;
66
use Laravel\Boost\Mcp\Tools\ApplicationInfo;
7-
use Laravel\Mcp\Server\Tools\ToolResult;
87
use Laravel\Roster\Enums\Packages;
98
use Laravel\Roster\Package;
109
use Laravel\Roster\PackageCollection;
@@ -28,26 +27,29 @@
2827
$tool = new ApplicationInfo($roster, $guidelineAssist);
2928
$result = $tool->handle([]);
3029

31-
expect($result)->toBeInstanceOf(ToolResult::class);
32-
33-
$data = $result->toArray();
34-
expect($data['isError'])->toBeFalse();
35-
36-
$content = json_decode($data['content'][0]['text'], true);
37-
expect($content['php_version'])->toBe(PHP_VERSION);
38-
expect($content['laravel_version'])->toBe(app()->version());
39-
expect($content['database_engine'])->toBe(config('database.default'));
40-
expect($content['packages'])->toHaveCount(2);
41-
expect($content['packages'][0]['roster_name'])->toBe('LARAVEL');
42-
expect($content['packages'][0]['package_name'])->toBe('laravel/framework');
43-
expect($content['packages'][0]['version'])->toBe('11.0.0');
44-
expect($content['packages'][1]['roster_name'])->toBe('PEST');
45-
expect($content['packages'][1]['package_name'])->toBe('pestphp/pest');
46-
expect($content['packages'][1]['version'])->toBe('2.0.0');
47-
expect($content['models'])->toBeArray();
48-
expect($content['models'])->toHaveCount(2);
49-
expect($content['models'])->toContain('App\\Models\\User');
50-
expect($content['models'])->toContain('App\\Models\\Post');
30+
expect($result)->isToolResult()
31+
->toolHasNoError()
32+
->toolJsonContentToMatchArray([
33+
'php_version' => PHP_VERSION,
34+
'laravel_version' => app()->version(),
35+
'database_engine' => config('database.default'),
36+
'packages' => [
37+
[
38+
'roster_name' => 'LARAVEL',
39+
'package_name' => 'laravel/framework',
40+
'version' => '11.0.0',
41+
],
42+
[
43+
'roster_name' => 'PEST',
44+
'package_name' => 'pestphp/pest',
45+
'version' => '2.0.0',
46+
],
47+
],
48+
'models' => [
49+
'App\\Models\\User',
50+
'App\\Models\\Post',
51+
],
52+
]);
5153
});
5254

5355
test('it returns application info with no packages', function () {
@@ -60,17 +62,13 @@
6062
$tool = new ApplicationInfo($roster, $guidelineAssist);
6163
$result = $tool->handle([]);
6264

63-
expect($result)->toBeInstanceOf(ToolResult::class);
64-
expect($result)->toBeInstanceOf(ToolResult::class);
65-
66-
$data = $result->toArray();
67-
expect($data['isError'])->toBeFalse();
68-
69-
$content = json_decode($data['content'][0]['text'], true);
70-
expect($content['php_version'])->toBe(PHP_VERSION);
71-
expect($content['laravel_version'])->toBe(app()->version());
72-
expect($content['database_engine'])->toBe(config('database.default'));
73-
expect($content['packages'])->toHaveCount(0);
74-
expect($content['models'])->toBeArray();
75-
expect($content['models'])->toHaveCount(0);
65+
expect($result)->isToolResult()
66+
->toolHasNoError()
67+
->toolJsonContentToMatchArray([
68+
'php_version' => PHP_VERSION,
69+
'laravel_version' => app()->version(),
70+
'database_engine' => config('database.default'),
71+
'packages' => [],
72+
'models' => [],
73+
]);
7674
});

tests/Feature/Mcp/Tools/BrowserLogsTest.php

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use Laravel\Boost\Mcp\Tools\BrowserLogs;
1111
use Laravel\Boost\Middleware\InjectBoost;
1212
use Laravel\Boost\Services\BrowserLogger;
13-
use Laravel\Mcp\Server\Tools\ToolResult;
1413

1514
beforeEach(function () {
1615
// Clean up any existing browser.log file before each test
@@ -36,47 +35,38 @@
3635
$tool = new BrowserLogs;
3736
$result = $tool->handle(['entries' => 2]);
3837

39-
expect($result)->toBeInstanceOf(ToolResult::class);
38+
expect($result)->isToolResult()
39+
->toolHasNoError()
40+
->toolTextContains('browser.WARNING: Warning message', 'browser.ERROR: JavaScript error occurred')
41+
->toolTextDoesNotContain('browser.DEBUG: console log message');
4042

4143
$data = $result->toArray();
42-
expect($data['isError'])->toBeFalse();
4344
expect($data['content'][0]['type'])->toBe('text');
44-
45-
$text = $data['content'][0]['text'];
46-
expect($text)->toContain('browser.WARNING: Warning message');
47-
expect($text)->toContain('browser.ERROR: JavaScript error occurred');
48-
expect($text)->not->toContain('browser.DEBUG: console log message');
4945
});
5046

5147
test('it returns error when entries argument is invalid', function () {
5248
$tool = new BrowserLogs;
5349

5450
// Test with zero
5551
$result = $tool->handle(['entries' => 0]);
56-
expect($result)->toBeInstanceOf(ToolResult::class);
57-
58-
$data = $result->toArray();
59-
expect($data['isError'])->toBeTrue();
60-
expect($data['content'][0]['text'])->toBe('The "entries" argument must be greater than 0.');
52+
expect($result)->isToolResult()
53+
->toolHasError()
54+
->toolTextContains('The "entries" argument must be greater than 0.');
6155

6256
// Test with negative
6357
$result = $tool->handle(['entries' => -5]);
64-
expect($result)->toBeInstanceOf(ToolResult::class);
65-
66-
$data = $result->toArray();
67-
expect($data['isError'])->toBeTrue();
68-
expect($data['content'][0]['text'])->toBe('The "entries" argument must be greater than 0.');
58+
expect($result)->isToolResult()
59+
->toolHasError()
60+
->toolTextContains('The "entries" argument must be greater than 0.');
6961
});
7062

7163
test('it returns error when log file does not exist', function () {
7264
$tool = new BrowserLogs;
7365
$result = $tool->handle(['entries' => 10]);
7466

75-
expect($result)->toBeInstanceOf(ToolResult::class);
76-
77-
$data = $result->toArray();
78-
expect($data['isError'])->toBeTrue();
79-
expect($data['content'][0]['text'])->toBe('No log file found, probably means no logs yet.');
67+
expect($result)->isToolResult()
68+
->toolHasError()
69+
->toolTextContains('No log file found, probably means no logs yet.');
8070
});
8171

8272
test('it returns error when log file is empty', function () {
@@ -88,11 +78,9 @@
8878
$tool = new BrowserLogs;
8979
$result = $tool->handle(['entries' => 5]);
9080

91-
expect($result)->toBeInstanceOf(ToolResult::class);
92-
93-
$data = $result->toArray();
94-
expect($data['isError'])->toBeFalse();
95-
expect($data['content'][0]['text'])->toBe('Unable to retrieve log entries, or no logs');
81+
expect($result)->isToolResult()
82+
->toolHasNoError()
83+
->toolTextContains('Unable to retrieve log entries, or no logs');
9684
});
9785

9886
test('@boostJs blade directive renders browser logger script', function () {
@@ -106,11 +94,11 @@
10694

10795
// Test that the script contains expected content
10896
$script = BrowserLogger::getScript();
109-
expect($script)->toContain('browser-logger-active');
110-
expect($script)->toContain('/_boost/browser-logs');
111-
expect($script)->toContain('console.log');
112-
expect($script)->toContain('console.error');
113-
expect($script)->toContain('window.onerror');
97+
expect($script)->toContain('browser-logger-active')
98+
->and($script)->toContain('/_boost/browser-logs')
99+
->and($script)->toContain('console.log')
100+
->and($script)->toContain('console.error')
101+
->and($script)->toContain('window.onerror');
114102
});
115103

116104
test('browser logs endpoint processes logs correctly', function () {
@@ -215,9 +203,10 @@
215203
});
216204

217205
$content = $result->getContent();
218-
expect($content)->toContain('browser-logger-active');
219-
expect($content)->toContain('</head>');
220-
expect(substr_count($content, 'browser-logger-active'))->toBe(1); // Should not inject twice
206+
expect($content)->toContain('browser-logger-active')
207+
->and($content)->toContain('</head>')
208+
// Should not inject twice
209+
->and(substr_count($content, 'browser-logger-active'))->toBe(1);
221210
});
222211

223212
test('InjectBoost middleware does not inject into non-HTML responses', function () {
@@ -233,8 +222,8 @@
233222
});
234223

235224
$content = $result->getContent();
236-
expect($content)->toBe($json);
237-
expect($content)->not->toContain('browser-logger-active');
225+
expect($content)->toBe($json)
226+
->and($content)->not->toContain('browser-logger-active');
238227
});
239228

240229
test('InjectBoost middleware does not inject script twice', function () {
@@ -284,6 +273,6 @@
284273
});
285274

286275
$content = $result->getContent();
287-
expect($content)->toContain('browser-logger-active');
288-
expect($content)->toMatch('/<script[^>]*browser-logger-active[^>]*>.*<\/script>\s*<\/body>/s');
276+
expect($content)->toContain('browser-logger-active')
277+
->and($content)->toMatch('/<script[^>]*browser-logger-active[^>]*>.*<\/script>\s*<\/body>/s');
289278
});

tests/Feature/Mcp/Tools/DatabaseConnectionsTest.php

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
declare(strict_types=1);
44

55
use Laravel\Boost\Mcp\Tools\DatabaseConnections;
6-
use Laravel\Mcp\Server\Tools\ToolResult;
76

87
beforeEach(function () {
98
config()->set('database.default', 'mysql');
@@ -18,16 +17,12 @@
1817
$tool = new DatabaseConnections;
1918
$result = $tool->handle([]);
2019

21-
expect($result)->toBeInstanceOf(ToolResult::class);
22-
$data = $result->toArray();
23-
expect($data['isError'])->toBe(false);
24-
25-
$content = json_decode($data['content'][0]['text'], true);
26-
expect($content['default_connection'])->toBe('mysql');
27-
expect($content['connections'])->toHaveCount(3);
28-
expect($content['connections'])->toContain('mysql');
29-
expect($content['connections'])->toContain('pgsql');
30-
expect($content['connections'])->toContain('sqlite');
20+
expect($result)->isToolResult()
21+
->toolHasNoError()
22+
->toolJsonContentToMatchArray([
23+
'default_connection' => 'mysql',
24+
'connections' => ['mysql', 'pgsql', 'sqlite'],
25+
]);
3126
});
3227

3328
test('it returns empty connections when none configured', function () {
@@ -36,11 +31,10 @@
3631
$tool = new DatabaseConnections;
3732
$result = $tool->handle([]);
3833

39-
expect($result)->toBeInstanceOf(ToolResult::class);
40-
$data = $result->toArray();
41-
expect($data['isError'])->toBe(false);
42-
43-
$content = json_decode($data['content'][0]['text'], true);
44-
expect($content['default_connection'])->toBe('mysql');
45-
expect($content['connections'])->toHaveCount(0);
34+
expect($result)->isToolResult()
35+
->toolHasNoError()
36+
->toolJsonContentToMatchArray([
37+
'default_connection' => 'mysql',
38+
'connections' => [],
39+
]);
4640
});

tests/Feature/Mcp/Tools/DatabaseSchemaTest.php

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -39,35 +39,24 @@
3939
$tool = new DatabaseSchema;
4040
$response = $tool->handle([]);
4141

42-
$responseArray = $response->toArray();
43-
expect($responseArray['isError'])->toBeFalse();
44-
45-
$schemaArray = json_decode($responseArray['content'][0]['text'], true);
46-
47-
expect($schemaArray)->toHaveKey('engine');
48-
expect($schemaArray['engine'])->toBe('sqlite');
49-
50-
expect($schemaArray)->toHaveKey('tables');
51-
expect($schemaArray['tables'])->toHaveKey('examples');
52-
53-
$exampleTable = $schemaArray['tables']['examples'];
54-
expect($exampleTable)->toHaveKey('columns');
55-
expect($exampleTable['columns'])->toHaveKey('id');
56-
expect($exampleTable['columns'])->toHaveKey('name');
57-
58-
expect($exampleTable['columns']['id']['type'])->toBe('integer');
59-
expect($exampleTable['columns']['name']['type'])->toBe('varchar');
60-
61-
expect($exampleTable)->toHaveKey('indexes');
62-
expect($exampleTable)->toHaveKey('foreign_keys');
63-
expect($exampleTable)->toHaveKey('triggers');
64-
expect($exampleTable)->toHaveKey('check_constraints');
65-
66-
expect($schemaArray)->toHaveKey('global');
67-
expect($schemaArray['global'])->toHaveKey('views');
68-
expect($schemaArray['global'])->toHaveKey('stored_procedures');
69-
expect($schemaArray['global'])->toHaveKey('functions');
70-
expect($schemaArray['global'])->toHaveKey('sequences');
42+
expect($response)->isToolResult()
43+
->toolHasNoError()
44+
->toolJsonContentToMatchArray([
45+
'engine' => 'sqlite',
46+
])
47+
->toolJsonContent(function ($schemaArray) {
48+
expect($schemaArray)->toHaveKey('tables')
49+
->and($schemaArray['tables'])->toHaveKey('examples');
50+
51+
$exampleTable = $schemaArray['tables']['examples'];
52+
expect($exampleTable)->toHaveKeys(['columns', 'indexes', 'foreign_keys', 'triggers', 'check_constraints'])
53+
->and($exampleTable['columns'])->toHaveKeys(['id', 'name'])
54+
->and($exampleTable['columns']['id']['type'])->toBe('integer')
55+
->and($exampleTable['columns']['name']['type'])->toBe('varchar')
56+
->and($schemaArray)->toHaveKey('global')
57+
->and($schemaArray['global'])->toHaveKeys(['views', 'stored_procedures', 'functions', 'sequences']);
58+
59+
});
7160
});
7261

7362
test('it filters tables by name', function () {
@@ -81,17 +70,19 @@
8170

8271
// Test filtering for 'example'
8372
$response = $tool->handle(['filter' => 'example']);
84-
$responseArray = $response->toArray();
85-
$schemaArray = json_decode($responseArray['content'][0]['text'], true);
86-
87-
expect($schemaArray['tables'])->toHaveKey('examples');
88-
expect($schemaArray['tables'])->not->toHaveKey('users');
73+
expect($response)->isToolResult()
74+
->toolHasNoError()
75+
->toolJsonContent(function ($schemaArray) {
76+
expect($schemaArray['tables'])->toHaveKey('examples')
77+
->and($schemaArray['tables'])->not->toHaveKey('users');
78+
});
8979

9080
// Test filtering for 'user'
9181
$response = $tool->handle(['filter' => 'user']);
92-
$responseArray = $response->toArray();
93-
$schemaArray = json_decode($responseArray['content'][0]['text'], true);
94-
95-
expect($schemaArray['tables'])->toHaveKey('users');
96-
expect($schemaArray['tables'])->not->toHaveKey('examples');
82+
expect($response)->isToolResult()
83+
->toolHasNoError()
84+
->toolJsonContent(function ($schemaArray) {
85+
expect($schemaArray['tables'])->toHaveKey('users')
86+
->and($schemaArray['tables'])->not->toHaveKey('examples');
87+
});
9788
});

0 commit comments

Comments
 (0)