184 lines
6.4 KiB
PHP
184 lines
6.4 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Livewire;
|
|
|
|
use App\Enums\ApprovalStatusEnum;
|
|
use App\Events\RouteArticleApproved;
|
|
use App\Livewire\Articles;
|
|
use App\Models\Article;
|
|
use App\Models\Feed;
|
|
use App\Models\Route;
|
|
use App\Models\RouteArticle;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Event;
|
|
use Livewire\Livewire;
|
|
use Tests\TestCase;
|
|
|
|
class ArticlesTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
private function createRouteArticle(ApprovalStatusEnum $status = ApprovalStatusEnum::PENDING, string $title = 'Test Article'): RouteArticle
|
|
{
|
|
$feed = Feed::factory()->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.');
|
|
}
|
|
}
|