61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
import { UserPreferencesService } from './user-preferences.service';
|
|
import { DEFAULT_USER_PREFERENCE } from './user.types';
|
|
import type { UpdateUserPreferenceDto } from './user.types';
|
|
|
|
describe('UserPreferencesService', () => {
|
|
describe('getOrDefault', () => {
|
|
it('returns the stored preference when one exists', async () => {
|
|
const stored = {
|
|
userId: 'u1',
|
|
...DEFAULT_USER_PREFERENCE,
|
|
preferredPace: 'relaxed',
|
|
};
|
|
const repo = { findByUserId: jest.fn().mockResolvedValue(stored) };
|
|
const service = new UserPreferencesService(repo as never);
|
|
|
|
await expect(service.getOrDefault('u1')).resolves.toEqual(stored);
|
|
});
|
|
|
|
it('returns an in-memory default without persisting a row when none exists', async () => {
|
|
const repo = {
|
|
findByUserId: jest.fn().mockResolvedValue(undefined),
|
|
upsert: jest.fn(),
|
|
};
|
|
const service = new UserPreferencesService(repo as never);
|
|
|
|
const result = await service.getOrDefault('u1');
|
|
|
|
expect(result).toEqual({ userId: 'u1', ...DEFAULT_USER_PREFERENCE });
|
|
expect(repo.upsert).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('upsert', () => {
|
|
it('merges the partial dto onto the current effective preference before persisting', async () => {
|
|
const repo = {
|
|
findByUserId: jest.fn().mockResolvedValue({
|
|
userId: 'u1',
|
|
...DEFAULT_USER_PREFERENCE,
|
|
preferredPace: 'relaxed',
|
|
}),
|
|
upsert: jest
|
|
.fn()
|
|
.mockImplementation((userId: string, dto: UpdateUserPreferenceDto) =>
|
|
Promise.resolve({ userId, ...DEFAULT_USER_PREFERENCE, ...dto }),
|
|
),
|
|
};
|
|
const service = new UserPreferencesService(repo as never);
|
|
|
|
await service.upsert('u1', { childFriendlyPreferred: true });
|
|
|
|
expect(repo.upsert).toHaveBeenCalledWith(
|
|
'u1',
|
|
expect.objectContaining({
|
|
preferredPace: 'relaxed',
|
|
childFriendlyPreferred: true,
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
});
|