mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-21 00:38:14 +08:00
169 lines
5.1 KiB
JavaScript
169 lines
5.1 KiB
JavaScript
const assert = require('node:assert/strict');
|
|
const { createRequire } = require('node:module');
|
|
const { DatabaseSync } = require('node:sqlite');
|
|
const { test } = require('node:test');
|
|
|
|
const ownerCliRequire = createRequire(
|
|
require.resolve('../../packages/ql3-local-owner-cli/package.json'),
|
|
);
|
|
const localSqliteRequire = createRequire(
|
|
require.resolve('../../packages/ql3-local-sqlite/package.json'),
|
|
);
|
|
const localExecutionRequire = createRequire(
|
|
require.resolve('../../packages/ql3-local-execution/package.json'),
|
|
);
|
|
const { runLocalTaskDefinitionCommandFile } = ownerCliRequire(
|
|
'@qinglong/local-owner-cli/task-definition-command',
|
|
);
|
|
const { runLocalTriggerCommandFile } = ownerCliRequire(
|
|
'@qinglong/local-owner-cli/trigger-command',
|
|
);
|
|
const { openLocalSqliteRuntimeDatabase } = localSqliteRequire(
|
|
'@qinglong/local-sqlite/runtime',
|
|
);
|
|
const { LocalSchedulerCoordinator } = localExecutionRequire(
|
|
'@qinglong/local-execution/scheduler',
|
|
);
|
|
const {
|
|
localManagementFixture,
|
|
taskPutRequest,
|
|
writeCommand,
|
|
} = require('../../packages/ql3-local-owner-cli/test/localManagementFixture.cjs');
|
|
|
|
function triggerRequest(value, task, overrides = {}) {
|
|
return {
|
|
projectId: 'default',
|
|
triggerId: 'fresh-product-trigger',
|
|
expectedRevision: null,
|
|
mutationId: 'a1000000-0000-4000-8000-000000000001',
|
|
requestId: 'fresh-trigger-put-1',
|
|
failureAuditEventId: 'a2000000-0000-4000-8000-000000000001',
|
|
taskId: task.taskId,
|
|
taskRevision: task.revision,
|
|
taskContentDigest: task.contentDigest,
|
|
spec: {
|
|
schema: 'qinglong/cron@v1',
|
|
config: {
|
|
expression: '* * * * *',
|
|
timezone: 'UTC',
|
|
misfirePolicy: 'fire_once',
|
|
},
|
|
},
|
|
enabled: true,
|
|
occurredAtMs: value.now + 1,
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
test('fresh product commands create Task then Trigger then one scheduled Run', async (t) => {
|
|
const value = await localManagementFixture(t);
|
|
const taskCreate = taskPutRequest(value, '1', {
|
|
taskId: 'fresh-product-task',
|
|
});
|
|
const task = (
|
|
await runLocalTaskDefinitionCommandFile(
|
|
writeCommand(value, 'task.put', taskCreate, 'fresh-task-create'),
|
|
)
|
|
).task;
|
|
const triggerCreate = triggerRequest(value, task);
|
|
const trigger = (
|
|
await runLocalTriggerCommandFile(
|
|
writeCommand(value, 'trigger.put', triggerCreate, 'fresh-trigger-create'),
|
|
)
|
|
).trigger;
|
|
assert.equal(trigger.taskContentDigest, task.contentDigest);
|
|
|
|
const runtime = await openLocalSqliteRuntimeDatabase({
|
|
databasePath: value.databasePath,
|
|
profile: 'edge',
|
|
});
|
|
t.after(() => runtime.close());
|
|
const clockValues = [value.now + 1, value.now + 2_000, value.now + 4_000];
|
|
const ids = [
|
|
'a3000000-0000-4000-8000-000000000001',
|
|
'a3000000-0000-4000-8000-000000000002',
|
|
'a3000000-0000-4000-8000-000000000003',
|
|
'a3000000-0000-4000-8000-000000000004',
|
|
];
|
|
const scheduler = new LocalSchedulerCoordinator(runtime.schedules, {
|
|
pageSize: 4,
|
|
misfireGraceMs: 5_000,
|
|
clock: () => clockValues.shift(),
|
|
createId: () => ids.shift(),
|
|
nextOccurrence: (_schedule, afterMs) => afterMs + 1_000,
|
|
});
|
|
assert.equal((await scheduler.scheduleOnce()).initialized, 1);
|
|
const admitted = await scheduler.scheduleOnce();
|
|
assert.equal(admitted.admitted, 1);
|
|
|
|
const database = new DatabaseSync(value.databasePath, { readOnly: true });
|
|
try {
|
|
const run = database
|
|
.prepare(
|
|
`SELECT id, task_id AS "taskId", trigger_id AS "triggerId", status
|
|
FROM "Runs"`,
|
|
)
|
|
.get();
|
|
assert.deepEqual(
|
|
{ ...run },
|
|
{
|
|
id: 'a3000000-0000-4000-8000-000000000001',
|
|
taskId: task.taskId,
|
|
triggerId: trigger.triggerId,
|
|
status: 'queued',
|
|
},
|
|
);
|
|
} finally {
|
|
database.close();
|
|
}
|
|
|
|
await runLocalTaskDefinitionCommandFile(
|
|
writeCommand(
|
|
value,
|
|
'task.put',
|
|
taskPutRequest(value, '2', {
|
|
taskId: task.taskId,
|
|
expectedRevision: 1,
|
|
mutationId: 'a4000000-0000-4000-8000-000000000001',
|
|
requestId: 'fresh-task-disable-1',
|
|
failureAuditEventId: 'a5000000-0000-4000-8000-000000000001',
|
|
enabled: false,
|
|
occurredAtMs: value.now + 3_000,
|
|
}),
|
|
'fresh-task-disable',
|
|
),
|
|
);
|
|
const afterTaskDisable = await scheduler.scheduleOnce();
|
|
assert.equal(afterTaskDisable.scanned, 0);
|
|
|
|
const disabledTrigger = await runLocalTriggerCommandFile(
|
|
writeCommand(
|
|
value,
|
|
'trigger.put',
|
|
triggerRequest(value, task, {
|
|
expectedRevision: 1,
|
|
mutationId: 'a6000000-0000-4000-8000-000000000001',
|
|
requestId: 'fresh-trigger-disable-1',
|
|
failureAuditEventId: 'a7000000-0000-4000-8000-000000000001',
|
|
enabled: false,
|
|
occurredAtMs: value.now + 4_000,
|
|
}),
|
|
'fresh-trigger-disable',
|
|
),
|
|
);
|
|
assert.equal(disabledTrigger.trigger.enabled, false);
|
|
assert.equal(disabledTrigger.trigger.revision, 2);
|
|
|
|
const finalDatabase = new DatabaseSync(value.databasePath, {
|
|
readOnly: true,
|
|
});
|
|
try {
|
|
assert.equal(
|
|
finalDatabase.prepare('SELECT COUNT(*) AS count FROM "Runs"').get().count,
|
|
1,
|
|
);
|
|
} finally {
|
|
finalDatabase.close();
|
|
}
|
|
});
|