This commit is contained in:
2025-12-03 16:33:12 +01:00
parent a572e6edce
commit c0fdae3d3c
157 changed files with 7824 additions and 1042 deletions

View File

@@ -1,8 +1,8 @@
import { describe, it, expect } from 'vitest';
import { Result } from '@/packages/shared/result/Result';
import { CheckoutConfirmation } from '@/packages/domain/value-objects/CheckoutConfirmation';
import { CheckoutPrice } from '@/packages/domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '@/packages/automation-domain/value-objects/CheckoutConfirmation';
import { CheckoutPrice } from '@/packages/automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/automation-domain/value-objects/CheckoutState';
/**
* Contract tests for ICheckoutConfirmationPort

View File

@@ -1,8 +1,8 @@
import { describe, expect, test } from 'vitest'
import { OverlayAction, ActionAck } from '../../../../packages/application/ports/IOverlaySyncPort'
import { IAutomationEventPublisher, AutomationEvent } from '../../../../packages/application/ports/IAutomationEventPublisher'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../../../packages/infrastructure/adapters/IAutomationLifecycleEmitter'
import { OverlaySyncService } from '../../../../packages/application/services/OverlaySyncService'
import { OverlayAction, ActionAck } from '../../../../packages/automation-application/ports/IOverlaySyncPort'
import { IAutomationEventPublisher, AutomationEvent } from '../../../../packages/automation-application/ports/IAutomationEventPublisher'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../../../packages/automation-infrastructure/adapters/IAutomationLifecycleEmitter'
import { OverlaySyncService } from '../../../../packages/automation-application/services/OverlaySyncService'
class MockLifecycleEmitter implements IAutomationLifecycleEmitter {
private callbacks: Set<LifecycleCallback> = new Set()

View File

@@ -1,7 +1,7 @@
import { describe, expect, test } from 'vitest'
import { OverlayAction } from '../../../../packages/application/ports/IOverlaySyncPort'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../../../packages/infrastructure/adapters/IAutomationLifecycleEmitter'
import { OverlaySyncService } from '../../../../packages/application/services/OverlaySyncService'
import { OverlayAction } from '../../../../packages/automation-application/ports/IOverlaySyncPort'
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../../../packages/automation-infrastructure/adapters/IAutomationLifecycleEmitter'
import { OverlaySyncService } from '../../../../packages/automation-application/services/OverlaySyncService'
class MockLifecycleEmitter implements IAutomationLifecycleEmitter {
private callbacks: Set<LifecycleCallback> = new Set()

View File

@@ -1,9 +1,9 @@
import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
import { CheckAuthenticationUseCase } from '../../../../packages/application/use-cases/CheckAuthenticationUseCase';
import { AuthenticationState } from '../../../../packages/domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../packages/domain/value-objects/BrowserAuthenticationState';
import { CheckAuthenticationUseCase } from '../../../../packages/automation-application/use-cases/CheckAuthenticationUseCase';
import { AuthenticationState } from '../../../../packages/automation-domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../packages/automation-domain/value-objects/BrowserAuthenticationState';
import { Result } from '../../../../packages/shared/result/Result';
import type { IAuthenticationService } from '../../../../packages/application/ports/IAuthenticationService';
import type { IAuthenticationService } from '../../../../packages/automation-application/ports/IAuthenticationService';
interface ISessionValidator {
validateSession(): Promise<Result<boolean>>;

View File

@@ -1,10 +1,10 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { CompleteRaceCreationUseCase } from '@/packages/application/use-cases/CompleteRaceCreationUseCase';
import { CompleteRaceCreationUseCase } from '@/packages/automation-application/use-cases/CompleteRaceCreationUseCase';
import { Result } from '@/packages/shared/result/Result';
import { RaceCreationResult } from '@/packages/domain/value-objects/RaceCreationResult';
import { CheckoutPrice } from '@/packages/domain/value-objects/CheckoutPrice';
import type { ICheckoutService } from '@/packages/application/ports/ICheckoutService';
import { CheckoutState } from '@/packages/domain/value-objects/CheckoutState';
import { RaceCreationResult } from '@/packages/automation-domain/value-objects/RaceCreationResult';
import { CheckoutPrice } from '@/packages/automation-domain/value-objects/CheckoutPrice';
import type { ICheckoutService } from '@/packages/automation-application/ports/ICheckoutService';
import { CheckoutState } from '@/packages/automation-domain/value-objects/CheckoutState';
describe('CompleteRaceCreationUseCase', () => {
let mockCheckoutService: ICheckoutService;

View File

@@ -1,11 +1,11 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { ConfirmCheckoutUseCase } from '@/packages/application/use-cases/ConfirmCheckoutUseCase';
import { ConfirmCheckoutUseCase } from '@/packages/automation-application/use-cases/ConfirmCheckoutUseCase';
import { Result } from '@/packages/shared/result/Result';
import { CheckoutPrice } from '@/packages/domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '@/packages/domain/value-objects/CheckoutConfirmation';
import type { ICheckoutService } from '@/packages/application/ports/ICheckoutService';
import type { ICheckoutConfirmationPort } from '@/packages/application/ports/ICheckoutConfirmationPort';
import { CheckoutPrice } from '@/packages/automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/automation-domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '@/packages/automation-domain/value-objects/CheckoutConfirmation';
import type { ICheckoutService } from '@/packages/automation-application/ports/ICheckoutService';
import type { ICheckoutConfirmationPort } from '@/packages/automation-application/ports/ICheckoutConfirmationPort';
describe('ConfirmCheckoutUseCase - Enhanced with Confirmation Port', () => {
let mockCheckoutService: ICheckoutService;

View File

@@ -1,11 +1,11 @@
import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
import { Result } from '../../../../packages/shared/result/Result';
import { ConfirmCheckoutUseCase } from '../../../../packages/application/use-cases/ConfirmCheckoutUseCase';
import { ICheckoutService, CheckoutInfo } from '../../../../packages/application/ports/ICheckoutService';
import { ICheckoutConfirmationPort } from '../../../../packages/application/ports/ICheckoutConfirmationPort';
import { CheckoutPrice } from '../../../../packages/domain/value-objects/CheckoutPrice';
import { CheckoutState, CheckoutStateEnum } from '../../../../packages/domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../packages/domain/value-objects/CheckoutConfirmation';
import { ConfirmCheckoutUseCase } from '../../../../packages/automation-application/use-cases/ConfirmCheckoutUseCase';
import { ICheckoutService, CheckoutInfo } from '../../../../packages/automation-application/ports/ICheckoutService';
import { ICheckoutConfirmationPort } from '../../../../packages/automation-application/ports/ICheckoutConfirmationPort';
import { CheckoutPrice } from '../../../../packages/automation-domain/value-objects/CheckoutPrice';
import { CheckoutState, CheckoutStateEnum } from '../../../../packages/automation-domain/value-objects/CheckoutState';
import { CheckoutConfirmation } from '../../../../packages/automation-domain/value-objects/CheckoutConfirmation';
/**
* ConfirmCheckoutUseCase - GREEN PHASE

View File

@@ -1,9 +1,9 @@
import { describe, it, expect, vi, beforeEach, Mock } from 'vitest';
import { StartAutomationSessionUseCase } from '../../../../packages/application/use-cases/StartAutomationSessionUseCase';
import { IAutomationEngine } from '../../../../packages/application/ports/IAutomationEngine';
import { IScreenAutomation } from '../../../../packages/application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../packages/application/ports/ISessionRepository';
import { AutomationSession } from '../../../../packages/domain/entities/AutomationSession';
import { StartAutomationSessionUseCase } from '../../../../packages/automation-application/use-cases/StartAutomationSessionUseCase';
import { IAutomationEngine } from '../../../../packages/automation-application/ports/IAutomationEngine';
import { IScreenAutomation } from '../../../../packages/automation-application/ports/IScreenAutomation';
import { ISessionRepository } from '../../../../packages/automation-application/ports/ISessionRepository';
import { AutomationSession } from '../../../../packages/automation-domain/entities/AutomationSession';
describe('StartAutomationSessionUseCase', () => {
let mockAutomationEngine: {

View File

@@ -1,9 +1,9 @@
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { VerifyAuthenticatedPageUseCase } from '../../../../packages/application/use-cases/VerifyAuthenticatedPageUseCase';
import { IAuthenticationService } from '../../../../packages/application/ports/IAuthenticationService';
import { VerifyAuthenticatedPageUseCase } from '../../../../packages/automation-application/use-cases/VerifyAuthenticatedPageUseCase';
import { IAuthenticationService } from '../../../../packages/automation-application/ports/IAuthenticationService';
import { Result } from '../../../../packages/shared/result/Result';
import { BrowserAuthenticationState } from '../../../../packages/domain/value-objects/BrowserAuthenticationState';
import { AuthenticationState } from '../../../../packages/domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../packages/automation-domain/value-objects/BrowserAuthenticationState';
import { AuthenticationState } from '../../../../packages/automation-domain/value-objects/AuthenticationState';
describe('VerifyAuthenticatedPageUseCase', () => {
let useCase: VerifyAuthenticatedPageUseCase;

View File

@@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest';
import { AutomationSession } from '../../../../packages/domain/entities/AutomationSession';
import { StepId } from '../../../../packages/domain/value-objects/StepId';
import { SessionState } from '../../../../packages/domain/value-objects/SessionState';
import { AutomationSession } from '../../../../packages/automation-domain/entities/AutomationSession';
import { StepId } from '../../../../packages/automation-domain/value-objects/StepId';
import { SessionState } from '../../../../packages/automation-domain/value-objects/SessionState';
describe('AutomationSession Entity', () => {
describe('create', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { PageStateValidator } from '../../../../packages/domain/services/PageStateValidator';
import { PageStateValidator } from '../../../../packages/automation-domain/services/PageStateValidator';
describe('PageStateValidator', () => {
const validator = new PageStateValidator();

View File

@@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest';
import { StepTransitionValidator } from '../../../../packages/domain/services/StepTransitionValidator';
import { StepId } from '../../../../packages/domain/value-objects/StepId';
import { SessionState } from '../../../../packages/domain/value-objects/SessionState';
import { StepTransitionValidator } from '../../../../packages/automation-domain/services/StepTransitionValidator';
import { StepId } from '../../../../packages/automation-domain/value-objects/StepId';
import { SessionState } from '../../../../packages/automation-domain/value-objects/SessionState';
describe('StepTransitionValidator Service', () => {
describe('canTransition', () => {

View File

@@ -1,6 +1,6 @@
import { describe, test, expect } from 'vitest';
import { BrowserAuthenticationState } from '../../../../packages/domain/value-objects/BrowserAuthenticationState';
import { AuthenticationState } from '../../../../packages/domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../packages/automation-domain/value-objects/BrowserAuthenticationState';
import { AuthenticationState } from '../../../../packages/automation-domain/value-objects/AuthenticationState';
describe('BrowserAuthenticationState', () => {
describe('isFullyAuthenticated()', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { CheckoutConfirmation } from '../../../../packages/domain/value-objects/CheckoutConfirmation';
import { CheckoutConfirmation } from '../../../../packages/automation-domain/value-objects/CheckoutConfirmation';
describe('CheckoutConfirmation Value Object', () => {
describe('create', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { CheckoutPrice } from '../../../../packages/domain/value-objects/CheckoutPrice';
import { CheckoutPrice } from '../../../../packages/automation-domain/value-objects/CheckoutPrice';
/**
* CheckoutPrice Value Object - GREEN PHASE

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { CheckoutState, CheckoutStateEnum } from '../../../../packages/domain/value-objects/CheckoutState';
import { CheckoutState, CheckoutStateEnum } from '../../../../packages/automation-domain/value-objects/CheckoutState';
/**
* CheckoutState Value Object - GREEN PHASE

View File

@@ -1,5 +1,5 @@
import { describe, test, expect } from 'vitest';
import { CookieConfiguration } from '../../../../packages/domain/value-objects/CookieConfiguration';
import { CookieConfiguration } from '../../../../packages/automation-domain/value-objects/CookieConfiguration';
describe('CookieConfiguration', () => {
const validTargetUrl = 'https://members-ng.iracing.com/jjwtauth/success';

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { RaceCreationResult } from '../../../../packages/domain/value-objects/RaceCreationResult';
import { RaceCreationResult } from '../../../../packages/automation-domain/value-objects/RaceCreationResult';
describe('RaceCreationResult Value Object', () => {
describe('create', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { SessionLifetime } from '../../../../packages/domain/value-objects/SessionLifetime';
import { SessionLifetime } from '../../../../packages/automation-domain/value-objects/SessionLifetime';
describe('SessionLifetime Value Object', () => {
describe('Construction', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { SessionState } from '../../../../packages/domain/value-objects/SessionState';
import { SessionState } from '../../../../packages/automation-domain/value-objects/SessionState';
describe('SessionState Value Object', () => {
describe('create', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { StepId } from '../../../../packages/domain/value-objects/StepId';
import { StepId } from '../../../../packages/automation-domain/value-objects/StepId';
describe('StepId Value Object', () => {
describe('create', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import { loadAutomationConfig, getAutomationMode, AutomationMode } from '../../../packages/infrastructure/config/AutomationConfig';
import { loadAutomationConfig, getAutomationMode, AutomationMode } from '../../../packages/automation-infrastructure/config/AutomationConfig';
describe('AutomationConfig', () => {
const originalEnv = process.env;

View File

@@ -1,6 +1,6 @@
import { describe, test, expect, beforeEach, vi } from 'vitest';
import type { Page } from 'playwright';
import { AuthenticationGuard } from 'packages/infrastructure/adapters/automation/auth/AuthenticationGuard';
import { AuthenticationGuard } from 'packages/automation-infrastructure/adapters/automation/auth/AuthenticationGuard';
describe('AuthenticationGuard', () => {
let mockPage: Page;

View File

@@ -9,9 +9,9 @@ vi.mock('electron', () => ({
},
}));
import { ElectronCheckoutConfirmationAdapter } from '@/packages/infrastructure/adapters/ipc/ElectronCheckoutConfirmationAdapter';
import { CheckoutPrice } from '@/packages/domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/domain/value-objects/CheckoutState';
import { ElectronCheckoutConfirmationAdapter } from '@/packages/automation-infrastructure/adapters/ipc/ElectronCheckoutConfirmationAdapter';
import { CheckoutPrice } from '@/packages/automation-domain/value-objects/CheckoutPrice';
import { CheckoutState } from '@/packages/automation-domain/value-objects/CheckoutState';
import { ipcMain } from 'electron';
describe('ElectronCheckoutConfirmationAdapter', () => {

View File

@@ -1,12 +1,12 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import type { Page, BrowserContext } from 'playwright';
import { PlaywrightAuthSessionService } from '../../../packages/infrastructure/adapters/automation/auth/PlaywrightAuthSessionService';
import type { PlaywrightBrowserSession } from '../../../packages/infrastructure/adapters/automation/core/PlaywrightBrowserSession';
import type { SessionCookieStore } from '../../../packages/infrastructure/adapters/automation/auth/SessionCookieStore';
import type { IPlaywrightAuthFlow } from '../../../packages/infrastructure/adapters/automation/auth/PlaywrightAuthFlow';
import type { ILogger } from '../../../packages/application/ports/ILogger';
import { AuthenticationState } from '../../../packages/domain/value-objects/AuthenticationState';
import { Result } from '../../../packages/shared/result/Result';
import { PlaywrightAuthSessionService } from '../../../../packages/automation-infrastructure/adapters/automation/auth/PlaywrightAuthSessionService';
import type { PlaywrightBrowserSession } from '../../../../packages/automation-infrastructure/adapters/automation/core/PlaywrightBrowserSession';
import type { SessionCookieStore } from '../../../../packages/automation-infrastructure/adapters/automation/auth/SessionCookieStore';
import type { IPlaywrightAuthFlow } from '../../../../packages/automation-infrastructure/adapters/automation/auth/PlaywrightAuthFlow';
import type { ILogger } from '../../../../packages/automation-application/ports/ILogger';
import { AuthenticationState } from '../../../../packages/automation-domain/value-objects/AuthenticationState';
import { Result } from '../../../../packages/shared/result/Result';
describe('PlaywrightAuthSessionService.initiateLogin browser mode behaviour', () => {
const originalEnv = { ...process.env };
@@ -98,7 +98,7 @@ describe('PlaywrightAuthSessionService.initiateLogin browser mode behaviour', ()
const result = await service.initiateLogin();
expect(result.isOk()).toBe(true);
expect(mockAuthFlow.getLoginUrl).toHaveBeenCalledTimes(2);
expect(mockAuthFlow.getLoginUrl).toHaveBeenCalledTimes(1);
expect(mockPage.goto).toHaveBeenCalledWith(
'https://members-ng.iracing.com/login',

View File

@@ -1,13 +1,13 @@
import { describe, it, expect, vi } from 'vitest';
import type { Page, Locator } from 'playwright';
import { PlaywrightAuthSessionService } from '../../../packages/infrastructure/adapters/automation/auth/PlaywrightAuthSessionService';
import { AuthenticationState } from '../../../packages/domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../packages/domain/value-objects/BrowserAuthenticationState';
import type { ILogger } from '../../../packages/application/ports/ILogger';
import type { Result } from '../../../packages/shared/result/Result';
import type { PlaywrightBrowserSession } from '../../../packages/infrastructure/adapters/automation/core/PlaywrightBrowserSession';
import type { SessionCookieStore } from '../../../packages/infrastructure/adapters/automation/auth/SessionCookieStore';
import type { IPlaywrightAuthFlow } from '../../../packages/infrastructure/adapters/automation/auth/PlaywrightAuthFlow';
import { PlaywrightAuthSessionService } from '../../../../packages/automation-infrastructure/adapters/automation/auth/PlaywrightAuthSessionService';
import { AuthenticationState } from '../../../../packages/automation-domain/value-objects/AuthenticationState';
import { BrowserAuthenticationState } from '../../../../packages/automation-domain/value-objects/BrowserAuthenticationState';
import type { ILogger } from '../../../../packages/automation-application/ports/ILogger';
import type { Result } from '../../../../packages/shared/result/Result';
import type { PlaywrightBrowserSession } from '../../../../packages/automation-infrastructure/adapters/automation/core/PlaywrightBrowserSession';
import type { SessionCookieStore } from '../../../../packages/automation-infrastructure/adapters/automation/auth/SessionCookieStore';
import type { IPlaywrightAuthFlow } from '../../../../packages/automation-infrastructure/adapters/automation/auth/PlaywrightAuthFlow';
describe('PlaywrightAuthSessionService.verifyPageAuthentication', () => {
function createService(deps: {

View File

@@ -1,5 +1,5 @@
import { describe, test, expect, beforeEach } from 'vitest';
import { SessionCookieStore } from 'packages/infrastructure/adapters/automation/auth/SessionCookieStore';
import { SessionCookieStore } from 'packages/automation-infrastructure/adapters/automation/auth/SessionCookieStore';
import type { Cookie } from 'playwright';
describe('SessionCookieStore - Cookie Validation', () => {

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { BrowserModeConfigLoader } from '../../../../packages/infrastructure/config/BrowserModeConfig';
import { BrowserModeConfigLoader } from '../../../../packages/automation-infrastructure/config/BrowserModeConfig';
/**
* Unit tests for BrowserModeConfig - GREEN PHASE