package accessctl import ( "reflect" "testing" "github.com/davecgh/go-spew/spew" ) func normalizeResult(res MatchResult) MatchResult { if len(res.ChangeAccessControls) == 0 { res.ChangeAccessControls = nil } return res } func TestMatch(t *testing.T) { secondCond := Condition{ Signature: &ConditionSignature{ AnyAccount: true, Count: "2", }, } tests := []struct { descr string branchACs []BranchAccessControl interactions MatchInteractions result MatchResult }{ { descr: "empty input empty result", result: MatchResult{ BranchPattern: "**", }, }, { descr: "empty access controls", interactions: MatchInteractions{ Branch: "trunk", FilePathsChanged: []string{"foo", "bar"}, }, result: MatchResult{ BranchPattern: "trunk", ChangeAccessControls: []MatchedChangeAccessControl{ { ChangeAccessControl: DefaultChangeAccessControl, FilePaths: []string{"foo", "bar"}, }, }, }, }, { descr: "empty filesPathsChanged", branchACs: DefaultBranchAccessControls, interactions: MatchInteractions{Branch: "trunk"}, result: MatchResult{BranchPattern: "trunk"}, }, { descr: "no matching branch patterns", branchACs: []BranchAccessControl{{ BranchPattern: "dunk", ChangeAccessControls: []ChangeAccessControl{{ FilePathPattern: "**", Condition: secondCond, }}, }}, interactions: MatchInteractions{ Branch: "crunk", FilePathsChanged: []string{"foo"}, }, result: MatchResult{ BranchPattern: "**", ChangeAccessControls: []MatchedChangeAccessControl{{ ChangeAccessControl: DefaultChangeAccessControl, FilePaths: []string{"foo"}, }}, }, }, { descr: "no matching files", branchACs: []BranchAccessControl{{ BranchPattern: "trunk", ChangeAccessControls: []ChangeAccessControl{{ FilePathPattern: "boo", Condition: secondCond, }}, }}, interactions: MatchInteractions{ Branch: "trunk", FilePathsChanged: []string{"foo"}, }, result: MatchResult{ BranchPattern: "trunk", ChangeAccessControls: []MatchedChangeAccessControl{{ ChangeAccessControl: DefaultChangeAccessControl, FilePaths: []string{"foo"}, }}, }, }, { descr: "branch pattern precedent", branchACs: []BranchAccessControl{ { BranchPattern: "trunk", ChangeAccessControls: []ChangeAccessControl{{ FilePathPattern: "foo", Condition: secondCond, }}, }, { BranchPattern: "**", ChangeAccessControls: []ChangeAccessControl{ DefaultChangeAccessControl, }, }, }, interactions: MatchInteractions{ Branch: "trunk", FilePathsChanged: []string{"foo"}, }, result: MatchResult{ BranchPattern: "trunk", ChangeAccessControls: []MatchedChangeAccessControl{{ ChangeAccessControl: ChangeAccessControl{ FilePathPattern: "foo", Condition: secondCond, }, FilePaths: []string{"foo"}, }}, }, }, { descr: "multiple files matching FilePathPatterns", branchACs: []BranchAccessControl{{ BranchPattern: "trunk", ChangeAccessControls: []ChangeAccessControl{{ FilePathPattern: "foo*", Condition: secondCond, }}, }}, interactions: MatchInteractions{ Branch: "trunk", FilePathsChanged: []string{"foo_a", "bar", "foo_b"}, }, result: MatchResult{ BranchPattern: "trunk", ChangeAccessControls: []MatchedChangeAccessControl{ { ChangeAccessControl: DefaultChangeAccessControl, FilePaths: []string{"bar"}, }, { ChangeAccessControl: ChangeAccessControl{ FilePathPattern: "foo*", Condition: secondCond, }, FilePaths: []string{"foo_a", "foo_b"}, }, }, }, }, } for _, test := range tests { t.Run(test.descr, func(t *testing.T) { res, err := Match(test.branchACs, test.interactions) if err != nil { t.Fatalf("error matching: %v", err) } res, expRes := normalizeResult(res), normalizeResult(test.result) if !reflect.DeepEqual(res, expRes) { t.Fatalf("expected:%s\ngot: %s", spew.Sdump(expRes), spew.Sdump(res)) } }) } }