Something went wrong. Try again.
Monorepo for Tangled
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288package workflow
import ( "strings" "testing"
"github.com/stretchr/testify/assert" "tangled.org/core/api/tangled")
var trigger = tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/heads/main", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), },}
var when = []Constraint{ { Event: []string{"push"}, Branch: []string{"main"}, },}
func TestCompileWorkflow_MatchingWorkflowWithSteps(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/test.yml", Engine: "nixery", When: when, CloneOpts: CloneOpts{}, // default true }
c := Compiler{Trigger: trigger} cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 1) assert.Equal(t, wf.Name, cp.Workflows[0].Name) assert.False(t, cp.Workflows[0].Clone.Skip) assert.False(t, c.Diagnostics.IsErr())}
func TestCompileWorkflow_TriggerMismatch(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/mismatch.yml", Engine: "nixery", When: []Constraint{ { Event: []string{"push"}, Branch: []string{"master"}, // different branch }, }, }
c := Compiler{Trigger: trigger} cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 0) assert.Len(t, c.Diagnostics.Warnings, 1) assert.Equal(t, WorkflowSkipped, c.Diagnostics.Warnings[0].Type)}
func TestCompileWorkflow_CloneFalseWithShallowTrue(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/clone_skip.yml", Engine: "nixery", When: when, CloneOpts: CloneOpts{ Skip: true, Depth: 1, }, // false }
c := Compiler{Trigger: trigger} cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 1) assert.True(t, cp.Workflows[0].Clone.Skip) assert.Len(t, c.Diagnostics.Warnings, 1) assert.Equal(t, InvalidConfiguration, c.Diagnostics.Warnings[0].Type)}
func TestCompileWorkflow_MissingEngine(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/missing_engine.yml", When: when, Engine: "", }
c := Compiler{Trigger: trigger} cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 0) assert.Len(t, c.Diagnostics.Errors, 1) assert.Equal(t, MissingEngine, c.Diagnostics.Errors[0].Error)}
func TestCompileWorkflow_ChangedFilesMatchesPaths(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/test.yml", Engine: "nixery", When: []Constraint{ { Event: []string{"push"}, Branch: []string{"main"}, Paths: []string{"src/**"}, }, }, }
c := Compiler{ Trigger: trigger, ChangedFiles: []string{"src/main.go", "src/util.go"}, } cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 1) assert.Equal(t, wf.Name, cp.Workflows[0].Name) assert.False(t, c.Diagnostics.IsErr())}
func TestCompileWorkflow_ChangedFilesNoMatch(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/test.yml", Engine: "nixery", When: []Constraint{ { Event: []string{"push"}, Branch: []string{"main"}, Paths: []string{"src/**"}, }, }, }
c := Compiler{ Trigger: trigger, ChangedFiles: []string{"docs/guide.md", "README.md"}, } cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 0) assert.Len(t, c.Diagnostics.Warnings, 1) assert.Equal(t, WorkflowSkipped, c.Diagnostics.Warnings[0].Type)}
func TestCompileWorkflow_NoPaths_ChangedFilesIgnored(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/test.yml", Engine: "nixery", When: when, // no Paths constraint }
c := Compiler{ Trigger: trigger, ChangedFiles: []string{"docs/guide.md"}, } cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, 1) assert.False(t, c.Diagnostics.IsErr())}
func TestCompileWorkflow_MultipleBranchAndTag(t *testing.T) { wf := Workflow{ Name: ".tangled/workflows/branch_and_tag.yml", When: []Constraint{ { Event: []string{"push"}, Branch: []string{"main", "develop"}, Tag: []string{"v*"}, }, }, Engine: "nixery", }
tests := []struct { name string trigger tangled.Pipeline_TriggerMetadata shouldMatch bool expectedCount int }{ { name: "matches main branch", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/heads/main", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: true, expectedCount: 1, }, { name: "matches develop branch", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/heads/develop", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: true, expectedCount: 1, }, { name: "matches v* tag pattern", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/tags/v1.0.0", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: true, expectedCount: 1, }, { name: "matches v* tag pattern with different version", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/tags/v2.5.3", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: true, expectedCount: 1, }, { name: "does not match master branch", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/heads/master", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: false, expectedCount: 0, }, { name: "does not match non-v tag", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/tags/release-1.0", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: false, expectedCount: 0, }, { name: "does not match feature branch", trigger: tangled.Pipeline_TriggerMetadata{ Kind: string(TriggerKindPush), Push: &tangled.Pipeline_PushTriggerData{ Ref: "refs/heads/feature/new-feature", OldSha: strings.Repeat("0", 40), NewSha: strings.Repeat("f", 40), }, }, shouldMatch: false, expectedCount: 0, }, }
for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := Compiler{Trigger: tt.trigger} cp := c.Compile([]Workflow{wf})
assert.Len(t, cp.Workflows, tt.expectedCount) if tt.shouldMatch { assert.Equal(t, wf.Name, cp.Workflows[0].Name) } }) }}