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(); } }