From 0ee1f4f2cbb5efb1e0846cf07217f9c4208782d4 Mon Sep 17 00:00:00 2001 From: 128na Date: Tue, 2 Jun 2026 22:58:53 +0900 Subject: [PATCH 1/8] Feature: Add Tests for Extract Action --- .../Actions/Extract/ExtractActionTest.php | 112 ++++++++++++++++++ .../Extract/Japan/ExtractContentsTest.php | 28 +++++ .../Extract/Japan/ExtractLastModifiedTest.php | 26 ++++ .../Extract/Portal/ExtractContentsTest.php | 57 +++++++++ .../Extract/Twitrans/ExtractContentsTest.php | 28 +++++ .../Twitrans/ExtractLastModifiedTest.php | 26 ++++ 6 files changed, 277 insertions(+) create mode 100644 tests/Feature/Actions/Extract/ExtractActionTest.php create mode 100644 tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php create mode 100644 tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php create mode 100644 tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php create mode 100644 tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php create mode 100644 tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php diff --git a/tests/Feature/Actions/Extract/ExtractActionTest.php b/tests/Feature/Actions/Extract/ExtractActionTest.php new file mode 100644 index 0000000..6aa27dc --- /dev/null +++ b/tests/Feature/Actions/Extract/ExtractActionTest.php @@ -0,0 +1,112 @@ + false, 'portal' => false, 'twitrans' => false]; + + $this->app->bind(Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->japan = true; + } + }; + }); + + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->portal = true; + } + }; + }); + + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->twitrans = true; + } + }; + }); + + $action = app(ExtractAction::class); + $action(null, new NullLogger); + + $this->assertTrue($state->japan); + $this->assertTrue($state->portal); + $this->assertTrue($state->twitrans); + } + + public function test_invokes_specific_handler_when_site_provided(): void + { + $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; + + $this->app->bind(Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->japan = true; + } + }; + }); + + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->portal = true; + } + }; + }); + + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, function () use ($state) { + return new class($state) implements HandlerInterface + { + public function __construct(private object $state) {} + + public function __invoke(LoggerInterface $logger): void + { + $this->state->twitrans = true; + } + }; + }); + + $action = app(ExtractAction::class); + $action(SiteName::Japan, new NullLogger); + + $this->assertTrue($state->japan); + $this->assertFalse($state->portal); + $this->assertFalse($state->twitrans); + } +} diff --git a/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php new file mode 100644 index 0000000..daaec32 --- /dev/null +++ b/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php @@ -0,0 +1,28 @@ +make([ + 'url' => 'https://japanese.simutrans.com/index.php?addon128%2fTest', + 'html' => 'Awesome Addon - Simutrans日本語化・解説
This is an awesome addon description.
', + ]); + + $action = new ExtractContents; + $result = $action($rawPage); + + $this->assertSame('Awesome Addon', $result['title']); + $this->assertSame('This is an awesome addon description.', $result['text']); + $this->assertEquals([PakSlug::Pak128], $result['paks']); + } +} diff --git a/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php b/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php new file mode 100644 index 0000000..623d228 --- /dev/null +++ b/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php @@ -0,0 +1,26 @@ +make([ + 'html' => '
Last-modified: 2023-05-15 14:30:00 (月)
', + ]); + + $action = new ExtractLastModified; + $date = $action($rawPage); + + $this->assertInstanceOf(CarbonImmutable::class, $date); + $this->assertSame('2023-05-15 14:30:00', $date->format('Y-m-d H:i:s')); + } +} diff --git a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php new file mode 100644 index 0000000..ddf0c40 --- /dev/null +++ b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php @@ -0,0 +1,57 @@ + 'Portal Addon Title', + 'post_type' => ArticlePostType::AddonPost, + 'contents' => [ + 'description' => 'A nice addon.', + 'thanks' => 'Thanks to the author.', + 'license' => 'MIT', + 'file' => 123, + ], + ]); + + $tag = new Tag(['name' => 'Train', 'description' => 'A train addon']); + $article->setRelation('tags', collect([$tag])); + + $category = new Category(['slug' => '128-japan']); + $article->setRelation('categories', collect([$category])); + + $mockFindFileInfo = Mockery::mock(FindFileInfo::class); + $mockFindFileInfo->shouldReceive('__invoke') + ->with(123) + ->andReturn(new FileInfo(['data' => 'file content info'])); + + $action = new ExtractContents($mockFindFileInfo); + $result = $action($article); + + $this->assertSame('Portal Addon Title', $result['title']); + $this->assertStringContainsString('A nice addon.', $result['text']); + $this->assertStringContainsString('Thanks to the author.', $result['text']); + $this->assertStringContainsString('MIT', $result['text']); + $this->assertStringContainsString('Train', $result['text']); + $this->assertStringContainsString('A train addon', $result['text']); + $this->assertStringContainsString('file content info', $result['text']); + + $this->assertEquals([PakSlug::Pak128Jp], $result['paks']); + } +} diff --git a/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php new file mode 100644 index 0000000..730cd51 --- /dev/null +++ b/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php @@ -0,0 +1,28 @@ +make([ + 'url' => 'https://wikiwiki.jp/twitrans/addon/pak128.japan/test', + 'html' => 'Twitrans Addon - Simutrans的な実験室 Wiki*
This is a twitrans addon description.
', + ]); + + $action = new ExtractContents; + $result = $action($rawPage); + + $this->assertSame('Twitrans Addon', $result['title']); + $this->assertSame('This is a twitrans addon description.', $result['text']); + $this->assertEquals([PakSlug::Pak128Jp], $result['paks']); + } +} diff --git a/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php b/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php new file mode 100644 index 0000000..c7d116a --- /dev/null +++ b/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php @@ -0,0 +1,26 @@ +make([ + 'html' => '
Last-modified: 2023-11-20 10:00:00 (月)
', + ]); + + $action = new ExtractLastModified; + $date = $action($rawPage); + + $this->assertInstanceOf(CarbonImmutable::class, $date); + $this->assertSame('2023-11-20 10:00:00', $date->format('Y-m-d H:i:s')); + } +} From 2c0b491c1df0131c64e33939be32a4e2ef679238 Mon Sep 17 00:00:00 2001 From: 128na Date: Tue, 2 Jun 2026 22:59:28 +0900 Subject: [PATCH 2/8] Fix Portal ExtractContentsTest to use SQLite for CI as FindFileInfo must remain final --- .../Extract/Portal/ExtractContentsTest.php | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php index ddf0c40..4a08529 100644 --- a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php @@ -12,13 +12,36 @@ use App\Models\Portal\Category; use App\Models\Portal\FileInfo; use App\Models\Portal\Tag; -use Mockery; use Tests\Feature\TestCase; final class ExtractContentsTest extends TestCase { + use \Illuminate\Foundation\Testing\RefreshDatabase; + + protected function setUp(): void + { + parent::setUp(); + + config(['database.connections.portal' => [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]]); + \Illuminate\Support\Facades\Schema::connection('portal')->create('file_infos', function (\Illuminate\Database\Schema\Blueprint $table) { + $table->id(); + $table->integer('attachment_id'); + $table->text('data')->nullable(); + $table->timestamps(); + }); + } + public function test_extracts_title_text_and_pak(): void { + FileInfo::create([ + 'attachment_id' => 123, + 'data' => 'file content info', + ]); + $article = new Article([ 'title' => 'Portal Addon Title', 'post_type' => ArticlePostType::AddonPost, @@ -27,7 +50,7 @@ public function test_extracts_title_text_and_pak(): void 'thanks' => 'Thanks to the author.', 'license' => 'MIT', 'file' => 123, - ], + ] ]); $tag = new Tag(['name' => 'Train', 'description' => 'A train addon']); @@ -36,12 +59,7 @@ public function test_extracts_title_text_and_pak(): void $category = new Category(['slug' => '128-japan']); $article->setRelation('categories', collect([$category])); - $mockFindFileInfo = Mockery::mock(FindFileInfo::class); - $mockFindFileInfo->shouldReceive('__invoke') - ->with(123) - ->andReturn(new FileInfo(['data' => 'file content info'])); - - $action = new ExtractContents($mockFindFileInfo); + $action = new ExtractContents(new FindFileInfo()); $result = $action($article); $this->assertSame('Portal Addon Title', $result['title']); From 887b79fb09e90f7b7e9e2c5001c8167a37958c8b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 2 Jun 2026 14:00:03 +0000 Subject: [PATCH 3/8] [rector] Rector fixes --- .../Actions/Extract/ExtractActionTest.php | 104 ++++++++---------- .../Extract/Japan/ExtractContentsTest.php | 4 +- .../Extract/Japan/ExtractLastModifiedTest.php | 4 +- .../Extract/Portal/ExtractContentsTest.php | 23 ++-- .../Extract/Twitrans/ExtractContentsTest.php | 4 +- .../Twitrans/ExtractLastModifiedTest.php | 4 +- 6 files changed, 67 insertions(+), 76 deletions(-) diff --git a/tests/Feature/Actions/Extract/ExtractActionTest.php b/tests/Feature/Actions/Extract/ExtractActionTest.php index 6aa27dc..672bc05 100644 --- a/tests/Feature/Actions/Extract/ExtractActionTest.php +++ b/tests/Feature/Actions/Extract/ExtractActionTest.php @@ -18,44 +18,38 @@ public function test_invokes_handlers_for_all_sites_when_null_provided(): void { $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; - $this->app->bind(Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->japan = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->japan = true; + } }); - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->portal = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->portal = true; + } }); - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->twitrans = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->twitrans = true; + } }); - $action = app(ExtractAction::class); - $action(null, new NullLogger); + $extractAction = app(ExtractAction::class); + $extractAction(null, new NullLogger); $this->assertTrue($state->japan); $this->assertTrue($state->portal); @@ -66,44 +60,38 @@ public function test_invokes_specific_handler_when_site_provided(): void { $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; - $this->app->bind(Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->japan = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->japan = true; + } }); - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->portal = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->portal = true; + } }); - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, function () use ($state) { - return new class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn () => new readonly class($state) implements HandlerInterface + { + public function __construct(private object $state) {} - public function __invoke(LoggerInterface $logger): void - { - $this->state->twitrans = true; - } - }; + public function __invoke(LoggerInterface $logger): void + { + $this->state->twitrans = true; + } }); - $action = app(ExtractAction::class); - $action(SiteName::Japan, new NullLogger); + $extractAction = app(ExtractAction::class); + $extractAction(SiteName::Japan, new NullLogger); $this->assertTrue($state->japan); $this->assertFalse($state->portal); diff --git a/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php index daaec32..d56c04d 100644 --- a/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Japan/ExtractContentsTest.php @@ -18,8 +18,8 @@ public function test_extracts_title_text_and_pak(): void 'html' => 'Awesome Addon - Simutrans日本語化・解説
This is an awesome addon description.
', ]); - $action = new ExtractContents; - $result = $action($rawPage); + $extractContents = new ExtractContents; + $result = $extractContents($rawPage); $this->assertSame('Awesome Addon', $result['title']); $this->assertSame('This is an awesome addon description.', $result['text']); diff --git a/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php b/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php index 623d228..a4f9b33 100644 --- a/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php +++ b/tests/Feature/Actions/Extract/Japan/ExtractLastModifiedTest.php @@ -17,8 +17,8 @@ public function test_extracts_last_modified_date(): void 'html' => '
Last-modified: 2023-05-15 14:30:00 (月)
', ]); - $action = new ExtractLastModified; - $date = $action($rawPage); + $extractLastModified = new ExtractLastModified; + $date = $extractLastModified($rawPage); $this->assertInstanceOf(CarbonImmutable::class, $date); $this->assertSame('2023-05-15 14:30:00', $date->format('Y-m-d H:i:s')); diff --git a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php index 4a08529..e18e235 100644 --- a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php @@ -12,26 +12,29 @@ use App\Models\Portal\Category; use App\Models\Portal\FileInfo; use App\Models\Portal\Tag; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\Schema; use Tests\Feature\TestCase; final class ExtractContentsTest extends TestCase { - use \Illuminate\Foundation\Testing\RefreshDatabase; + use RefreshDatabase; protected function setUp(): void { parent::setUp(); - + config(['database.connections.portal' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ]]); - \Illuminate\Support\Facades\Schema::connection('portal')->create('file_infos', function (\Illuminate\Database\Schema\Blueprint $table) { - $table->id(); - $table->integer('attachment_id'); - $table->text('data')->nullable(); - $table->timestamps(); + Schema::connection('portal')->create('file_infos', function (Blueprint $blueprint): void { + $blueprint->id(); + $blueprint->integer('attachment_id'); + $blueprint->text('data')->nullable(); + $blueprint->timestamps(); }); } @@ -50,7 +53,7 @@ public function test_extracts_title_text_and_pak(): void 'thanks' => 'Thanks to the author.', 'license' => 'MIT', 'file' => 123, - ] + ], ]); $tag = new Tag(['name' => 'Train', 'description' => 'A train addon']); @@ -59,8 +62,8 @@ public function test_extracts_title_text_and_pak(): void $category = new Category(['slug' => '128-japan']); $article->setRelation('categories', collect([$category])); - $action = new ExtractContents(new FindFileInfo()); - $result = $action($article); + $extractContents = new ExtractContents(new FindFileInfo); + $result = $extractContents($article); $this->assertSame('Portal Addon Title', $result['title']); $this->assertStringContainsString('A nice addon.', $result['text']); diff --git a/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php index 730cd51..affe461 100644 --- a/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Twitrans/ExtractContentsTest.php @@ -18,8 +18,8 @@ public function test_extracts_title_text_and_pak(): void 'html' => 'Twitrans Addon - Simutrans的な実験室 Wiki*
This is a twitrans addon description.
', ]); - $action = new ExtractContents; - $result = $action($rawPage); + $extractContents = new ExtractContents; + $result = $extractContents($rawPage); $this->assertSame('Twitrans Addon', $result['title']); $this->assertSame('This is a twitrans addon description.', $result['text']); diff --git a/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php b/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php index c7d116a..32efa3e 100644 --- a/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php +++ b/tests/Feature/Actions/Extract/Twitrans/ExtractLastModifiedTest.php @@ -17,8 +17,8 @@ public function test_extracts_last_modified_date(): void 'html' => '
Last-modified: 2023-11-20 10:00:00 (月)
', ]); - $action = new ExtractLastModified; - $date = $action($rawPage); + $extractLastModified = new ExtractLastModified; + $date = $extractLastModified($rawPage); $this->assertInstanceOf(CarbonImmutable::class, $date); $this->assertSame('2023-11-20 10:00:00', $date->format('Y-m-d H:i:s')); From 8473306e1bfa1d26d516705fa4ca9939a9c32584 Mon Sep 17 00:00:00 2001 From: 128na Date: Tue, 2 Jun 2026 23:00:31 +0900 Subject: [PATCH 4/8] Fix NOT NULL constraint violation in ExtractContentsTest by assigning attachment_id explicitly --- .../Actions/Extract/Portal/ExtractContentsTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php index e18e235..85f0a8a 100644 --- a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php @@ -40,10 +40,10 @@ protected function setUp(): void public function test_extracts_title_text_and_pak(): void { - FileInfo::create([ - 'attachment_id' => 123, - 'data' => 'file content info', - ]); + $fileInfo = new FileInfo(); + $fileInfo->attachment_id = 123; + $fileInfo->data = 'file content info'; + $fileInfo->save(); $article = new Article([ 'title' => 'Portal Addon Title', From c53acfe1c9d9b303ce88aec87fcb602733c254d8 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 2 Jun 2026 14:00:45 +0000 Subject: [PATCH 5/8] [rector] Rector fixes --- tests/Feature/Actions/Extract/ExtractActionTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Feature/Actions/Extract/ExtractActionTest.php b/tests/Feature/Actions/Extract/ExtractActionTest.php index 672bc05..0d55bd3 100644 --- a/tests/Feature/Actions/Extract/ExtractActionTest.php +++ b/tests/Feature/Actions/Extract/ExtractActionTest.php @@ -18,7 +18,7 @@ public function test_invokes_handlers_for_all_sites_when_null_provided(): void { $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; - $this->app->bind(Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} @@ -28,7 +28,7 @@ public function __invoke(LoggerInterface $logger): void } }); - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} @@ -38,7 +38,7 @@ public function __invoke(LoggerInterface $logger): void } }); - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} @@ -60,7 +60,7 @@ public function test_invokes_specific_handler_when_site_provided(): void { $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; - $this->app->bind(Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} @@ -70,7 +70,7 @@ public function __invoke(LoggerInterface $logger): void } }); - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} @@ -80,7 +80,7 @@ public function __invoke(LoggerInterface $logger): void } }); - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn () => new readonly class($state) implements HandlerInterface + $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface { public function __construct(private object $state) {} From 2d40ab7868ceb9f51516d8cad618a5f955251f45 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 2 Jun 2026 14:01:23 +0000 Subject: [PATCH 6/8] [rector] Rector fixes --- tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php index 85f0a8a..72f657c 100644 --- a/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php +++ b/tests/Feature/Actions/Extract/Portal/ExtractContentsTest.php @@ -40,7 +40,7 @@ protected function setUp(): void public function test_extracts_title_text_and_pak(): void { - $fileInfo = new FileInfo(); + $fileInfo = new FileInfo; $fileInfo->attachment_id = 123; $fileInfo->data = 'file content info'; $fileInfo->save(); From fc78c07db08e519cc16ba63f6f2b42bbb79726e1 Mon Sep 17 00:00:00 2001 From: 128na Date: Tue, 2 Jun 2026 23:06:09 +0900 Subject: [PATCH 7/8] Refactor ExtractActionTest to use Mockery --- .../Actions/Extract/ExtractActionTest.php | 93 +++++-------------- 1 file changed, 22 insertions(+), 71 deletions(-) diff --git a/tests/Feature/Actions/Extract/ExtractActionTest.php b/tests/Feature/Actions/Extract/ExtractActionTest.php index 0d55bd3..37634ad 100644 --- a/tests/Feature/Actions/Extract/ExtractActionTest.php +++ b/tests/Feature/Actions/Extract/ExtractActionTest.php @@ -8,7 +8,6 @@ use App\Actions\Extract\HandlerInterface; use App\Actions\Extract\Japan\Handler; use App\Enums\SiteName; -use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Tests\Feature\TestCase; @@ -16,85 +15,37 @@ final class ExtractActionTest extends TestCase { public function test_invokes_handlers_for_all_sites_when_null_provided(): void { - $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; + $japanHandler = \Mockery::mock(HandlerInterface::class); + $japanHandler->shouldReceive('__invoke')->once(); + $this->app->instance(Handler::class, $japanHandler); - $this->app->bind(Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $portalHandler = \Mockery::mock(HandlerInterface::class); + $portalHandler->shouldReceive('__invoke')->once(); + $this->app->instance(\App\Actions\Extract\Portal\Handler::class, $portalHandler); - public function __invoke(LoggerInterface $logger): void - { - $this->state->japan = true; - } - }); + $twitransHandler = \Mockery::mock(HandlerInterface::class); + $twitransHandler->shouldReceive('__invoke')->once(); + $this->app->instance(\App\Actions\Extract\Twitrans\Handler::class, $twitransHandler); - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} - - public function __invoke(LoggerInterface $logger): void - { - $this->state->portal = true; - } - }); - - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} - - public function __invoke(LoggerInterface $logger): void - { - $this->state->twitrans = true; - } - }); - - $extractAction = app(ExtractAction::class); - $extractAction(null, new NullLogger); - - $this->assertTrue($state->japan); - $this->assertTrue($state->portal); - $this->assertTrue($state->twitrans); + $action = app(ExtractAction::class); + $action(null, new NullLogger); } public function test_invokes_specific_handler_when_site_provided(): void { - $state = (object) ['japan' => false, 'portal' => false, 'twitrans' => false]; - - $this->app->bind(Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} - - public function __invoke(LoggerInterface $logger): void - { - $this->state->japan = true; - } - }); - - $this->app->bind(\App\Actions\Extract\Portal\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} - - public function __invoke(LoggerInterface $logger): void - { - $this->state->portal = true; - } - }); - - $this->app->bind(\App\Actions\Extract\Twitrans\Handler::class, fn (): HandlerInterface => new readonly class($state) implements HandlerInterface - { - public function __construct(private object $state) {} + $japanHandler = \Mockery::mock(HandlerInterface::class); + $japanHandler->shouldReceive('__invoke')->once(); + $this->app->instance(Handler::class, $japanHandler); - public function __invoke(LoggerInterface $logger): void - { - $this->state->twitrans = true; - } - }); + $portalHandler = \Mockery::mock(HandlerInterface::class); + $portalHandler->shouldReceive('__invoke')->never(); + $this->app->instance(\App\Actions\Extract\Portal\Handler::class, $portalHandler); - $extractAction = app(ExtractAction::class); - $extractAction(SiteName::Japan, new NullLogger); + $twitransHandler = \Mockery::mock(HandlerInterface::class); + $twitransHandler->shouldReceive('__invoke')->never(); + $this->app->instance(\App\Actions\Extract\Twitrans\Handler::class, $twitransHandler); - $this->assertTrue($state->japan); - $this->assertFalse($state->portal); - $this->assertFalse($state->twitrans); + $action = app(ExtractAction::class); + $action(SiteName::Japan, new NullLogger); } } From 82bd969465442d6914b2c5785bdb4915601f1cd4 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 2 Jun 2026 14:06:49 +0000 Subject: [PATCH 8/8] [rector] Rector fixes --- .../Actions/Extract/ExtractActionTest.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/Feature/Actions/Extract/ExtractActionTest.php b/tests/Feature/Actions/Extract/ExtractActionTest.php index 37634ad..b1c7552 100644 --- a/tests/Feature/Actions/Extract/ExtractActionTest.php +++ b/tests/Feature/Actions/Extract/ExtractActionTest.php @@ -15,9 +15,9 @@ final class ExtractActionTest extends TestCase { public function test_invokes_handlers_for_all_sites_when_null_provided(): void { - $japanHandler = \Mockery::mock(HandlerInterface::class); - $japanHandler->shouldReceive('__invoke')->once(); - $this->app->instance(Handler::class, $japanHandler); + $mock = \Mockery::mock(HandlerInterface::class); + $mock->shouldReceive('__invoke')->once(); + $this->app->instance(Handler::class, $mock); $portalHandler = \Mockery::mock(HandlerInterface::class); $portalHandler->shouldReceive('__invoke')->once(); @@ -27,15 +27,15 @@ public function test_invokes_handlers_for_all_sites_when_null_provided(): void $twitransHandler->shouldReceive('__invoke')->once(); $this->app->instance(\App\Actions\Extract\Twitrans\Handler::class, $twitransHandler); - $action = app(ExtractAction::class); - $action(null, new NullLogger); + $extractAction = app(ExtractAction::class); + $extractAction(null, new NullLogger); } public function test_invokes_specific_handler_when_site_provided(): void { - $japanHandler = \Mockery::mock(HandlerInterface::class); - $japanHandler->shouldReceive('__invoke')->once(); - $this->app->instance(Handler::class, $japanHandler); + $mock = \Mockery::mock(HandlerInterface::class); + $mock->shouldReceive('__invoke')->once(); + $this->app->instance(Handler::class, $mock); $portalHandler = \Mockery::mock(HandlerInterface::class); $portalHandler->shouldReceive('__invoke')->never(); @@ -45,7 +45,7 @@ public function test_invokes_specific_handler_when_site_provided(): void $twitransHandler->shouldReceive('__invoke')->never(); $this->app->instance(\App\Actions\Extract\Twitrans\Handler::class, $twitransHandler); - $action = app(ExtractAction::class); - $action(SiteName::Japan, new NullLogger); + $extractAction = app(ExtractAction::class); + $extractAction(SiteName::Japan, new NullLogger); } }