fix issues in core

This commit is contained in:
2025-12-23 15:38:50 +01:00
parent df5c20c5cc
commit 120d3bb1a1
125 changed files with 1005 additions and 793 deletions

View File

@@ -4,6 +4,10 @@ import { User } from '../../domain/entities/User';
import { IUserRepository, StoredUser } from '../../domain/repositories/IUserRepository';
import type { Logger, UseCaseOutputPort } from '@core/shared/application';
type GetCurrentSessionOutput = {
user: User;
};
describe('GetCurrentSessionUseCase', () => {
let useCase: GetCurrentSessionUseCase;
let mockUserRepo: {
@@ -14,7 +18,7 @@ describe('GetCurrentSessionUseCase', () => {
emailExists: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<GetCurrentSessionOutput> & { present: Mock };
beforeEach(() => {
mockUserRepo = {

View File

@@ -11,7 +11,7 @@ describe('GetCurrentUserSessionUseCase', () => {
clearSession: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<AuthSessionDTO | null> & { present: Mock };
let useCase: GetCurrentUserSessionUseCase;
beforeEach(() => {

View File

@@ -3,14 +3,16 @@ import { GetUserUseCase } from './GetUserUseCase';
import { User } from '../../domain/entities/User';
import type { IUserRepository, StoredUser } from '../../domain/repositories/IUserRepository';
import type { Logger, UseCaseOutputPort } from '@core/shared/application';
import type { Result } from '@core/shared/application/Result';
import { Result } from '@core/shared/application/Result';
type GetUserOutput = Result<{ user: User }, unknown>;
describe('GetUserUseCase', () => {
let userRepository: {
findById: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<GetUserOutput> & { present: Mock };
let useCase: GetUserUseCase;
beforeEach(() => {
@@ -54,8 +56,9 @@ describe('GetUserUseCase', () => {
expect(userRepository.findById).toHaveBeenCalledWith('user-1');
expect(result.isOk()).toBe(true);
expect(output.present).toHaveBeenCalled();
const callArgs = output.present.mock.calls?.[0]?.[0] as Result<any, any>;
const user = callArgs.unwrap().user;
const callArgs = output.present.mock.calls?.[0]?.[0];
expect(callArgs).toBeInstanceOf(Result);
const user = (callArgs as GetUserOutput).unwrap().user;
expect(user).toBeInstanceOf(User);
expect(user.getId().value).toBe('user-1');
expect(user.getDisplayName()).toBe('Test User');

View File

@@ -17,7 +17,7 @@ describe('HandleAuthCallbackUseCase', () => {
clearSession: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<AuthSessionDTO> & { present: Mock };
let useCase: HandleAuthCallbackUseCase;
beforeEach(() => {

View File

@@ -6,6 +6,8 @@ import {
type LoginErrorCode,
} from './LoginUseCase';
import { EmailAddress } from '../../domain/value-objects/EmailAddress';
import { UserId } from '../../domain/value-objects/UserId';
import { PasswordHash } from '../../domain/value-objects/PasswordHash';
import type { IAuthRepository } from '../../domain/repositories/IAuthRepository';
import type { IPasswordHashingService } from '../../domain/services/PasswordHashingService';
import { User } from '../../domain/entities/User';
@@ -56,13 +58,12 @@ describe('LoginUseCase', () => {
const emailVO = EmailAddress.create(input.email);
const user = User.create({
id: { value: 'user-1' } as any,
id: UserId.fromString('user-1'),
displayName: 'Test User',
email: emailVO.value,
passwordHash: PasswordHash.fromHash('stored-hash'),
});
(user as any).getPasswordHash = () => ({ value: 'stored-hash' });
authRepo.findByEmail.mockResolvedValue(user);
passwordService.verify.mockResolvedValue(true);
@@ -107,13 +108,12 @@ describe('LoginUseCase', () => {
const emailVO = EmailAddress.create(input.email);
const user = User.create({
id: { value: 'user-1' } as any,
id: UserId.fromString('user-1'),
displayName: 'Test User',
email: emailVO.value,
passwordHash: PasswordHash.fromHash('stored-hash'),
});
(user as any).getPasswordHash = () => ({ value: 'stored-hash' });
authRepo.findByEmail.mockResolvedValue(user);
passwordService.verify.mockResolvedValue(false);

View File

@@ -70,21 +70,29 @@ export class LoginWithEmailUseCase {
} as LoginWithEmailApplicationError);
}
const session = await this.sessionPort.createSession({
type CreateSessionInput = Parameters<IdentitySessionPort['createSession']>[0];
const createSessionInput = {
id: user.id,
displayName: user.displayName,
email: user.email,
primaryDriverId: user.primaryDriverId,
} as any);
...(user.email !== undefined ? { email: user.email } : {}),
...(user.primaryDriverId !== undefined
? { primaryDriverId: user.primaryDriverId }
: {}),
} satisfies CreateSessionInput;
const session = await this.sessionPort.createSession(createSessionInput);
const result: LoginWithEmailResult = {
sessionToken: (session as any).token,
userId: (session as any).user.id,
displayName: (session as any).user.displayName,
email: (session as any).user.email,
primaryDriverId: (session as any).user.primaryDriverId,
issuedAt: (session as any).issuedAt,
expiresAt: (session as any).expiresAt,
sessionToken: session.token,
userId: session.user.id,
displayName: session.user.displayName,
...(session.user.email !== undefined ? { email: session.user.email } : {}),
...(session.user.primaryDriverId !== undefined
? { primaryDriverId: session.user.primaryDriverId }
: {}),
issuedAt: session.issuedAt,
expiresAt: session.expiresAt,
};
this.output.present(result);

View File

@@ -13,6 +13,8 @@ vi.mock('../../domain/value-objects/PasswordHash', () => ({
},
}));
type SignupOutput = unknown;
describe('SignupUseCase', () => {
let authRepo: {
findByEmail: Mock;
@@ -22,7 +24,7 @@ describe('SignupUseCase', () => {
hash: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<SignupOutput> & { present: Mock };
let useCase: SignupUseCase;
beforeEach(() => {

View File

@@ -6,6 +6,8 @@ import type { IdentitySessionPort } from '../ports/IdentitySessionPort';
import type { AuthSessionDTO } from '../dto/AuthSessionDTO';
import type { Logger, UseCaseOutputPort } from '@core/shared/application';
type SignupWithEmailOutput = unknown;
describe('SignupWithEmailUseCase', () => {
let userRepository: {
findByEmail: Mock;
@@ -17,7 +19,7 @@ describe('SignupWithEmailUseCase', () => {
clearSession: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<SignupWithEmailOutput> & { present: Mock };
let useCase: SignupWithEmailUseCase;
beforeEach(() => {

View File

@@ -43,7 +43,7 @@ describe('StartAuthUseCase', () => {
it('returns ok and presents redirect when provider call succeeds', async () => {
const input: StartAuthInput = {
provider: 'IRACING_DEMO' as any,
provider: 'IRACING_DEMO',
returnTo: 'https://app/callback',
};
@@ -69,7 +69,7 @@ describe('StartAuthUseCase', () => {
it('wraps unexpected errors as REPOSITORY_ERROR and logs them', async () => {
const input: StartAuthInput = {
provider: 'IRACING_DEMO' as any,
provider: 'IRACING_DEMO',
returnTo: 'https://app/callback',
};

View File

@@ -3,13 +3,17 @@ import { CreateAchievementUseCase, type IAchievementRepository } from './CreateA
import { Achievement } from '@core/identity/domain/entities/Achievement';
import type { Logger, UseCaseOutputPort } from '@core/shared/application';
type CreateAchievementOutput = {
achievement: Achievement;
};
describe('CreateAchievementUseCase', () => {
let achievementRepository: {
save: Mock;
findById: Mock;
};
let logger: Logger;
let output: UseCaseOutputPort<any> & { present: Mock };
let output: UseCaseOutputPort<CreateAchievementOutput> & { present: Mock };
let useCase: CreateAchievementUseCase;
beforeEach(() => {