forked from
tangled.org/core
Monorepo for Tangled — https://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: "my-repo",
22 DefaultBranch: "main",
23 },
24 }
25 id := PipelineId{
26 Knot: "example.com",
27 Rkey: "123123",
28 }
29 env := PipelineEnvVars(tr, id, false)
30
31 // Check standard CI variable
32 if env["CI"] != "true" {
33 t.Errorf("Expected CI='true', got '%s'", env["CI"])
34 }
35
36 // Check ref variables
37 if env["TANGLED_REF"] != "refs/heads/main" {
38 t.Errorf("Expected TANGLED_REF='refs/heads/main', got '%s'", env["TANGLED_REF"])
39 }
40 if env["TANGLED_REF_NAME"] != "main" {
41 t.Errorf("Expected TANGLED_REF_NAME='main', got '%s'", env["TANGLED_REF_NAME"])
42 }
43 if env["TANGLED_REF_TYPE"] != "branch" {
44 t.Errorf("Expected TANGLED_REF_TYPE='branch', got '%s'", env["TANGLED_REF_TYPE"])
45 }
46
47 // Check SHA variables
48 if env["TANGLED_SHA"] != "abc123def456" {
49 t.Errorf("Expected TANGLED_SHA='abc123def456', got '%s'", env["TANGLED_SHA"])
50 }
51 if env["TANGLED_COMMIT_SHA"] != "abc123def456" {
52 t.Errorf("Expected TANGLED_COMMIT_SHA='abc123def456', got '%s'", env["TANGLED_COMMIT_SHA"])
53 }
54
55 // Check repo variables
56 if env["TANGLED_REPO_KNOT"] != "example.com" {
57 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
58 }
59 if env["TANGLED_REPO_DID"] != "did:plc:user123" {
60 t.Errorf("Expected TANGLED_REPO_DID='did:plc:user123', got '%s'", env["TANGLED_REPO_DID"])
61 }
62 if env["TANGLED_REPO_NAME"] != "my-repo" {
63 t.Errorf("Expected TANGLED_REPO_NAME='my-repo', got '%s'", env["TANGLED_REPO_NAME"])
64 }
65 if env["TANGLED_REPO_DEFAULT_BRANCH"] != "main" {
66 t.Errorf("Expected TANGLED_REPO_DEFAULT_BRANCH='main', got '%s'", env["TANGLED_REPO_DEFAULT_BRANCH"])
67 }
68 if env["TANGLED_REPO_URL"] != "https://example.com/did:plc:user123/my-repo" {
69 t.Errorf("Expected TANGLED_REPO_URL='https://example.com/did:plc:user123/my-repo', got '%s'", env["TANGLED_REPO_URL"])
70 }
71}
72
73func TestPipelineEnvVars_PushTag(t *testing.T) {
74 tr := &tangled.Pipeline_TriggerMetadata{
75 Kind: string(workflow.TriggerKindPush),
76 Push: &tangled.Pipeline_PushTriggerData{
77 NewSha: "abc123def456",
78 OldSha: "000000000000",
79 Ref: "refs/tags/v1.2.3",
80 },
81 Repo: &tangled.Pipeline_TriggerRepo{
82 Knot: "example.com",
83 Did: "did:plc:user123",
84 Repo: "my-repo",
85 },
86 }
87 id := PipelineId{
88 Knot: "example.com",
89 Rkey: "123123",
90 }
91 env := PipelineEnvVars(tr, id, false)
92
93 if env["TANGLED_REF"] != "refs/tags/v1.2.3" {
94 t.Errorf("Expected TANGLED_REF='refs/tags/v1.2.3', got '%s'", env["TANGLED_REF"])
95 }
96 if env["TANGLED_REF_NAME"] != "v1.2.3" {
97 t.Errorf("Expected TANGLED_REF_NAME='v1.2.3', got '%s'", env["TANGLED_REF_NAME"])
98 }
99 if env["TANGLED_REF_TYPE"] != "tag" {
100 t.Errorf("Expected TANGLED_REF_TYPE='tag', got '%s'", env["TANGLED_REF_TYPE"])
101 }
102}
103
104func TestPipelineEnvVars_PullRequest(t *testing.T) {
105 tr := &tangled.Pipeline_TriggerMetadata{
106 Kind: string(workflow.TriggerKindPullRequest),
107 PullRequest: &tangled.Pipeline_PullRequestTriggerData{
108 SourceBranch: "feature-branch",
109 TargetBranch: "main",
110 SourceSha: "pr-sha-789",
111 Action: "opened",
112 },
113 Repo: &tangled.Pipeline_TriggerRepo{
114 Knot: "example.com",
115 Did: "did:plc:user123",
116 Repo: "my-repo",
117 },
118 }
119 id := PipelineId{
120 Knot: "example.com",
121 Rkey: "123123",
122 }
123 env := PipelineEnvVars(tr, id, false)
124
125 // Check ref variables for PR
126 if env["TANGLED_REF"] != "refs/heads/feature-branch" {
127 t.Errorf("Expected TANGLED_REF='refs/heads/feature-branch', got '%s'", env["TANGLED_REF"])
128 }
129 if env["TANGLED_REF_NAME"] != "feature-branch" {
130 t.Errorf("Expected TANGLED_REF_NAME='feature-branch', got '%s'", env["TANGLED_REF_NAME"])
131 }
132 if env["TANGLED_REF_TYPE"] != "branch" {
133 t.Errorf("Expected TANGLED_REF_TYPE='branch', got '%s'", env["TANGLED_REF_TYPE"])
134 }
135
136 // Check SHA variables
137 if env["TANGLED_SHA"] != "pr-sha-789" {
138 t.Errorf("Expected TANGLED_SHA='pr-sha-789', got '%s'", env["TANGLED_SHA"])
139 }
140 if env["TANGLED_COMMIT_SHA"] != "pr-sha-789" {
141 t.Errorf("Expected TANGLED_COMMIT_SHA='pr-sha-789', got '%s'", env["TANGLED_COMMIT_SHA"])
142 }
143
144 // Check PR-specific variables
145 if env["TANGLED_PR_SOURCE_BRANCH"] != "feature-branch" {
146 t.Errorf("Expected TANGLED_PR_SOURCE_BRANCH='feature-branch', got '%s'", env["TANGLED_PR_SOURCE_BRANCH"])
147 }
148 if env["TANGLED_PR_TARGET_BRANCH"] != "main" {
149 t.Errorf("Expected TANGLED_PR_TARGET_BRANCH='main', got '%s'", env["TANGLED_PR_TARGET_BRANCH"])
150 }
151 if env["TANGLED_PR_SOURCE_SHA"] != "pr-sha-789" {
152 t.Errorf("Expected TANGLED_PR_SOURCE_SHA='pr-sha-789', got '%s'", env["TANGLED_PR_SOURCE_SHA"])
153 }
154 if env["TANGLED_PR_ACTION"] != "opened" {
155 t.Errorf("Expected TANGLED_PR_ACTION='opened', got '%s'", env["TANGLED_PR_ACTION"])
156 }
157}
158
159func TestPipelineEnvVars_ManualWithInputs(t *testing.T) {
160 tr := &tangled.Pipeline_TriggerMetadata{
161 Kind: string(workflow.TriggerKindManual),
162 Manual: &tangled.Pipeline_ManualTriggerData{
163 Inputs: []*tangled.Pipeline_Pair{
164 {Key: "version", Value: "1.0.0"},
165 {Key: "environment", Value: "production"},
166 },
167 },
168 Repo: &tangled.Pipeline_TriggerRepo{
169 Knot: "example.com",
170 Did: "did:plc:user123",
171 Repo: "my-repo",
172 },
173 }
174 id := PipelineId{
175 Knot: "example.com",
176 Rkey: "123123",
177 }
178 env := PipelineEnvVars(tr, id, false)
179
180 // Check manual input variables
181 if env["TANGLED_INPUT_VERSION"] != "1.0.0" {
182 t.Errorf("Expected TANGLED_INPUT_VERSION='1.0.0', got '%s'", env["TANGLED_INPUT_VERSION"])
183 }
184 if env["TANGLED_INPUT_ENVIRONMENT"] != "production" {
185 t.Errorf("Expected TANGLED_INPUT_ENVIRONMENT='production', got '%s'", env["TANGLED_INPUT_ENVIRONMENT"])
186 }
187
188 // Manual triggers shouldn't have ref/sha variables
189 if _, ok := env["TANGLED_REF"]; ok {
190 t.Error("Manual trigger should not have TANGLED_REF")
191 }
192 if _, ok := env["TANGLED_SHA"]; ok {
193 t.Error("Manual trigger should not have TANGLED_SHA")
194 }
195}
196
197func TestPipelineEnvVars_DevMode(t *testing.T) {
198 tr := &tangled.Pipeline_TriggerMetadata{
199 Kind: string(workflow.TriggerKindPush),
200 Push: &tangled.Pipeline_PushTriggerData{
201 NewSha: "abc123",
202 Ref: "refs/heads/main",
203 },
204 Repo: &tangled.Pipeline_TriggerRepo{
205 Knot: "localhost:3000",
206 Did: "did:plc:user123",
207 Repo: "my-repo",
208 },
209 }
210 id := PipelineId{
211 Knot: "example.com",
212 Rkey: "123123",
213 }
214 env := PipelineEnvVars(tr, id, true)
215
216 // Dev mode should use http:// and replace localhost with host.docker.internal
217 expectedURL := "http://host.docker.internal:3000/did:plc:user123/my-repo"
218 if env["TANGLED_REPO_URL"] != expectedURL {
219 t.Errorf("Expected TANGLED_REPO_URL='%s', got '%s'", expectedURL, env["TANGLED_REPO_URL"])
220 }
221}
222
223func TestPipelineEnvVars_NilTrigger(t *testing.T) {
224 id := PipelineId{
225 Knot: "example.com",
226 Rkey: "123123",
227 }
228 env := PipelineEnvVars(nil, id, false)
229
230 if env != nil {
231 t.Error("Expected nil env for nil trigger")
232 }
233}
234
235func TestPipelineEnvVars_NilPushData(t *testing.T) {
236 tr := &tangled.Pipeline_TriggerMetadata{
237 Kind: string(workflow.TriggerKindPush),
238 Push: nil,
239 Repo: &tangled.Pipeline_TriggerRepo{
240 Knot: "example.com",
241 Did: "did:plc:user123",
242 Repo: "my-repo",
243 },
244 }
245 id := PipelineId{
246 Knot: "example.com",
247 Rkey: "123123",
248 }
249 env := PipelineEnvVars(tr, id, false)
250
251 // Should still have repo variables
252 if env["TANGLED_REPO_KNOT"] != "example.com" {
253 t.Errorf("Expected TANGLED_REPO_KNOT='example.com', got '%s'", env["TANGLED_REPO_KNOT"])
254 }
255
256 // Should not have ref/sha variables
257 if _, ok := env["TANGLED_REF"]; ok {
258 t.Error("Should not have TANGLED_REF when push data is nil")
259 }
260}