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 Action: "opened",
114 },
115 Repo: &tangled.Pipeline_TriggerRepo{
116 Knot: "example.com",
117 Did: "did:plc:user123",
118 Repo: sp("my-repo"),
119 RepoDid: sp("did:plc:boltless"),
120 },
121 }
122 id := PipelineId{
123 Knot: "example.com",
124 Rkey: "123123",
125 }
126 env := PipelineEnvVars(tr, id)
127
128 // Check ref variables for PR
129 if env["TANGLED_REF"] != "refs/heads/feature-branch" {
130 t.Errorf("Expected TANGLED_REF='refs/heads/feature-branch', got '%s'", env["TANGLED_REF"])
131 }
132 if env["TANGLED_REF_NAME"] != "feature-branch" {
133 t.Errorf("Expected TANGLED_REF_NAME='feature-branch', got '%s'", env["TANGLED_REF_NAME"])
134 }
135 if env["TANGLED_REF_TYPE"] != "branch" {
136 t.Errorf("Expected TANGLED_REF_TYPE='branch', got '%s'", env["TANGLED_REF_TYPE"])
137 }
138
139 // Check SHA variables
140 if env["TANGLED_SHA"] != "pr-sha-789" {
141 t.Errorf("Expected TANGLED_SHA='pr-sha-789', got '%s'", env["TANGLED_SHA"])
142 }
143 if env["TANGLED_COMMIT_SHA"] != "pr-sha-789" {
144 t.Errorf("Expected TANGLED_COMMIT_SHA='pr-sha-789', got '%s'", env["TANGLED_COMMIT_SHA"])
145 }
146
147 // Check PR-specific variables
148 if env["TANGLED_PR_SOURCE_BRANCH"] != "feature-branch" {
149 t.Errorf("Expected TANGLED_PR_SOURCE_BRANCH='feature-branch', got '%s'", env["TANGLED_PR_SOURCE_BRANCH"])
150 }
151 if env["TANGLED_PR_TARGET_BRANCH"] != "main" {
152 t.Errorf("Expected TANGLED_PR_TARGET_BRANCH='main', got '%s'", env["TANGLED_PR_TARGET_BRANCH"])
153 }
154 if env["TANGLED_PR_SOURCE_SHA"] != "pr-sha-789" {
155 t.Errorf("Expected TANGLED_PR_SOURCE_SHA='pr-sha-789', got '%s'", env["TANGLED_PR_SOURCE_SHA"])
156 }
157 if env["TANGLED_PR_ACTION"] != "opened" {
158 t.Errorf("Expected TANGLED_PR_ACTION='opened', got '%s'", env["TANGLED_PR_ACTION"])
159 }
160}
161
162func TestPipelineEnvVars_ManualWithInputs(t *testing.T) {
163 tr := &tangled.Pipeline_TriggerMetadata{
164 Kind: string(workflow.TriggerKindManual),
165 Manual: &tangled.Pipeline_ManualTriggerData{
166 Sha: "manualsha789",
167 Inputs: []*tangled.Pipeline_Pair{
168 {Key: "version", Value: "1.0.0"},
169 {Key: "environment", Value: "production"},
170 },
171 },
172 Repo: &tangled.Pipeline_TriggerRepo{
173 Knot: "example.com",
174 Did: "did:plc:user123",
175 Repo: sp("my-repo"),
176 RepoDid: sp("did:plc:boltless"),
177 },
178 }
179 id := PipelineId{
180 Knot: "example.com",
181 Rkey: "123123",
182 }
183 env := PipelineEnvVars(tr, id)
184
185 // Check manual input variables
186 if env["TANGLED_INPUT_VERSION"] != "1.0.0" {
187 t.Errorf("Expected TANGLED_INPUT_VERSION='1.0.0', got '%s'", env["TANGLED_INPUT_VERSION"])
188 }
189 if env["TANGLED_INPUT_ENVIRONMENT"] != "production" {
190 t.Errorf("Expected TANGLED_INPUT_ENVIRONMENT='production', got '%s'", env["TANGLED_INPUT_ENVIRONMENT"])
191 }
192
193 // Manual triggers carry the explicit SHA
194 if env["TANGLED_SHA"] != "manualsha789" {
195 t.Errorf("Expected TANGLED_SHA='manualsha789', got '%s'", env["TANGLED_SHA"])
196 }
197 if env["TANGLED_COMMIT_SHA"] != "manualsha789" {
198 t.Errorf("Expected TANGLED_COMMIT_SHA='manualsha789', got '%s'", env["TANGLED_COMMIT_SHA"])
199 }
200 // No ref was supplied, so ref vars stay unset
201 if _, ok := env["TANGLED_REF"]; ok {
202 t.Error("Manual trigger without a ref should not have TANGLED_REF")
203 }
204}
205
206func TestPipelineEnvVars_DevMode(t *testing.T) {
207 tr := &tangled.Pipeline_TriggerMetadata{
208 Kind: string(workflow.TriggerKindPush),
209 Push: &tangled.Pipeline_PushTriggerData{
210 NewSha: "abc123",
211 Ref: "refs/heads/main",
212 },
213 Repo: &tangled.Pipeline_TriggerRepo{
214 Knot: "localhost:3000",
215 Did: "did:plc:user123",
216 Repo: sp("my-repo"),
217 RepoDid: sp("did:plc:boltless"),
218 },
219 }
220 id := PipelineId{
221 Knot: "example.com",
222 Rkey: "123123",
223 }
224 env := PipelineEnvVars(tr, id)
225
226 expectedURL := "http://localhost:3000/did:plc:boltless"
227 if env["TANGLED_REPO_URL"] != expectedURL {
228 t.Errorf("Expected TANGLED_REPO_URL='%s', got '%s'", expectedURL, env["TANGLED_REPO_URL"])
229 }
230}
231
232func TestPipelineEnvVars_NilTrigger(t *testing.T) {
233 id := PipelineId{
234 Knot: "example.com",
235 Rkey: "123123",
236 }
237 env := PipelineEnvVars(nil, id)
238
239 if env != nil {
240 t.Error("Expected nil env for nil trigger")
241 }
242}
243
244func TestPipelineEnvVars_NilPushData(t *testing.T) {
245 tr := &tangled.Pipeline_TriggerMetadata{
246 Kind: string(workflow.TriggerKindPush),
247 Push: nil,
248 Repo: &tangled.Pipeline_TriggerRepo{
249 Knot: "example.com",
250 Did: "did:plc:user123",
251 Repo: sp("my-repo"),
252 RepoDid: sp("did:plc:boltless"),
253 },
254 }
255 id := PipelineId{
256 Knot: "example.com",
257 Rkey: "123123",
258 }
259 env := PipelineEnvVars(tr, id)
260
261 // Should still have repo variables
262 if env["TANGLED_REPO_KNOT"] != "example.com" {
263 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
264 }
265
266 // Should not have ref/sha variables
267 if _, ok := env["TANGLED_REF"]; ok {
268 t.Error("Should not have TANGLED_REF when push data is nil")
269 }
270}