website refactor

This commit is contained in:
2026-01-16 15:20:25 +01:00
parent 7e02fc3ea5
commit 37b1aa626c
325 changed files with 2167 additions and 2782 deletions

View File

@@ -1,6 +1,6 @@
import { AnalyticsSnapshot } from '@core/analytics/domain/entities/AnalyticsSnapshot';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { AnalyticsSnapshot } from '@core/analytics/application/repositories/PageViewRepository';
import { InMemoryAnalyticsSnapshotRepository } from './InMemoryAnalyticsSnapshotRepository';
describe('InMemoryAnalyticsSnapshotRepository', () => {

View File

@@ -1,6 +1,6 @@
import { EngagementEvent } from '@core/analytics/domain/entities/EngagementEvent';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { EngagementEvent } from '@core/analytics/application/repositories/PageViewRepository';
import { InMemoryEngagementRepository } from './InMemoryEngagementRepository';
describe('InMemoryEngagementRepository', () => {

View File

@@ -1,6 +1,6 @@
import { PageView } from '@core/analytics/domain/entities/PageView';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { PageView } from '@core/analytics/application/repositories/PageViewRepository';
import { InMemoryPageViewRepository } from './InMemoryPageViewRepository';
describe('InMemoryPageViewRepository', () => {

View File

@@ -1,13 +1,13 @@
import { SignupWithEmailUseCase } from '@core/identity/application/use-cases/SignupWithEmailUseCase';
import { CreateAchievementUseCase } from '@core/identity/application/use-cases/achievement/CreateAchievementUseCase';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import {
DRIVER_ACHIEVEMENTS,
STEWARD_ACHIEVEMENTS,
ADMIN_ACHIEVEMENTS,
COMMUNITY_ACHIEVEMENTS,
ADMIN_ACHIEVEMENTS,
COMMUNITY_ACHIEVEMENTS,
DRIVER_ACHIEVEMENTS,
STEWARD_ACHIEVEMENTS,
} from '@core/identity/domain/AchievementConstants';

View File

@@ -1,13 +1,13 @@
import { Game } from '@core/racing/domain/entities/Game';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { LeagueScoringConfig } from '@core/racing/domain/entities/LeagueScoringConfig';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { Logger } from '@core/shared/domain/Logger';
import {
InMemoryChampionshipStandingRepository,
InMemoryGameRepository,
InMemoryLeagueScoringConfigRepository,
InMemorySeasonRepository,
InMemoryChampionshipStandingRepository,
InMemoryGameRepository,
InMemoryLeagueScoringConfigRepository,
InMemorySeasonRepository,
} from '../racing/persistence/inmemory/InMemoryScoringRepositories';
import type { Logger } from '@core/shared/domain';
import { getLeagueScoringPresetById } from './LeagueScoringPresets';
/* eslint-disable @typescript-eslint/no-unused-vars */

View File

@@ -1,16 +1,12 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import type { Logger } from '@core/shared/domain';
import type { AuthRepository } from '@core/identity/domain/repositories/AuthRepository';
import type { PasswordHashingService } from '@core/identity/domain/services/PasswordHashingService';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import { User } from '@core/identity/domain/entities/User';
import { AdminUser } from '@core/admin/domain/entities/AdminUser';
import { EmailAddress } from '@core/identity/domain/value-objects/EmailAddress';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import { Email } from '@core/admin/domain/value-objects/Email';
import { UserRole } from '@core/admin/domain/value-objects/UserRole';
import { UserStatus } from '@core/admin/domain/value-objects/UserStatus';
import { User } from '@core/identity/domain/entities/User';
import { EmailAddress } from '@core/identity/domain/value-objects/EmailAddress';
import { PasswordHash } from '@core/identity/domain/value-objects/PasswordHash';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import type { Logger } from '@core/shared/domain/Logger';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
// Import the class we're testing (will be created)
import { SeedDemoUsers } from './SeedDemoUsers';

View File

@@ -1,13 +1,10 @@
import type { Logger } from '@core/shared/domain';
import type { AuthRepository } from '@core/identity/domain/repositories/AuthRepository';
import type { PasswordHashingService } from '@core/identity/domain/services/PasswordHashingService';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import { User } from '@core/identity/domain/entities/User';
import { AdminUser } from '@core/admin/domain/entities/AdminUser';
import { EmailAddress } from '@core/identity/domain/value-objects/EmailAddress';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import { Email } from '@core/admin/domain/value-objects/Email';
import { User } from '@core/identity/domain/entities/User';
import { EmailAddress } from '@core/identity/domain/value-objects/EmailAddress';
import { PasswordHash } from '@core/identity/domain/value-objects/PasswordHash';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import type { Logger } from '@core/shared/domain/Logger';
import { stableUuidFromSeedKey } from './racing/SeedIdHelper';
interface DemoUserSpec {
@@ -38,7 +35,7 @@ export class SeedDemoUsers {
{
email: 'demo.sponsor@example.com',
password: 'Demo1234!',
needsAdminUser: true,
needsAdminUser: false,
needsPrimaryDriverId: false,
roles: ['sponsor'],
displayName: 'Jane Sponsor',

View File

@@ -1,4 +1,4 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
// IMPORTANT: SeedRacingData imports createRacingSeed from ./racing/RacingSeed
// We mock it to avoid heavy seed generation and to keep the test focused on
@@ -34,7 +34,7 @@ vi.mock('./racing/RacingSeed', () => {
};
});
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { SeedRacingData, type RacingSeedDependencies } from './SeedRacingData';
describe('SeedRacingData force reseed behavior', () => {

View File

@@ -1,39 +1,14 @@
import type { Logger } from '@core/shared/domain';
import type { DriverRepository } from '@core/racing/domain/repositories/DriverRepository';
import type { LeagueRepository } from '@core/racing/domain/repositories/LeagueRepository';
import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import type { ResultRepository } from '@core/racing/domain/repositories/ResultRepository';
import type { StandingRepository } from '@core/racing/domain/repositories/StandingRepository';
import type { LeagueMembershipRepository } from '@core/racing/domain/repositories/LeagueMembershipRepository';
import type { RaceRegistrationRepository } from '@core/racing/domain/repositories/RaceRegistrationRepository';
import type { TeamRepository } from '@core/racing/domain/repositories/TeamRepository';
import type { TeamMembershipRepository } from '@core/racing/domain/repositories/TeamMembershipRepository';
import type { SponsorRepository } from '@core/racing/domain/repositories/SponsorRepository';
import type { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository';
import type { LeagueScoringConfigRepository } from '@core/racing/domain/repositories/LeagueScoringConfigRepository';
import type { SeasonSponsorshipRepository } from '@core/racing/domain/repositories/SeasonSponsorshipRepository';
import type { SponsorshipRequestRepository } from '@core/racing/domain/repositories/SponsorshipRequestRepository';
import type { LeagueWalletRepository } from '@core/racing/domain/repositories/LeagueWalletRepository';
import type { TransactionRepository } from '@core/racing/domain/repositories/TransactionRepository';
import type { Season } from '@core/racing/domain/entities/season/Season';
import { getLeagueScoringPresetById } from './LeagueScoringPresets';
import type { ProtestRepository } from '@core/racing/domain/repositories/ProtestRepository';
import type { PenaltyRepository } from '@core/racing/domain/repositories/PenaltyRepository';
import type { FeedRepository } from '@core/social/domain/repositories/FeedRepository';
import type { SocialGraphRepository } from '@core/social/domain/repositories/SocialGraphRepository';
import type { DriverStatsRepository } from '@core/racing/domain/repositories/DriverStatsRepository';
import type { TeamStatsRepository, TeamStats } from '@core/racing/domain/repositories/TeamStatsRepository';
import type { MediaRepository } from '@core/racing/domain/repositories/MediaRepository';
import type { AuthRepository } from '@core/identity/domain/repositories/AuthRepository';
import type { PasswordHashingService } from '@core/identity/domain/services/PasswordHashingService';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import { createRacingSeed } from './racing/RacingSeed';
import { seedId } from './racing/SeedIdHelper';
import type { DriverStats } from '@core/racing/application/use-cases/DriverStatsUseCase';
import { Driver } from '@core/racing/domain/entities/Driver';
import { Result } from '@core/racing/domain/entities/result/Result';
import type { Season } from '@core/racing/domain/entities/season/Season';
import { Standing } from '@core/racing/domain/entities/Standing';
import { Team } from '@core/racing/domain/entities/Team';
import type { DriverStats } from '@core/racing/application/use-cases/DriverStatsUseCase';
import type { TeamStats } from '@core/racing/domain/repositories/TeamStatsRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { getLeagueScoringPresetById } from './LeagueScoringPresets';
import { createRacingSeed } from './racing/RacingSeed';
import { seedId } from './racing/SeedIdHelper';
export type RacingSeedDependencies = {
driverRepository: IDriverRepository;

View File

@@ -62,7 +62,7 @@ export class RacingDriverFactory {
}
// Create system-default reference with avatar variant
return MediaReference.systemDefault(avatarVariant);
return MediaReference.createSystemDefault('avatar', avatarVariant);
}
create(): Driver[] {

View File

@@ -48,7 +48,7 @@ export class RacingTeamFactory {
leagues: teamLeagues,
isRecruiting,
createdAt: faker.date.past({ years: 2, refDate: this.baseDate }),
logoRef: MediaReference.generated('team', teamId),
logoRef: MediaReference.createGenerated(`team-${teamId}`),
});
});
}

View File

@@ -9,7 +9,7 @@ module.exports = {
fixable: null,
schema: [],
messages: {
invalidNaming: 'Adapter classes should end with "Adapter", "Repository", "Service", or "Entity". Found: {{name}}',
invalidNaming: 'Adapter classes should end with "Adapter", "Repository", "Service", "Factory" or "Entity". Found: {{name}}',
},
},
@@ -20,7 +20,7 @@ module.exports = {
if (!filename.includes('adapters/')) return;
const name = node.id.name;
const isValidName = /(.+)(Adapter|Repository|Service|Entity|Mapper|Schema|Guard|Module|Controller)$/.test(name);
const isValidName = /(.+)(Adapter|Factory|Repository|Service|Entity|Mapper|Schema|Guard|Module|Controller)$/.test(name);
if (!isValidName) {
context.report({

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import type { UserAchievement } from '@core/identity';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryAchievementRepository } from './InMemoryAchievementRepository';
describe('InMemoryAchievementRepository (identity)', () => {

View File

@@ -4,12 +4,13 @@
* In-memory implementation of IAchievementRepository
*/
import { Achievement, AchievementCategory, IAchievementRepository, UserAchievement } from "@core/identity";
import { Achievement } from "@core/identity/domain/entities/Achievement";
import { AchievementCategory } from "@core/identity/domain/types/AchievementTypes";
import { AchievementRepository } from "@core/identity/domain/repositories/AchievementRepository";
import { UserAchievement } from "@core/identity/domain/entities/UserAchievement";
import { ADMIN_ACHIEVEMENTS, COMMUNITY_ACHIEVEMENTS, DRIVER_ACHIEVEMENTS, STEWARD_ACHIEVEMENTS } from "@core/identity/domain/AchievementConstants";
import { Logger } from "@core/shared/domain";
export class InMemoryAchievementRepository implements AchievementRepository {
private achievements: Map<string, Achievement> = new Map();
private userAchievements: Map<string, UserAchievement> = new Map();
@@ -282,4 +283,4 @@ export class InMemoryAchievementRepository implements AchievementRepository {
this.userAchievements.clear();
this.logger.info('All achievement data cleared.');
}
}
}

View File

@@ -1,10 +1,10 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { UserId } from '@core/identity';
import { User } from '@core/identity/domain/entities/User';
import { InMemoryUserRepository } from './InMemoryUserRepository';
import { InMemoryAuthRepository } from './InMemoryAuthRepository';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryPasswordHashingService } from '../../services/InMemoryPasswordHashingService';
import { InMemoryAuthRepository } from './InMemoryAuthRepository';
import { InMemoryUserRepository } from './InMemoryUserRepository';
describe('InMemoryAuthRepository', () => {
let mockLogger: Logger;

View File

@@ -1,6 +1,7 @@
import type { SponsorAccount } from '@core/identity/domain/entities/SponsorAccount';
import { UserId } from '@core/identity/domain/value-objects/UserId';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { UserId, type SponsorAccount } from '@core/identity';
import { InMemorySponsorAccountRepository } from './InMemorySponsorAccountRepository';
describe('InMemorySponsorAccountRepository', () => {

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import type { UserRating } from '@core/identity';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryUserRatingRepository } from './InMemoryUserRatingRepository';
describe('InMemoryUserRatingRepository', () => {

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import type { StoredUser } from '@core/identity/domain/repositories/UserRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryUserRepository } from './InMemoryUserRepository';
describe('InMemoryUserRepository', () => {

View File

@@ -1,9 +1,9 @@
import { randomUUID } from 'node:crypto';
import { tryGetHttpRequestContext } from '@adapters/http/RequestContext';
import type { AuthenticatedUser } from '@core/identity/application/ports/IdentityProviderPort';
import type { AuthSession, IdentitySessionPort } from '@core/identity/application/ports/IdentitySessionPort';
import type { Logger } from '@core/shared/domain';
import { tryGetHttpRequestContext } from '@adapters/http/RequestContext';
import type { Logger } from '@core/shared/domain/Logger';
const COOKIE_NAME = 'gp_session';
const SESSION_TTL_MS = 3600 * 1000; // 1 hour

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { AvatarGenerationRequest } from '@core/media/domain/entities/AvatarGenerationRequest';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryAvatarGenerationRepository } from './InMemoryAvatarGenerationRepository';
describe('InMemoryAvatarGenerationRepository', () => {

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { InMemoryFaceValidationAdapter } from './InMemoryFaceValidationAdapter';
describe('InMemoryFaceValidationAdapter', () => {

View File

@@ -1,5 +1,5 @@
import type { FaceValidationPort, FaceValidationResult } from '@core/media/application/ports/FaceValidationPort';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryFaceValidationAdapter implements FaceValidationPort {
constructor(private readonly logger: Logger) {

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { InMemoryImageServiceAdapter } from './InMemoryImageServiceAdapter';
describe('InMemoryImageServiceAdapter', () => {

View File

@@ -1,5 +1,5 @@
import type { ImageServicePort } from '@core/racing/application/ports/ImageServicePort';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryImageServiceAdapter implements ImageServicePort {
constructor(private readonly logger: Logger) {

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { NotificationPreference } from '@core/notifications/domain/entities/NotificationPreference';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryNotificationPreferenceRepository } from './InMemoryNotificationPreferenceRepository';
describe('InMemoryNotificationPreferenceRepository', () => {

View File

@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { Notification } from '@core/notifications/domain/entities/Notification';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryNotificationRepository } from './InMemoryNotificationRepository';
describe('InMemoryNotificationRepository', () => {

View File

@@ -7,7 +7,7 @@
import { Notification } from '@core/notifications/domain/entities/Notification';
import type { NotificationRepository } from '@core/notifications/domain/repositories/NotificationRepository';
import type { NotificationType } from '@core/notifications/domain/types/NotificationTypes';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryNotificationRepository implements NotificationRepository {
private notifications: Map<string, Notification> = new Map();

View File

@@ -1,9 +1,7 @@
import type { NotificationService, SendNotificationCommand } from '@core/notifications/application/ports/NotificationService';
import type { NotificationRepository } from '@core/notifications/domain/repositories/NotificationRepository';
import type { NotificationPreferenceRepository } from '@core/notifications/domain/repositories/NotificationPreferenceRepository';
import type { NotificationGatewayRegistry } from '@core/notifications/application/ports/NotificationGateway';
import type { NotificationService, SendNotificationCommand } from '@core/notifications/application/ports/NotificationService';
import { SendNotificationUseCase } from '@core/notifications/application/use-cases/SendNotificationUseCase';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class NotificationServiceAdapter implements NotificationService {
private readonly useCase: SendNotificationUseCase;

View File

@@ -1,9 +1,9 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryCarRepository } from './InMemoryCarRepository';
import { Car } from '@core/racing/domain/entities/Car';
import { CarClass } from '@core/racing/domain/entities/CarClass';
import { CarLicense } from '@core/racing/domain/entities/CarLicense';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryCarRepository } from './InMemoryCarRepository';
describe('InMemoryCarRepository', () => {
let repository: InMemoryCarRepository;

View File

@@ -5,12 +5,12 @@
* Stores data in Map structure with UUID generation.
*/
import { v4 as uuidv4 } from 'uuid';
import { Car } from '@core/racing/domain/entities/Car';
import { CarClass } from '@core/racing/domain/entities/CarClass';
import { CarLicense } from '@core/racing/domain/entities/CarLicense';
import type { CarRepository } from '@core/racing/domain/repositories/CarRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { v4 as uuidv4 } from 'uuid';
export class InMemoryCarRepository implements CarRepository {
private cars: Map<string, Car>;

View File

@@ -1,8 +1,8 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryDriverRepository } from './InMemoryDriverRepository';
import { Driver } from '@core/racing/domain/entities/Driver';
import type { Logger } from '@core/shared/domain';
import { MediaReference } from '@core/domain/media/MediaReference';
import { Driver } from '@core/racing/domain/entities/Driver';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryDriverRepository } from './InMemoryDriverRepository';
describe('InMemoryDriverRepository', () => {
let repository: InMemoryDriverRepository;

View File

@@ -5,9 +5,9 @@
* Stores computed driver statistics for caching and frontend queries.
*/
import type { DriverStatsRepository } from '@core/racing/domain/repositories/DriverStatsRepository';
import type { DriverStats } from '@core/racing/application/use-cases/DriverStatsUseCase';
import type { Logger } from '@core/shared/domain';
import type { DriverStatsRepository } from '@core/racing/domain/repositories/DriverStatsRepository';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryDriverStatsRepository implements DriverStatsRepository {
private stats = new Map<string, DriverStats>();

View File

@@ -1,6 +1,6 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryGameRepository } from './InMemoryGameRepository';
import type { Logger } from '@core/shared/domain';
describe('InMemoryGameRepository', () => {
let repository: InMemoryGameRepository;

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { InMemoryLeagueMembershipRepository } from './InMemoryLeagueMembershipRepository';
describe('InMemoryLeagueMembershipRepository', () => {

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryLeagueRepository } from './InMemoryLeagueRepository';
import { League } from '@core/racing/domain/entities/League';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryLeagueRepository } from './InMemoryLeagueRepository';
describe('InMemoryLeagueRepository', () => {
let repository: InMemoryLeagueRepository;

View File

@@ -1,9 +1,9 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryLeagueScoringConfigRepository } from './InMemoryLeagueScoringConfigRepository';
import { LeagueScoringConfig, type LeagueScoringConfigProps } from '@core/racing/domain/entities/LeagueScoringConfig';
import type { ChampionshipConfig } from '@core/racing/domain/types/ChampionshipConfig';
import { PointsTable } from '@core/racing/domain/value-objects/PointsTable';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryLeagueScoringConfigRepository } from './InMemoryLeagueScoringConfigRepository';
const mockPointsTable = new PointsTable({ 1: 25, 2: 18, 3: 15 });

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryLeagueStandingsRepository } from './InMemoryLeagueStandingsRepository';
import type { Logger } from '@core/shared/domain';
import type { RawStanding } from '@core/league/application/ports/LeagueStandingsRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryLeagueStandingsRepository } from './InMemoryLeagueStandingsRepository';
describe('InMemoryLeagueStandingsRepository', () => {
let repository: InMemoryLeagueStandingsRepository;

View File

@@ -1,8 +1,8 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryLeagueWalletRepository } from './InMemoryLeagueWalletRepository';
import { LeagueWallet } from '@core/racing/domain/entities/league-wallet/LeagueWallet';
import { Money } from '@core/racing/domain/value-objects/Money';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryLeagueWalletRepository } from './InMemoryLeagueWalletRepository';
describe('InMemoryLeagueWalletRepository', () => {
let repository: InMemoryLeagueWalletRepository;

View File

@@ -6,7 +6,7 @@
import { LeagueWallet } from '@core/racing/domain/entities/league-wallet/LeagueWallet';
import type { LeagueWalletRepository } from '@core/racing/domain/repositories/LeagueWalletRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryLeagueWalletRepository implements LeagueWalletRepository {
private wallets: Map<string, LeagueWallet> = new Map();

View File

@@ -1,9 +1,9 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryLiveryRepository } from './InMemoryLiveryRepository';
import { DriverLivery } from '@core/racing/domain/entities/DriverLivery';
import { LiveryTemplate } from '@core/racing/domain/entities/LiveryTemplate';
import { LiveryDecal } from '@core/racing/domain/value-objects/LiveryDecal';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryLiveryRepository } from './InMemoryLiveryRepository';
describe('InMemoryLiveryRepository', () => {
let repository: InMemoryLiveryRepository;

View File

@@ -4,10 +4,10 @@
* Mock repository for testing and development
*/
import type { Logger } from '@core/shared/domain/Logger';
import type { DriverLivery } from '../../../../core/racing/domain/entities/DriverLivery';
import type { LiveryTemplate } from '../../../../core/racing/domain/entities/LiveryTemplate';
import type { LiveryRepository } from '../../../../core/racing/domain/repositories/LiveryRepository';
import type { Logger } from '@core/shared/domain';
export class InMemoryLiveryRepository implements LiveryRepository {
private driverLiveries: Map<string, DriverLivery> = new Map();

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryPenaltyRepository } from './InMemoryPenaltyRepository';
import { Penalty } from '@core/racing/domain/entities/penalty/Penalty';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryPenaltyRepository } from './InMemoryPenaltyRepository';
describe('InMemoryPenaltyRepository', () => {
let repository: InMemoryPenaltyRepository;

View File

@@ -6,7 +6,7 @@
import type { Penalty } from '@core/racing/domain/entities/penalty/Penalty';
import type { PenaltyRepository } from '@core/racing/domain/repositories/PenaltyRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryPenaltyRepository implements PenaltyRepository {
private penalties: Map<string, Penalty> = new Map();

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryProtestRepository } from './InMemoryProtestRepository';
import { Protest } from '@core/racing/domain/entities/Protest';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryProtestRepository } from './InMemoryProtestRepository';
describe('InMemoryProtestRepository', () => {
let repository: InMemoryProtestRepository;

View File

@@ -1,9 +1,9 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryRaceEventRepository } from './InMemoryRaceEventRepository';
import { RaceEvent } from '@core/racing/domain/entities/RaceEvent';
import { Session } from '@core/racing/domain/entities/Session';
import { SessionType } from '@core/racing/domain/value-objects/SessionType';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryRaceEventRepository } from './InMemoryRaceEventRepository';
describe('InMemoryRaceEventRepository', () => {
let repository: InMemoryRaceEventRepository;

View File

@@ -1,9 +1,9 @@
/**
* In-memory implementation of IRaceEventRepository for development/testing.
*/
import type { RaceEventRepository } from '@core/racing/domain/repositories/RaceEventRepository';
import type { RaceEvent } from '@core/racing/domain/entities/RaceEvent';
import type { Logger } from '@core/shared/domain';
import type { RaceEventRepository } from '@core/racing/domain/repositories/RaceEventRepository';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryRaceEventRepository implements RaceEventRepository {
private raceEvents: Map<string, RaceEvent> = new Map();

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryRaceRegistrationRepository } from './InMemoryRaceRegistrationRepository';
import { RaceRegistration } from '@core/racing/domain/entities/RaceRegistration';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryRaceRegistrationRepository } from './InMemoryRaceRegistrationRepository';
describe('InMemoryRaceRegistrationRepository', () => {
let repository: InMemoryRaceRegistrationRepository;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryRaceRepository } from './InMemoryRaceRepository';
import { Race, type RaceStatusValue } from '@core/racing/domain/entities/Race';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryRaceRepository } from './InMemoryRaceRepository';
describe('InMemoryRaceRepository', () => {
let repository: InMemoryRaceRepository;

View File

@@ -1,8 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryResultRepository } from './InMemoryResultRepository';
import { Result } from '@core/racing/domain/entities/result/Result';
import type { Logger } from '@core/shared/domain';
import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryResultRepository } from './InMemoryResultRepository';
describe('InMemoryResultRepository', () => {
let repository: InMemoryResultRepository;

View File

@@ -5,11 +5,10 @@
* Stores data in Map structure with UUID generation.
*/
import { v4 as uuidv4 } from 'uuid';
import { Result } from '@core/racing/domain/entities/result/Result';
import type { ResultRepository } from '@core/racing/domain/repositories/ResultRepository';
import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { v4 as uuidv4 } from 'uuid';
export class InMemoryResultRepository implements ResultRepository {
private results: Map<string, Result>;

View File

@@ -1,15 +1,15 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import {
InMemoryGameRepository,
InMemorySeasonRepository,
InMemoryLeagueScoringConfigRepository,
InMemoryChampionshipStandingRepository,
} from './InMemoryScoringRepositories';
import { Game } from '@core/racing/domain/entities/Game';
import { Season } from '@core/racing/domain/entities/season/Season';
import { LeagueScoringConfig } from '@core/racing/domain/entities/LeagueScoringConfig';
import { ChampionshipStanding } from '@core/racing/domain/entities/championship/ChampionshipStanding';
import type { Logger } from '@core/shared/domain';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import {
InMemoryChampionshipStandingRepository,
InMemoryGameRepository,
InMemoryLeagueScoringConfigRepository,
InMemorySeasonRepository,
} from './InMemoryScoringRepositories';
describe('InMemoryScoringRepositories', () => {
let mockLogger: Logger;

View File

@@ -1,12 +1,12 @@
import { Game } from '@core/racing/domain/entities/Game';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { LeagueScoringConfig } from '@core/racing/domain/entities/LeagueScoringConfig';
import type { GameRepository } from '@core/racing/domain/repositories/GameRepository';
import type { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository';
import type { LeagueScoringConfigRepository } from '@core/racing/domain/repositories/LeagueScoringConfigRepository';
import type { ChampionshipStandingRepository } from '@core/racing/domain/repositories/ChampionshipStandingRepository';
import { ChampionshipStanding } from '@core/racing/domain/entities/championship/ChampionshipStanding';
import type { Logger } from '@core/shared/domain';
import { Game } from '@core/racing/domain/entities/Game';
import type { LeagueScoringConfig } from '@core/racing/domain/entities/LeagueScoringConfig';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { ChampionshipStandingRepository } from '@core/racing/domain/repositories/ChampionshipStandingRepository';
import type { GameRepository } from '@core/racing/domain/repositories/GameRepository';
import type { LeagueScoringConfigRepository } from '@core/racing/domain/repositories/LeagueScoringConfigRepository';
import type { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryGameRepository implements GameRepository {

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySeasonRepository } from './InMemorySeasonRepository';
import { Season } from '@core/racing/domain/entities/season/Season';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySeasonRepository } from './InMemorySeasonRepository';
describe('InMemorySeasonRepository', () => {
let repository: InMemorySeasonRepository;

View File

@@ -1,8 +1,8 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySeasonSponsorshipRepository } from './InMemorySeasonSponsorshipRepository';
import { SeasonSponsorship, type SponsorshipTier } from '@core/racing/domain/entities/season/SeasonSponsorship';
import { Money } from '@core/racing/domain/value-objects/Money';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySeasonSponsorshipRepository } from './InMemorySeasonSponsorshipRepository';
describe('InMemorySeasonSponsorshipRepository', () => {
let repository: InMemorySeasonSponsorshipRepository;

View File

@@ -6,7 +6,7 @@
import type { SeasonSponsorship, SponsorshipTier } from '@core/racing/domain/entities/season/SeasonSponsorship';
import type { SeasonSponsorshipRepository } from '@core/racing/domain/repositories/SeasonSponsorshipRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemorySeasonSponsorshipRepository implements SeasonSponsorshipRepository {
private sponsorships: Map<string, SeasonSponsorship> = new Map();

View File

@@ -1,8 +1,8 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySessionRepository } from './InMemorySessionRepository';
import { Session, SessionStatus } from '@core/racing/domain/entities/Session';
import { SessionType } from '@core/racing/domain/value-objects/SessionType';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySessionRepository } from './InMemorySessionRepository';
describe('InMemorySessionRepository', () => {
let repository: InMemorySessionRepository;

View File

@@ -1,9 +1,9 @@
/**
* In-memory implementation of ISessionRepository for development/testing.
*/
import type { SessionRepository } from '@core/racing/domain/repositories/SessionRepository';
import type { Session } from '@core/racing/domain/entities/Session';
import type { Logger } from '@core/shared/domain';
import type { SessionRepository } from '@core/racing/domain/repositories/SessionRepository';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemorySessionRepository implements SessionRepository {
private sessions: Map<string, Session> = new Map();

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySponsorRepository } from './InMemorySponsorRepository';
import { Sponsor } from '@core/racing/domain/entities/sponsor/Sponsor';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySponsorRepository } from './InMemorySponsorRepository';
describe('InMemorySponsorRepository', () => {
let repository: InMemorySponsorRepository;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySponsorshipPricingRepository } from './InMemorySponsorshipPricingRepository';
import { SponsorshipPricing } from '@core/racing/domain/value-objects/SponsorshipPricing';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySponsorshipPricingRepository } from './InMemorySponsorshipPricingRepository';
describe('InMemorySponsorshipPricingRepository', () => {
let repository: InMemorySponsorshipPricingRepository;

View File

@@ -2,10 +2,10 @@
* InMemory implementation of ISponsorshipPricingRepository
*/
import type { SponsorableEntityType } from '@core/racing/domain/entities/SponsorshipRequest';
import type { SponsorshipPricingRepository } from '@core/racing/domain/repositories/SponsorshipPricingRepository';
import { SponsorshipPricing } from '@core/racing/domain/value-objects/SponsorshipPricing';
import type { SponsorableEntityType } from '@core/racing/domain/entities/SponsorshipRequest';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemorySponsorshipPricingRepository implements SponsorshipPricingRepository {
private pricings: Map<string, { entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }> = new Map();

View File

@@ -1,9 +1,9 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemorySponsorshipRequestRepository } from './InMemorySponsorshipRequestRepository';
import { SponsorshipRequest, SponsorableEntityType, SponsorshipRequestStatus } from '@core/racing/domain/entities/SponsorshipRequest';
import { Money } from '@core/racing/domain/value-objects/Money';
import { SponsorshipTier } from '@core/racing/domain/entities/season/SeasonSponsorship';
import type { Logger } from '@core/shared/domain';
import { SponsorableEntityType, SponsorshipRequest, SponsorshipRequestStatus } from '@core/racing/domain/entities/SponsorshipRequest';
import { Money } from '@core/racing/domain/value-objects/Money';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemorySponsorshipRequestRepository } from './InMemorySponsorshipRequestRepository';
describe('InMemorySponsorshipRequestRepository', () => {
let repository: InMemorySponsorshipRequestRepository;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryStandingRepository } from './InMemoryStandingRepository';
import { Standing } from '@core/racing/domain/entities/Standing';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryStandingRepository } from './InMemoryStandingRepository';
/* eslint-disable @typescript-eslint/no-explicit-any */

View File

@@ -7,10 +7,7 @@
import { Standing } from '@core/racing/domain/entities/Standing';
import type { StandingRepository } from '@core/racing/domain/repositories/StandingRepository';
import type { ResultRepository } from '@core/racing/domain/repositories/ResultRepository';
import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import type { LeagueRepository } from '@core/racing/domain/repositories/LeagueRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryStandingRepository implements StandingRepository {
private standings: Map<string, Standing>;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import type { TeamJoinRequest, TeamMembership } from '@core/racing/domain/types/TeamMembership';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryTeamMembershipRepository } from './InMemoryTeamMembershipRepository';
import type { TeamMembership, TeamJoinRequest } from '@core/racing/domain/types/TeamMembership';
import type { Logger } from '@core/shared/domain';
/* eslint-disable @typescript-eslint/no-explicit-any */

View File

@@ -5,12 +5,12 @@
* Stores memberships and join requests in Map structures.
*/
import type {
TeamMembership,
TeamJoinRequest,
} from '@core/racing/domain/types/TeamMembership';
import type { TeamMembershipRepository } from '@core/racing/domain/repositories/TeamMembershipRepository';
import type { Logger } from '@core/shared/domain';
import type {
TeamJoinRequest,
TeamMembership,
} from '@core/racing/domain/types/TeamMembership';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryTeamMembershipRepository implements TeamMembershipRepository {
private membershipsByTeam: Map<string, TeamMembership[]>;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryTeamRepository } from './InMemoryTeamRepository';
import type { Logger } from '@core/shared/domain';
import { Team } from '@core/racing/domain/entities/Team';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryTeamRepository } from './InMemoryTeamRepository';
describe('InMemoryTeamRepository', () => {
let repository: InMemoryTeamRepository;

View File

@@ -5,10 +5,10 @@
* Stores data in a Map structure.
*/
import { MediaReference } from '@core/domain/media/MediaReference';
import { Team } from '@core/racing/domain/entities/Team';
import type { TeamRepository } from '@core/racing/domain/repositories/TeamRepository';
import type { Logger } from '@core/shared/domain';
import { MediaReference } from '@core/domain/media/MediaReference';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryTeamRepository implements TeamRepository {
private teams: Map<string, Team>;

View File

@@ -1,7 +1,7 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryTrackRepository } from './InMemoryTrackRepository';
import type { Logger } from '@core/shared/domain';
import { Track } from '@core/racing/domain/entities/Track';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryTrackRepository } from './InMemoryTrackRepository';
describe('InMemoryTrackRepository', () => {
let repository: InMemoryTrackRepository;

View File

@@ -5,10 +5,10 @@
* Stores data in Map structure with UUID generation.
*/
import { v4 as uuidv4 } from 'uuid';
import { Track, TrackCategory } from '@core/racing/domain/entities/Track';
import type { TrackRepository } from '@core/racing/domain/repositories/TrackRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { v4 as uuidv4 } from 'uuid';
export class InMemoryTrackRepository implements TrackRepository {
private tracks: Map<string, Track>;

View File

@@ -1,10 +1,10 @@
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { InMemoryTransactionRepository } from './InMemoryTransactionRepository';
import { LeagueWalletId } from '@core/racing/domain/entities/league-wallet/LeagueWalletId';
import { Transaction, TransactionType } from '@core/racing/domain/entities/league-wallet/Transaction';
import { TransactionId } from '@core/racing/domain/entities/league-wallet/TransactionId';
import { LeagueWalletId } from '@core/racing/domain/entities/league-wallet/LeagueWalletId';
import { Money } from '@core/racing/domain/value-objects/Money';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { InMemoryTransactionRepository } from './InMemoryTransactionRepository';
describe('InMemoryTransactionRepository', () => {
let repository: InMemoryTransactionRepository;

View File

@@ -6,7 +6,7 @@
import type { Transaction, TransactionType } from '@core/racing/domain/entities/league-wallet/Transaction';
import type { TransactionRepository } from '@core/racing/domain/repositories/TransactionRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryTransactionRepository implements TransactionRepository {
private transactions: Map<string, Transaction> = new Map();

View File

@@ -6,7 +6,7 @@
*/
import type { MediaRepository } from '@core/racing/domain/repositories/MediaRepository';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
export class InMemoryMediaRepository implements MediaRepository {
private driverAvatars = new Map<string, string>();

View File

@@ -22,9 +22,9 @@ describe('TypeOrmTeamRepository', () => {
const teamRepo = new TypeOrmTeamRepository(repo as any, mapper as any);
const team = await teamRepo.findById('team-1');
const team = await teamRepo.findById('550e8400-e29b-41d4-a716-446655440000');
expect(repo.findOne).toHaveBeenCalledWith({ where: { id: 'team-1' } });
expect(repo.findOne).toHaveBeenCalledWith({ where: { id: '550e8400-e29b-41d4-a716-446655440000' } });
expect(mapper.toDomain).toHaveBeenCalledWith(ormEntity);
expect(team).toEqual({ id: 'domain-team' });
});

View File

@@ -33,31 +33,20 @@ describe('TypeOrmDriverRepository', () => {
const repo = new TypeOrmDriverRepository(dataSource, mapper);
await expect(repo.findById('driver-1')).resolves.toBeNull();
await expect(repo.findById('00000000-0000-0000-0000-000000000001')).resolves.toBeNull();
});
it('persists and retrieves driver with avatarRef (roundtrip test)', async () => {
const driverId = '00000000-0000-0000-0000-000000000123';
// Create a driver with a specific avatar reference
const driver = Driver.create({
id: 'driver-123',
id: driverId,
iracingId: '456789',
name: 'Test Driver',
country: 'US',
avatarRef: MediaReference.createUploaded('media-abc-123'),
});
// Mock entity that would be saved
const mockEntity = {
id: 'driver-123',
iracingId: '456789',
name: 'Test Driver',
country: 'US',
bio: null,
joinedAt: driver.joinedAt.toDate(),
category: null,
avatarRef: { type: 'uploaded', mediaId: 'media-abc-123' },
};
const savedEntities: any[] = [];
const repo = {
@@ -82,32 +71,22 @@ describe('TypeOrmDriverRepository', () => {
expect(savedEntities[0].avatarRef).toEqual({ type: 'uploaded', mediaId: 'media-abc-123' });
// Test load
const loaded = await typeOrmRepo.findById('driver-123');
const loaded = await typeOrmRepo.findById(driverId);
expect(loaded).not.toBeNull();
expect(loaded!.avatarRef.type).toBe('uploaded');
expect(loaded!.avatarRef.mediaId).toBe('media-abc-123');
});
it('handles system-default avatarRef correctly', async () => {
const driverId = '00000000-0000-0000-0000-000000000456';
const driver = Driver.create({
id: 'driver-456',
id: driverId,
iracingId: '98765',
name: 'Default Driver',
country: 'UK',
avatarRef: MediaReference.createSystemDefault('avatar'),
});
const mockEntity = {
id: 'driver-456',
iracingId: '98765',
name: 'Default Driver',
country: 'UK',
bio: null,
joinedAt: driver.joinedAt.toDate(),
category: null,
avatarRef: { type: 'system-default', variant: 'avatar' },
};
const savedEntities: any[] = [];
const repo = {
@@ -129,31 +108,22 @@ describe('TypeOrmDriverRepository', () => {
expect(savedEntities[0].avatarRef).toEqual({ type: 'system-default', variant: 'avatar' });
const loaded = await typeOrmRepo.findById('driver-456');
const loaded = await typeOrmRepo.findById(driverId);
expect(loaded).not.toBeNull();
expect(loaded!.avatarRef.type).toBe('system-default');
expect(loaded!.avatarRef.variant).toBe('avatar');
});
it('handles generated avatarRef correctly', async () => {
const driverId = '00000000-0000-0000-0000-000000000789';
const driver = Driver.create({
id: 'driver-789',
id: driverId,
iracingId: '11111',
name: 'Generated Driver',
country: 'DE',
avatarRef: MediaReference.createGenerated('gen-req-xyz'),
});
const mockEntity = {
id: 'driver-789',
iracingId: '11111',
name: 'Generated Driver',
country: 'DE',
bio: null,
joinedAt: driver.joinedAt.toDate(),
category: null,
avatarRef: { type: 'generated', generationRequestId: 'gen-req-xyz' },
};
const savedEntities: any[] = [];
const repo = {
@@ -175,14 +145,16 @@ describe('TypeOrmDriverRepository', () => {
expect(savedEntities[0].avatarRef).toEqual({ type: 'generated', generationRequestId: 'gen-req-xyz' });
const loaded = await typeOrmRepo.findById('driver-789');
const loaded = await typeOrmRepo.findById(driverId);
expect(loaded).not.toBeNull();
expect(loaded!.avatarRef.type).toBe('generated');
expect(loaded!.avatarRef.generationRequestId).toBe('gen-req-xyz');
});
it('handles update with changed avatarRef', async () => {
const driverId = '00000000-0000-0000-0000-000000000000';
const driver = Driver.create({
id: 'driver-update',
id: driverId,
iracingId: '22222',
name: 'Update Driver',
country: 'FR',
@@ -220,8 +192,9 @@ describe('TypeOrmDriverRepository', () => {
expect(savedEntities).toHaveLength(2);
expect(savedEntities[1].avatarRef).toEqual({ type: 'uploaded', mediaId: 'new-media-id' });
const loaded = await typeOrmRepo.findById('driver-update');
const loaded = await typeOrmRepo.findById(driverId);
expect(loaded).not.toBeNull();
expect(loaded!.avatarRef.type).toBe('uploaded');
expect(loaded!.avatarRef.mediaId).toBe('new-media-id');
});
});
});

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { InMemoryDriverExtendedProfileProvider } from './InMemoryDriverExtendedProfileProvider';
describe('InMemoryDriverExtendedProfileProvider', () => {

View File

@@ -1,5 +1,5 @@
import type { DriverExtendedProfileProvider } from '@core/racing/application/ports/DriverExtendedProfileProvider';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
// TODO Provider doesnt exist in Clean Architecture
// TODO Hardcoded data here must be moved to a better place

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import { InMemoryDriverRatingProvider } from './InMemoryDriverRatingProvider';
describe('InMemoryDriverRatingProvider', () => {

View File

@@ -1,5 +1,5 @@
import type { DriverRatingProvider } from '@core/racing/application/ports/DriverRatingProvider';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
// TODO Provider doesnt exist in Clean Architecture
// TODO Hardcoded data here must be moved to a better place

View File

@@ -1,5 +1,5 @@
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { Logger } from '@core/shared/domain';
import type { RacingSeedData } from './InMemorySocialAndFeed';
import { InMemoryFeedRepository, InMemorySocialGraphRepository } from './InMemorySocialAndFeed';

View File

@@ -1,5 +1,5 @@
import type { Driver } from '@core/racing/domain/entities/Driver';
import type { Logger } from '@core/shared/domain';
import type { Logger } from '@core/shared/domain/Logger';
import type { FeedRepository } from '@core/social/domain/repositories/FeedRepository';
import type { SocialGraphRepository } from '@core/social/domain/repositories/SocialGraphRepository';
import type { FeedItem } from '@core/social/domain/types/FeedItem';