forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 5.4 kB view raw
1package workflow 2 3import ( 4 "strings" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 "tangled.org/core/api/tangled" 9) 10 11var trigger = tangled.Pipeline_TriggerMetadata{ 12 Kind: string(TriggerKindPush), 13 Push: &tangled.Pipeline_PushTriggerData{ 14 Ref: "refs/heads/main", 15 OldSha: strings.Repeat("0", 40), 16 NewSha: strings.Repeat("f", 40), 17 }, 18} 19 20var when = []Constraint{ 21 { 22 Event: []string{"push"}, 23 Branch: []string{"main"}, 24 }, 25} 26 27func TestCompileWorkflow_MatchingWorkflowWithSteps(t *testing.T) { 28 wf := Workflow{ 29 Name: ".tangled/workflows/test.yml", 30 Engine: "nixery", 31 When: when, 32 CloneOpts: CloneOpts{}, // default true 33 } 34 35 c := Compiler{Trigger: trigger} 36 cp := c.Compile([]Workflow{wf}) 37 38 assert.Len(t, cp.Workflows, 1) 39 assert.Equal(t, wf.Name, cp.Workflows[0].Name) 40 assert.False(t, cp.Workflows[0].Clone.Skip) 41 assert.False(t, c.Diagnostics.IsErr()) 42} 43 44func TestCompileWorkflow_TriggerMismatch(t *testing.T) { 45 wf := Workflow{ 46 Name: ".tangled/workflows/mismatch.yml", 47 Engine: "nixery", 48 When: []Constraint{ 49 { 50 Event: []string{"push"}, 51 Branch: []string{"master"}, // different branch 52 }, 53 }, 54 } 55 56 c := Compiler{Trigger: trigger} 57 cp := c.Compile([]Workflow{wf}) 58 59 assert.Len(t, cp.Workflows, 0) 60 assert.Len(t, c.Diagnostics.Warnings, 1) 61 assert.Equal(t, WorkflowSkipped, c.Diagnostics.Warnings[0].Type) 62} 63 64func TestCompileWorkflow_CloneFalseWithShallowTrue(t *testing.T) { 65 wf := Workflow{ 66 Name: ".tangled/workflows/clone_skip.yml", 67 Engine: "nixery", 68 When: when, 69 CloneOpts: CloneOpts{ 70 Skip: true, 71 Depth: 1, 72 }, // false 73 } 74 75 c := Compiler{Trigger: trigger} 76 cp := c.Compile([]Workflow{wf}) 77 78 assert.Len(t, cp.Workflows, 1) 79 assert.True(t, cp.Workflows[0].Clone.Skip) 80 assert.Len(t, c.Diagnostics.Warnings, 1) 81 assert.Equal(t, InvalidConfiguration, c.Diagnostics.Warnings[0].Type) 82} 83 84func TestCompileWorkflow_MissingEngine(t *testing.T) { 85 wf := Workflow{ 86 Name: ".tangled/workflows/missing_engine.yml", 87 When: when, 88 Engine: "", 89 } 90 91 c := Compiler{Trigger: trigger} 92 cp := c.Compile([]Workflow{wf}) 93 94 assert.Len(t, cp.Workflows, 0) 95 assert.Len(t, c.Diagnostics.Errors, 1) 96 assert.Equal(t, MissingEngine, c.Diagnostics.Errors[0].Error) 97} 98 99func TestCompileWorkflow_MultipleBranchAndTag(t *testing.T) { 100 wf := Workflow{ 101 Name: ".tangled/workflows/branch_and_tag.yml", 102 When: []Constraint{ 103 { 104 Event: []string{"push"}, 105 Branch: []string{"main", "develop"}, 106 Tag: []string{"v*"}, 107 }, 108 }, 109 Engine: "nixery", 110 } 111 112 tests := []struct { 113 name string 114 trigger tangled.Pipeline_TriggerMetadata 115 shouldMatch bool 116 expectedCount int 117 }{ 118 { 119 name: "matches main branch", 120 trigger: tangled.Pipeline_TriggerMetadata{ 121 Kind: string(TriggerKindPush), 122 Push: &tangled.Pipeline_PushTriggerData{ 123 Ref: "refs/heads/main", 124 OldSha: strings.Repeat("0", 40), 125 NewSha: strings.Repeat("f", 40), 126 }, 127 }, 128 shouldMatch: true, 129 expectedCount: 1, 130 }, 131 { 132 name: "matches develop branch", 133 trigger: tangled.Pipeline_TriggerMetadata{ 134 Kind: string(TriggerKindPush), 135 Push: &tangled.Pipeline_PushTriggerData{ 136 Ref: "refs/heads/develop", 137 OldSha: strings.Repeat("0", 40), 138 NewSha: strings.Repeat("f", 40), 139 }, 140 }, 141 shouldMatch: true, 142 expectedCount: 1, 143 }, 144 { 145 name: "matches v* tag pattern", 146 trigger: tangled.Pipeline_TriggerMetadata{ 147 Kind: string(TriggerKindPush), 148 Push: &tangled.Pipeline_PushTriggerData{ 149 Ref: "refs/tags/v1.0.0", 150 OldSha: strings.Repeat("0", 40), 151 NewSha: strings.Repeat("f", 40), 152 }, 153 }, 154 shouldMatch: true, 155 expectedCount: 1, 156 }, 157 { 158 name: "matches v* tag pattern with different version", 159 trigger: tangled.Pipeline_TriggerMetadata{ 160 Kind: string(TriggerKindPush), 161 Push: &tangled.Pipeline_PushTriggerData{ 162 Ref: "refs/tags/v2.5.3", 163 OldSha: strings.Repeat("0", 40), 164 NewSha: strings.Repeat("f", 40), 165 }, 166 }, 167 shouldMatch: true, 168 expectedCount: 1, 169 }, 170 { 171 name: "does not match master branch", 172 trigger: tangled.Pipeline_TriggerMetadata{ 173 Kind: string(TriggerKindPush), 174 Push: &tangled.Pipeline_PushTriggerData{ 175 Ref: "refs/heads/master", 176 OldSha: strings.Repeat("0", 40), 177 NewSha: strings.Repeat("f", 40), 178 }, 179 }, 180 shouldMatch: false, 181 expectedCount: 0, 182 }, 183 { 184 name: "does not match non-v tag", 185 trigger: tangled.Pipeline_TriggerMetadata{ 186 Kind: string(TriggerKindPush), 187 Push: &tangled.Pipeline_PushTriggerData{ 188 Ref: "refs/tags/release-1.0", 189 OldSha: strings.Repeat("0", 40), 190 NewSha: strings.Repeat("f", 40), 191 }, 192 }, 193 shouldMatch: false, 194 expectedCount: 0, 195 }, 196 { 197 name: "does not match feature branch", 198 trigger: tangled.Pipeline_TriggerMetadata{ 199 Kind: string(TriggerKindPush), 200 Push: &tangled.Pipeline_PushTriggerData{ 201 Ref: "refs/heads/feature/new-feature", 202 OldSha: strings.Repeat("0", 40), 203 NewSha: strings.Repeat("f", 40), 204 }, 205 }, 206 shouldMatch: false, 207 expectedCount: 0, 208 }, 209 } 210 211 for _, tt := range tests { 212 t.Run(tt.name, func(t *testing.T) { 213 c := Compiler{Trigger: tt.trigger} 214 cp := c.Compile([]Workflow{wf}) 215 216 assert.Len(t, cp.Workflows, tt.expectedCount) 217 if tt.shouldMatch { 218 assert.Equal(t, wf.Name, cp.Workflows[0].Name) 219 } 220 }) 221 } 222}