user sync optinization

This commit is contained in:
2025-12-15 20:00:55 +08:00
parent 15a1551eb6
commit 9301df860e
6 changed files with 148 additions and 16 deletions

View File

@@ -8,9 +8,11 @@ describe('AuthService', () => {
let service: AuthService;
const mockCreateFromToken = jest.fn();
const mockFindByKeycloakSub = jest.fn();
const mockUsersService = {
createFromToken: mockCreateFromToken,
findByKeycloakSub: mockFindByKeycloakSub,
};
const mockAuthUser: AuthenticatedUser = {
@@ -202,6 +204,81 @@ describe('AuthService', () => {
});
});
describe('ensureUserExists', () => {
it('should return existing user without updating', async () => {
mockFindByKeycloakSub.mockResolvedValue(mockUser);
const result = await service.ensureUserExists(mockAuthUser);
expect(result).toEqual(mockUser);
expect(mockFindByKeycloakSub).toHaveBeenCalledWith('f:realm:user123');
expect(mockCreateFromToken).not.toHaveBeenCalled();
});
it('should create new user if user does not exist', async () => {
mockFindByKeycloakSub.mockResolvedValue(null);
mockCreateFromToken.mockResolvedValue(mockUser);
const result = await service.ensureUserExists(mockAuthUser);
expect(result).toEqual(mockUser);
expect(mockFindByKeycloakSub).toHaveBeenCalledWith('f:realm:user123');
expect(mockCreateFromToken).toHaveBeenCalledWith({
keycloakSub: 'f:realm:user123',
email: 'test@example.com',
name: 'Test User',
username: 'testuser',
picture: 'https://example.com/avatar.jpg',
roles: ['user', 'premium'],
});
});
it('should handle user with no email when creating new user', async () => {
const authUserNoEmail: AuthenticatedUser = {
keycloakSub: 'f:realm:user456',
name: 'No Email User',
};
mockFindByKeycloakSub.mockResolvedValue(null);
mockCreateFromToken.mockResolvedValue({
...mockUser,
email: '',
name: 'No Email User',
});
await service.ensureUserExists(authUserNoEmail);
expect(mockFindByKeycloakSub).toHaveBeenCalledWith('f:realm:user456');
expect(mockCreateFromToken).toHaveBeenCalledWith(
expect.objectContaining({
email: '',
name: 'No Email User',
}),
);
});
it('should use "Unknown User" when creating user with no name or username', async () => {
const authUserMinimal: AuthenticatedUser = {
keycloakSub: 'f:realm:minimal',
};
mockFindByKeycloakSub.mockResolvedValue(null);
mockCreateFromToken.mockResolvedValue({
...mockUser,
name: 'Unknown User',
});
await service.ensureUserExists(authUserMinimal);
expect(mockFindByKeycloakSub).toHaveBeenCalledWith('f:realm:minimal');
expect(mockCreateFromToken).toHaveBeenCalledWith(
expect.objectContaining({
name: 'Unknown User',
}),
);
});
});
describe('hasRole', () => {
it('should return true if user has the required role', () => {
const result = service.hasRole(mockAuthUser, 'user');