120 lines
3.5 KiB
JavaScript
120 lines
3.5 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
|
|
import {
|
|
ReleaseModelError,
|
|
appendOtaChangelog,
|
|
createReleaseDocument,
|
|
deriveReleaseIdentity,
|
|
extractPublicChangelog,
|
|
finalizeReleaseDocument,
|
|
parseReleaseDocument,
|
|
} from './model.mjs'
|
|
|
|
const SHA = '0123456789abcdef0123456789abcdef01234567'
|
|
|
|
test('derives every release identifier from one version', () => {
|
|
assert.deepEqual(deriveReleaseIdentity('1.131.1'), {
|
|
version: '1.131.1',
|
|
branch: 'release-1.131.1',
|
|
tag: '1.131.1',
|
|
filename: 'RELEASE-1.131.1.md',
|
|
githubReleaseName: 'Release 1.131.1',
|
|
})
|
|
})
|
|
|
|
test('rejects non-strict release versions', () => {
|
|
for (const version of [
|
|
'v1.131.1',
|
|
'1.131',
|
|
'1.131.1-beta',
|
|
' 1.131.1',
|
|
'1.0131.1',
|
|
]) {
|
|
assert.throws(() => deriveReleaseIdentity(version), ReleaseModelError)
|
|
}
|
|
})
|
|
|
|
test('creates and parses a prepared release document', () => {
|
|
const document = createReleaseDocument('1.131.1', '- Added something')
|
|
const parsed = parseReleaseDocument(document, {
|
|
filename: 'RELEASE-1.131.1.md',
|
|
})
|
|
|
|
assert.deepEqual(parsed.metadata, {releaseVersion: '1.131.1'})
|
|
assert.equal(parsed.sections.length, 1)
|
|
assert.equal(parsed.sections[0].type, 'initial')
|
|
assert.equal(
|
|
extractPublicChangelog(document),
|
|
'## Initial release\n\n- Added something',
|
|
)
|
|
})
|
|
|
|
test('finalizes a release using artifact-derived metadata', () => {
|
|
const prepared = createReleaseDocument('1.131.1', '- Added something')
|
|
const finalized = finalizeReleaseDocument(prepared, {
|
|
sourceTag: '1.131.1',
|
|
sourceSha: SHA,
|
|
iosBuildNumber: 1662,
|
|
androidVersionCode: 1110,
|
|
})
|
|
const parsed = parseReleaseDocument(finalized, {stage: 'final'})
|
|
|
|
assert.equal(parsed.metadata.sourceSha, SHA)
|
|
assert.equal(parsed.metadata.iosBuildNumber, '1662')
|
|
assert.equal(parsed.metadata.androidVersionCode, '1110')
|
|
})
|
|
|
|
test('requires all operational metadata in the final state', () => {
|
|
const prepared = createReleaseDocument('1.131.1', '- Added something')
|
|
assert.throws(
|
|
() => parseReleaseDocument(prepared, {stage: 'final'}),
|
|
/missing 'sourceTag'/,
|
|
)
|
|
})
|
|
|
|
test('appends contiguous OTA changelog sections', () => {
|
|
let document = createReleaseDocument('1.131.1', '- Initial change')
|
|
document = appendOtaChangelog(document, 1, '- First fix')
|
|
document = appendOtaChangelog(document, 2, '- Second fix')
|
|
|
|
const parsed = parseReleaseDocument(document)
|
|
assert.deepEqual(
|
|
parsed.sections.map(section => section.sequence),
|
|
[null, 1, 2],
|
|
)
|
|
assert.match(parsed.publicChangelog, /## OTA 2\n\n- Second fix$/)
|
|
})
|
|
|
|
test('rejects skipped OTA sequence numbers', () => {
|
|
const document = createReleaseDocument('1.131.1', '- Initial change')
|
|
assert.throws(() => appendOtaChangelog(document, 2, '- A fix'), /must be 1/)
|
|
})
|
|
|
|
test('rejects filename, metadata, and changelog inconsistencies', () => {
|
|
const document = createReleaseDocument('1.131.1', '- Initial change')
|
|
assert.throws(
|
|
() => parseReleaseDocument(document, {filename: 'RELEASE-1.132.0.md'}),
|
|
/Filename must be/,
|
|
)
|
|
assert.throws(
|
|
() =>
|
|
parseReleaseDocument(document.replace('releaseVersion:', 'surprise:')),
|
|
/Unknown release frontmatter field/,
|
|
)
|
|
assert.throws(
|
|
() => parseReleaseDocument(document.replace('Initial release', 'OTA 1')),
|
|
/must begin with an '## Initial release'/,
|
|
)
|
|
assert.throws(
|
|
() =>
|
|
parseReleaseDocument(
|
|
document.replace(
|
|
'- Initial change',
|
|
'- Initial change\n\n## Notes\n\nNope',
|
|
),
|
|
),
|
|
/Unsupported public changelog section/,
|
|
)
|
|
})
|