Monorepo for Tangled tangled.org
1

Configure Feed

Select the types of activity you want to include in your feed.

core / spindle / models / pipeline_env_test.go
9.9 kB 314 lines
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}