fix issues in core
This commit is contained in:
@@ -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 = {
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
Reference in New Issue
Block a user