From 61ab8c09dc8f20d113f1191f123df445a46236f6 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Mon, 3 Aug 2026 20:24:01 +0300 Subject: [PATCH] test sets list endpoint --- backend/tests/Fakes/FakeSetRepository.php | 49 +++++++++ .../Feature/Set/ListSetsEndpointTest.php | 102 ++++++++++++++++++ .../tests/Unit/Set/UseCases/ListSetsTest.php | 40 +++++++ 3 files changed, 191 insertions(+) create mode 100644 backend/tests/Fakes/FakeSetRepository.php create mode 100644 backend/tests/Feature/Set/ListSetsEndpointTest.php create mode 100644 backend/tests/Unit/Set/UseCases/ListSetsTest.php diff --git a/backend/tests/Fakes/FakeSetRepository.php b/backend/tests/Fakes/FakeSetRepository.php new file mode 100644 index 0000000..a4cff4c --- /dev/null +++ b/backend/tests/Fakes/FakeSetRepository.php @@ -0,0 +1,49 @@ + + */ + private array $sets = []; + + public function create(CreateSetDto $dto): Set + { + $id = count($this->sets) + 1; + $set = new Set( + id: $id, + name: $dto->name, + creator: $dto->creator, + ); + $this->sets[$id] = $set; + + return $this->copy($set); + } + + public function all(): array + { + $sets = array_values($this->sets); + usort($sets, function (Set $first, Set $second): int { + return $first->getName() <=> $second->getName(); + }); + + return array_map(function (Set $set): Set { + return $this->copy($set); + }, $sets); + } + + private function copy(Set $set): Set + { + return new Set( + id: $set->getId(), + name: $set->getName(), + creator: $set->getCreator(), + ); + } +} diff --git a/backend/tests/Feature/Set/ListSetsEndpointTest.php b/backend/tests/Feature/Set/ListSetsEndpointTest.php new file mode 100644 index 0000000..6f8085b --- /dev/null +++ b/backend/tests/Feature/Set/ListSetsEndpointTest.php @@ -0,0 +1,102 @@ +createUser('reader@example.com'); + $otherUser = $this->createUser('creator@example.com'); + $repository = app(SetRepository::class); + $course = $repository->create(new CreateSetDto( + name: 'Course', + creator: $authenticatedUser, + )); + $bible = $repository->create(new CreateSetDto( + name: 'Bible', + creator: $otherUser, + )); + $this->createSession($authenticatedUser); + + $response = $this->withCredentials() + ->withUnencryptedCookie( + AuthMiddleware::COOKIE_NAME, + 'valid-token', + )->getJson('/api/sets'); + + $response->assertOk()->assertExactJson([ + 'sets' => [ + [ + 'id' => $bible->getId(), + 'name' => 'Bible', + ], + [ + 'id' => $course->getId(), + 'name' => 'Course', + ], + ], + ]); + } + + public function test_it_returns_an_empty_catalog(): void + { + $authenticatedUser = $this->createUser('reader@example.com'); + $this->createSession($authenticatedUser); + + $response = $this->withCredentials() + ->withUnencryptedCookie( + AuthMiddleware::COOKIE_NAME, + 'valid-token', + )->getJson('/api/sets'); + + $response->assertOk()->assertExactJson(['sets' => []]); + } + + public function test_it_rejects_an_unauthenticated_request(): void + { + $response = $this->getJson('/api/sets'); + + $response + ->assertStatus(401) + ->assertExactJson(['error' => 'unauthenticated']); + } + + private function createUser(string $email): User + { + return app(UserRepository::class)->create(new CreateUserDto( + email: new EmailAddress($email), + passwordHash: 'hashed-password', + )); + } + + private function createSession(User $user): void + { + $createdAt = new DateTimeImmutable( + '2026-08-03T12:00:00', + new DateTimeZone('UTC'), + ); + app(SessionRepository::class)->create(new CreateSessionDto( + token: 'valid-token', + user: $user, + createdAt: $createdAt, + expiresAt: $createdAt->modify('+7 days'), + )); + } +} diff --git a/backend/tests/Unit/Set/UseCases/ListSetsTest.php b/backend/tests/Unit/Set/UseCases/ListSetsTest.php new file mode 100644 index 0000000..fbdf5fb --- /dev/null +++ b/backend/tests/Unit/Set/UseCases/ListSetsTest.php @@ -0,0 +1,40 @@ +create(new CreateSetDto( + name: 'Course', + creator: $creator, + )); + $repository->create(new CreateSetDto( + name: 'Bible', + creator: $creator, + )); + + $sets = (new ListSets($repository))->execute(); + + $this->assertSame( + ['Bible', 'Course'], + array_map(function ($set): string { + return $set->getName(); + }, $sets), + ); + } +}