返回 DeepSeek-Reasonix
release_notes_test.go
根目录 / internal / productdocs / release_notes_test.go
1 package productdocs
2
3 import (
4 "strings"
5 "testing"
6 )
7
8 func TestTargetedReleaseDocumentsSplitDesktopAndCLIUpdates(t *testing.T) {
9 documents, _, err := renderReleaseDocuments([]byte(`{
10 "releases": [{
11 "version": "2.0.0",
12 "targetingVersion": 1,
13 "date": "2026-01-01",
14 "channel": "stable",
15 "status": "reviewed",
16 "title": {"en": "Targeted", "zh": "分类版本"},
17 "summary": {"en": "Summary", "zh": "摘要"},
18 "surfaces": ["desktop", "cli", "service"],
19 "highlights": [
20 {"kind": "fixed", "targets": ["desktop", "cli"], "title": {"en": "Shared fix", "zh": "共享修复"}, "body": {"en": "Shared body.", "zh": "共享正文。"}},
21 {"kind": "improved", "targets": ["service"], "title": {"en": "Service work", "zh": "服务端改进"}, "body": {"en": "Service body.", "zh": "服务正文。"}}
22 ],
23 "changes": {
24 "new": [],
25 "improved": [],
26 "fixed": [{"targets": ["desktop"], "title": {"en": "Desktop fix", "zh": "桌面端修复"}, "body": {"en": "Desktop body.", "zh": "桌面端正文。"}}]
27 },
28 "upgrade": [],
29 "risks": []
30 }]
31 }`))
32 if err != nil {
33 t.Fatal(err)
34 }
35 var chinese string
36 for _, document := range documents {
37 if document.locale == "zh-CN" {
38 chinese = document.content
39 break
40 }
41 }
42 for _, want := range []string{"## 桌面端更新", "## CLI 端更新", "## 其他项目更新", "[桌面端 · CLI]", "[服务端]"} {
43 if !strings.Contains(chinese, want) {
44 t.Fatalf("targeted release document missing %q:\n%s", want, chinese)
45 }
46 }
47 if got := strings.Count(chinese, "共享修复"); got != 2 {
48 t.Fatalf("shared item rendered %d times, want once per client section:\n%s", got, chinese)
49 }
50 }
51
52 func TestLegacyReleaseDocumentsKeepOriginalSections(t *testing.T) {
53 documents, _, err := renderReleaseDocuments([]byte(`{
54 "releases": [{
55 "version": "1.0.0",
56 "title": {"en": "Legacy", "zh": "旧版"},
57 "summary": {"en": "Summary", "zh": "摘要"},
58 "highlights": [{"kind": "fixed", "title": {"en": "Fix", "zh": "修复"}, "body": {"en": "Body.", "zh": "正文。"}}],
59 "changes": {"new": [], "improved": [], "fixed": []}
60 }]
61 }`))
62 if err != nil {
63 t.Fatal(err)
64 }
65 english := documents[0].content
66 if !strings.Contains(english, "## Highlights") {
67 t.Fatalf("legacy release lost original sections:\n%s", english)
68 }
69 if strings.Contains(english, "## Desktop updates") || strings.Contains(english, "## CLI updates") {
70 t.Fatalf("legacy release unexpectedly used targeted sections:\n%s", english)
71 }
72 }
73
74 func TestTargetedReleaseDocumentsExplainEmptyCLISection(t *testing.T) {
75 release := releaseRecord{
76 Version: "2.0.1",
77 TargetingVersion: 1,
78 Title: localizedText{English: "Desktop only", Chinese: "仅桌面端"},
79 Summary: localizedText{English: "Summary", Chinese: "摘要"},
80 Surfaces: []string{"desktop"},
81 Highlights: []releaseItem{{
82 Kind: "fixed",
83 Targets: []string{"desktop"},
84 Title: localizedText{English: "Desktop fix", Chinese: "桌面端修复"},
85 Body: localizedText{English: "Body.", Chinese: "正文。"},
86 }},
87 }
88 markdown := renderReleaseMarkdown(release, "zh-CN")
89 if !strings.Contains(markdown, "CLI 用户可按需跳过") {
90 t.Fatalf("empty CLI section missing actionable guidance:\n%s", markdown)
91 }
92 }
93
93 lines GO