Restore the v2.1.19 application baseline and retain only the focused import preflight summary with duplicate, unavailable, destination, job, and size-limit visibility.
This commit is contained in:
@@ -23,75 +23,6 @@ test('release arguments reject a malformed transport tag', async () => {
|
||||
);
|
||||
});
|
||||
|
||||
test('release notes accept English and reject German or French', async () => {
|
||||
const { createReleasePlan, parseReleaseArgs } = await import(releasePlanUrl);
|
||||
for (const notes of [
|
||||
'Security improvements and more reliable updates.',
|
||||
'Uploads now resume correctly after network interruptions.',
|
||||
'Faster uploads, smoother recovery.',
|
||||
'Hardened credential redaction.'
|
||||
]) {
|
||||
assert.equal(
|
||||
createReleasePlan(parseReleaseArgs(['2.1.21', '--transport-tag', 'v2.1.21', notes])).releaseBody,
|
||||
notes
|
||||
);
|
||||
}
|
||||
for (const notes of [
|
||||
'Sicherheitsverbesserungen und zuverlässigere Updates.',
|
||||
'Uploads werden nach Netzwerkunterbrechungen jetzt korrekt fortgesetzt.',
|
||||
'Améliorations de sécurité et mises à jour plus fiables.',
|
||||
'Les téléversements reprennent correctement après les interruptions réseau.',
|
||||
'Security update et corrections.',
|
||||
'Das Programm korrigiert Probleme im update.',
|
||||
'Uploads laufen wieder stabil.'
|
||||
]) {
|
||||
assert.throws(
|
||||
() => createReleasePlan(parseReleaseArgs(['2.1.21', '--transport-tag', 'v2.1.21', notes])),
|
||||
/English release notes are required/
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('release arguments reject unknown, misspelled, and duplicate options', async () => {
|
||||
const { parseReleaseArgs } = await import(releasePlanUrl);
|
||||
assert.deepEqual(
|
||||
parseReleaseArgs(['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Hardened credential redaction.', '--dry-run']),
|
||||
{
|
||||
version: '2.1.21',
|
||||
transportTag: 'v2.1.21',
|
||||
notes: 'Hardened credential redaction.',
|
||||
dryRun: true
|
||||
}
|
||||
);
|
||||
const invalidArgs = [
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Release notes', '--publish'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Release notes', '--dryrun'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Release notes', '-dry-run'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '-notes', 'Release notes'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Release notes', '--dry-run', '--dry-run'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--notes', 'Release notes', '--notes', 'Other notes'],
|
||||
['2.1.21', '--transport-tag', 'v2.1.21', '--transport-tag', 'v2.1.22', '--notes', 'Release notes']
|
||||
];
|
||||
|
||||
for (const args of invalidArgs) {
|
||||
assert.throws(() => parseReleaseArgs(args), /option/i);
|
||||
}
|
||||
});
|
||||
|
||||
test(['GitHub and ', ['Gi', 'tea'].join(''), ' CI verify version tag pushes'].join(''), () => {
|
||||
const workflowPaths = ['.github/workflows/ci.yml', `${['.', ['gi', 'tea'].join('')].join('')}/workflows/ci.yml`];
|
||||
for (const relativePath of workflowPaths) {
|
||||
const workflow = fs.readFileSync(path.resolve(__dirname, '..', relativePath), 'utf8');
|
||||
const lines = workflow.split(/\r?\n/);
|
||||
const pushIndex = lines.indexOf(' push:');
|
||||
const pushTrigger = [];
|
||||
for (let index = pushIndex + 1; index < lines.length && lines[index].startsWith(' '); index++) {
|
||||
pushTrigger.push(lines[index]);
|
||||
}
|
||||
assert.ok(pushTrigger.includes(" tags: ['v*']"), relativePath);
|
||||
}
|
||||
});
|
||||
|
||||
test('matching GitHub release notes replace the private release body', async () => {
|
||||
const calls = [];
|
||||
const notes = await fetchGithubReleaseNotes('2.1.0', 'Private fallback', async (url, options) => {
|
||||
@@ -259,7 +190,7 @@ test('release plan keeps product artifacts separate from the transport tag', asy
|
||||
}, {
|
||||
version: '2.0.7',
|
||||
transportTag: 'v3.3.115',
|
||||
releaseTitle: 'Multi Hoster Uploader v2.0.7',
|
||||
releaseTitle: 'Multi-Hoster-Upload v2.0.7',
|
||||
releaseBody: 'Update visibility',
|
||||
expectedArtifacts: [
|
||||
'Multi-Hoster-Upload Setup 2.0.7.exe',
|
||||
@@ -271,29 +202,13 @@ test('release plan keeps product artifacts separate from the transport tag', asy
|
||||
});
|
||||
});
|
||||
|
||||
test('GitHub release metadata uses the normalized uploaded asset name', async () => {
|
||||
const { createReleasePlan, parseReleaseArgs, renderLatestYml } = await import(releasePlanUrl);
|
||||
const plan = createReleasePlan(parseReleaseArgs(['2.1.20', '--transport-tag', 'v2.1.20', 'Release notes']));
|
||||
const latestYml = renderLatestYml(plan, 'abc123', 456, '2026-08-13T12:00:00.000Z', plan.githubSetupName);
|
||||
|
||||
assert.deepEqual(plan.githubExpectedArtifacts, [
|
||||
'Multi-Hoster-Upload.Setup.2.1.20.exe',
|
||||
'Multi-Hoster-Upload.2.1.20.exe',
|
||||
'Multi-Hoster-Upload.Setup.2.1.20.exe.blockmap',
|
||||
'latest.yml'
|
||||
]);
|
||||
assert.match(latestYml, /url: Multi-Hoster-Upload\.Setup\.2\.1\.20\.exe/);
|
||||
assert.match(latestYml, /path: Multi-Hoster-Upload\.Setup\.2\.1\.20\.exe/);
|
||||
assert.doesNotMatch(latestYml, /Multi-Hoster-Upload Setup/);
|
||||
});
|
||||
|
||||
test('compatible existing release preserves the recovery id', async () => {
|
||||
const { createReleasePlan, parseReleaseArgs, resolveExistingReleaseId } = await import(releasePlanUrl);
|
||||
const plan = createReleasePlan(parseReleaseArgs(['2.0.1', '--transport-tag', 'v3.3.109', 'Bridge notes']));
|
||||
const release = {
|
||||
id: 81,
|
||||
tag_name: 'v3.3.109',
|
||||
name: 'Multi Hoster Uploader v2.0.1',
|
||||
name: 'Multi-Hoster-Upload v2.0.1',
|
||||
body: 'Bridge notes',
|
||||
draft: false,
|
||||
prerelease: false,
|
||||
@@ -318,36 +233,6 @@ test('incompatible existing release title fails closed', async () => {
|
||||
|
||||
assert.throws(
|
||||
() => resolveExistingReleaseId(plan, release),
|
||||
/Refusing recovery for v3\.3\.109: existing release title "Multi-Hoster-Upload v3\.3\.109" does not match "Multi Hoster Uploader v2\.0\.1"/
|
||||
/Refusing recovery for v3\.3\.109: existing release title "Multi-Hoster-Upload v3\.3\.109" does not match "Multi-Hoster-Upload v2\.0\.1"/
|
||||
);
|
||||
});
|
||||
|
||||
test('existing release recovery rejects a mismatched transport tag', async () => {
|
||||
const { createReleasePlan, parseReleaseArgs, resolveExistingReleaseId } = await import(releasePlanUrl);
|
||||
const plan = createReleasePlan(parseReleaseArgs(['2.1.20', '--transport-tag', 'v2.1.20', 'Release notes']));
|
||||
const release = {
|
||||
id: 82,
|
||||
tag_name: 'v9.9.9',
|
||||
name: 'Multi Hoster Uploader v2.1.20'
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => resolveExistingReleaseId(plan, release),
|
||||
/existing release tag "v9\.9\.9" does not match "v2\.1\.20"/
|
||||
);
|
||||
});
|
||||
|
||||
test('checksum metadata accepts equivalent transport-specific installer separators', async () => {
|
||||
const sha = crypto.randomBytes(64).toString('base64');
|
||||
const metadata = await parseLatestYml('https://update.invalid/latest.yml', {
|
||||
version: '2.1.22',
|
||||
assetName: 'Multi-Hoster-Upload Setup 2.1.22.exe',
|
||||
assetSize: 456
|
||||
}, async () => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => `version: 2.1.22\npath: Multi-Hoster-Upload.Setup.2.1.22.exe\nsha512: ${sha}\nsize: 456\n`
|
||||
}));
|
||||
|
||||
assert.equal(metadata.path, 'Multi-Hoster-Upload.Setup.2.1.22.exe');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user