@@ -57,7 +57,7 @@ func Test_Experiments(t *testing.T) {
57
57
t .Run ("wildcard" , func (t * testing.T ) {
58
58
t .Parallel ()
59
59
cfg := coderdtest .DeploymentValues (t )
60
- cfg .Experiments = []string {"*" }
60
+ cfg .Experiments = []string {codersdk . ExperimentsAllWildcard }
61
61
client := coderdtest .New (t , & coderdtest.Options {
62
62
DeploymentValues : cfg ,
63
63
})
@@ -79,7 +79,7 @@ func Test_Experiments(t *testing.T) {
79
79
t .Run ("alternate wildcard with manual opt-in" , func (t * testing.T ) {
80
80
t .Parallel ()
81
81
cfg := coderdtest .DeploymentValues (t )
82
- cfg .Experiments = []string {"*" , "dAnGeR" }
82
+ cfg .Experiments = []string {codersdk . ExperimentsAllWildcard , "dAnGeR" }
83
83
client := coderdtest .New (t , & coderdtest.Options {
84
84
DeploymentValues : cfg ,
85
85
})
@@ -102,7 +102,7 @@ func Test_Experiments(t *testing.T) {
102
102
t .Run ("Unauthorized" , func (t * testing.T ) {
103
103
t .Parallel ()
104
104
cfg := coderdtest .DeploymentValues (t )
105
- cfg .Experiments = []string {"*" }
105
+ cfg .Experiments = []string {codersdk . ExperimentsAllWildcard }
106
106
client := coderdtest .New (t , & coderdtest.Options {
107
107
DeploymentValues : cfg ,
108
108
})
@@ -133,4 +133,140 @@ func Test_Experiments(t *testing.T) {
133
133
require .NotNil (t , experiments )
134
134
require .ElementsMatch (t , codersdk .ExperimentsAll , experiments .Safe )
135
135
})
136
+
137
+ t .Run ("experiments detail" , func (t * testing.T ) {
138
+ t .Parallel ()
139
+
140
+ const (
141
+ invalidExp = "bob"
142
+ expiredExp = "auto-fill-parameters" // using a string here not a constant since this experiment has expired & will be deleted eventually
143
+ )
144
+
145
+ tests := []struct {
146
+ name string
147
+ enabledValid []codersdk.Experiment
148
+ enabledInvalid []codersdk.Experiment
149
+ expectedExtraCount int
150
+ }{
151
+ {
152
+ name : "using defaults" ,
153
+ },
154
+ {
155
+ name : "use all (*)" ,
156
+ enabledValid : []codersdk.Experiment {codersdk .Experiment (codersdk .ExperimentsAllWildcard )},
157
+ },
158
+ {
159
+ name : "only valid experiments" ,
160
+ enabledValid : codersdk .ExperimentsAll ,
161
+ },
162
+ {
163
+ name : "use all (*) + invalid" ,
164
+ enabledValid : []codersdk.Experiment {codersdk .Experiment (codersdk .ExperimentsAllWildcard ), codersdk .Experiment (expiredExp )},
165
+ expectedExtraCount : 1 ,
166
+ },
167
+ {
168
+ name : "valid + expired experiments" ,
169
+ enabledValid : codersdk .ExperimentsAll ,
170
+ enabledInvalid : []codersdk.Experiment {codersdk .Experiment (expiredExp )},
171
+ expectedExtraCount : 1 ,
172
+ },
173
+ {
174
+ name : "valid + expired + invalid experiments" ,
175
+ enabledValid : codersdk .ExperimentsAll ,
176
+ enabledInvalid : []codersdk.Experiment {codersdk .Experiment (invalidExp ), codersdk .Experiment (expiredExp )},
177
+ expectedExtraCount : 2 ,
178
+ },
179
+ {
180
+ name : "only expired" ,
181
+ enabledInvalid : []codersdk.Experiment {codersdk .Experiment (expiredExp )},
182
+ expectedExtraCount : 1 ,
183
+ },
184
+ {
185
+ name : "only invalid" ,
186
+ enabledInvalid : []codersdk.Experiment {codersdk .Experiment (invalidExp )},
187
+ expectedExtraCount : 1 ,
188
+ },
189
+ {
190
+ name : "expired + invalid experiments" ,
191
+ enabledInvalid : []codersdk.Experiment {codersdk .Experiment (invalidExp ), codersdk .Experiment (expiredExp )},
192
+ expectedExtraCount : 2 ,
193
+ },
194
+ }
195
+
196
+ for _ , tc := range tests {
197
+ tc := tc
198
+
199
+ t .Run (tc .name , func (t * testing.T ) {
200
+ t .Parallel ()
201
+
202
+ var exps []string
203
+
204
+ // given
205
+ for _ , e := range tc .enabledValid {
206
+ exps = append (exps , string (e ))
207
+ }
208
+ for _ , e := range tc .enabledInvalid {
209
+ exps = append (exps , string (e ))
210
+ }
211
+
212
+ cfg := coderdtest .DeploymentValues (t )
213
+ cfg .Experiments = exps
214
+ client := coderdtest .New (t , & coderdtest.Options {
215
+ DeploymentValues : cfg ,
216
+ })
217
+ _ = coderdtest .CreateFirstUser (t , client )
218
+
219
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
220
+ defer cancel ()
221
+
222
+ // when
223
+ experiments , err := client .ExperimentDetails (ctx )
224
+
225
+ // then
226
+ require .NoError (t , err )
227
+ require .Len (t , experiments , len (codersdk .ExperimentsAll )+ tc .expectedExtraCount )
228
+ require .Conditionf (t , func () (success bool ) {
229
+ var enabled []bool
230
+
231
+ var validCount int
232
+ for _ , exp := range tc .enabledValid {
233
+ // don't count wildcard experiment itself as a single experiment
234
+ if exp == codersdk .ExperimentsAllWildcard {
235
+ validCount += len (codersdk .ExperimentsAll )
236
+ } else {
237
+ validCount ++
238
+ }
239
+ }
240
+
241
+ for _ , exp := range append (tc .enabledValid , tc .enabledInvalid ... ) {
242
+ for _ , e := range experiments {
243
+ // * is special-cased to mean all experiments
244
+ if (exp == codersdk .ExperimentsAllWildcard || e .Name == exp ) && e .Enabled {
245
+ // codersdk.ExperimentsAllWildcard cannot include invalid experiments
246
+ if exp == codersdk .ExperimentsAllWildcard && e .Invalid {
247
+ continue
248
+ }
249
+
250
+ enabled = append (enabled , true )
251
+ }
252
+ }
253
+ }
254
+
255
+ return len (enabled ) == validCount + len (tc .enabledInvalid )
256
+ }, "enabled experiment(s) were either not found or not marked as enabled" )
257
+ require .Conditionf (t , func () (success bool ) {
258
+ var invalid []bool
259
+ for _ , exp := range tc .enabledInvalid {
260
+ for _ , e := range experiments {
261
+ if e .Name == exp && e .Invalid {
262
+ invalid = append (invalid , true )
263
+ }
264
+ }
265
+ }
266
+
267
+ return len (invalid ) == len (tc .enabledInvalid )
268
+ }, "invalid experiment(s) were either not found or not marked as invalid" )
269
+ })
270
+ }
271
+ })
136
272
}
0 commit comments