74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
|
|
const load = async () => {
|
|
vi.resetModules();
|
|
process.env.SPOON_WORKER_TOKEN = 'test-worker-token';
|
|
process.env.GITHUB_APP_ID = '123';
|
|
process.env.GITHUB_APP_PRIVATE_KEY =
|
|
'-----BEGIN PRIVATE KEY-----\ntest\n-----END PRIVATE KEY-----';
|
|
return await import('../../src/worker');
|
|
};
|
|
|
|
describe('planWorkdirCleanup', () => {
|
|
afterEach(() => vi.resetModules());
|
|
|
|
test('never removes the homes/ root or any home directory', async () => {
|
|
const { planWorkdirCleanup } = await load();
|
|
const plan = planWorkdirCleanup({
|
|
root: '/work',
|
|
rootEntries: [{ name: 'homes', isDirectory: true }],
|
|
homesEntries: { alice: [{ name: 'Code', isDirectory: true }] },
|
|
codeLeaves: {},
|
|
activeWorkdirs: new Set(),
|
|
runningBoxUsernames: new Set(),
|
|
});
|
|
expect(plan.removeDirs).not.toContain('/work/homes');
|
|
expect(plan.removeDirs).not.toContain('/work/homes/alice');
|
|
});
|
|
|
|
test('removes legacy top-level job dirs not in the active set', async () => {
|
|
const { planWorkdirCleanup } = await load();
|
|
const plan = planWorkdirCleanup({
|
|
root: '/work',
|
|
rootEntries: [
|
|
{ name: 'homes', isDirectory: true },
|
|
{ name: 'legacy-job-123', isDirectory: true },
|
|
{ name: 'dev', isDirectory: true },
|
|
],
|
|
homesEntries: {},
|
|
codeLeaves: {},
|
|
activeWorkdirs: new Set(['/work/dev']),
|
|
runningBoxUsernames: new Set(),
|
|
});
|
|
expect(plan.removeDirs).toContain('/work/legacy-job-123');
|
|
expect(plan.removeDirs).not.toContain('/work/dev');
|
|
expect(plan.removeDirs).not.toContain('/work/homes');
|
|
});
|
|
|
|
test('removes per-thread checkouts only for users with no running box', async () => {
|
|
const { planWorkdirCleanup } = await load();
|
|
const plan = planWorkdirCleanup({
|
|
root: '/work',
|
|
rootEntries: [{ name: 'homes', isDirectory: true }],
|
|
homesEntries: {
|
|
alice: [{ name: 'Code', isDirectory: true }],
|
|
bob: [{ name: 'Code', isDirectory: true }],
|
|
},
|
|
codeLeaves: {
|
|
alice: ['/work/homes/alice/Code/spoon-a/branch-x'],
|
|
bob: ['/work/homes/bob/Code/spoon-b/branch-y'],
|
|
},
|
|
activeWorkdirs: new Set(),
|
|
runningBoxUsernames: new Set(['bob']),
|
|
});
|
|
expect(plan.removeDirs).toContain(
|
|
'/work/homes/alice/Code/spoon-a/branch-x',
|
|
);
|
|
expect(plan.removeDirs).not.toContain(
|
|
'/work/homes/bob/Code/spoon-b/branch-y',
|
|
);
|
|
expect(plan.removeDirs).not.toContain('/work/homes/alice');
|
|
expect(plan.removeDirs).not.toContain('/work/homes/alice/Code');
|
|
});
|
|
});
|