code quality
Some checks failed
CI / lint-typecheck (pull_request) Failing after 12s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped

This commit is contained in:
2026-01-26 02:27:37 +01:00
parent bf2c0fdb0c
commit afef777961
23 changed files with 565 additions and 134 deletions

View File

@@ -1,3 +1,18 @@
export interface ScoringSystem {
// Define scoring system properties based on your domain
// This is a placeholder - adjust based on actual scoring system structure
pointsPerPosition?: Record<number, number>;
bonusPoints?: {
polePosition?: number;
fastestLap?: number;
cleanRace?: number;
};
penalties?: {
timePenalty?: number;
pointsDeduction?: number;
};
}
export interface LeagueCreateCommand {
name: string;
description?: string;
@@ -16,7 +31,7 @@ export interface LeagueCreateCommand {
tracks?: string[];
// Scoring
scoringSystem?: any;
scoringSystem?: ScoringSystem;
bonusPointsEnabled: boolean;
penaltiesEnabled: boolean;

View File

@@ -1,3 +1,5 @@
import { ScoringSystem } from './LeagueCreateCommand';
export interface LeagueCreatedEvent {
type: 'LeagueCreatedEvent';
leagueId: string;
@@ -5,10 +7,33 @@ export interface LeagueCreatedEvent {
timestamp: Date;
}
export interface LeagueUpdates {
name?: string;
description?: string;
visibility?: 'public' | 'private';
maxDrivers?: number;
approvalRequired?: boolean;
lateJoinAllowed?: boolean;
raceFrequency?: string;
raceDay?: string;
raceTime?: string;
tracks?: string[];
scoringSystem?: ScoringSystem;
bonusPointsEnabled?: boolean;
penaltiesEnabled?: boolean;
protestsEnabled?: boolean;
appealsEnabled?: boolean;
stewardTeam?: string[];
gameType?: string;
skillLevel?: string;
category?: string;
tags?: string[];
}
export interface LeagueUpdatedEvent {
type: 'LeagueUpdatedEvent';
leagueId: string;
updates: Partial<any>;
updates: Partial<LeagueUpdates>;
timestamp: Date;
}

View File

@@ -1,3 +1,5 @@
import { ScoringSystem } from './LeagueCreateCommand';
export interface LeagueData {
id: string;
name: string;
@@ -20,7 +22,7 @@ export interface LeagueData {
tracks: string[] | null;
// Scoring
scoringSystem: any | null;
scoringSystem: ScoringSystem | null;
bonusPointsEnabled: boolean;
penaltiesEnabled: boolean;

View File

@@ -1,28 +1,63 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { describe, it, expect, vi, beforeEach, Mock } from 'vitest';
import { CreateLeagueUseCase } from './CreateLeagueUseCase';
import { LeagueCreateCommand } from '../ports/LeagueCreateCommand';
import { LeagueRepository } from '../ports/LeagueRepository';
import { LeagueEventPublisher } from '../ports/LeagueEventPublisher';
describe('CreateLeagueUseCase', () => {
let mockLeagueRepository: any;
let mockEventPublisher: any;
let mockLeagueRepository: LeagueRepository;
let mockEventPublisher: LeagueEventPublisher;
let useCase: CreateLeagueUseCase;
beforeEach(() => {
mockLeagueRepository = {
create: vi.fn().mockImplementation((data) => Promise.resolve(data)),
updateStats: vi.fn().mockResolvedValue(undefined),
updateFinancials: vi.fn().mockResolvedValue(undefined),
updateStewardingMetrics: vi.fn().mockResolvedValue(undefined),
updatePerformanceMetrics: vi.fn().mockResolvedValue(undefined),
updateRatingMetrics: vi.fn().mockResolvedValue(undefined),
updateTrendMetrics: vi.fn().mockResolvedValue(undefined),
updateSuccessRateMetrics: vi.fn().mockResolvedValue(undefined),
updateResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined),
updateComplexSuccessRateMetrics: vi.fn().mockResolvedValue(undefined),
updateComplexResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined),
create: vi.fn().mockImplementation((data) => Promise.resolve(data)) as unknown as Mock,
findById: vi.fn() as unknown as Mock,
findByName: vi.fn() as unknown as Mock,
findByOwner: vi.fn() as unknown as Mock,
search: vi.fn() as unknown as Mock,
update: vi.fn() as unknown as Mock,
delete: vi.fn() as unknown as Mock,
getStats: vi.fn() as unknown as Mock,
updateStats: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getFinancials: vi.fn() as unknown as Mock,
updateFinancials: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getStewardingMetrics: vi.fn() as unknown as Mock,
updateStewardingMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getPerformanceMetrics: vi.fn() as unknown as Mock,
updatePerformanceMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getRatingMetrics: vi.fn() as unknown as Mock,
updateRatingMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getTrendMetrics: vi.fn() as unknown as Mock,
updateTrendMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getSuccessRateMetrics: vi.fn() as unknown as Mock,
updateSuccessRateMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getComplexSuccessRateMetrics: vi.fn() as unknown as Mock,
updateComplexSuccessRateMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getComplexResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateComplexResolutionTimeMetrics: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
getLeagueMembers: vi.fn() as unknown as Mock,
getPendingRequests: vi.fn() as unknown as Mock,
addLeagueMembers: vi.fn() as unknown as Mock,
updateLeagueMember: vi.fn() as unknown as Mock,
removeLeagueMember: vi.fn() as unknown as Mock,
addPendingRequests: vi.fn() as unknown as Mock,
removePendingRequest: vi.fn() as unknown as Mock,
};
mockEventPublisher = {
emitLeagueCreated: vi.fn().mockResolvedValue(undefined),
emitLeagueCreated: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
emitLeagueUpdated: vi.fn() as unknown as Mock,
emitLeagueDeleted: vi.fn() as unknown as Mock,
emitLeagueAccessed: vi.fn() as unknown as Mock,
emitLeagueRosterAccessed: vi.fn() as unknown as Mock,
getLeagueCreatedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock,
getLeagueUpdatedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock,
getLeagueDeletedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock,
getLeagueAccessedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock,
getLeagueRosterAccessedEventCount: vi.fn().mockReturnValue(0) as unknown as Mock,
clear: vi.fn() as unknown as Mock,
};
useCase = new CreateLeagueUseCase(mockLeagueRepository, mockEventPublisher);
});
@@ -51,12 +86,12 @@ describe('CreateLeagueUseCase', () => {
});
it('should throw error if name is missing', async () => {
const command: any = { ownerId: 'owner-1' };
const command = { ownerId: 'owner-1' } as unknown as LeagueCreateCommand;
await expect(useCase.execute(command)).rejects.toThrow('League name is required');
});
it('should throw error if ownerId is missing', async () => {
const command: any = { name: 'League' };
const command = { name: 'League' } as unknown as LeagueCreateCommand;
await expect(useCase.execute(command)).rejects.toThrow('Owner ID is required');
});
});

View File

@@ -1,19 +1,94 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { describe, it, expect, vi, beforeEach, Mock } from 'vitest';
import { DemoteAdminUseCase } from './DemoteAdminUseCase';
import { LeagueRepository } from '../ports/LeagueRepository';
import { DriverRepository } from '../../racing/domain/repositories/DriverRepository';
import { LeagueEventPublisher } from '../ports/LeagueEventPublisher';
describe('DemoteAdminUseCase', () => {
let mockLeagueRepository: any;
let mockDriverRepository: any;
let mockEventPublisher: any;
let mockLeagueRepository: LeagueRepository;
let mockDriverRepository: DriverRepository;
let mockEventPublisher: LeagueEventPublisher;
let useCase: DemoteAdminUseCase;
beforeEach(() => {
mockLeagueRepository = {
updateLeagueMember: vi.fn().mockResolvedValue(undefined),
updateLeagueMember: vi.fn().mockResolvedValue(undefined) as unknown as Mock,
create: vi.fn() as unknown as Mock,
findById: vi.fn() as unknown as Mock,
findByName: vi.fn() as unknown as Mock,
findByOwner: vi.fn() as unknown as Mock,
search: vi.fn() as unknown as Mock,
update: vi.fn() as unknown as Mock,
delete: vi.fn() as unknown as Mock,
getStats: vi.fn() as unknown as Mock,
updateStats: vi.fn() as unknown as Mock,
getFinancials: vi.fn() as unknown as Mock,
updateFinancials: vi.fn() as unknown as Mock,
getStewardingMetrics: vi.fn() as unknown as Mock,
updateStewardingMetrics: vi.fn() as unknown as Mock,
getPerformanceMetrics: vi.fn() as unknown as Mock,
updatePerformanceMetrics: vi.fn() as unknown as Mock,
getRatingMetrics: vi.fn() as unknown as Mock,
updateRatingMetrics: vi.fn() as unknown as Mock,
getTrendMetrics: vi.fn() as unknown as Mock,
updateTrendMetrics: vi.fn() as unknown as Mock,
getSuccessRateMetrics: vi.fn() as unknown as Mock,
updateSuccessRateMetrics: vi.fn() as unknown as Mock,
getResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateResolutionTimeMetrics: vi.fn() as unknown as Mock,
getComplexSuccessRateMetrics: vi.fn() as unknown as Mock,
updateComplexSuccessRateMetrics: vi.fn() as unknown as Mock,
getComplexResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateComplexResolutionTimeMetrics: vi.fn() as unknown as Mock,
getLeagueMembers: vi.fn() as unknown as Mock,
getPendingRequests: vi.fn() as unknown as Mock,
addLeagueMembers: vi.fn() as unknown as Mock,
removeLeagueMember: vi.fn() as unknown as Mock,
addPendingRequests: vi.fn() as unknown as Mock,
removePendingRequest: vi.fn() as unknown as Mock,
};
mockDriverRepository = {};
mockEventPublisher = {};
useCase = new DemoteAdminUseCase(mockLeagueRepository, mockDriverRepository, mockEventPublisher as any);
mockDriverRepository = {
findById: vi.fn() as unknown as Mock,
findByName: vi.fn() as unknown as Mock,
findByEmail: vi.fn() as unknown as Mock,
search: vi.fn() as unknown as Mock,
update: vi.fn() as unknown as Mock,
delete: vi.fn() as unknown as Mock,
getStats: vi.fn() as unknown as Mock,
updateStats: vi.fn() as unknown as Mock,
getPerformanceMetrics: vi.fn() as unknown as Mock,
updatePerformanceMetrics: vi.fn() as unknown as Mock,
getRatingMetrics: vi.fn() as unknown as Mock,
updateRatingMetrics: vi.fn() as unknown as Mock,
getTrendMetrics: vi.fn() as unknown as Mock,
updateTrendMetrics: vi.fn() as unknown as Mock,
getSuccessRateMetrics: vi.fn() as unknown as Mock,
updateSuccessRateMetrics: vi.fn() as unknown as Mock,
getResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateResolutionTimeMetrics: vi.fn() as unknown as Mock,
getComplexSuccessRateMetrics: vi.fn() as unknown as Mock,
updateComplexSuccessRateMetrics: vi.fn() as unknown as Mock,
getComplexResolutionTimeMetrics: vi.fn() as unknown as Mock,
updateComplexResolutionTimeMetrics: vi.fn() as unknown as Mock,
getDriverMemberships: vi.fn() as unknown as Mock,
addDriverMembership: vi.fn() as unknown as Mock,
updateDriverMembership: vi.fn() as unknown as Mock,
removeDriverMembership: vi.fn() as unknown as Mock,
};
mockEventPublisher = {
emitLeagueCreated: vi.fn() as unknown as Mock,
emitLeagueUpdated: vi.fn() as unknown as Mock,
emitLeagueDeleted: vi.fn() as unknown as Mock,
emitLeagueAccessed: vi.fn() as unknown as Mock,
emitLeagueRosterAccessed: vi.fn() as unknown as Mock,
getLeagueCreatedEventCount: vi.fn() as unknown as Mock,
getLeagueUpdatedEventCount: vi.fn() as unknown as Mock,
getLeagueDeletedEventCount: vi.fn() as unknown as Mock,
getLeagueAccessedEventCount: vi.fn() as unknown as Mock,
getLeagueRosterAccessedEventCount: vi.fn() as unknown as Mock,
clear: vi.fn() as unknown as Mock,
};
useCase = new DemoteAdminUseCase(mockLeagueRepository, mockDriverRepository, mockEventPublisher);
});
it('should update member role to member', async () => {