diff --git a/backend/tests/Feature/Set/EloquentSetRepositoryTest.php b/backend/tests/Feature/Set/EloquentSetRepositoryTest.php new file mode 100644 index 0000000..bb4679f --- /dev/null +++ b/backend/tests/Feature/Set/EloquentSetRepositoryTest.php @@ -0,0 +1,107 @@ +createUser('creator@example.com'); + $set = app(SetRepository::class)->create(new CreateSetDto( + name: 'Bible', + creator: $creator, + )); + + $this->assertGreaterThan(0, $set->getId()); + $this->assertSame('Bible', $set->getName()); + $this->assertSame($creator->getId(), $set->getCreator()->getId()); + $this->assertDatabaseHas('sets', [ + 'id' => $set->getId(), + 'name' => 'Bible', + 'creator_id' => $creator->getId(), + ]); + } + + public function test_it_lists_every_set_alphabetically(): void + { + $firstCreator = $this->createUser('first@example.com'); + $secondCreator = $this->createUser('second@example.com'); + $repository = app(SetRepository::class); + $repository->create(new CreateSetDto( + name: 'Fitness Program', + creator: $firstCreator, + )); + $repository->create(new CreateSetDto( + name: 'Bible', + creator: $secondCreator, + )); + $repository->create(new CreateSetDto( + name: 'Course', + creator: $firstCreator, + )); + + $sets = $repository->all(); + + $this->assertSame( + ['Bible', 'Course', 'Fitness Program'], + array_map(function ($set): string { + return $set->getName(); + }, $sets), + ); + $this->assertSame( + $secondCreator->getId(), + $sets[0]->getCreator()->getId(), + ); + } + + public function test_it_rejects_duplicate_set_names(): void + { + $creator = $this->createUser('creator@example.com'); + $repository = app(SetRepository::class); + $repository->create(new CreateSetDto( + name: 'Bible', + creator: $creator, + )); + + $this->expectException(QueryException::class); + + $repository->create(new CreateSetDto( + name: 'Bible', + creator: $creator, + )); + } + + public function test_it_prevents_deleting_a_set_creator(): void + { + $creator = $this->createUser('creator@example.com'); + app(SetRepository::class)->create(new CreateSetDto( + name: 'Bible', + creator: $creator, + )); + + $this->expectException(QueryException::class); + + DB::table('users')->where('id', $creator->getId())->delete(); + } + + private function createUser(string $email): User + { + return app(UserRepository::class)->create(new CreateUserDto( + email: new EmailAddress($email), + passwordHash: 'hashed-password', + )); + } +} diff --git a/backend/tests/Unit/Set/SetTest.php b/backend/tests/Unit/Set/SetTest.php new file mode 100644 index 0000000..ed7d75d --- /dev/null +++ b/backend/tests/Unit/Set/SetTest.php @@ -0,0 +1,29 @@ +assertSame(42, $set->getId()); + $this->assertSame('Bible', $set->getName()); + $this->assertSame($creator, $set->getCreator()); + } +}