hermes-agent/apps/desktop/scripts/write-build-stamp.test.mjs
ethernet 1a4c4eca0d feat(version): derive display versions from release tags
Resolve user-facing versions from SemVer release tags and available local
history while retaining raw package metadata for API identity. Stamp Desktop
provenance at build time, and expose generic version details for every
Desktop install method.
2026-07-28 17:22:59 -04:00

154 lines
4.9 KiB
JavaScript

import assert from 'node:assert/strict'
import { test } from 'vitest'
import {
FALLBACK_BRANCH,
FALLBACK_COMMIT,
fromCI,
deriveVersionMetadata,
fromFallback,
fromLocalGit,
isFallbackCommit,
resolveStamp
} from './write-build-stamp.mjs'
test('fromCI reads GITHUB_SHA / GITHUB_REF_NAME', () => {
assert.deepEqual(
fromCI({ GITHUB_SHA: 'a'.repeat(40), GITHUB_REF_NAME: 'release' }),
{ commit: 'a'.repeat(40), branch: 'release', dirty: false, source: 'ci' }
)
assert.equal(fromCI({}), null)
})
test('fromLocalGit returns null when git rev-parse fails', () => {
const stamp = fromLocalGit('/tmp/not-a-repo', () => null)
assert.equal(stamp, null)
})
test('fromLocalGit reads HEAD + branch + dirty status', () => {
const calls = []
const execFn = (cmd) => {
calls.push(cmd)
if (cmd === 'git rev-parse HEAD') return 'b'.repeat(40)
if (cmd === 'git rev-parse --abbrev-ref HEAD') return 'main'
if (cmd === 'git status --porcelain -uno') return ' M apps/desktop/package.json'
return null
}
assert.deepEqual(fromLocalGit('/repo', execFn), {
commit: 'b'.repeat(40),
branch: 'main',
dirty: true,
source: 'local'
})
assert.ok(calls.includes('git rev-parse HEAD'))
})
test('fromFallback uses the all-zero placeholder commit', () => {
assert.deepEqual(fromFallback(), {
commit: FALLBACK_COMMIT,
branch: FALLBACK_BRANCH,
dirty: false,
source: 'fallback'
})
assert.equal(isFallbackCommit(FALLBACK_COMMIT), true)
assert.equal(isFallbackCommit('a'.repeat(40)), false)
})
test('resolveStamp prefers CI over local git over fallback', () => {
const ci = resolveStamp({
env: { GITHUB_SHA: 'c'.repeat(40), GITHUB_REF_NAME: 'main' },
execFn: () => 'should-not-run'
})
assert.equal(ci.source, 'ci')
assert.equal(ci.commit, 'c'.repeat(40))
const local = resolveStamp({
env: {},
execFn: (cmd) => {
if (cmd === 'git rev-parse HEAD') return 'd'.repeat(40)
if (cmd === 'git rev-parse --abbrev-ref HEAD') return 'main'
if (cmd === 'git status --porcelain -uno') return ''
return null
}
})
assert.equal(local.source, 'local')
assert.equal(local.commit, 'd'.repeat(40))
assert.equal(local.dirty, false)
})
test('resolveStamp falls back when neither CI nor git is available', () => {
const stamp = resolveStamp({ env: {}, execFn: () => null })
assert.deepEqual(stamp, {
commit: FALLBACK_COMMIT,
branch: FALLBACK_BRANCH,
dirty: false,
source: 'fallback'
})
})
test('deriveVersionMetadata prefers a strict SemVer tag over historical CalVer tags', () => {
const stamp = deriveVersionMetadata(
{ commit: 'a'.repeat(40), branch: 'feature', dirty: true, source: 'local' },
{
readFile: () => '__version__ = "0.20.0"\n__release_date__ = "2026.7.20"\n',
execFn: command => {
if (command.startsWith('git tag --merged')) return 'v2026.7.20\nv0.19.0\n'
if (command === 'git rev-list --count v0.19.0..HEAD') return '7'
if (command === 'git rev-list --count v2026.7.20..HEAD') return '20'
return null
}
}
)
assert.deepEqual(stamp, {
commit: 'a'.repeat(40), branch: 'feature', dirty: true, source: 'local',
baseVersion: '0.19.0', displayVersion: '0.19.0+7', distance: 7
})
})
test('deriveVersionMetadata uses the historical release tag only as a transition fallback', () => {
const stamp = deriveVersionMetadata(
{ commit: 'a'.repeat(40), branch: 'feature', dirty: false, source: 'local' },
{
readFile: () => '__version__ = "0.19.0"\n__release_date__ = "2026.7.20"\n',
execFn: command => command === 'git rev-list --count v2026.7.20..HEAD' ? '3' : ''
}
)
assert.equal(stamp.baseVersion, '0.19.0')
assert.equal(stamp.displayVersion, '0.19.0+3')
assert.equal(stamp.distance, 3)
})
test('deriveVersionMetadata accepts three-digit SemVer majors but rejects four-digit CalVer years', () => {
const stamp = deriveVersionMetadata(
{ commit: 'a'.repeat(40), branch: 'feature', dirty: false, source: 'local' },
{
readFile: () => '__version__ = "999.1.2"\n__release_date__ = "2026.7.20"\n',
execFn: command => {
if (command.startsWith('git tag --merged')) return 'v2026.7.20\nv999.1.2\n'
if (command === 'git rev-list --count v999.1.2..HEAD') return '4'
if (command === 'git rev-list --count v2026.7.20..HEAD') return '8'
return null
}
}
)
assert.equal(stamp.baseVersion, '999.1.2')
assert.equal(stamp.displayVersion, '999.1.2+4')
assert.equal(stamp.distance, 4)
})
test('deriveVersionMetadata shows +? for dirty builds with unknown distance', () => {
const stamp = deriveVersionMetadata(
{ commit: 'a'.repeat(40), branch: 'feature', dirty: true, source: 'local' },
{
readFile: () => '__version__ = "0.19.0"\n__release_date__ = "2026.7.20"\n',
execFn: () => null
}
)
assert.equal(stamp.baseVersion, '0.19.0')
assert.equal(stamp.displayVersion, '0.19.0+?')
assert.equal(stamp.distance, null)
})