This commit is contained in:
@@ -42,6 +42,7 @@ async function setup(
|
||||
await writeFile(path, options.original);
|
||||
}
|
||||
const { script, version } = scripts.createScript({
|
||||
releaseVersion: '1.0.0',
|
||||
name: 'Revision test',
|
||||
targetRelPath: kind === 'script' ? 'revision.gsc' : undefined,
|
||||
kind,
|
||||
@@ -89,7 +90,13 @@ describe('beta revisions', () => {
|
||||
x.reviseBeta(
|
||||
x.betaId,
|
||||
1,
|
||||
[{ scriptId: x.script.id, content: Buffer.from('revision two') }],
|
||||
[
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('revision two')
|
||||
}
|
||||
],
|
||||
'Small fix'
|
||||
)
|
||||
).resolves.toEqual({ revision: 2 });
|
||||
@@ -132,7 +139,11 @@ describe('beta revisions', () => {
|
||||
await activateFiles('beta', x.betaId);
|
||||
for (let revision = 2; revision <= 3; revision++) {
|
||||
await x.reviseBeta(x.betaId, revision - 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from(`revision ${revision}`) }
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: `${revision}.0.0`,
|
||||
content: Buffer.from(`revision ${revision}`)
|
||||
}
|
||||
]);
|
||||
await activateFiles('beta', x.betaId);
|
||||
}
|
||||
@@ -157,7 +168,11 @@ describe('beta revisions', () => {
|
||||
await activateFiles('beta', x.betaId);
|
||||
}
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('pending replacement') }
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('pending replacement')
|
||||
}
|
||||
]);
|
||||
if (waves)
|
||||
expect(x.listBetaServers(x.betaId).map((row) => row.stage)).toEqual([
|
||||
@@ -174,7 +189,9 @@ describe('beta revisions', () => {
|
||||
|
||||
it('does not restore or delete files when no revision was ever activated', async () => {
|
||||
const x = await setup({ original: 'untouched' });
|
||||
await x.reviseBeta(x.betaId, 1, [{ scriptId: x.script.id, content: Buffer.from('new') }]);
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, releaseVersion: '2.0.0', content: Buffer.from('new') }
|
||||
]);
|
||||
expect(await x.rollbackBeta(x.betaId)).toMatchObject({ deploymentId: null });
|
||||
expect(await readFile(x.path, 'utf8')).toBe('untouched');
|
||||
});
|
||||
@@ -183,11 +200,16 @@ describe('beta revisions', () => {
|
||||
const x = await setup({ original: 'tracked original' });
|
||||
const { recordScript, getServerScript } =
|
||||
await import('../../src/lib/server/fleet/inventory.js');
|
||||
const prior = x.uploadNewVersion(x.script.id, Buffer.from('tracked original'));
|
||||
const prior = x.uploadNewVersion(
|
||||
x.script.id,
|
||||
Buffer.from('tracked original'),
|
||||
undefined,
|
||||
'1.0.1'
|
||||
);
|
||||
recordScript(names[0], 'revision.gsc', prior.id, prior.sha256, prior.size, 'test');
|
||||
await activateFiles('beta', x.betaId);
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('replacement') }
|
||||
{ scriptId: x.script.id, releaseVersion: '2.0.0', content: Buffer.from('replacement') }
|
||||
]);
|
||||
await activateFiles('beta', x.betaId);
|
||||
expect(x.db.prepare('SELECT prior_version_id FROM beta_server_scripts').get()).toEqual({
|
||||
@@ -210,7 +232,7 @@ describe('beta revisions', () => {
|
||||
});
|
||||
x.db.prepare("UPDATE beta_test_plans SET outcome = 'paused' WHERE beta_id = ?").run(betaId);
|
||||
await x.reviseBeta(betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('replacement') }
|
||||
{ scriptId: x.script.id, releaseVersion: '2.0.0', content: Buffer.from('replacement') }
|
||||
]);
|
||||
expect(x.listBetaServers(betaId).map((row) => [row.server, row.stage])).toEqual([
|
||||
[names[0], 'queued'],
|
||||
@@ -229,7 +251,11 @@ describe('beta revisions', () => {
|
||||
releaseRestartRequest(names[0], { kind: 'beta', id: String(x.betaId) });
|
||||
await expect(
|
||||
x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('replacement') }
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('replacement')
|
||||
}
|
||||
])
|
||||
).resolves.toEqual({ revision: 2 });
|
||||
});
|
||||
@@ -238,7 +264,11 @@ describe('beta revisions', () => {
|
||||
const x = await setup({ original: 'original config', kind: 'baseline' });
|
||||
await activateFiles('beta', x.betaId);
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('set sv_voice "0"\n') }
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('set sv_voice "0"\n')
|
||||
}
|
||||
]);
|
||||
await activateFiles('beta', x.betaId);
|
||||
expect(await readFile(x.path, 'utf8')).toContain('set sv_voice "0"');
|
||||
@@ -259,7 +289,11 @@ describe('beta revisions', () => {
|
||||
'activating'
|
||||
])('rejects %s updates without saving a revision', async (reason) => {
|
||||
const x = await setup();
|
||||
const upload = { scriptId: x.script.id, content: Buffer.from('changed') };
|
||||
const upload = {
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('changed')
|
||||
};
|
||||
if (reason === 'identical')
|
||||
upload.content = Buffer.from(
|
||||
(await import('../../src/lib/server/fleet/scripts.js')).getVersionContent(
|
||||
@@ -301,7 +335,7 @@ describe('beta revisions', () => {
|
||||
x.db.prepare('UPDATE betas SET opened_at = ?').run('2000-01-01T00:00:00Z');
|
||||
x.db.prepare("UPDATE beta_test_plans SET outcome = 'inconclusive'").run();
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('changed') }
|
||||
{ scriptId: x.script.id, releaseVersion: '2.0.0', content: Buffer.from('changed') }
|
||||
]);
|
||||
const { closeDb } = await import('../../src/lib/server/db/index.js');
|
||||
closeDb();
|
||||
@@ -320,7 +354,7 @@ describe('beta revisions', () => {
|
||||
const x = await setup({ legacy: true });
|
||||
await activateFiles('beta', x.betaId);
|
||||
await x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('changed') }
|
||||
{ scriptId: x.script.id, releaseVersion: '2.0.0', content: Buffer.from('changed') }
|
||||
]);
|
||||
expect(x.listBetaServers(x.betaId)[0]).toMatchObject({
|
||||
stage: 'awaiting-empty',
|
||||
@@ -346,8 +380,16 @@ describe('beta revisions', () => {
|
||||
.run(x.betaId, overlay.script.id, overlay.version.id);
|
||||
await expect(
|
||||
x.reviseBeta(x.betaId, 1, [
|
||||
{ scriptId: x.script.id, content: Buffer.from('valid new version') },
|
||||
{ scriptId: overlay.script.id, content: Buffer.from('invalid config') }
|
||||
{
|
||||
scriptId: x.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('valid new version')
|
||||
},
|
||||
{
|
||||
scriptId: overlay.script.id,
|
||||
releaseVersion: '2.0.0',
|
||||
content: Buffer.from('invalid config')
|
||||
}
|
||||
])
|
||||
).rejects.toThrow('at least one');
|
||||
expect(x.listVersions(x.script.id)).toHaveLength(1);
|
||||
@@ -365,6 +407,7 @@ describe('beta revisions', () => {
|
||||
const form = new FormData();
|
||||
form.set('expectedRevision', '1');
|
||||
form.set('notes', 'Fix scoring');
|
||||
form.set(`release:${x.script.id}`, '2.0.0');
|
||||
form.set(`file:${x.script.id}`, new File(['changed'], 'revision.gsc'));
|
||||
const post = () =>
|
||||
POST({
|
||||
@@ -380,4 +423,25 @@ describe('beta revisions', () => {
|
||||
});
|
||||
expect(await download.text()).toBe('revision one');
|
||||
});
|
||||
it.each([undefined, 'bad', '1.0.0'])(
|
||||
'rejects invalid replacement release %s without modifying the beta',
|
||||
async (release) => {
|
||||
const x = await setup();
|
||||
const { POST } = await import('../../src/routes/api/betas/[id]/revisions/+server.js');
|
||||
const before = x.getBeta(x.betaId);
|
||||
const form = new FormData();
|
||||
form.set('expectedRevision', '1');
|
||||
form.set(`file:${x.script.id}`, new File(['changed'], 'revision.gsc'));
|
||||
if (release !== undefined) form.set(`release:${x.script.id}`, release);
|
||||
const response = await POST({
|
||||
params: { id: String(x.betaId) },
|
||||
request: new Request('http://test/revisions', { method: 'POST', body: form })
|
||||
});
|
||||
expect(response.status).toBe(release === '1.0.0' ? 409 : 400);
|
||||
expect(x.getBeta(x.betaId)).toEqual(before);
|
||||
expect(x.listVersions(x.script.id)).toHaveLength(1);
|
||||
expect(x.db.prepare('SELECT * FROM beta_revisions').all()).toEqual([]);
|
||||
expect(x.listBetaScripts(x.betaId)[0].script_version_id).toBe(x.version.id);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user