/** * 版本一致性契约测试(v0.8.0) * * 背景:此前版本号被硬编码在多个测试文件里(tests/v025-fixes.test.ts:31、 * tests/v033-fixes.test.ts:406),每次发版必须手改测试;而且只校验 src 常量, * 与 package.json / dist 产物之间没有任何一致性检查 —— 三者可以静默漂移。 * * 本测试把"版本号"变成一个单点校验的契约: * 1. src/constants.ts 的 VERSION 是合法 semver; * 2. package.json 的 version 与 VERSION 完全一致; * 3. (可选)dist 产物存在时,其内嵌 VERSION 必须与上述一致。 * * 第 3 条让"dist 与 src 漂移"(CI 无同步校验)变成红灯。 */ import { readFileSync, existsSync } from 'fs'; import { join } from 'path'; import { VERSION } from '../src/constants'; const ROOT = join(__dirname, '..'); describe('[v0.8.0] 版本一致性契约', () => { test('src/constants.ts VERSION 是合法语义化版本', () => { expect(VERSION).toMatch(/^\d+\.\d+\.\d+$/); }); test('package.json version 与 VERSION 常量一致', () => { const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')) as { version: string }; expect(pkg.version).toBe(VERSION); }); test('dist 产物内嵌 VERSION 与源码一致(dist 存在时)', () => { const distFile = join(ROOT, 'dist', 'metona-sqlark.esm.js'); if (!existsSync(distFile)) { // dist 未构建时不失败(CI 会先 build),但要显式跳过而不是静默通过 expect(existsSync(distFile)).toBe(false); return; } const content = readFileSync(distFile, 'utf8'); // 构建产物把源码常量内联为 `const VERSION = 'x.y.z';` // (见 rollup 输出,不要去扫描文件里全部字符串字面量 —— 那会命中无关数字) const match = content.match(/\bVERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/); expect(match).not.toBeNull(); expect(match![1]).toBe(VERSION); }); });