14
14
15
15
"""Tests for firebase_admin.remote_config."""
16
16
import uuid
17
- from unittest import mock
18
17
import firebase_admin
19
18
from firebase_admin .remote_config import (
20
19
PercentConditionOperator ,
21
20
ServerTemplateData )
22
21
from firebase_admin import remote_config
22
+ from tests import testutils
23
23
24
24
VERSION_INFO = {
25
25
'versionNumber' : '86' ,
63
63
}
64
64
65
65
class TestEvaluate :
66
- def set_up (self ):
67
- # Create a more specific mock for firebase_admin.App
68
- self .mock_app = mock .create_autospec (firebase_admin .App )
69
- self .mock_app .project_id = 'mock-project-id'
70
- self .mock_app .name = 'mock-app-name'
66
+ @classmethod
67
+ def setup_class (cls ):
68
+ cred = testutils .MockCredential ()
69
+ firebase_admin .initialize_app (cred , {'projectId' : 'project-id' })
71
70
72
- # Mock initialize_app to return the mock App instance
73
- self .mock_initialize_app = mock .patch ('firebase_admin.initialize_app' ).start ()
74
- self .mock_initialize_app .return_value = self .mock_app
75
-
76
- # Mock the app registry
77
- self .mock_get_app = mock .patch ('firebase_admin._utils.get_app_service' ).start ()
78
- self .mock_get_app .return_value = self .mock_app
79
-
80
- def tear_down (self ):
81
- mock .patch .stopall ()
71
+ @classmethod
72
+ def teardown_class (cls ):
73
+ testutils .cleanup_apps ()
82
74
83
75
def test_evaluate_or_and_true_condition_true (self ):
84
- self . set_up ()
76
+ app = firebase_admin . get_app ()
85
77
default_config = {'param1' : 'in_app_default_param1' , 'param3' : 'in_app_default_param3' }
86
78
condition = {
87
79
'name' : 'is_true' ,
@@ -116,17 +108,16 @@ def test_evaluate_or_and_true_condition_true(self):
116
108
'etag' : '123'
117
109
}
118
110
server_template = remote_config .init_server_template (
119
- app = self . mock_app ,
111
+ app = app ,
120
112
default_config = default_config ,
121
113
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
122
114
)
123
115
124
116
server_config = server_template .evaluate ()
125
117
assert server_config .get_boolean ('is_enabled' )
126
- self .tear_down ()
127
118
128
119
def test_evaluate_or_and_false_condition_false (self ):
129
- self . set_up ()
120
+ app = firebase_admin . get_app ()
130
121
default_config = {'param1' : 'in_app_default_param1' , 'param3' : 'in_app_default_param3' }
131
122
condition = {
132
123
'name' : 'is_true' ,
@@ -161,17 +152,16 @@ def test_evaluate_or_and_false_condition_false(self):
161
152
'etag' : '123'
162
153
}
163
154
server_template = remote_config .init_server_template (
164
- app = self . mock_app ,
155
+ app = app ,
165
156
default_config = default_config ,
166
157
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
167
158
)
168
159
169
160
server_config = server_template .evaluate ()
170
161
assert not server_config .get_boolean ('is_enabled' )
171
- self .tear_down ()
172
162
173
163
def test_evaluate_non_or_condition (self ):
174
- self . set_up ()
164
+ app = firebase_admin . get_app ()
175
165
default_config = {'param1' : 'in_app_default_param1' , 'param3' : 'in_app_default_param3' }
176
166
condition = {
177
167
'name' : 'is_true' ,
@@ -193,17 +183,16 @@ def test_evaluate_non_or_condition(self):
193
183
'etag' : '123'
194
184
}
195
185
server_template = remote_config .init_server_template (
196
- app = self . mock_app ,
186
+ app = app ,
197
187
default_config = default_config ,
198
188
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
199
189
)
200
190
201
191
server_config = server_template .evaluate ()
202
192
assert server_config .get_boolean ('is_enabled' )
203
- self .tear_down ()
204
193
205
194
def test_evaluate_return_conditional_values_honor_order (self ):
206
- self . set_up ()
195
+ app = firebase_admin . get_app ()
207
196
default_config = {'param1' : 'in_app_default_param1' , 'param3' : 'in_app_default_param3' }
208
197
template_data = {
209
198
'conditions' : [
@@ -260,47 +249,44 @@ def test_evaluate_return_conditional_values_honor_order(self):
260
249
'etag' : '123'
261
250
}
262
251
server_template = remote_config .init_server_template (
263
- app = self . mock_app ,
252
+ app = app ,
264
253
default_config = default_config ,
265
254
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
266
255
)
267
256
server_config = server_template .evaluate ()
268
257
assert server_config .get_string ('dog_type' ) == 'corgi'
269
- self .tear_down ()
270
258
271
259
def test_evaluate_default_when_no_param (self ):
272
- self . set_up ()
260
+ app = firebase_admin . get_app ()
273
261
default_config = {'promo_enabled' : False , 'promo_discount' : 20 ,}
274
262
template_data = SERVER_REMOTE_CONFIG_RESPONSE
275
263
template_data ['parameters' ] = {}
276
264
server_template = remote_config .init_server_template (
277
- app = self . mock_app ,
265
+ app = app ,
278
266
default_config = default_config ,
279
267
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
280
268
)
281
269
server_config = server_template .evaluate ()
282
270
assert server_config .get_boolean ('promo_enabled' ) == default_config .get ('promo_enabled' )
283
271
assert server_config .get_int ('promo_discount' ) == default_config .get ('promo_discount' )
284
- self .tear_down ()
285
272
286
273
def test_evaluate_default_when_no_default_value (self ):
287
- self . set_up ()
274
+ app = firebase_admin . get_app ()
288
275
default_config = {'default_value' : 'local default' }
289
276
template_data = SERVER_REMOTE_CONFIG_RESPONSE
290
277
template_data ['parameters' ] = {
291
278
'default_value' : {}
292
279
}
293
280
server_template = remote_config .init_server_template (
294
- app = self . mock_app ,
281
+ app = app ,
295
282
default_config = default_config ,
296
283
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
297
284
)
298
285
server_config = server_template .evaluate ()
299
286
assert server_config .get_string ('default_value' ) == default_config .get ('default_value' )
300
- self .tear_down ()
301
287
302
288
def test_evaluate_default_when_in_default (self ):
303
- self . set_up ()
289
+ app = firebase_admin . get_app ()
304
290
template_data = SERVER_REMOTE_CONFIG_RESPONSE
305
291
template_data ['parameters' ] = {
306
292
'remote_default_value' : {}
@@ -309,63 +295,59 @@ def test_evaluate_default_when_in_default(self):
309
295
'inapp_default' : '🐕'
310
296
}
311
297
server_template = remote_config .init_server_template (
312
- app = self . mock_app ,
298
+ app = app ,
313
299
default_config = default_config ,
314
300
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
315
301
)
316
302
server_config = server_template .evaluate ()
317
303
assert server_config .get_string ('inapp_default' ) == default_config .get ('inapp_default' )
318
- self .tear_down ()
319
304
320
305
def test_evaluate_default_when_defined (self ):
321
- self . set_up ()
306
+ app = firebase_admin . get_app ()
322
307
template_data = SERVER_REMOTE_CONFIG_RESPONSE
323
308
template_data ['parameters' ] = {}
324
309
default_config = {
325
310
'dog_type' : 'shiba'
326
311
}
327
312
server_template = remote_config .init_server_template (
328
- app = self . mock_app ,
313
+ app = app ,
329
314
default_config = default_config ,
330
315
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
331
316
)
332
317
server_config = server_template .evaluate ()
333
318
assert server_config .get_value ('dog_type' ).as_string () == 'shiba'
334
319
assert server_config .get_value ('dog_type' ).get_source () == 'default'
335
- self .tear_down ()
336
320
337
321
def test_evaluate_return_numeric_value (self ):
338
- self . set_up ()
322
+ app = firebase_admin . get_app ()
339
323
template_data = SERVER_REMOTE_CONFIG_RESPONSE
340
324
default_config = {
341
325
'dog_age' : 12
342
326
}
343
327
server_template = remote_config .init_server_template (
344
- app = self . mock_app ,
328
+ app = app ,
345
329
default_config = default_config ,
346
330
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
347
331
)
348
332
server_config = server_template .evaluate ()
349
333
assert server_config .get_int ('dog_age' ) == 12
350
- self .tear_down ()
351
334
352
335
def test_evaluate_return__value (self ):
353
- self . set_up ()
336
+ app = firebase_admin . get_app ()
354
337
template_data = SERVER_REMOTE_CONFIG_RESPONSE
355
338
default_config = {
356
339
'dog_is_cute' : True
357
340
}
358
341
server_template = remote_config .init_server_template (
359
- app = self . mock_app ,
342
+ app = app ,
360
343
default_config = default_config ,
361
344
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
362
345
)
363
346
server_config = server_template .evaluate ()
364
347
assert server_config .get_int ('dog_is_cute' )
365
- self .tear_down ()
366
348
367
349
def test_evaluate_unknown_operator_to_false (self ):
368
- self . set_up ()
350
+ app = firebase_admin . get_app ()
369
351
condition = {
370
352
'name' : 'is_true' ,
371
353
'condition' : {
@@ -399,16 +381,15 @@ def test_evaluate_unknown_operator_to_false(self):
399
381
}
400
382
context = {'randomization_id' : '123' }
401
383
server_template = remote_config .init_server_template (
402
- app = self . mock_app ,
384
+ app = app ,
403
385
default_config = default_config ,
404
386
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
405
387
)
406
388
server_config = server_template .evaluate (context )
407
389
assert not server_config .get_boolean ('is_enabled' )
408
- self .tear_down ()
409
390
410
391
def test_evaluate_less_or_equal_to_max_to_true (self ):
411
- self . set_up ()
392
+ app = firebase_admin . get_app ()
412
393
condition = {
413
394
'name' : 'is_true' ,
414
395
'condition' : {
@@ -444,16 +425,15 @@ def test_evaluate_less_or_equal_to_max_to_true(self):
444
425
}
445
426
context = {'randomization_id' : '123' }
446
427
server_template = remote_config .init_server_template (
447
- app = self . mock_app ,
428
+ app = app ,
448
429
default_config = default_config ,
449
430
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
450
431
)
451
432
server_config = server_template .evaluate (context )
452
433
assert server_config .get_boolean ('is_enabled' )
453
- self .tear_down ()
454
434
455
435
def test_evaluate_undefined_micropercent_to_false (self ):
456
- self . set_up ()
436
+ app = firebase_admin . get_app ()
457
437
condition = {
458
438
'name' : 'is_true' ,
459
439
'condition' : {
@@ -488,16 +468,15 @@ def test_evaluate_undefined_micropercent_to_false(self):
488
468
}
489
469
context = {'randomization_id' : '123' }
490
470
server_template = remote_config .init_server_template (
491
- app = self . mock_app ,
471
+ app = app ,
492
472
default_config = default_config ,
493
473
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
494
474
)
495
475
server_config = server_template .evaluate (context )
496
476
assert not server_config .get_boolean ('is_enabled' )
497
- self .tear_down ()
498
477
499
478
def test_evaluate_undefined_micropercentrange_to_false (self ):
500
- self . set_up ()
479
+ app = firebase_admin . get_app ()
501
480
condition = {
502
481
'name' : 'is_true' ,
503
482
'condition' : {
@@ -532,16 +511,15 @@ def test_evaluate_undefined_micropercentrange_to_false(self):
532
511
}
533
512
context = {'randomization_id' : '123' }
534
513
server_template = remote_config .init_server_template (
535
- app = self . mock_app ,
514
+ app = app ,
536
515
default_config = default_config ,
537
516
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
538
517
)
539
518
server_config = server_template .evaluate (context )
540
519
assert not server_config .get_boolean ('is_enabled' )
541
- self .tear_down ()
542
520
543
521
def test_evaluate_between_min_max_to_true (self ):
544
- self . set_up ()
522
+ app = firebase_admin . get_app ()
545
523
condition = {
546
524
'name' : 'is_true' ,
547
525
'condition' : {
@@ -580,16 +558,15 @@ def test_evaluate_between_min_max_to_true(self):
580
558
}
581
559
context = {'randomization_id' : '123' }
582
560
server_template = remote_config .init_server_template (
583
- app = self . mock_app ,
561
+ app = app ,
584
562
default_config = default_config ,
585
563
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
586
564
)
587
565
server_config = server_template .evaluate (context )
588
566
assert server_config .get_boolean ('is_enabled' )
589
- self .tear_down ()
590
567
591
568
def test_evaluate_between_equal_bounds_to_false (self ):
592
- self . set_up ()
569
+ app = firebase_admin . get_app ()
593
570
condition = {
594
571
'name' : 'is_true' ,
595
572
'condition' : {
@@ -628,16 +605,15 @@ def test_evaluate_between_equal_bounds_to_false(self):
628
605
}
629
606
context = {'randomization_id' : '123' }
630
607
server_template = remote_config .init_server_template (
631
- app = self . mock_app ,
608
+ app = app ,
632
609
default_config = default_config ,
633
610
template_data = ServerTemplateData ('etag' , template_data ) # Use ServerTemplateData here
634
611
)
635
612
server_config = server_template .evaluate (context )
636
613
assert not server_config .get_boolean ('is_enabled' )
637
- self .tear_down ()
638
614
639
615
def test_evaluate_less_or_equal_to_approx (self ):
640
- self . set_up ()
616
+ app = firebase_admin . get_app ()
641
617
condition = {
642
618
'name' : 'is_true' ,
643
619
'condition' : {
@@ -661,14 +637,13 @@ def test_evaluate_less_or_equal_to_approx(self):
661
637
}
662
638
663
639
truthy_assignments = self .evaluate_random_assignments (condition , 100000 ,
664
- self . mock_app , default_config )
640
+ app , default_config )
665
641
tolerance = 284
666
642
assert truthy_assignments >= 10000 - tolerance
667
643
assert truthy_assignments <= 10000 + tolerance
668
- self .tear_down ()
669
644
670
645
def test_evaluate_between_approx (self ):
671
- self . set_up ()
646
+ app = firebase_admin . get_app ()
672
647
condition = {
673
648
'name' : 'is_true' ,
674
649
'condition' : {
@@ -695,14 +670,13 @@ def test_evaluate_between_approx(self):
695
670
}
696
671
697
672
truthy_assignments = self .evaluate_random_assignments (condition , 100000 ,
698
- self . mock_app , default_config )
673
+ app , default_config )
699
674
tolerance = 379
700
675
assert truthy_assignments >= 20000 - tolerance
701
676
assert truthy_assignments <= 20000 + tolerance
702
- self .tear_down ()
703
677
704
678
def test_evaluate_between_interquartile_range_accuracy (self ):
705
- self . set_up ()
679
+ app = firebase_admin . get_app ()
706
680
condition = {
707
681
'name' : 'is_true' ,
708
682
'condition' : {
@@ -729,11 +703,10 @@ def test_evaluate_between_interquartile_range_accuracy(self):
729
703
}
730
704
731
705
truthy_assignments = self .evaluate_random_assignments (condition , 100000 ,
732
- self . mock_app , default_config )
706
+ app , default_config )
733
707
tolerance = 474
734
708
assert truthy_assignments >= 50000 - tolerance
735
709
assert truthy_assignments <= 50000 + tolerance
736
- self .tear_down ()
737
710
738
711
def evaluate_random_assignments (self , condition , num_of_assignments , mock_app , default_config ):
739
712
"""Evaluates random assignments based on a condition.
0 commit comments