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, false)
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, false)
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, false)
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 Inputs: []*tangled.Pipeline_Pair{
167 {Key: "version", Value: "1.0.0"},
168 {Key: "environment", Value: "production"},
169 },
170 },
171 Repo: &tangled.Pipeline_TriggerRepo{
172 Knot: "example.com",
173 Did: "did:plc:user123",
174 Repo: sp("my-repo"),
175 RepoDid: sp("did:plc:boltless"),
176 },
177 }
178 id := PipelineId{
179 Knot: "example.com",
180 Rkey: "123123",
181 }
182 env := PipelineEnvVars(tr, id, false)
183
184 // Check manual input variables
185 if env["TANGLED_INPUT_VERSION"] != "1.0.0" {
186 t.Errorf("Expected TANGLED_INPUT_VERSION='1.0.0', got '%s'", env["TANGLED_INPUT_VERSION"])
187 }
188 if env["TANGLED_INPUT_ENVIRONMENT"] != "production" {
189 t.Errorf("Expected TANGLED_INPUT_ENVIRONMENT='production', got '%s'", env["TANGLED_INPUT_ENVIRONMENT"])
190 }
191
192 // Manual triggers shouldn't have ref/sha variables
193 if _, ok := env["TANGLED_REF"]; ok {
194 t.Error("Manual trigger should not have TANGLED_REF")
195 }
196 if _, ok := env["TANGLED_SHA"]; ok {
197 t.Error("Manual trigger should not have TANGLED_SHA")
198 }
199}
200
201func TestPipelineEnvVars_DevMode(t *testing.T) {
202 tr := &tangled.Pipeline_TriggerMetadata{
203 Kind: string(workflow.TriggerKindPush),
204 Push: &tangled.Pipeline_PushTriggerData{
205 NewSha: "abc123",
206 Ref: "refs/heads/main",
207 },
208 Repo: &tangled.Pipeline_TriggerRepo{
209 Knot: "localhost:3000",
210 Did: "did:plc:user123",
211 Repo: sp("my-repo"),
212 RepoDid: sp("did:plc:boltless"),
213 },
214 }
215 id := PipelineId{
216 Knot: "example.com",
217 Rkey: "123123",
218 }
219 env := PipelineEnvVars(tr, id, true)
220
221 // Dev mode should use http:// and replace localhost with host.docker.internal
222 expectedURL := "http://host.docker.internal:3000/did:plc:boltless"
223 if env["TANGLED_REPO_URL"] != expectedURL {
224 t.Errorf("Expected TANGLED_REPO_URL='%s', got '%s'", expectedURL, env["TANGLED_REPO_URL"])
225 }
226}
227
228func TestPipelineEnvVars_NilTrigger(t *testing.T) {
229 id := PipelineId{
230 Knot: "example.com",
231 Rkey: "123123",
232 }
233 env := PipelineEnvVars(nil, id, false)
234
235 if env != nil {
236 t.Error("Expected nil env for nil trigger")
237 }
238}
239
240func TestPipelineEnvVars_NilPushData(t *testing.T) {
241 tr := &tangled.Pipeline_TriggerMetadata{
242 Kind: string(workflow.TriggerKindPush),
243 Push: nil,
244 Repo: &tangled.Pipeline_TriggerRepo{
245 Knot: "example.com",
246 Did: "did:plc:user123",
247 Repo: sp("my-repo"),
248 RepoDid: sp("did:plc:boltless"),
249 },
250 }
251 id := PipelineId{
252 Knot: "example.com",
253 Rkey: "123123",
254 }
255 env := PipelineEnvVars(tr, id, false)
256
257 // Should still have repo variables
258 if env["TANGLED_REPO_KNOT"] != "example.com" {
259 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
260 }
261
262 // Should not have ref/sha variables
263 if _, ok := env["TANGLED_REF"]; ok {
264 t.Error("Should not have TANGLED_REF when push data is nil")
265 }
266}