49 lines
3.0 KiB
TypeScript
49 lines
3.0 KiB
TypeScript
import { afterEach, beforeEach, expect, it, vi } from 'vitest';
|
|
import { newFixture, type Fixture } from '../helpers/fixture.js';
|
|
let fixture: Fixture;
|
|
beforeEach(async () => { vi.resetModules(); fixture = await newFixture([]); });
|
|
afterEach(async () => { await fixture.cleanup(); });
|
|
|
|
it('bounds beta pages, searches across retained history, and seeks activity without duplicates', async () => {
|
|
const { db } = await import('../../src/lib/server/db/index.js');
|
|
const { betaListPage, betaActivityPage } = await import('../../src/lib/server/fleet/beta-pages.js');
|
|
db().exec(`INSERT INTO scripts(id,name,target_rel_path) VALUES(1,'Plugin','plugin.dll');
|
|
INSERT INTO script_versions(id,script_id,version,sha256,size) VALUES(1,1,1,'hash',0)`);
|
|
db().transaction(() => {
|
|
for (let id = 1; id <= 125; id++) {
|
|
db().prepare('INSERT INTO betas(id,script_id,script_version_id,trigger_kind,state,notes) VALUES(?,1,1,?,?,?)')
|
|
.run(id, 'ui', id <= 5 ? 'running' : 'promoted', `Test ${id}`);
|
|
db().prepare('INSERT INTO beta_scripts(beta_id,script_id,script_version_id) VALUES(?,1,1)').run(id);
|
|
}
|
|
for (let i = 0; i < 150; i++) db().prepare('INSERT INTO beta_events(beta_id,message) VALUES(1,?)').run(`Activity ${i}`);
|
|
})();
|
|
const page = betaListPage(new URLSearchParams());
|
|
expect(page.betas).toHaveLength(25);
|
|
expect(page).toMatchObject({ total: 125, page: 1, totalPages: 5, counts: { active: 5, history: 120 } });
|
|
expect(betaListPage(new URLSearchParams('view=active')).betas.map(beta => beta.id)).toEqual([5,4,3,2,1]);
|
|
expect(betaListPage(new URLSearchParams('view=history&q=Test%20101')).betas.map(beta => beta.id)).toEqual([101]);
|
|
expect(betaListPage(new URLSearchParams('q=Plugin&limit=100000')).betas).toHaveLength(100);
|
|
const second = betaListPage(new URLSearchParams('page=2'));
|
|
expect(second.betas.some(beta => page.betas.some(other => other.id === beta.id))).toBe(false);
|
|
const latest = betaActivityPage(1);
|
|
expect(latest.events).toHaveLength(50);
|
|
db().prepare("INSERT INTO beta_events(beta_id,message) VALUES(1,'New event')").run();
|
|
const previous = betaActivityPage(1, new URLSearchParams({ before: String(latest.nextBefore) }));
|
|
expect(previous.events).toHaveLength(50);
|
|
expect(previous.events.at(-1)!.id).toBeLessThan(latest.events[0].id);
|
|
const { GET } = await import('../../src/routes/api/betas/[id]/+server.js');
|
|
expect((await (await GET({ params: { id: '1' } })).json()).events).toHaveLength(50);
|
|
});
|
|
|
|
it('coalesces beta progress notifications after synchronous database work', async () => {
|
|
const { invalidateBeta, subscribe } = await import('../../src/lib/server/pipeline/bus.js');
|
|
const events: unknown[] = [];
|
|
const stop = subscribe(event => events.push(event));
|
|
try {
|
|
invalidateBeta(1); invalidateBeta(1); invalidateBeta(2);
|
|
expect(events).toEqual([]);
|
|
await Promise.resolve();
|
|
expect(events).toEqual([{ type: 'beta-changed', betaId: 1 }, { type: 'beta-changed', betaId: 2 }]);
|
|
} finally { stop(); }
|
|
});
|