返回 DeepSeek-Reasonix
release-notes.test.mjs
根目录 / scripts / release-notes.test.mjs
1 import assert from "node:assert/strict";
2 import { test } from "node:test";
3 import { loadCatalog, releaseForVersion, renderGitHubRelease, validateCatalog } from "./release-notes.mjs";
4 import { validateReleaseEvent } from "./release-event.mjs";
5
6 test("the committed release catalog is valid and newest first", async () => {
7 const catalog = await loadCatalog();
8 assert.equal(catalog.schemaVersion, 1);
9 assert.equal(new Set(catalog.releases.map((release) => release.version)).size, catalog.releases.length);
10 });
11
12 test("tag namespaces resolve to the same product release", async () => {
13 const catalog = await loadCatalog();
14 assert.equal(releaseForVersion(catalog, "v1.17.13").version, "1.17.13");
15 assert.equal(releaseForVersion(catalog, "desktop-v1.17.13").version, "1.17.13");
16 assert.equal(releaseForVersion(catalog, "npm-v1.17.13").version, "1.17.13");
17 });
18
19 test("GitHub rendering keeps product sections and source PR links", async () => {
20 const catalog = await loadCatalog();
21 const markdown = renderGitHubRelease(releaseForVersion(catalog, "1.17.13"), "zh");
22 assert.match(markdown, /## 使用攻略/);
23 assert.match(markdown, /## 重点内容/);
24 assert.match(markdown, /## 升级提醒/);
25 assert.match(markdown, /## 风险提示/);
26 assert.match(markdown, /## 致谢/);
27 assert.match(markdown, /\/pull\/6460/);
28 assert.match(markdown, /reasonix\.io\/changelog\/v1\.17\.13/);
29 });
30
31 test("validation rejects bilingual drift", () => {
32 assert.throws(
33 () =>
34 validateCatalog({
35 schemaVersion: 1,
36 releases: [
37 {
38 version: "1.0.0",
39 date: "2026-01-01",
40 channel: "stable",
41 title: { en: "Title", zh: "" },
42 summary: { en: "Summary", zh: "摘要" },
43 },
44 ],
45 }),
46 /title\.zh/,
47 );
48 });
49
50 test("managed Preview records bind every surface to one exact ordinal", () => {
51 const release = {
52 version: "1.19.0-preview.3",
53 releaseId: "1.19.0-preview.3",
54 baseVersion: "1.19.0",
55 date: "2026-07-31",
56 channel: "prerelease",
57 status: "reviewed",
58 previousRelease: "1.19.0-preview.2",
59 builds: {
60 cli: "v1.19.0-preview.3",
61 desktop: "v1.19.0-preview.3",
62 npm: "1.19.0-canary.3",
63 },
64 title: { en: "Preview", zh: "预览版" },
65 summary: { en: "Preview summary", zh: "预览版摘要" },
66 surfaces: ["cli"],
67 guides: [],
68 highlights: [{
69 kind: "fixed",
70 title: { en: "Fix", zh: "修复" },
71 body: { en: "A fix.", zh: "一项修复。" },
72 refs: [1],
73 }],
74 changes: { new: [], improved: [], fixed: [] },
75 upgrade: [],
76 risks: [],
77 contributors: [],
78 links: {
79 github: "https://github.com/esengine/DeepSeek-Reasonix/releases/tag/v1.19.0-preview.3",
80 compare: "https://github.com/esengine/DeepSeek-Reasonix/compare/v1.19.0-preview.2...v1.19.0-preview.3",
81 download: "https://reasonix.io/?download=desktop&channel=preview#start",
82 },
83 };
84
85 assert.doesNotThrow(() => validateCatalog({ schemaVersion: 1, releases: [release] }));
86 assert.throws(
87 () => validateCatalog({
88 schemaVersion: 1,
89 releases: [{ ...release, builds: { ...release.builds, npm: "1.19.0-canary.4" } }],
90 }),
91 /builds\.npm/,
92 );
93 });
94
95 test("publication marker is bound to reviewed version, channel, SHA, and builds", () => {
96 const release = {
97 version: "1.19.0-preview.3",
98 channel: "prerelease",
99 candidateSha: "a".repeat(40),
100 builds: {
101 cli: "v1.19.0-preview.3",
102 desktop: "v1.19.0-preview.3",
103 npm: "1.19.0-canary.3",
104 },
105 };
106 const event = {
107 schemaVersion: 1,
108 releaseId: release.version,
109 channel: "preview",
110 candidateSha: release.candidateSha,
111 publishedAt: "2026-07-31T00:00:00.000Z",
112 releaseNotesUrl: "https://reasonix.io/changelog/v1.19.0-preview.3/",
113 builds: release.builds,
114 };
115
116 assert.doesNotThrow(() => validateReleaseEvent(event, release));
117 assert.throws(
118 () => validateReleaseEvent({ ...event, candidateSha: "b".repeat(40) }, release),
119 /candidateSha/,
120 );
121 });
122
122 lines Plain Text