From eb154e0bd479958acf2f682b837c3112dc97e462 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 16 Aug 2026 18:00:05 +0900 Subject: [PATCH 1/2] feat: add removeFavorite to FavoriteRepository --- .../Packages/Domains/Favorite/FavoriteRepository.php | 11 +++++++++++ .../Interface/FavoriteRepositoryInterface.php | 2 ++ 2 files changed, 13 insertions(+) diff --git a/src/app/Packages/Domains/Favorite/FavoriteRepository.php b/src/app/Packages/Domains/Favorite/FavoriteRepository.php index 586538f0..6a98f5fe 100644 --- a/src/app/Packages/Domains/Favorite/FavoriteRepository.php +++ b/src/app/Packages/Domains/Favorite/FavoriteRepository.php @@ -23,6 +23,17 @@ public function addFavorite(int $userId, int $worldHeritageSiteId): void $user->favorites()->attach($worldHeritageSiteId); } + public function removeFavorite(int $userId, int $worldHeritageSiteId): void + { + $user = $this->userModel->find($userId); + + if ($user === null) { + throw new Exception('User not found.'); + } + + $user->favorites()->detach($worldHeritageSiteId); + } + public function getFavoriteWorldHeritageIds(int $userId): array { $user = $this->userModel->find($userId); diff --git a/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php b/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php index 164187e6..1c507374 100644 --- a/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php +++ b/src/app/Packages/Domains/Favorite/Interface/FavoriteRepositoryInterface.php @@ -6,5 +6,7 @@ interface FavoriteRepositoryInterface { public function addFavorite(int $userId, int $worldHeritageSiteId): void; + public function removeFavorite(int $userId, int $worldHeritageSiteId): void; + public function getFavoriteWorldHeritageIds(int $userId): array; } From 63bdf4947eb98f2a07e3c193e0dda14ccae09272 Mon Sep 17 00:00:00 2001 From: Application-drop-up Date: Sun, 16 Aug 2026 18:00:06 +0900 Subject: [PATCH 2/2] test: cover removeFavorite in FavoriteRepositoryTest --- .../Favorite/Tests/FavoriteRepositoryTest.php | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php b/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php index 7264d602..bd001ace 100644 --- a/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php +++ b/src/app/Packages/Domains/Favorite/Tests/FavoriteRepositoryTest.php @@ -91,6 +91,39 @@ public function test_addFavorite_throws_exception_when_user_not_found(): void $this->repository()->addFavorite(999999, $worldHeritage->id); } + public function test_removeFavorite_detaches_world_heritage_site_from_user(): void + { + $user = $this->seedUser(); + $worldHeritage = $this->seedWorldHeritage(1); + $user->favorites()->attach($worldHeritage->id); + + $this->repository()->removeFavorite($user->id, $worldHeritage->id); + + $this->assertDatabaseMissing('user_favorite', [ + 'user_id' => $user->id, + 'world_heritage_site_id' => $worldHeritage->id, + ]); + } + + #[\PHPUnit\Framework\Attributes\DoesNotPerformAssertions] + public function test_removeFavorite_does_not_throw_when_not_favorited(): void + { + $user = $this->seedUser(); + $worldHeritage = $this->seedWorldHeritage(1); + + $this->repository()->removeFavorite($user->id, $worldHeritage->id); + } + + public function test_removeFavorite_throws_exception_when_user_not_found(): void + { + $worldHeritage = $this->seedWorldHeritage(1); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('User not found.'); + + $this->repository()->removeFavorite(999999, $worldHeritage->id); + } + public function test_getFavoriteWorldHeritageIds_returns_ids_ordered_by_most_recently_favorited(): void { $user = $this->seedUser();