setUserResolver(fn () => null); $response = $controller->me($request); expect($response->getStatusCode())->toBe(401); }); it('returns unauthenticated for updateMe when no user', function (): void { $controller = new UserController(); $request = Request::create('/api/user/me', 'PATCH', [ 'location' => 'Test', ]); $request->setUserResolver(fn () => null); $response = $controller->updateMe($request); expect($response->getStatusCode())->toBe(401); }); it('trims blank location to null in updateMe', function (): void { $controller = new UserController(); $user = User::factory()->create(['location' => 'Somewhere']); $request = Request::create('/api/user/me', 'PATCH', [ 'location' => ' ', ]); $request->setUserResolver(fn () => $user); $response = $controller->updateMe($request); expect($response->getStatusCode())->toBe(200); $user->refresh(); expect($user->location)->toBeNull(); }); it('resolves avatar urls when present', function (): void { Storage::fake('public'); $controller = new UserController(); $user = User::factory()->create([ 'avatar_path' => 'avatars/test.png', ]); $response = $controller->profile($user); expect($response->getStatusCode())->toBe(200); expect($response->getData(true)['avatar_url'])->not->toBeNull(); }); it('returns null group color when roles relation is null', function (): void { $controller = new UserController(); $user = User::factory()->create(); $user->setRelation('roles', null); $ref = new ReflectionMethod($controller, 'resolveGroupColor'); $ref->setAccessible(true); $result = $ref->invoke($controller, $user); expect($result)->toBeNull(); }); it('normalizes empty and raw role names', function (): void { $controller = new UserController(); $ref = new ReflectionMethod($controller, 'normalizeRoleName'); $ref->setAccessible(true); expect($ref->invoke($controller, ''))->toBe('ROLE_'); expect($ref->invoke($controller, 'moderator'))->toBe('ROLE_MODERATOR'); });