96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { UsersController } from './users.controller';
|
|
import type { AuthenticatedUser } from '../../../../libs/auth/src';
|
|
|
|
describe('UsersController', () => {
|
|
const currentUser: AuthenticatedUser = {
|
|
id: 'u1',
|
|
externalSubjectId: 'sub-1',
|
|
displayName: 'Alex',
|
|
email: 'a@example.com',
|
|
};
|
|
|
|
it('GET /users/me returns the current user profile', async () => {
|
|
const usersService = {
|
|
findById: jest.fn().mockResolvedValue({
|
|
id: 'u1',
|
|
externalSubjectId: 'sub-1',
|
|
displayName: 'Alex',
|
|
email: 'a@example.com',
|
|
createdAt: new Date('2026-01-01'),
|
|
updatedAt: new Date('2026-01-02'),
|
|
}),
|
|
};
|
|
const preferencesService = { getOrDefault: jest.fn(), upsert: jest.fn() };
|
|
const controller = new UsersController(
|
|
usersService as never,
|
|
preferencesService as never,
|
|
);
|
|
|
|
const result = await controller.me(currentUser);
|
|
|
|
expect(usersService.findById).toHaveBeenCalledWith('u1');
|
|
expect(result).toEqual({
|
|
id: 'u1',
|
|
displayName: 'Alex',
|
|
email: 'a@example.com',
|
|
createdAt: new Date('2026-01-01'),
|
|
updatedAt: new Date('2026-01-02'),
|
|
});
|
|
});
|
|
|
|
it('GET /users/me/preferences returns the effective preference', async () => {
|
|
const preference = {
|
|
userId: 'u1',
|
|
preferredPace: null,
|
|
preferredBudgetLevel: null,
|
|
maxWalkingDistanceKm: null,
|
|
preferredStartTime: null,
|
|
childFriendlyPreferred: false,
|
|
interests: [],
|
|
notes: null,
|
|
};
|
|
const usersService = { findById: jest.fn() };
|
|
const preferencesService = {
|
|
getOrDefault: jest.fn().mockResolvedValue(preference),
|
|
upsert: jest.fn(),
|
|
};
|
|
const controller = new UsersController(
|
|
usersService as never,
|
|
preferencesService as never,
|
|
);
|
|
|
|
await expect(controller.getPreferences(currentUser)).resolves.toEqual(
|
|
preference,
|
|
);
|
|
expect(preferencesService.getOrDefault).toHaveBeenCalledWith('u1');
|
|
});
|
|
|
|
it('PUT /users/me/preferences round-trips the dto through the service', async () => {
|
|
const dto = { childFriendlyPreferred: true };
|
|
const updated = {
|
|
userId: 'u1',
|
|
preferredPace: null,
|
|
preferredBudgetLevel: null,
|
|
maxWalkingDistanceKm: null,
|
|
preferredStartTime: null,
|
|
childFriendlyPreferred: true,
|
|
interests: [],
|
|
notes: null,
|
|
};
|
|
const usersService = { findById: jest.fn() };
|
|
const preferencesService = {
|
|
getOrDefault: jest.fn(),
|
|
upsert: jest.fn().mockResolvedValue(updated),
|
|
};
|
|
const controller = new UsersController(
|
|
usersService as never,
|
|
preferencesService as never,
|
|
);
|
|
|
|
await expect(
|
|
controller.updatePreferences(currentUser, dto),
|
|
).resolves.toEqual(updated);
|
|
expect(preferencesService.upsert).toHaveBeenCalledWith('u1', dto);
|
|
});
|
|
});
|