mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-11 04:47:29 -08:00
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import type { K6Executor } from './k6Executor';
|
|
import type { Scenario } from '@/types/scenario';
|
|
import type { N8nApiClient } from '@/n8nApiClient/n8nApiClient';
|
|
import type { ScenarioDataFileLoader } from '@/scenario/scenarioDataLoader';
|
|
import { ScenarioDataImporter } from '@/testExecution/scenarioDataImporter';
|
|
import { AuthenticatedN8nApiClient } from '@/n8nApiClient/authenticatedN8nApiClient';
|
|
|
|
/**
|
|
* Runs scenarios
|
|
*/
|
|
export class ScenarioRunner {
|
|
constructor(
|
|
private readonly n8nClient: N8nApiClient,
|
|
private readonly dataLoader: ScenarioDataFileLoader,
|
|
private readonly k6Executor: K6Executor,
|
|
private readonly ownerConfig: {
|
|
email: string;
|
|
password: string;
|
|
},
|
|
private readonly scenarioPrefix: string,
|
|
) {}
|
|
|
|
async runManyScenarios(scenarios: Scenario[]) {
|
|
console.log(`Waiting for n8n ${this.n8nClient.apiBaseUrl} to become online`);
|
|
await this.n8nClient.waitForInstanceToBecomeOnline();
|
|
|
|
console.log('Setting up owner');
|
|
await this.n8nClient.setupOwnerIfNeeded(this.ownerConfig);
|
|
|
|
const authenticatedN8nClient = await AuthenticatedN8nApiClient.createUsingUsernameAndPassword(
|
|
this.n8nClient,
|
|
this.ownerConfig,
|
|
);
|
|
const testDataImporter = new ScenarioDataImporter(authenticatedN8nClient);
|
|
|
|
for (const scenario of scenarios) {
|
|
await this.runSingleTestScenario(testDataImporter, scenario);
|
|
}
|
|
}
|
|
|
|
private async runSingleTestScenario(testDataImporter: ScenarioDataImporter, scenario: Scenario) {
|
|
const scenarioRunName = this.formTestScenarioRunName(scenario);
|
|
console.log('Running scenario:', scenarioRunName);
|
|
|
|
console.log('Loading and importing data');
|
|
const testData = await this.dataLoader.loadDataForScenario(scenario);
|
|
await testDataImporter.importTestScenarioData(testData.workflows);
|
|
|
|
console.log('Executing scenario script');
|
|
await this.k6Executor.executeTestScenario(scenario, {
|
|
scenarioRunName,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Forms a name for the scenario by combining prefix and scenario name.
|
|
* The benchmarks are ran against different n8n setups, so we use the
|
|
* prefix to differentiate between them.
|
|
*/
|
|
private formTestScenarioRunName(scenario: Scenario) {
|
|
return `${this.scenarioPrefix}-${scenario.name}`;
|
|
}
|
|
}
|