@@ -9,27 +9,119 @@ import (
99)
1010
1111func TestParseProvideStrategy (t * testing.T ) {
12- tests := []struct {
13- input string
14- expect ProvideStrategy
15- }{
16- {"all" , ProvideStrategyAll },
17- {"pinned" , ProvideStrategyPinned },
18- {"mfs" , ProvideStrategyMFS },
19- {"pinned+mfs" , ProvideStrategyPinned | ProvideStrategyMFS },
20- {"invalid" , 0 },
21- {"all+invalid" , ProvideStrategyAll },
22- {"" , ProvideStrategyAll },
23- {"flat" , ProvideStrategyAll }, // deprecated, maps to "all"
24- {"flat+all" , ProvideStrategyAll },
25- }
12+ t .Run ("valid strategies" , func (t * testing.T ) {
13+ tests := []struct {
14+ input string
15+ expect ProvideStrategy
16+ }{
17+ {"all" , ProvideStrategyAll },
18+ {"pinned" , ProvideStrategyPinned },
19+ {"roots" , ProvideStrategyRoots },
20+ {"mfs" , ProvideStrategyMFS },
21+ {"pinned+mfs" , ProvideStrategyPinned | ProvideStrategyMFS },
22+ {"pinned+roots" , ProvideStrategyPinned | ProvideStrategyRoots },
23+ {"pinned+mfs+roots" , ProvideStrategyPinned | ProvideStrategyMFS | ProvideStrategyRoots },
24+ {"" , ProvideStrategyAll }, // empty string = default = all
25+ {"flat" , ProvideStrategyAll }, // deprecated, maps to "all"
26+ {"flat+all" , ProvideStrategyAll }, // redundant but valid
27+ {"all+all" , ProvideStrategyAll }, // redundant but valid
28+ {"mfs+pinned" , ProvideStrategyMFS | ProvideStrategyPinned }, // order doesn't matter
29+ }
2630
27- for _ , tt := range tests {
28- result := ParseProvideStrategy (tt .input )
29- if result != tt .expect {
30- t . Errorf ( "ParseProvideStrategy(%q) = %d, want %d " , tt .input , result , tt . expect )
31+ for _ , tt := range tests {
32+ result , err := ParseProvideStrategy (tt .input )
33+ require . NoError ( t , err , "ParseProvideStrategy(%q)" , tt .input )
34+ assert . Equal ( t , tt . expect , result , "ParseProvideStrategy(%q)" , tt .input )
3135 }
32- }
36+ })
37+
38+ t .Run ("unknown token (including typos)" , func (t * testing.T ) {
39+ tests := []struct {
40+ input string
41+ err string
42+ }{
43+ {"invalid" , `unknown provide strategy token: "invalid"` },
44+ {"uniuqe" , `unknown provide strategy token: "uniuqe"` }, // typo of "unique"
45+ {"entites" , `unknown provide strategy token: "entites"` }, // cspell:disable-line -- intentional typo of "entities"
46+ {"pinned+uniuqe" , `unknown provide strategy token: "uniuqe"` }, // typo in combo
47+ }
48+
49+ for _ , tt := range tests {
50+ _ , err := ParseProvideStrategy (tt .input )
51+ require .Error (t , err , "ParseProvideStrategy(%q) should fail" , tt .input )
52+ assert .Contains (t , err .Error (), tt .err )
53+ }
54+ })
55+
56+ t .Run ("empty token from delimiter" , func (t * testing.T ) {
57+ tests := []string {
58+ "pinned+" , // trailing +
59+ "+pinned" , // leading +
60+ "pinned++mfs" , // double +
61+ }
62+
63+ for _ , input := range tests {
64+ _ , err := ParseProvideStrategy (input )
65+ require .Error (t , err , "ParseProvideStrategy(%q) should fail" , input )
66+ assert .Contains (t , err .Error (), "empty token" )
67+ }
68+ })
69+
70+ t .Run ("all cannot be combined with other strategies" , func (t * testing.T ) {
71+ tests := []string {
72+ "all+pinned" ,
73+ "all+mfs" ,
74+ "all+roots" ,
75+ "flat+pinned" ,
76+ "all+pinned+mfs" ,
77+ }
78+
79+ for _ , input := range tests {
80+ _ , err := ParseProvideStrategy (input )
81+ require .Error (t , err , "ParseProvideStrategy(%q) should fail" , input )
82+ assert .Contains (t , err .Error (), "cannot be combined" )
83+ }
84+ })
85+ }
86+
87+ func TestMustParseProvideStrategy (t * testing.T ) {
88+ t .Run ("valid input returns strategy" , func (t * testing.T ) {
89+ assert .Equal (t , ProvideStrategyAll , MustParseProvideStrategy ("all" ))
90+ assert .Equal (t , ProvideStrategyPinned | ProvideStrategyMFS , MustParseProvideStrategy ("pinned+mfs" ))
91+ })
92+
93+ t .Run ("invalid input panics" , func (t * testing.T ) {
94+ assert .Panics (t , func () { MustParseProvideStrategy ("bogus" ) })
95+ assert .Panics (t , func () { MustParseProvideStrategy ("all+pinned" ) })
96+ })
97+ }
98+
99+ func TestValidateProvideConfig_Strategy (t * testing.T ) {
100+ t .Run ("valid strategies" , func (t * testing.T ) {
101+ for _ , s := range []string {"all" , "pinned" , "roots" , "mfs" , "pinned+mfs" } {
102+ cfg := & Provide {Strategy : NewOptionalString (s )}
103+ require .NoError (t , ValidateProvideConfig (cfg ), "strategy=%q" , s )
104+ }
105+ })
106+
107+ t .Run ("default (nil) strategy is valid" , func (t * testing.T ) {
108+ cfg := & Provide {}
109+ require .NoError (t , ValidateProvideConfig (cfg ))
110+ })
111+
112+ t .Run ("invalid strategy" , func (t * testing.T ) {
113+ cfg := & Provide {Strategy : NewOptionalString ("bogus" )}
114+ err := ValidateProvideConfig (cfg )
115+ require .Error (t , err )
116+ assert .Contains (t , err .Error (), "Provide.Strategy" )
117+ })
118+
119+ t .Run ("all combined with others" , func (t * testing.T ) {
120+ cfg := & Provide {Strategy : NewOptionalString ("all+pinned" )}
121+ err := ValidateProvideConfig (cfg )
122+ require .Error (t , err )
123+ assert .Contains (t , err .Error (), "cannot be combined" )
124+ })
33125}
34126
35127func TestValidateProvideConfig_Interval (t * testing.T ) {
0 commit comments