-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocumentation_test.go
More file actions
187 lines (177 loc) · 4.77 KB
/
Copy pathdocumentation_test.go
File metadata and controls
187 lines (177 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package chat_test
import (
"os"
"regexp"
"strings"
"testing"
)
func TestDocumentationCoversIntentionalVercelDifferences(t *testing.T) {
t.Parallel()
readme, err := os.ReadFile("README.md")
if err != nil {
t.Fatalf("read README.md: %v", err)
}
readmeText := string(readme)
for _, phrase := range []string{
"not a TypeScript API port",
"Handlers are single-slot per hook",
"no dedicated `OnDirectMessage` hook",
"no public proactive `OpenDM`",
"no thread application state APIs",
"no full Vercel Chat SDK feature parity",
"Message history is application-owned",
"Thread Application State",
"HistoryReader",
} {
if !strings.Contains(readmeText, phrase) {
t.Fatalf("README.md does not mention %q", phrase)
}
}
runtimeSource, err := os.ReadFile("runtime.go")
if err != nil {
t.Fatalf("read runtime.go: %v", err)
}
sourceText := string(runtimeSource)
for _, phrase := range []string{
"OnNewMention installs or atomically replaces the single new-mention handler",
"intentionally differs from Vercel Chat SDK",
"OnSubscribedMessage installs or atomically replaces the single subscribed-message handler",
"OnCommand installs or atomically replaces the single command handler",
"OnInteraction installs or atomically replaces the single interaction handler",
} {
if !strings.Contains(sourceText, phrase) {
t.Fatalf("runtime GoDoc does not mention %q", phrase)
}
}
}
func TestAdapterDocumentationCoversMultiTenantInstall(t *testing.T) {
t.Parallel()
cases := []struct {
path string
phrases []string
}{
{
path: "adapters/slack/doc.go",
phrases: []string{
"Multi-tenant is opt-in",
"account linking",
"stay app-owned",
"InstallStore is application-implemented",
"slack.SlackInstall",
},
},
{
path: "adapters/linear/doc.go",
phrases: []string{
"Multi-tenant is opt-in",
"account linking",
"stay app-owned",
"InstallStore is application-implemented",
"linear.LinearInstall",
},
},
}
for _, tc := range cases {
source, err := os.ReadFile(tc.path)
if err != nil {
t.Fatalf("read %s: %v", tc.path, err)
}
text := string(source)
for _, phrase := range tc.phrases {
if !strings.Contains(text, phrase) {
t.Fatalf("%s does not mention %q", tc.path, phrase)
}
}
}
}
func TestDocumentationCoversMessageHistoryCapability(t *testing.T) {
t.Parallel()
cases := []struct {
path string
phrases []string
}{
{
path: "README.md",
phrases: []string{
"HistoryReader",
"Optional Capability",
"Thread Application State",
"no runtime storage",
},
},
{
path: "adapters/slack/doc.go",
phrases: []string{
"HistoryReader Optional Capability",
"storage-free",
"Thread Application State",
},
},
{
path: "adapters/linear/doc.go",
phrases: []string{
"HistoryReader Optional Capability",
"storage-free",
"Thread Application State",
},
},
{
path: "types.go",
phrases: []string{
"HistoryReader is an Optional Capability",
"It performs",
"NO runtime storage",
"Thread Application State",
},
},
}
for _, tc := range cases {
source, err := os.ReadFile(tc.path)
if err != nil {
t.Fatalf("read %s: %v", tc.path, err)
}
text := string(source)
for _, phrase := range tc.phrases {
if !strings.Contains(text, phrase) {
t.Fatalf("%s does not mention %q", tc.path, phrase)
}
}
}
}
// TestLinearHowToSnippetsAreExtractedFromBuildableSource keeps the worked
// examples in the Linear how-to honest: every fenced Go block annotated with a
// `<!-- source: path -->` marker must appear verbatim (modulo whitespace) in
// the referenced buildable, tested source file.
func TestLinearHowToSnippetsAreExtractedFromBuildableSource(t *testing.T) {
t.Parallel()
doc, err := os.ReadFile("docs/how-to/linear-agent-sessions.md")
if err != nil {
t.Fatalf("read how-to: %v", err)
}
pattern := regexp.MustCompile("(?s)<!-- source: ([^>]+?) -->\\s*```go\\n(.*?)```")
matches := pattern.FindAllStringSubmatch(string(doc), -1)
if len(matches) < 8 {
t.Fatalf("marked snippets = %d, want at least 8", len(matches))
}
normalizedSources := map[string]string{}
for _, match := range matches {
path := strings.TrimSpace(match[1])
snippet := match[2]
normalizedSource, ok := normalizedSources[path]
if !ok {
source, err := os.ReadFile(path)
if err != nil {
t.Fatalf("read snippet source %s: %v", path, err)
}
normalizedSource = strings.Join(strings.Fields(string(source)), " ")
normalizedSources[path] = normalizedSource
}
normalizedSnippet := strings.Join(strings.Fields(snippet), " ")
if normalizedSnippet == "" {
t.Fatalf("empty marked snippet for %s", path)
}
if !strings.Contains(normalizedSource, normalizedSnippet) {
t.Fatalf("doc snippet drifted from %s:\n%s", path, snippet)
}
}
}