import assert from 'node:assert/strict' import { mkdtempSync, readFileSync, rmSync } from 'node:fs' import { tmpdir } from 'node:os' import path from 'node:path' import test from 'node:test' import { createAndroidReleaseIdentity } from './release-identity.mjs' test('release identity increases for repeated builds with the same app version', () => { const root = mkdtempSync(path.join(tmpdir(), 'xuqm-release-identity-')) try { const first = createAndroidReleaseIdentity({ projectRoot: root, environment: {}, now: 1_800_000_000_000, entropy: 'first', }) const second = createAndroidReleaseIdentity({ projectRoot: root, environment: {}, now: 1_800_000_000_000, entropy: 'second', }) assert.equal(second.versionCode, first.versionCode + 1) assert.notEqual(second.buildId, first.buildId) const cached = JSON.parse( readFileSync(path.join(root, '.xuqm-cache', 'release-build.json'), 'utf8'), ) assert.deepEqual({ versionCode: cached.versionCode, buildId: cached.buildId }, second) } finally { rmSync(root, { recursive: true, force: true }) } }) test('release identity accepts explicit CI identity and validates its contract', () => { const root = mkdtempSync(path.join(tmpdir(), 'xuqm-release-identity-ci-')) try { assert.deepEqual( createAndroidReleaseIdentity({ projectRoot: root, environment: { XUQM_VERSION_CODE: '123456', XUQM_BUILD_ID: 'jenkins-123456', }, now: 1_800_000_000_000, }), { versionCode: 123456, buildId: 'jenkins-123456' }, ) assert.throws( () => createAndroidReleaseIdentity({ projectRoot: root, environment: { XUQM_VERSION_CODE: 'invalid' }, }), /XUQM_VERSION_CODE/, ) assert.throws( () => createAndroidReleaseIdentity({ projectRoot: root, environment: { XUQM_BUILD_ID: 'contains whitespace' }, }), /XUQM_BUILD_ID/, ) } finally { rmSync(root, { recursive: true, force: true }) } })