diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..18de98416 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm test \ No newline at end of file diff --git a/package.json b/package.json index 3e7dda312..7a1d8ba84 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,13 @@ "companion:dev": "npm run dev --workspace=@gridpilot/companion", "companion:build": "npm run build --workspace=@gridpilot/companion", "companion:start": "npm run start --workspace=@gridpilot/companion", - "chrome:debug": "open -a 'Google Chrome' --args --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug" + "chrome:debug": "open -a 'Google Chrome' --args --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug", + "prepare": "husky" }, "devDependencies": { "@cucumber/cucumber": "^11.0.1", "@vitest/ui": "^2.1.8", + "husky": "^9.1.7", "puppeteer": "^24.31.0", "typescript": "^5.7.2", "vitest": "^2.1.8" diff --git a/packages/infrastructure/adapters/automation/BrowserDevToolsAdapter.ts b/packages/infrastructure/adapters/automation/BrowserDevToolsAdapter.ts index 3bb13a5b0..9f48f7182 100644 --- a/packages/infrastructure/adapters/automation/BrowserDevToolsAdapter.ts +++ b/packages/infrastructure/adapters/automation/BrowserDevToolsAdapter.ts @@ -124,11 +124,19 @@ export class BrowserDevToolsAdapter implements IBrowserAutomation { '--no-sandbox', ]; - this.browser = await puppeteer.launch({ + const launchOptions: Parameters[0] = { headless: this.config.headless, - executablePath: this.config.executablePath || undefined, args: launchArgs, - }); + }; + + // Use explicit executablePath if provided, otherwise use channel to auto-detect Chrome + if (this.config.executablePath) { + launchOptions.executablePath = this.config.executablePath; + } else { + launchOptions.channel = 'chrome'; + } + + this.browser = await puppeteer.launch(launchOptions); const pages = await this.browser.pages(); this.page = pages[0] || await this.browser.newPage(); diff --git a/tests/integration/infrastructure/BrowserDevToolsAdapter.test.ts b/tests/integration/infrastructure/BrowserDevToolsAdapter.test.ts index 810ce27ef..c077f81f3 100644 --- a/tests/integration/infrastructure/BrowserDevToolsAdapter.test.ts +++ b/tests/integration/infrastructure/BrowserDevToolsAdapter.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { BrowserDevToolsAdapter, DevToolsConfig } from '../../../src/infrastructure/adapters/automation/BrowserDevToolsAdapter'; -import { StepId } from '../../../src/packages/domain/value-objects/StepId'; +import { BrowserDevToolsAdapter, DevToolsConfig } from '../../../packages/infrastructure/adapters/automation/BrowserDevToolsAdapter'; +import { StepId } from '../../../packages/domain/value-objects/StepId'; import { IRacingSelectorMap, getStepSelectors, getStepName, isModalStep, -} from '../../../src/infrastructure/adapters/automation/selectors/IRacingSelectorMap'; +} from '../../../packages/infrastructure/adapters/automation/selectors/IRacingSelectorMap'; // Mock puppeteer-core vi.mock('puppeteer-core', () => { diff --git a/tests/integration/infrastructure/InMemorySessionRepository.test.ts b/tests/integration/infrastructure/InMemorySessionRepository.test.ts index fbc467273..2cde900c2 100644 --- a/tests/integration/infrastructure/InMemorySessionRepository.test.ts +++ b/tests/integration/infrastructure/InMemorySessionRepository.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach } from 'vitest'; -import { InMemorySessionRepository } from '../../../src/infrastructure/repositories/InMemorySessionRepository'; -import { AutomationSession } from '../../../src/packages/domain/entities/AutomationSession'; -import { StepId } from '../../../src/packages/domain/value-objects/StepId'; +import { InMemorySessionRepository } from '../../../packages/infrastructure/repositories/InMemorySessionRepository'; +import { AutomationSession } from '../../../packages/domain/entities/AutomationSession'; +import { StepId } from '../../../packages/domain/value-objects/StepId'; describe('InMemorySessionRepository Integration Tests', () => { let repository: InMemorySessionRepository; diff --git a/tests/integration/infrastructure/MockBrowserAutomationAdapter.test.ts b/tests/integration/infrastructure/MockBrowserAutomationAdapter.test.ts index 04edc573f..7043925ed 100644 --- a/tests/integration/infrastructure/MockBrowserAutomationAdapter.test.ts +++ b/tests/integration/infrastructure/MockBrowserAutomationAdapter.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; -import { MockBrowserAutomationAdapter } from '../../../src/infrastructure/adapters/automation/MockBrowserAutomationAdapter'; -import { StepId } from '../../../src/packages/domain/value-objects/StepId'; +import { MockBrowserAutomationAdapter } from '../../../packages/infrastructure/adapters/automation/MockBrowserAutomationAdapter'; +import { StepId } from '../../../packages/domain/value-objects/StepId'; describe('MockBrowserAutomationAdapter Integration Tests', () => { let adapter: MockBrowserAutomationAdapter; diff --git a/tests/unit/application/use-cases/StartAutomationSession.test.ts b/tests/unit/application/use-cases/StartAutomationSession.test.ts index d6d227c42..6f7dc0f40 100644 --- a/tests/unit/application/use-cases/StartAutomationSession.test.ts +++ b/tests/unit/application/use-cases/StartAutomationSession.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; -import { StartAutomationSessionUseCase } from '../../../../src/packages/application/use-cases/StartAutomationSessionUseCase'; -import { IAutomationEngine } from '../../../../src/packages/application/ports/IAutomationEngine'; -import { IBrowserAutomation } from '../../../../src/packages/application/ports/IBrowserAutomation'; -import { ISessionRepository } from '../../../../src/packages/application/ports/ISessionRepository'; -import { AutomationSession } from '../../../../src/packages/domain/entities/AutomationSession'; +import { StartAutomationSessionUseCase } from '../../../../packages/application/use-cases/StartAutomationSessionUseCase'; +import { IAutomationEngine } from '../../../../packages/application/ports/IAutomationEngine'; +import { IBrowserAutomation } from '../../../../packages/application/ports/IBrowserAutomation'; +import { ISessionRepository } from '../../../../packages/application/ports/ISessionRepository'; +import { AutomationSession } from '../../../../packages/domain/entities/AutomationSession'; describe('StartAutomationSessionUseCase', () => { let mockAutomationEngine: { diff --git a/tests/unit/domain/entities/AutomationSession.test.ts b/tests/unit/domain/entities/AutomationSession.test.ts index 373bfc329..da2d90721 100644 --- a/tests/unit/domain/entities/AutomationSession.test.ts +++ b/tests/unit/domain/entities/AutomationSession.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; -import { AutomationSession } from '../../../../src/packages/domain/entities/AutomationSession'; -import { StepId } from '../../../../src/packages/domain/value-objects/StepId'; -import { SessionState } from '../../../../src/packages/domain/value-objects/SessionState'; +import { AutomationSession } from '../../../../packages/domain/entities/AutomationSession'; +import { StepId } from '../../../../packages/domain/value-objects/StepId'; +import { SessionState } from '../../../../packages/domain/value-objects/SessionState'; describe('AutomationSession Entity', () => { describe('create', () => { diff --git a/tests/unit/domain/services/StepTransitionValidator.test.ts b/tests/unit/domain/services/StepTransitionValidator.test.ts index 4e3e7a8f8..68c70be78 100644 --- a/tests/unit/domain/services/StepTransitionValidator.test.ts +++ b/tests/unit/domain/services/StepTransitionValidator.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; -import { StepTransitionValidator } from '../../../../src/packages/domain/services/StepTransitionValidator'; -import { StepId } from '../../../../src/packages/domain/value-objects/StepId'; -import { SessionState } from '../../../../src/packages/domain/value-objects/SessionState'; +import { StepTransitionValidator } from '../../../../packages/domain/services/StepTransitionValidator'; +import { StepId } from '../../../../packages/domain/value-objects/StepId'; +import { SessionState } from '../../../../packages/domain/value-objects/SessionState'; describe('StepTransitionValidator Service', () => { describe('canTransition', () => { diff --git a/tests/unit/domain/value-objects/SessionState.test.ts b/tests/unit/domain/value-objects/SessionState.test.ts index a762481c2..6dd01595e 100644 --- a/tests/unit/domain/value-objects/SessionState.test.ts +++ b/tests/unit/domain/value-objects/SessionState.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { SessionState } from '../../../../src/packages/domain/value-objects/SessionState'; +import { SessionState } from '../../../../packages/domain/value-objects/SessionState'; describe('SessionState Value Object', () => { describe('create', () => { diff --git a/tests/unit/domain/value-objects/StepId.test.ts b/tests/unit/domain/value-objects/StepId.test.ts index f62100ec8..5811067f8 100644 --- a/tests/unit/domain/value-objects/StepId.test.ts +++ b/tests/unit/domain/value-objects/StepId.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { StepId } from '../../../../src/packages/domain/value-objects/StepId'; +import { StepId } from '../../../../packages/domain/value-objects/StepId'; describe('StepId Value Object', () => { describe('create', () => { diff --git a/tests/unit/infrastructure/AutomationConfig.test.ts b/tests/unit/infrastructure/AutomationConfig.test.ts index 61541d692..b909b732f 100644 --- a/tests/unit/infrastructure/AutomationConfig.test.ts +++ b/tests/unit/infrastructure/AutomationConfig.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; -import { loadAutomationConfig, AutomationMode } from '../../../src/infrastructure/config/AutomationConfig'; +import { loadAutomationConfig, AutomationMode } from '../../../packages/infrastructure/config/AutomationConfig'; describe('AutomationConfig', () => { const originalEnv = process.env; @@ -16,12 +16,12 @@ describe('AutomationConfig', () => { describe('loadAutomationConfig', () => { describe('default configuration', () => { - it('should return mock mode when AUTOMATION_MODE is not set', () => { + it('should return dev mode when AUTOMATION_MODE is not set', () => { delete process.env.AUTOMATION_MODE; const config = loadAutomationConfig(); - expect(config.mode).toBe('mock'); + expect(config.mode).toBe('dev'); }); it('should return default devTools configuration', () => { @@ -161,12 +161,12 @@ describe('AutomationConfig', () => { expect(config.nutJs?.confidence).toBe(0.9); }); - it('should fallback to mock mode for invalid AUTOMATION_MODE', () => { + it('should fallback to dev mode for invalid AUTOMATION_MODE', () => { process.env.AUTOMATION_MODE = 'invalid-mode'; const config = loadAutomationConfig(); - expect(config.mode).toBe('mock'); + expect(config.mode).toBe('dev'); }); });