Skip to content

Commit d7a8e20

Browse files
authored
Import AdditionalAssertions to base test case when generating Pest tests (#733)
1 parent a748d8a commit d7a8e20

19 files changed

+98
-55
lines changed

src/Generators/PestTestGenerator.php

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,7 @@ protected function buildTestCases(Controller $controller): string
209209
$class = $this->buildFormRequestName($controller, $name);
210210
$test_case = $this->buildFormRequestTestCase($controller->fullyQualifiedClassName(), $name, config('blueprint.namespace') . '\\Http\\Requests\\' . $class) . PHP_EOL . PHP_EOL . $test_case;
211211

212-
$this->addImport($controller, 'JMac\\Testing\\Traits\AdditionalAssertions');
213-
$this->addTrait($controller, 'AdditionalAssertions');
212+
$this->importAdditionalAssertionsToBaseTest();
214213

215214
if ($statement->data()) {
216215
foreach ($statement->data() as $data) {
@@ -678,17 +677,35 @@ private function buildLines($lines): string
678677
return str_pad(' ', 4) . implode(PHP_EOL . str_pad(' ', 4), $lines);
679678
}
680679

681-
protected function buildTraits(BlueprintModel $model): string
680+
private function importAdditionalAssertionsToBaseTest(): void
682681
{
683-
if (empty($this->traits[$model->name()])) {
684-
return '';
682+
$path = 'tests/TestCase.php';
683+
$fullPath = base_path($path);
684+
685+
if (!$this->filesystem->exists($fullPath)) {
686+
return;
685687
}
686688

687-
$traits = collect($this->traits[$model->name()])
688-
->unique()
689-
->sort()
690-
->implode('::class)->use(');
689+
$content = $this->filesystem->get($fullPath);
690+
691+
if (Str::contains($content, 'use JMac\\Testing\\Traits\\AdditionalAssertions;')) {
692+
return;
693+
}
691694

692-
return "pest()->use({$traits}::class);";
695+
$updatedContent = preg_replace(
696+
[
697+
'/as BaseTestCase;/',
698+
'/abstract class TestCase extends BaseTestCase\s*{/',
699+
],
700+
[
701+
'as BaseTestCase;' . PHP_EOL . 'use JMac\\Testing\\Traits\\AdditionalAssertions;',
702+
'abstract class TestCase extends BaseTestCase' . PHP_EOL . '{' . PHP_EOL . ' use AdditionalAssertions;',
703+
],
704+
$content
705+
);
706+
707+
$this->output['updated'][] = $path;
708+
709+
$this->filesystem->put($fullPath, $updatedContent);
693710
}
694711
}

tests/Feature/Generators/PestTestGeneratorTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,55 @@ public function output_generates_tests_with_singular_route_names(): void
213213
$this->assertEquals(['created' => [$path]], $this->subject->output($tree));
214214
}
215215

216+
#[Test]
217+
public function output_imports_additional_assertions_to_base_test(): void
218+
{
219+
$definition = 'drafts/api-resource-nested.yaml';
220+
$path = 'tests/Feature/Http/Controllers/CommentControllerTest.php';
221+
$test = 'tests/pest/api-resource-nested.php';
222+
$testCasePath = base_path('tests/TestCase.php');
223+
224+
$this->filesystem->expects('stub')
225+
->with('pest.test.class.stub')
226+
->andReturn($this->stub('pest.test.class.stub'));
227+
228+
$this->filesystem->expects('stub')
229+
->with('pest.test.case.stub')
230+
->andReturn($this->stub('pest.test.case.stub'));
231+
232+
$dirname = dirname($path);
233+
$this->filesystem->expects('exists')
234+
->with($dirname)
235+
->andReturnFalse();
236+
237+
$this->filesystem->expects('makeDirectory')
238+
->with($dirname, 0755, true);
239+
240+
$this->filesystem->expects('put')
241+
->with($path, $this->fixture($test));
242+
243+
$this->filesystem->expects('exists')
244+
->with($testCasePath)
245+
->twice()
246+
->andReturnTrue();
247+
248+
$this->filesystem->expects('get')
249+
->twice()
250+
->with($testCasePath)
251+
->andReturn(
252+
$this->fixture('tests/pest/test-case.php'),
253+
$this->fixture('tests/pest/test-case-with-additional-assertions.php'),
254+
);
255+
256+
$this->filesystem->expects('put')
257+
->with($testCasePath, $this->fixture('tests/pest/test-case-with-additional-assertions.php'));
258+
259+
$tokens = $this->blueprint->parse($this->fixture($definition));
260+
$tree = $this->blueprint->analyze($tokens);
261+
262+
$this->assertEquals(['created' => [$path], 'updated' => ['tests/TestCase.php']], $this->subject->output($tree));
263+
}
264+
216265
public static function controllerTreeDataProvider(): array
217266
{
218267
return [

tests/fixtures/tests/pest/api-resource-nested.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55
use App\Models\Comment;
66
use App\Models\Post;
77
use App\Models\User;
8-
use JMac\Testing\Traits\AdditionalAssertions;
98
use function Pest\Faker\fake;
109
use function Pest\Laravel\assertModelMissing;
1110
use function Pest\Laravel\delete;
1211
use function Pest\Laravel\get;
1312
use function Pest\Laravel\post;
1413
use function Pest\Laravel\put;
1514

16-
pest()->use(AdditionalAssertions::class);
17-
1815
test('index behaves as expected', function (): void {
1916
$post = Post::factory()->create();
2017
$comments = Comment::factory()->count(3)->create();

tests/fixtures/tests/pest/api-shorthand-validation.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55
use App\Models\Certificate;
66
use App\Models\CertificateType;
77
use Illuminate\Support\Carbon;
8-
use JMac\Testing\Traits\AdditionalAssertions;
98
use function Pest\Faker\fake;
109
use function Pest\Laravel\assertModelMissing;
1110
use function Pest\Laravel\delete;
1211
use function Pest\Laravel\get;
1312
use function Pest\Laravel\post;
1413
use function Pest\Laravel\put;
1514

16-
pest()->use(AdditionalAssertions::class);
17-
1815
test('index behaves as expected', function (): void {
1916
$certificates = Certificate::factory()->count(3)->create();
2017

tests/fixtures/tests/pest/call-to-a-member-function-columns-on-null-Api-PaymentControllerTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,10 @@
88
use App\Models\User;
99
use Illuminate\Support\Facades\Event;
1010
use Illuminate\Support\Facades\Mail;
11-
use JMac\Testing\Traits\AdditionalAssertions;
1211
use function Pest\Faker\fake;
1312
use function Pest\Laravel\get;
1413
use function Pest\Laravel\post;
1514

16-
pest()->use(AdditionalAssertions::class);
17-
1815
test('store uses form request validation')
1916
->assertActionUsesFormRequest(
2017
\App\Http\Controllers\Api\PaymentController::class,

tests/fixtures/tests/pest/call-to-a-member-function-columns-on-null-PaymentControllerTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,10 @@
88
use App\Models\User;
99
use Illuminate\Support\Facades\Event;
1010
use Illuminate\Support\Facades\Mail;
11-
use JMac\Testing\Traits\AdditionalAssertions;
1211
use function Pest\Faker\fake;
1312
use function Pest\Laravel\get;
1413
use function Pest\Laravel\post;
1514

16-
pest()->use(AdditionalAssertions::class);
17-
1815
test('create displays view', function (): void {
1916
$response = get(route('payments.create'));
2017

tests/fixtures/tests/pest/certificate-pascal-case-example.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55
use App\Models\Certificate;
66
use App\Models\CertificateType;
77
use Illuminate\Support\Carbon;
8-
use JMac\Testing\Traits\AdditionalAssertions;
98
use function Pest\Faker\fake;
109
use function Pest\Laravel\assertModelMissing;
1110
use function Pest\Laravel\delete;
1211
use function Pest\Laravel\get;
1312
use function Pest\Laravel\post;
1413
use function Pest\Laravel\put;
1514

16-
pest()->use(AdditionalAssertions::class);
17-
1815
test('index behaves as expected', function (): void {
1916
$certificates = Certificate::factory()->count(3)->create();
2017

tests/fixtures/tests/pest/certificate-type-pascal-case-example.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
namespace Tests\Feature\Http\Controllers;
44

55
use App\Models\CertificateType;
6-
use JMac\Testing\Traits\AdditionalAssertions;
76
use function Pest\Faker\fake;
87
use function Pest\Laravel\assertModelMissing;
98
use function Pest\Laravel\delete;
109
use function Pest\Laravel\get;
1110
use function Pest\Laravel\post;
1211
use function Pest\Laravel\put;
1312

14-
pest()->use(AdditionalAssertions::class);
15-
1613
test('index behaves as expected', function (): void {
1714
$certificateTypes = CertificateType::factory()->count(3)->create();
1815

tests/fixtures/tests/pest/date-formats.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44

55
use App\Models\Date;
66
use Illuminate\Support\Carbon;
7-
use JMac\Testing\Traits\AdditionalAssertions;
87
use function Pest\Faker\fake;
98
use function Pest\Laravel\assertModelMissing;
109
use function Pest\Laravel\delete;
1110
use function Pest\Laravel\get;
1211
use function Pest\Laravel\post;
1312
use function Pest\Laravel\put;
1413

15-
pest()->use(AdditionalAssertions::class);
16-
1714
test('index displays view', function (): void {
1815
$dates = Date::factory()->count(3)->create();
1916

tests/fixtures/tests/pest/full-crud-example.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
namespace Tests\Feature\Http\Controllers;
44

55
use App\Models\Post;
6-
use JMac\Testing\Traits\AdditionalAssertions;
76
use function Pest\Faker\fake;
87
use function Pest\Laravel\assertModelMissing;
98
use function Pest\Laravel\delete;
109
use function Pest\Laravel\get;
1110
use function Pest\Laravel\post;
1211
use function Pest\Laravel\put;
1312

14-
pest()->use(AdditionalAssertions::class);
15-
1613
test('index displays view', function (): void {
1714
$posts = Post::factory()->count(3)->create();
1815

0 commit comments

Comments
 (0)