mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-20 03:12:15 +00:00
fix(core): Mark invalid enqueued executions as crashed during startup for legacy SQLite driver (#17629)
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import { LegacySqliteExecutionRecoveryService } from '@/executions/legacy-sqlite-execution-recovery.service';
|
||||
import { Logger } from '@n8n/backend-common';
|
||||
import { testDb } from '@n8n/backend-test-utils';
|
||||
import { GlobalConfig } from '@n8n/config';
|
||||
import { DbConnection, ExecutionRepository, WorkflowRepository } from '@n8n/db';
|
||||
import { Container } from '@n8n/di';
|
||||
|
||||
const globalConfig = Container.get(GlobalConfig);
|
||||
|
||||
if (globalConfig.database.isLegacySqlite) {
|
||||
beforeAll(async () => {
|
||||
await testDb.init();
|
||||
});
|
||||
|
||||
describe('Legacy SQLite Execution Recovery Service', () => {
|
||||
let legacySqliteExecutionRecoveryService: LegacySqliteExecutionRecoveryService;
|
||||
let executionRepository: ExecutionRepository;
|
||||
let dbConnection: DbConnection;
|
||||
|
||||
beforeEach(async () => {
|
||||
await testDb.truncate(['WorkflowEntity', 'ExecutionEntity', 'ExecutionData']);
|
||||
executionRepository = Container.get(ExecutionRepository);
|
||||
dbConnection = Container.get(DbConnection);
|
||||
legacySqliteExecutionRecoveryService = new LegacySqliteExecutionRecoveryService(
|
||||
Container.get(Logger),
|
||||
executionRepository,
|
||||
globalConfig,
|
||||
dbConnection,
|
||||
);
|
||||
|
||||
const workflowRepository = Container.get(WorkflowRepository);
|
||||
|
||||
const workflow = workflowRepository.create({
|
||||
id: 'test-workflow-id',
|
||||
name: 'Test Workflow',
|
||||
active: true,
|
||||
nodes: [],
|
||||
connections: {},
|
||||
settings: {},
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
});
|
||||
|
||||
await workflowRepository.save(workflow);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await testDb.terminate();
|
||||
});
|
||||
|
||||
it('should recover executions without data', async () => {
|
||||
// Arrange
|
||||
let execution = executionRepository.create({
|
||||
status: 'new',
|
||||
mode: 'manual',
|
||||
workflowId: 'test-workflow-id',
|
||||
createdAt: new Date(),
|
||||
finished: false,
|
||||
});
|
||||
|
||||
execution = await executionRepository.save(execution);
|
||||
|
||||
// Act
|
||||
await legacySqliteExecutionRecoveryService.cleanupWorkflowExecutions();
|
||||
|
||||
const executionMarkedAsCrashed = await executionRepository.findOneBy({ id: execution.id });
|
||||
// Assert
|
||||
expect(executionMarkedAsCrashed?.id).toBe(execution.id);
|
||||
expect(executionMarkedAsCrashed?.status).toBe('crashed');
|
||||
});
|
||||
});
|
||||
} else {
|
||||
describe('Legacy SQLite Execution Recovery Service', () => {
|
||||
it('should not run on non-legacy SQLite databases', () => {
|
||||
// We need an empty test here to ensure that the test suite is not empty
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user