@@ -225,5 +225,126 @@ module VCAP::CloudController
225225 end
226226 end
227227 end
228+
229+ describe 'default flag override in config' do
230+ let ( :key ) { :diego_docker }
231+ let ( :default_value ) { FeatureFlag ::DEFAULT_FLAGS [ key ] }
232+
233+ context 'when there was no previously set conflicting value' do
234+ let ( :config_value ) { !default_value }
235+
236+ before do
237+ FeatureFlag . override_default_flags ( { key => config_value } )
238+ end
239+
240+ after do
241+ FeatureFlag . find ( name : key . to_s ) &.destroy
242+ end
243+
244+ context 'and the value is not changed by admin' do
245+ it 'returns the config-set value' do
246+ expect ( FeatureFlag . enabled? ( key ) ) . to be config_value
247+ end
248+ end
249+
250+ context 'and the value is changed by admin' do
251+ let ( :admin_value ) { !config_value }
252+ let ( :admin_override ) do
253+ flag = FeatureFlag . find ( name : key . to_s )
254+ flag . enabled = admin_value
255+ flag . save
256+ end
257+
258+ before do
259+ admin_override
260+ end
261+
262+ after do
263+ admin_override . destroy
264+ end
265+
266+ it 'returns the admin-set value' do
267+ expect ( FeatureFlag . enabled? ( key ) ) . to be admin_value
268+ end
269+ end
270+ end
271+
272+ context 'when there was previously set conflicting value' do
273+ let ( :admin_value ) { !default_value }
274+
275+ before do
276+ FeatureFlag . make ( name : key . to_s , enabled : admin_value )
277+ end
278+
279+ after do
280+ FeatureFlag . find ( name : key . to_s ) &.destroy
281+ end
282+
283+ it 'overwrites the existing admin-set value' do
284+ expect ( FeatureFlag . enabled? ( key ) ) . to be admin_value
285+ FeatureFlag . override_default_flags ( { key => !admin_value } )
286+ expect ( FeatureFlag . enabled? ( key ) ) . to be !admin_value
287+ end
288+ end
289+ end
290+
291+ describe '.update_default_flags' do
292+ context 'with invalid flags' do
293+ it 'raises an error for the one and only invalid name' do
294+ expect do
295+ FeatureFlag . override_default_flags ( { an_invalid_name : true } )
296+ end . to raise_error ( /Invalid feature flag name\( s\) / )
297+ end
298+
299+ it 'raises an error for a mix of valid and invalid names' do
300+ expect do
301+ FeatureFlag . override_default_flags ( { diego_docker : true , an_invalid_name : true } )
302+ end . to raise_error ( /Invalid feature flag name\( s\) / )
303+ end
304+
305+ it 'raises an error for all invalid names' do
306+ expect do
307+ FeatureFlag . override_default_flags ( { invalid_name1 : true , invalid_name2 : false } )
308+ end . to raise_error ( /Invalid feature flag name\( s\) / )
309+ end
310+
311+ it 'raises an error for invalid values' do
312+ expect do
313+ FeatureFlag . override_default_flags ( { diego_docker : 'an invalid value' , user_org_creation : false } )
314+ end . to raise_error ( /Invalid feature flag value\( s\) / )
315+ end
316+ end
317+
318+ context 'with valid flags' do
319+ let ( :default_diego_docker_value ) { FeatureFlag ::DEFAULT_FLAGS [ :diego_docker ] }
320+ let ( :default_user_org_creation_value ) { FeatureFlag ::DEFAULT_FLAGS [ :user_org_creation ] }
321+
322+ before do
323+ expect do
324+ FeatureFlag . override_default_flags ( { diego_docker : !default_diego_docker_value , user_org_creation : !default_user_org_creation_value } )
325+ end . not_to raise_error
326+ end
327+
328+ after do
329+ %i[ diego_docker user_org_creation ] . each do |flag_key |
330+ FeatureFlag . find ( name : flag_key . to_s ) &.destroy
331+ end
332+ end
333+
334+ it 'updates values' do
335+ expect ( FeatureFlag . enabled? ( :diego_docker ) ) . to be !default_diego_docker_value
336+ expect ( FeatureFlag . enabled? ( :user_org_creation ) ) . to be !default_user_org_creation_value
337+ end
338+ end
339+
340+ context 'with empty flags' do
341+ it 'no effect' do
342+ FeatureFlag . override_default_flags ( { } )
343+ FeatureFlag ::DEFAULT_FLAGS . each do |key , value |
344+ expect ( FeatureFlag . enabled? ( key ) ) . to eq value
345+ end
346+ end
347+ end
348+ end
228349 end
229350end
0 commit comments