diff --git a/backend/tests/Unit/User/UseCases/SearchUsersTest.php b/backend/tests/Unit/User/UseCases/SearchUsersTest.php new file mode 100644 index 0000000..6d0cbed --- /dev/null +++ b/backend/tests/Unit/User/UseCases/SearchUsersTest.php @@ -0,0 +1,95 @@ +userRepo = new FakeUserRepository; + $this->useCase = new SearchUsers($this->userRepo); + + $this->userRepo->create(new CreateUserDto( + email: new EmailAddress('alice@example.com'), + displayName: 'alice', + passwordHash: '', + isAdmin: false, + emailConfirmedAt: null, + )); + $this->userRepo->create(new CreateUserDto( + email: new EmailAddress('alex@example.com'), + displayName: 'alex', + passwordHash: '', + isAdmin: false, + emailConfirmedAt: null, + )); + $this->userRepo->create(new CreateUserDto( + email: new EmailAddress('bob@other.com'), + displayName: 'bob', + passwordHash: '', + isAdmin: false, + emailConfirmedAt: null, + )); + } + + public function test_blank_query_throws_bad_request(): void + { + $this->expectException(BadRequestException::class); + $this->useCase->execute(new SearchUsersRequest(query: ' ')); + } + + public function test_finds_users_by_display_name_prefix(): void + { + $results = $this->useCase->execute(new SearchUsersRequest( + query: 'al', + )); + + $this->assertCount(2, $results); + $names = array_map( + function ($user) { + return $user->getDisplayName(); + }, + $results, + ); + sort($names); + $this->assertSame(['alex', 'alice'], $names); + } + + public function test_search_is_case_insensitive(): void + { + $results = $this->useCase->execute(new SearchUsersRequest( + query: 'ALI', + )); + $this->assertCount(1, $results); + $this->assertSame('alice', $results[0]->getDisplayName()); + } + + public function test_finds_users_by_email_prefix(): void + { + $results = $this->useCase->execute(new SearchUsersRequest( + query: 'bob@', + )); + $this->assertCount(1, $results); + $this->assertSame('bob', $results[0]->getDisplayName()); + } + + public function test_no_results_when_no_match(): void + { + $results = $this->useCase->execute(new SearchUsersRequest( + query: 'zzz', + )); + $this->assertSame([], $results); + } +}