From d58fd8a231a35a2c8ec32066028a19ef6e24caf3 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Thu, 13 Aug 2026 23:26:58 +0200 Subject: [PATCH] 144 - Rename ValidationService to ValidateArticleAction --- .../ValidateArticleAction.php} | 8 ++-- app/Listeners/ValidateArticleListener.php | 6 +-- .../RouteArticleDecisionStampingTest.php | 4 +- tests/Feature/ValidateArticleListenerTest.php | 6 +-- .../ValidateArticleActionTest.php} | 48 +++++++++---------- 5 files changed, 36 insertions(+), 36 deletions(-) rename app/{Services/Article/ValidationService.php => Actions/ValidateArticleAction.php} (89%) rename tests/Unit/{Services/ValidationServiceTest.php => Actions/ValidateArticleActionTest.php} (91%) diff --git a/app/Services/Article/ValidationService.php b/app/Actions/ValidateArticleAction.php similarity index 89% rename from app/Services/Article/ValidationService.php rename to app/Actions/ValidateArticleAction.php index 2557f437..05a49b4c 100644 --- a/app/Services/Article/ValidationService.php +++ b/app/Actions/ValidateArticleAction.php @@ -1,18 +1,18 @@ id); diff --git a/app/Listeners/ValidateArticleListener.php b/app/Listeners/ValidateArticleListener.php index 124551a7..147803a9 100644 --- a/app/Listeners/ValidateArticleListener.php +++ b/app/Listeners/ValidateArticleListener.php @@ -2,12 +2,12 @@ namespace App\Listeners; +use App\Actions\ValidateArticleAction; use App\Enums\ActivityTypeEnum; use App\Enums\LogLevelEnum; use App\Events\ActionPerformed; use App\Events\ActivityLogged; use App\Events\NewArticleFetched; -use App\Services\Article\ValidationService; use Exception; use Illuminate\Contracts\Queue\ShouldQueue; @@ -16,7 +16,7 @@ class ValidateArticleListener implements ShouldQueue public string $queue = 'default'; public function __construct( - private ValidationService $validationService + private ValidateArticleAction $validateArticle ) {} public function handle(NewArticleFetched $event): void @@ -33,7 +33,7 @@ public function handle(NewArticleFetched $event): void } try { - $this->validationService->validate($article); + $this->validateArticle->execute($article); ActivityLogged::dispatch( ActivityTypeEnum::VALIDATE, diff --git a/tests/Feature/RouteArticleDecisionStampingTest.php b/tests/Feature/RouteArticleDecisionStampingTest.php index eefd1963..54b61770 100644 --- a/tests/Feature/RouteArticleDecisionStampingTest.php +++ b/tests/Feature/RouteArticleDecisionStampingTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature; use App\Actions\CreateRouteArticlesAction; +use App\Actions\ValidateArticleAction; use App\Enums\ApprovalStatusEnum; use App\Livewire\Articles; use App\Models\Article; @@ -13,7 +14,6 @@ use App\Models\RouteArticle; use App\Models\User; use App\Services\Article\ArticleFetcher; -use App\Services\Article\ValidationService; use Illuminate\Foundation\Testing\RefreshDatabase; use Livewire\Livewire; use Mockery; @@ -135,7 +135,7 @@ private function validate(Article $article): void 'full_article' => 'Body text', ]); - (new ValidationService($fetcher, new CreateRouteArticlesAction))->validate($article); + (new ValidateArticleAction($fetcher, new CreateRouteArticlesAction))->execute($article); } private function articleOnRouteWithoutKeywords(bool $autoApprove): Article diff --git a/tests/Feature/ValidateArticleListenerTest.php b/tests/Feature/ValidateArticleListenerTest.php index 39ace545..cb232e6f 100644 --- a/tests/Feature/ValidateArticleListenerTest.php +++ b/tests/Feature/ValidateArticleListenerTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature; use App\Actions\CreateRouteArticlesAction; +use App\Actions\ValidateArticleAction; use App\Enums\ApprovalStatusEnum; use App\Events\NewArticleFetched; use App\Listeners\ValidateArticleListener; @@ -13,7 +14,6 @@ use App\Models\Route; use App\Models\RouteArticle; use App\Services\Article\ArticleFetcher; -use App\Services\Article\ValidationService; use Illuminate\Foundation\Testing\RefreshDatabase; use Mockery; use Tests\TestCase; @@ -34,7 +34,7 @@ private function createListenerWithMockedFetcher(?string $content = 'Some articl ); return new ValidateArticleListener( - new ValidationService($articleFetcher, new CreateRouteArticlesAction) + new ValidateArticleAction($articleFetcher, new CreateRouteArticlesAction) ); } @@ -115,7 +115,7 @@ public function test_listener_handles_validation_errors_gracefully(): void $articleFetcher->shouldReceive('fetchArticleData')->andThrow(new \Exception('Fetch failed')); $listener = new ValidateArticleListener( - new ValidationService($articleFetcher, new CreateRouteArticlesAction) + new ValidateArticleAction($articleFetcher, new CreateRouteArticlesAction) ); $feed = Feed::factory()->create(); diff --git a/tests/Unit/Services/ValidationServiceTest.php b/tests/Unit/Actions/ValidateArticleActionTest.php similarity index 91% rename from tests/Unit/Services/ValidationServiceTest.php rename to tests/Unit/Actions/ValidateArticleActionTest.php index 6c501d6c..fa753b2e 100644 --- a/tests/Unit/Services/ValidationServiceTest.php +++ b/tests/Unit/Actions/ValidateArticleActionTest.php @@ -1,8 +1,9 @@ articleFetcher = Mockery::mock(ArticleFetcher::class); - $this->validationService = new ValidationService($this->articleFetcher, new CreateRouteArticlesAction); + $this->validateArticle = new ValidateArticleAction($this->articleFetcher, new CreateRouteArticlesAction); } protected function tearDown(): void @@ -76,7 +76,7 @@ public function test_validate_sets_validated_at_on_article(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertNotNull($article->fresh()->validated_at); } @@ -90,7 +90,7 @@ public function test_validate_creates_route_articles_for_active_routes(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Some article content'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertCount(2, RouteArticle::where('article_id', $article->id)->get()); } @@ -104,7 +104,7 @@ public function test_validate_skips_inactive_routes(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Some article content'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertCount(1, RouteArticle::where('article_id', $article->id)->get()); } @@ -123,7 +123,7 @@ public function test_validate_sets_pending_when_keywords_match(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium politics'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::PENDING, $routeArticle->approval_status); @@ -143,7 +143,7 @@ public function test_validate_sets_rejected_when_no_keywords_match(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about random topics and weather'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::REJECTED, $routeArticle->approval_status); @@ -157,7 +157,7 @@ public function test_validate_sets_pending_when_route_has_no_keywords(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about random topics'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::PENDING, $routeArticle->approval_status); @@ -192,7 +192,7 @@ public function test_validate_different_routes_get_different_statuses(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $ra1 = RouteArticle::where('article_id', $article->id) ->where('platform_channel_id', $channel1->id)->first(); @@ -219,7 +219,7 @@ public function test_validate_auto_approves_when_global_setting_off_and_keywords $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::APPROVED, $routeArticle->approval_status); @@ -244,7 +244,7 @@ public function test_validate_route_auto_approve_overrides_global_setting(): voi $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::APPROVED, $routeArticle->approval_status); @@ -269,7 +269,7 @@ public function test_validate_route_auto_approve_false_overrides_global_off(): v $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::PENDING, $routeArticle->approval_status); @@ -291,7 +291,7 @@ public function test_validate_does_not_auto_approve_rejected_articles(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Random content no match'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::REJECTED, $routeArticle->approval_status); @@ -305,7 +305,7 @@ public function test_validate_creates_no_route_articles_when_content_fetch_fails $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, null); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertCount(0, RouteArticle::where('article_id', $article->id)->get()); $this->assertNotNull($article->fresh()->validated_at); @@ -322,7 +322,7 @@ public function test_validate_updates_article_metadata(): void ]); $this->mockFetchReturning($article, 'Content about Belgium', 'New Title', 'New description'); - $result = $this->validationService->validate($article); + $result = $this->validateArticle->execute($article); $this->assertEquals('New Title', $result->title); $this->assertEquals('New description', $result->description); @@ -337,7 +337,7 @@ public function test_validate_sets_validated_at_on_route_articles(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Content about something'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertNotNull($routeArticle->validated_at); @@ -357,7 +357,7 @@ public function test_validate_keyword_matching_is_case_insensitive(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about BELGIUM politics'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $routeArticle = RouteArticle::where('article_id', $article->id)->first(); $this->assertEquals(ApprovalStatusEnum::PENDING, $routeArticle->approval_status); @@ -377,7 +377,7 @@ public function test_validate_only_uses_active_keywords(): void $article = Article::factory()->create(['feed_id' => $feed->id]); $this->mockFetchReturning($article, 'Article about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); // No active keywords = matches everything = pending $routeArticle = RouteArticle::where('article_id', $article->id)->first(); @@ -395,7 +395,7 @@ public function test_validate_stores_thumbnail_in_image_url(): void ]); $this->mockFetchReturning($article, 'Content about Belgium', thumbnail: 'https://example.com/thumb.jpg'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertEquals('https://example.com/thumb.jpg', $article->fresh()->image_url); } @@ -411,7 +411,7 @@ public function test_validate_stores_thumbnail_when_full_article_is_missing(): v ]); $this->mockFetchReturning($article, null, thumbnail: 'https://example.com/thumb.jpg'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertEquals('https://example.com/thumb.jpg', $article->fresh()->image_url); } @@ -427,7 +427,7 @@ public function test_validate_leaves_image_url_null_when_parser_returns_no_thumb ]); $this->mockFetchReturning($article, 'Content about Belgium'); - $this->validationService->validate($article); + $this->validateArticle->execute($article); $this->assertNull($article->fresh()->image_url); }