118 lines
4.3 KiB
PHP
118 lines
4.3 KiB
PHP
<?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();
|
|
}
|
|
}
|