|
import Step from '../models/step.js'; |
|
import { processFlow } from './flow.js'; |
|
import { processTrigger } from './trigger.js'; |
|
import { processAction } from './action.js'; |
|
|
|
const testRun = async (options) => { |
|
const untilStep = await Step.query() |
|
.findById(options.stepId) |
|
.throwIfNotFound(); |
|
|
|
const flow = await untilStep.$relatedQuery('flow'); |
|
const [triggerStep, ...actionSteps] = await flow |
|
.$relatedQuery('steps') |
|
.withGraphFetched('connection') |
|
.orderBy('position', 'asc'); |
|
|
|
const { data, error: triggerError } = await processFlow({ |
|
flowId: flow.id, |
|
testRun: true, |
|
}); |
|
|
|
if (triggerError) { |
|
const { executionStep: triggerExecutionStepWithError } = |
|
await processTrigger({ |
|
flowId: flow.id, |
|
stepId: triggerStep.id, |
|
error: triggerError, |
|
testRun: true, |
|
}); |
|
|
|
return { executionStep: triggerExecutionStepWithError }; |
|
} |
|
|
|
const firstTriggerItem = data[0]; |
|
|
|
const { executionId, executionStep: triggerExecutionStep } = |
|
await processTrigger({ |
|
flowId: flow.id, |
|
stepId: triggerStep.id, |
|
triggerItem: firstTriggerItem, |
|
testRun: true, |
|
}); |
|
|
|
if (triggerStep.id === untilStep.id) { |
|
return { executionStep: triggerExecutionStep }; |
|
} |
|
|
|
for (const actionStep of actionSteps) { |
|
const { executionStep: actionExecutionStep } = await processAction({ |
|
flowId: flow.id, |
|
stepId: actionStep.id, |
|
executionId, |
|
}); |
|
|
|
if (actionStep.id === untilStep.id || actionExecutionStep.isFailed) { |
|
return { executionStep: actionExecutionStep }; |
|
} |
|
} |
|
}; |
|
|
|
export default testRun; |
|
|