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
8.3 kB 270 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 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}