PIMS/tests/Feature/Movies/PublicEntitiesBrowseTest.php

118 lines
4.3 KiB
PHP
Raw Permalink Normal View History

2025-12-07 03:49:26 +00:00
<?php
namespace Tests\Feature\Movies;
use App\Modules\Movies\Models\{Movie, Actor, Director, Studio, Genre};
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class PublicEntitiesBrowseTest extends TestCase
{
use RefreshDatabase;
private function seedActorWithMovies(): array
{
$actor = Actor::factory()->create(['name' => 'Bruce Willis']);
$m1 = Movie::factory()->create(['title' => 'Alpha']);
$m2 = Movie::factory()->create(['title' => 'Beta']);
$m1->actors()->sync([$actor->id]);
$m2->actors()->sync([$actor->id]);
return [$actor, collect([$m1, $m2])];
}
private function seedDirectorWithMovies(): array
{
$director = Director::factory()->create(['name' => 'John McTiernan']);
$m1 = Movie::factory()->create(['title' => 'Gamma']);
$m2 = Movie::factory()->create(['title' => 'Delta']);
$m1->directors()->sync([$director->id]);
$m2->directors()->sync([$director->id]);
return [$director, collect([$m1, $m2])];
}
private function seedStudioWithMovies(): array
{
$studio = Studio::factory()->create(['name' => 'Some Studio']);
$m1 = Movie::factory()->create(['title' => 'Epsilon']);
$m2 = Movie::factory()->create(['title' => 'Zeta']);
$m1->studios()->sync([$studio->id]);
$m2->studios()->sync([$studio->id]);
return [$studio, collect([$m1, $m2])];
}
private function seedGenreWithMovies(): array
{
$genre = Genre::factory()->create(['name' => 'Adventure']);
$m1 = Movie::factory()->create(['title' => 'Eta']);
$m2 = Movie::factory()->create(['title' => 'Kappa']);
$m1->genres()->sync([$genre->id]);
$m2->genres()->sync([$genre->id]);
return [$genre, collect([$m1, $m2])];
}
public function test_actor_endpoint_returns_entity_and_movies_and_supports_q_filter(): void
{
[$actor, $movies] = $this->seedActorWithMovies();
$res = $this->getJson('/api/actors/'.$actor->id);
$res->assertOk();
$json = $res->json();
$this->assertSame($actor->id, $json['entity']['id']);
$this->assertSame(2, $json['movies']['total']);
// Filter by title
$res2 = $this->getJson('/api/actors/'.$actor->id.'?q=Alpha');
$res2->assertOk()->assertJsonPath('movies.total', 1);
}
public function test_director_endpoint_returns_entity_and_movies_and_supports_q_filter(): void
{
[$director, $movies] = $this->seedDirectorWithMovies();
$res = $this->getJson('/api/directors/'.$director->id);
$res->assertOk();
$json = $res->json();
$this->assertSame($director->id, $json['entity']['id']);
$this->assertSame(2, $json['movies']['total']);
$res2 = $this->getJson('/api/directors/'.$director->id.'?q=Gamma');
$res2->assertOk()->assertJsonPath('movies.total', 1);
}
public function test_studio_endpoint_returns_entity_and_movies_and_supports_q_filter(): void
{
[$studio, $movies] = $this->seedStudioWithMovies();
$res = $this->getJson('/api/studios/'.$studio->id);
$res->assertOk();
$json = $res->json();
$this->assertSame($studio->id, $json['entity']['id']);
$this->assertSame(2, $json['movies']['total']);
$res2 = $this->getJson('/api/studios/'.$studio->id.'?q=Epsilon');
$res2->assertOk()->assertJsonPath('movies.total', 1);
}
public function test_genre_endpoint_returns_entity_and_movies_and_supports_q_filter(): void
{
[$genre, $movies] = $this->seedGenreWithMovies();
$res = $this->getJson('/api/genres/'.$genre->id);
$res->assertOk();
$json = $res->json();
$this->assertSame($genre->id, $json['entity']['id']);
$this->assertSame(2, $json['movies']['total']);
$res2 = $this->getJson('/api/genres/'.$genre->id.'?q=Eta');
$res2->assertOk()->assertJsonPath('movies.total', 1);
}
public function test_missing_entities_return_404(): void
{
$this->getJson('/api/actors/999999')->assertNotFound();
$this->getJson('/api/directors/999999')->assertNotFound();
$this->getJson('/api/studios/999999')->assertNotFound();
$this->getJson('/api/genres/999999')->assertNotFound();
}
}