mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-22 02:27:44 +08:00
feat(ql3): establish 3.0 incubation baseline
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
const { test } = require('node:test');
|
||||
const { migrateLocalSqlitePath } = require('@qinglong/local-sqlite/migration');
|
||||
const {
|
||||
bootstrapLocalProfileStorage,
|
||||
} = require('../dist/profile/localProfile');
|
||||
|
||||
function fixture(t) {
|
||||
const directory = fs.mkdtempSync(
|
||||
path.join(os.tmpdir(), 'ql3-local-profile-'),
|
||||
);
|
||||
t.after(() => fs.rmSync(directory, { recursive: true, force: true }));
|
||||
return path.join(directory, 'qinglong3.sqlite');
|
||||
}
|
||||
|
||||
test('disabled local Profile does not inspect or create the database path', async () => {
|
||||
const records = [];
|
||||
const databasePath = path.join(
|
||||
os.tmpdir(),
|
||||
'ql3-local-profile-parent-does-not-exist',
|
||||
'database.sqlite',
|
||||
);
|
||||
const result = await bootstrapLocalProfileStorage({
|
||||
enabled: false,
|
||||
profile: 'edge',
|
||||
databasePath,
|
||||
audit: (record) => records.push(record),
|
||||
});
|
||||
assert.equal(result.status, 'disabled');
|
||||
assert.equal(await result.stop(), 'stopped');
|
||||
assert.equal(fs.existsSync(databasePath), false);
|
||||
assert.deepEqual(records, [{ profile: 'edge', state: 'disabled' }]);
|
||||
});
|
||||
|
||||
test('enabled local Profile owns one ready repository and idempotent stop', async (t) => {
|
||||
const databasePath = fixture(t);
|
||||
await migrateLocalSqlitePath({ databasePath, profile: 'edge' });
|
||||
const records = [];
|
||||
const result = await bootstrapLocalProfileStorage({
|
||||
enabled: true,
|
||||
profile: 'edge',
|
||||
databasePath,
|
||||
audit: (record) => records.push(record),
|
||||
});
|
||||
assert.equal(result.status, 'storage_ready');
|
||||
assert.equal(result.profile, 'edge');
|
||||
assert.equal(result.evidence.journalMode, 'delete');
|
||||
assert.equal(await result.runs.findRunById('missing'), null);
|
||||
assert.deepEqual(await result.startupRecovery.inspectCandidates(), {
|
||||
candidates: [],
|
||||
truncated: false,
|
||||
});
|
||||
assert.deepEqual(await Promise.all([result.stop(), result.stop()]), [
|
||||
'stopped',
|
||||
'stopped',
|
||||
]);
|
||||
assert.deepEqual(
|
||||
records.map(({ state }) => state),
|
||||
['storage_ready', 'stopped'],
|
||||
);
|
||||
});
|
||||
|
||||
test('unprepared storage fails closed without auto-migration', async (t) => {
|
||||
const databasePath = fixture(t);
|
||||
new (require('node:sqlite').DatabaseSync)(databasePath).close();
|
||||
const records = [];
|
||||
await assert.rejects(
|
||||
bootstrapLocalProfileStorage({
|
||||
enabled: true,
|
||||
profile: 'standalone',
|
||||
databasePath,
|
||||
audit: (record) => records.push(record),
|
||||
}),
|
||||
/not ready/,
|
||||
);
|
||||
assert.deepEqual(records, [{ profile: 'standalone', state: 'failed' }]);
|
||||
});
|
||||
Reference in New Issue
Block a user