feat: add user jit provisioning and preferences service

This commit is contained in:
Bastian Wagner
2026-08-17 14:43:13 +02:00
parent ec95a8e527
commit 7ca4bd9cf7
11 changed files with 382 additions and 7 deletions

View File

@@ -0,0 +1,60 @@
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,
}),
);
});
});
});