-
- {{ $article->title ?? 'Untitled Article' }}
+
+ {{ $routeArticle->article->title ?? 'Untitled Article' }}
-
- {{ $article->description ?? 'No description available' }}
+
+ {{ $routeArticle->article->description ?? 'No description available' }}
-
-
Feed: {{ $article->feed?->name ?? 'Unknown' }}
-
•
-
{{ $article->created_at->format('M d, Y H:i') }}
- @if ($article->validated_at)
-
•
-
Validated
- @else
-
•
-
Not validated
- @endif
+
+
+
+ {{ $routeArticle->feed?->name ?? 'Unknown' }} → {{ $routeArticle->platformChannel?->name ?? 'Unknown' }}
+
+
{{ $routeArticle->created_at->format('M d, Y H:i') }}
-
- @if ($article->url)
+
@endforelse
- @if ($articles->hasPages())
+ @if ($routeArticles->hasPages())
- {{ $articles->links() }}
+ {{ $routeArticles->links() }}
@endif
diff --git a/tests/Feature/Livewire/ArticlesTest.php b/tests/Feature/Livewire/ArticlesTest.php
new file mode 100644
index 0000000..0b7752a
--- /dev/null
+++ b/tests/Feature/Livewire/ArticlesTest.php
@@ -0,0 +1,184 @@
+create();
+ /** @var Route $route */
+ $route = Route::factory()->active()->create(['feed_id' => $feed->id]);
+ $article = Article::factory()->create(['feed_id' => $feed->id, 'title' => $title]);
+
+ /** @var RouteArticle $routeArticle */
+ $routeArticle = RouteArticle::factory()->forRoute($route)->create([
+ 'article_id' => $article->id,
+ 'approval_status' => $status,
+ 'validated_at' => now(),
+ ]);
+
+ return $routeArticle;
+ }
+
+ public function test_renders_successfully(): void
+ {
+ Livewire::test(Articles::class)
+ ->assertStatus(200);
+ }
+
+ public function test_defaults_to_pending_tab(): void
+ {
+ Livewire::test(Articles::class)
+ ->assertSet('tab', 'pending');
+ }
+
+ public function test_pending_tab_shows_only_pending_route_articles(): void
+ {
+ $pending = $this->createRouteArticle(ApprovalStatusEnum::PENDING, 'Pending Article');
+ $approved = $this->createRouteArticle(ApprovalStatusEnum::APPROVED, 'Approved Article');
+ $rejected = $this->createRouteArticle(ApprovalStatusEnum::REJECTED, 'Rejected Article');
+
+ Livewire::test(Articles::class)
+ ->assertSee('Pending Article')
+ ->assertDontSee('Approved Article')
+ ->assertDontSee('Rejected Article');
+ }
+
+ public function test_all_tab_shows_all_route_articles(): void
+ {
+ $this->createRouteArticle(ApprovalStatusEnum::PENDING, 'Pending Article');
+ $this->createRouteArticle(ApprovalStatusEnum::APPROVED, 'Approved Article');
+ $this->createRouteArticle(ApprovalStatusEnum::REJECTED, 'Rejected Article');
+
+ Livewire::test(Articles::class)
+ ->call('setTab', 'all')
+ ->assertSee('Pending Article')
+ ->assertSee('Approved Article')
+ ->assertSee('Rejected Article');
+ }
+
+ public function test_all_tab_search_filters_by_title(): void
+ {
+ $this->createRouteArticle(ApprovalStatusEnum::PENDING, 'Belgian Politics Update');
+ $this->createRouteArticle(ApprovalStatusEnum::PENDING, 'Weather Forecast Today');
+
+ Livewire::test(Articles::class)
+ ->call('setTab', 'all')
+ ->set('search', 'Belgian')
+ ->assertSee('Belgian Politics Update')
+ ->assertDontSee('Weather Forecast Today');
+ }
+
+ public function test_approve_changes_status_and_dispatches_event(): void
+ {
+ Event::fake([RouteArticleApproved::class]);
+
+ $routeArticle = $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+
+ Livewire::test(Articles::class)
+ ->call('approve', $routeArticle->id);
+
+ $this->assertEquals(ApprovalStatusEnum::APPROVED, $routeArticle->fresh()->approval_status);
+
+ Event::assertDispatched(RouteArticleApproved::class);
+ }
+
+ public function test_reject_changes_status(): void
+ {
+ $routeArticle = $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+
+ Livewire::test(Articles::class)
+ ->call('reject', $routeArticle->id);
+
+ $this->assertEquals(ApprovalStatusEnum::REJECTED, $routeArticle->fresh()->approval_status);
+ }
+
+ public function test_restore_changes_status_back_to_pending(): void
+ {
+ $routeArticle = $this->createRouteArticle(ApprovalStatusEnum::REJECTED);
+
+ Livewire::test(Articles::class)
+ ->call('restore', $routeArticle->id);
+
+ $this->assertEquals(ApprovalStatusEnum::PENDING, $routeArticle->fresh()->approval_status);
+ }
+
+ public function test_clear_rejects_all_pending_route_articles(): void
+ {
+ $pending1 = $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+ $pending2 = $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+ $approved = $this->createRouteArticle(ApprovalStatusEnum::APPROVED);
+
+ Livewire::test(Articles::class)
+ ->call('clear');
+
+ $this->assertEquals(ApprovalStatusEnum::REJECTED, $pending1->fresh()->approval_status);
+ $this->assertEquals(ApprovalStatusEnum::REJECTED, $pending2->fresh()->approval_status);
+ $this->assertEquals(ApprovalStatusEnum::APPROVED, $approved->fresh()->approval_status);
+ }
+
+ public function test_pending_count_badge_shows_correct_count(): void
+ {
+ $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+ $this->createRouteArticle(ApprovalStatusEnum::PENDING);
+ $this->createRouteArticle(ApprovalStatusEnum::APPROVED);
+
+ Livewire::test(Articles::class)
+ ->assertSeeInOrder(['Pending', '2']);
+ }
+
+ public function test_switching_tabs_resets_search(): void
+ {
+ Livewire::test(Articles::class)
+ ->call('setTab', 'all')
+ ->set('search', 'something')
+ ->call('setTab', 'pending')
+ ->assertSet('search', '')
+ ->assertSet('tab', 'pending');
+ }
+
+ public function test_shows_route_name_in_listing(): void
+ {
+ $feed = Feed::factory()->create(['name' => 'VRT News']);
+ /** @var Route $route */
+ $route = Route::factory()->active()->create(['feed_id' => $feed->id]);
+ $article = Article::factory()->create(['feed_id' => $feed->id, 'title' => 'Test']);
+
+ RouteArticle::factory()->forRoute($route)->create([
+ 'article_id' => $article->id,
+ 'approval_status' => ApprovalStatusEnum::PENDING,
+ 'validated_at' => now(),
+ ]);
+
+ Livewire::test(Articles::class)
+ ->assertSee('VRT News');
+ }
+
+ public function test_empty_state_on_pending_tab(): void
+ {
+ Livewire::test(Articles::class)
+ ->assertSee('No pending articles');
+ }
+
+ public function test_empty_state_on_all_tab(): void
+ {
+ Livewire::test(Articles::class)
+ ->call('setTab', 'all')
+ ->assertSee('No route articles have been created yet.');
+ }
+}