117 lines
4.0 KiB
TypeScript
117 lines
4.0 KiB
TypeScript
import type { ITapSettings, ISettingsManager } from './tapbundle.interfaces.js';
|
|
|
|
export class SettingsManager implements ISettingsManager {
|
|
private globalSettings: ITapSettings = {};
|
|
private fileSettings: ITapSettings = {};
|
|
private testSettings: Map<string, ITapSettings> = new Map();
|
|
|
|
// Default settings
|
|
private defaultSettings: ITapSettings = {
|
|
timeout: undefined, // No timeout by default
|
|
slowThreshold: 1000, // 1 second
|
|
bail: false,
|
|
retries: 0,
|
|
retryDelay: 0,
|
|
suppressConsole: false,
|
|
verboseErrors: true,
|
|
showTestDuration: true,
|
|
maxConcurrency: 5,
|
|
isolateTests: false,
|
|
enableSnapshots: true,
|
|
snapshotDirectory: '.snapshots',
|
|
updateSnapshots: false,
|
|
};
|
|
|
|
/**
|
|
* Get merged settings for current context
|
|
*/
|
|
public getSettings(): ITapSettings {
|
|
return this.mergeSettings(
|
|
this.defaultSettings,
|
|
this.globalSettings,
|
|
this.fileSettings
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Set global settings (from 00init.ts or tap.settings())
|
|
*/
|
|
public setGlobalSettings(settings: ITapSettings): void {
|
|
this.globalSettings = { ...this.globalSettings, ...settings };
|
|
}
|
|
|
|
/**
|
|
* Set file-level settings
|
|
*/
|
|
public setFileSettings(settings: ITapSettings): void {
|
|
this.fileSettings = { ...this.fileSettings, ...settings };
|
|
}
|
|
|
|
/**
|
|
* Set test-specific settings
|
|
*/
|
|
public setTestSettings(testId: string, settings: ITapSettings): void {
|
|
const existingSettings = this.testSettings.get(testId) || {};
|
|
this.testSettings.set(testId, { ...existingSettings, ...settings });
|
|
}
|
|
|
|
/**
|
|
* Get settings for specific test
|
|
*/
|
|
public getTestSettings(testId: string): ITapSettings {
|
|
const testSpecificSettings = this.testSettings.get(testId) || {};
|
|
return this.mergeSettings(
|
|
this.defaultSettings,
|
|
this.globalSettings,
|
|
this.fileSettings,
|
|
testSpecificSettings
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Merge settings with proper inheritance
|
|
* Later settings override earlier ones
|
|
*/
|
|
private mergeSettings(...settingsArray: ITapSettings[]): ITapSettings {
|
|
const result: ITapSettings = {};
|
|
|
|
for (const settings of settingsArray) {
|
|
// Simple properties - later values override
|
|
if (settings.timeout !== undefined) result.timeout = settings.timeout;
|
|
if (settings.slowThreshold !== undefined) result.slowThreshold = settings.slowThreshold;
|
|
if (settings.bail !== undefined) result.bail = settings.bail;
|
|
if (settings.retries !== undefined) result.retries = settings.retries;
|
|
if (settings.retryDelay !== undefined) result.retryDelay = settings.retryDelay;
|
|
if (settings.suppressConsole !== undefined) result.suppressConsole = settings.suppressConsole;
|
|
if (settings.verboseErrors !== undefined) result.verboseErrors = settings.verboseErrors;
|
|
if (settings.showTestDuration !== undefined) result.showTestDuration = settings.showTestDuration;
|
|
if (settings.maxConcurrency !== undefined) result.maxConcurrency = settings.maxConcurrency;
|
|
if (settings.isolateTests !== undefined) result.isolateTests = settings.isolateTests;
|
|
if (settings.enableSnapshots !== undefined) result.enableSnapshots = settings.enableSnapshots;
|
|
if (settings.snapshotDirectory !== undefined) result.snapshotDirectory = settings.snapshotDirectory;
|
|
if (settings.updateSnapshots !== undefined) result.updateSnapshots = settings.updateSnapshots;
|
|
|
|
// Lifecycle hooks - later ones override
|
|
if (settings.beforeAll !== undefined) result.beforeAll = settings.beforeAll;
|
|
if (settings.afterAll !== undefined) result.afterAll = settings.afterAll;
|
|
if (settings.beforeEach !== undefined) result.beforeEach = settings.beforeEach;
|
|
if (settings.afterEach !== undefined) result.afterEach = settings.afterEach;
|
|
|
|
// Environment variables - merge
|
|
if (settings.env) {
|
|
result.env = { ...result.env, ...settings.env };
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Clear all settings (useful for testing)
|
|
*/
|
|
public clearSettings(): void {
|
|
this.globalSettings = {};
|
|
this.fileSettings = {};
|
|
this.testSettings.clear();
|
|
}
|
|
} |