Monorepo for Tangled
tangled.org
1package models
2
3import (
4 "testing"
5
6 "tangled.org/core/api/tangled"
7 "tangled.org/core/workflow"
8)
9
10func TestPipelineEnvVars_PushBranch(t *testing.T) {
11 tr := &tangled.Pipeline_TriggerMetadata{
12 Kind: string(workflow.TriggerKindPush),
13 Push: &tangled.Pipeline_PushTriggerData{
14 NewSha: "abc123def456",
15 OldSha: "000000000000",
16 Ref: "refs/heads/main",
17 },
18 Repo: &tangled.Pipeline_TriggerRepo{
19 Knot: "example.com",
20 Did: "did:plc:user123",
21 Repo: sp("my-repo"),
22 RepoDid: sp("did:plc:boltless"),
23 DefaultBranch: "main",
24 },
25 }
26 id := PipelineId{
27 Knot: "example.com",
28 Rkey: "123123",
29 }
30 env := PipelineEnvVars(tr, id)
31
32 // Check standard CI variable
33 if env["CI"] != "true" {
34 t.Errorf("Expected CI='true', got '%s'", env["CI"])
35 }
36
37 // Check ref variables
38 if env["TANGLED_REF"] != "refs/heads/main" {
39 t.Errorf("Expected TANGLED_REF='refs/heads/main', got '%s'", env["TANGLED_REF"])
40 }
41 if env["TANGLED_REF_NAME"] != "main" {
42 t.Errorf("Expected TANGLED_REF_NAME='main', got '%s'", env["TANGLED_REF_NAME"])
43 }
44 if env["TANGLED_REF_TYPE"] != "branch" {
45 t.Errorf("Expected TANGLED_REF_TYPE='branch', got '%s'", env["TANGLED_REF_TYPE"])
46 }
47
48 // Check SHA variables
49 if env["TANGLED_SHA"] != "abc123def456" {
50 t.Errorf("Expected TANGLED_SHA='abc123def456', got '%s'", env["TANGLED_SHA"])
51 }
52 if env["TANGLED_COMMIT_SHA"] != "abc123def456" {
53 t.Errorf("Expected TANGLED_COMMIT_SHA='abc123def456', got '%s'", env["TANGLED_COMMIT_SHA"])
54 }
55
56 // Check repo variables
57 if env["TANGLED_REPO_KNOT"] != "example.com" {
58 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
59 }
60 if env["TANGLED_REPO_DID"] != "did:plc:user123" {
61 t.Errorf("Expected TANGLED_REPO_DID='did:plc:user123', got '%s'", env["TANGLED_REPO_DID"])
62 }
63 if env["TANGLED_REPO_NAME"] != "my-repo" {
64 t.Errorf("Expected TANGLED_REPO_NAME='my-repo', got '%s'", env["TANGLED_REPO_NAME"])
65 }
66 if env["TANGLED_REPO_DEFAULT_BRANCH"] != "main" {
67 t.Errorf("Expected TANGLED_REPO_DEFAULT_BRANCH='main', got '%s'", env["TANGLED_REPO_DEFAULT_BRANCH"])
68 }
69 if env["TANGLED_REPO_URL"] != "https://example.com/did:plc:boltless" {
70 t.Errorf("Expected TANGLED_REPO_URL='https://example.com/did:plc:boltless', got '%s'", env["TANGLED_REPO_URL"])
71 }
72}
73
74func TestPipelineEnvVars_PushTag(t *testing.T) {
75 tr := &tangled.Pipeline_TriggerMetadata{
76 Kind: string(workflow.TriggerKindPush),
77 Push: &tangled.Pipeline_PushTriggerData{
78 NewSha: "abc123def456",
79 OldSha: "000000000000",
80 Ref: "refs/tags/v1.2.3",
81 },
82 Repo: &tangled.Pipeline_TriggerRepo{
83 Knot: "example.com",
84 Did: "did:plc:user123",
85 Repo: sp("my-repo"),
86 RepoDid: sp("did:plc:boltless"),
87 },
88 }
89 id := PipelineId{
90 Knot: "example.com",
91 Rkey: "123123",
92 }
93 env := PipelineEnvVars(tr, id)
94
95 if env["TANGLED_REF"] != "refs/tags/v1.2.3" {
96 t.Errorf("Expected TANGLED_REF='refs/tags/v1.2.3', got '%s'", env["TANGLED_REF"])
97 }
98 if env["TANGLED_REF_NAME"] != "v1.2.3" {
99 t.Errorf("Expected TANGLED_REF_NAME='v1.2.3', got '%s'", env["TANGLED_REF_NAME"])
100 }
101 if env["TANGLED_REF_TYPE"] != "tag" {
102 t.Errorf("Expected TANGLED_REF_TYPE='tag', got '%s'", env["TANGLED_REF_TYPE"])
103 }
104}
105
106func TestPipelineEnvVars_PullRequest(t *testing.T) {
107 tr := &tangled.Pipeline_TriggerMetadata{
108 Kind: string(workflow.TriggerKindPullRequest),
109 PullRequest: &tangled.Pipeline_PullRequestTriggerData{
110 SourceBranch: "feature-branch",
111 TargetBranch: "main",
112 SourceSha: "pr-sha-789",
113 },
114 Repo: &tangled.Pipeline_TriggerRepo{
115 Knot: "example.com",
116 Did: "did:plc:user123",
117 Repo: sp("my-repo"),
118 RepoDid: sp("did:plc:boltless"),
119 },
120 }
121 id := PipelineId{
122 Knot: "example.com",
123 Rkey: "123123",
124 }
125 env := PipelineEnvVars(tr, id)
126
127 // Check ref variables for PR
128 if env["TANGLED_REF"] != "refs/heads/feature-branch" {
129 t.Errorf("Expected TANGLED_REF='refs/heads/feature-branch', got '%s'", env["TANGLED_REF"])
130 }
131 if env["TANGLED_REF_NAME"] != "feature-branch" {
132 t.Errorf("Expected TANGLED_REF_NAME='feature-branch', got '%s'", env["TANGLED_REF_NAME"])
133 }
134 if env["TANGLED_REF_TYPE"] != "branch" {
135 t.Errorf("Expected TANGLED_REF_TYPE='branch', got '%s'", env["TANGLED_REF_TYPE"])
136 }
137
138 // Check SHA variables
139 if env["TANGLED_SHA"] != "pr-sha-789" {
140 t.Errorf("Expected TANGLED_SHA='pr-sha-789', got '%s'", env["TANGLED_SHA"])
141 }
142 if env["TANGLED_COMMIT_SHA"] != "pr-sha-789" {
143 t.Errorf("Expected TANGLED_COMMIT_SHA='pr-sha-789', got '%s'", env["TANGLED_COMMIT_SHA"])
144 }
145
146 // Check PR-specific variables
147 if env["TANGLED_PIPELINE_SOURCE_BRANCH"] != "feature-branch" {
148 t.Errorf("Expected TANGLED_PIPELINE_SOURCE_BRANCH='feature-branch', got '%s'", env["TANGLED_PIPELINE_SOURCE_BRANCH"])
149 }
150 if env["TANGLED_PIPELINE_TARGET_BRANCH"] != "main" {
151 t.Errorf("Expected TANGLED_PIPELINE_TARGET_BRANCH='main', got '%s'", env["TANGLED_PIPELINE_TARGET_BRANCH"])
152 }
153 if env["TANGLED_PR_SOURCE_BRANCH"] != "feature-branch" {
154 t.Errorf("Expected TANGLED_PR_SOURCE_BRANCH='feature-branch', got '%s'", env["TANGLED_PR_SOURCE_BRANCH"])
155 }
156 if env["TANGLED_PR_TARGET_BRANCH"] != "main" {
157 t.Errorf("Expected TANGLED_PR_TARGET_BRANCH='main', got '%s'", env["TANGLED_PR_TARGET_BRANCH"])
158 }
159 if env["TANGLED_PR_SOURCE_SHA"] != "pr-sha-789" {
160 t.Errorf("Expected TANGLED_PR_SOURCE_SHA='pr-sha-789', got '%s'", env["TANGLED_PR_SOURCE_SHA"])
161 }
162}
163
164func TestPipelineEnvVars_SourceRepo(t *testing.T) {
165 sourceRepoDid := "did:plc:fork"
166 tr := &tangled.Pipeline_TriggerMetadata{
167 Kind: string(workflow.TriggerKindPullRequest),
168 PullRequest: &tangled.Pipeline_PullRequestTriggerData{
169 SourceBranch: "feature-branch",
170 TargetBranch: "main",
171 SourceSha: "pr-sha-789",
172 },
173 Repo: &tangled.Pipeline_TriggerRepo{
174 Knot: "target.example.com",
175 Did: "did:plc:user123",
176 Repo: sp("target-repo"),
177 RepoDid: sp("did:plc:target"),
178 },
179 SourceRepo: &sourceRepoDid,
180 }
181 sourceRepo := &tangled.Pipeline_TriggerRepo{
182 Knot: "fork.example.com",
183 Did: "did:plc:user456",
184 Repo: sp("fork-repo"),
185 RepoDid: &sourceRepoDid,
186 DefaultBranch: "feature-branch",
187 }
188 id := PipelineId{
189 Knot: "target.example.com",
190 Rkey: "123123",
191 }
192
193 env := PipelineEnvVarsForSource(tr, id, sourceRepo)
194
195 if env["TANGLED_PIPELINE_SOURCE"] != sourceRepoDid {
196 t.Errorf("Expected TANGLED_PIPELINE_SOURCE='%s', got '%s'", sourceRepoDid, env["TANGLED_PIPELINE_SOURCE"])
197 }
198 if env["TANGLED_REPO_URL"] != "https://fork.example.com/did:plc:fork" {
199 t.Errorf("Expected TANGLED_REPO_URL to point at source repo, got '%s'", env["TANGLED_REPO_URL"])
200 }
201 if env["TANGLED_REPO_REPO_DID"] != sourceRepoDid {
202 t.Errorf("Expected TANGLED_REPO_REPO_DID='%s', got '%s'", sourceRepoDid, env["TANGLED_REPO_REPO_DID"])
203 }
204}
205
206func TestPipelineEnvVars_ManualWithInputs(t *testing.T) {
207 tr := &tangled.Pipeline_TriggerMetadata{
208 Kind: string(workflow.TriggerKindManual),
209 Manual: &tangled.Pipeline_ManualTriggerData{
210 Sha: "manualsha789",
211 Inputs: []*tangled.Pipeline_Pair{
212 {Key: "version", Value: "1.0.0"},
213 {Key: "environment", Value: "production"},
214 },
215 },
216 Repo: &tangled.Pipeline_TriggerRepo{
217 Knot: "example.com",
218 Did: "did:plc:user123",
219 Repo: sp("my-repo"),
220 RepoDid: sp("did:plc:boltless"),
221 },
222 }
223 id := PipelineId{
224 Knot: "example.com",
225 Rkey: "123123",
226 }
227 env := PipelineEnvVars(tr, id)
228
229 // Check manual input variables
230 if env["TANGLED_INPUT_VERSION"] != "1.0.0" {
231 t.Errorf("Expected TANGLED_INPUT_VERSION='1.0.0', got '%s'", env["TANGLED_INPUT_VERSION"])
232 }
233 if env["TANGLED_INPUT_ENVIRONMENT"] != "production" {
234 t.Errorf("Expected TANGLED_INPUT_ENVIRONMENT='production', got '%s'", env["TANGLED_INPUT_ENVIRONMENT"])
235 }
236
237 // Manual triggers carry the explicit SHA
238 if env["TANGLED_SHA"] != "manualsha789" {
239 t.Errorf("Expected TANGLED_SHA='manualsha789', got '%s'", env["TANGLED_SHA"])
240 }
241 if env["TANGLED_COMMIT_SHA"] != "manualsha789" {
242 t.Errorf("Expected TANGLED_COMMIT_SHA='manualsha789', got '%s'", env["TANGLED_COMMIT_SHA"])
243 }
244 // No ref was supplied, so ref vars stay unset
245 if _, ok := env["TANGLED_REF"]; ok {
246 t.Error("Manual trigger without a ref should not have TANGLED_REF")
247 }
248}
249
250func TestPipelineEnvVars_DevMode(t *testing.T) {
251 tr := &tangled.Pipeline_TriggerMetadata{
252 Kind: string(workflow.TriggerKindPush),
253 Push: &tangled.Pipeline_PushTriggerData{
254 NewSha: "abc123",
255 Ref: "refs/heads/main",
256 },
257 Repo: &tangled.Pipeline_TriggerRepo{
258 Knot: "localhost:3000",
259 Did: "did:plc:user123",
260 Repo: sp("my-repo"),
261 RepoDid: sp("did:plc:boltless"),
262 },
263 }
264 id := PipelineId{
265 Knot: "example.com",
266 Rkey: "123123",
267 }
268 env := PipelineEnvVars(tr, id)
269
270 expectedURL := "http://localhost:3000/did:plc:boltless"
271 if env["TANGLED_REPO_URL"] != expectedURL {
272 t.Errorf("Expected TANGLED_REPO_URL='%s', got '%s'", expectedURL, env["TANGLED_REPO_URL"])
273 }
274}
275
276func TestPipelineEnvVars_NilTrigger(t *testing.T) {
277 id := PipelineId{
278 Knot: "example.com",
279 Rkey: "123123",
280 }
281 env := PipelineEnvVars(nil, id)
282
283 if env != nil {
284 t.Error("Expected nil env for nil trigger")
285 }
286}
287
288func TestPipelineEnvVars_NilPushData(t *testing.T) {
289 tr := &tangled.Pipeline_TriggerMetadata{
290 Kind: string(workflow.TriggerKindPush),
291 Push: nil,
292 Repo: &tangled.Pipeline_TriggerRepo{
293 Knot: "example.com",
294 Did: "did:plc:user123",
295 Repo: sp("my-repo"),
296 RepoDid: sp("did:plc:boltless"),
297 },
298 }
299 id := PipelineId{
300 Knot: "example.com",
301 Rkey: "123123",
302 }
303 env := PipelineEnvVars(tr, id)
304
305 // Should still have repo variables
306 if env["TANGLED_REPO_KNOT"] != "example.com" {
307 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
308 }
309
310 // Should not have ref/sha variables
311 if _, ok := env["TANGLED_REF"]; ok {
312 t.Error("Should not have TANGLED_REF when push data is nil")
313 }
314}