|
12 | 12 | # limitations under the License.
|
13 | 13 |
|
14 | 14 | import mock
|
15 |
| -from six import PY2, PY3 |
| 15 | +from six import PY2 |
16 | 16 |
|
17 | 17 | from optimizely.helpers import condition as condition_helper
|
18 | 18 |
|
19 | 19 | from tests import base
|
20 | 20 |
|
21 |
| -if PY3: |
22 |
| - def long(a): |
23 |
| - raise NotImplementedError('Tests should only call `long` if running in PY2') |
24 |
| - |
25 | 21 | browserConditionSafari = ['browser_type', 'safari', 'custom_attribute', 'exact']
|
26 | 22 | booleanCondition = ['is_firefox', True, 'custom_attribute', 'exact']
|
27 | 23 | integerCondition = ['num_users', 10, 'custom_attribute', 'exact']
|
@@ -286,6 +282,36 @@ def test_exact_float__returns_null__when_no_user_provided_value(self):
|
286 | 282 |
|
287 | 283 | self.assertIsNone(evaluator.evaluate(0))
|
288 | 284 |
|
| 285 | + def test_exact__given_number_values__calls_is_finite_number(self): |
| 286 | + """ Test that CustomAttributeConditionEvaluator.evaluate returns True |
| 287 | + if is_finite_number returns True. Returns None if is_finite_number returns False. """ |
| 288 | + |
| 289 | + evaluator = condition_helper.CustomAttributeConditionEvaluator( |
| 290 | + exact_int_condition_list, {'lasers_count': 9000} |
| 291 | + ) |
| 292 | + |
| 293 | + # assert that isFiniteNumber only needs to reject condition value to stop evaluation. |
| 294 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 295 | + side_effect=[False, True]) as mock_is_finite: |
| 296 | + self.assertIsNone(evaluator.evaluate(0)) |
| 297 | + |
| 298 | + mock_is_finite.assert_called_once_with(9000) |
| 299 | + |
| 300 | + # assert that isFiniteNumber evaluates user value only if it has accepted condition value. |
| 301 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 302 | + side_effect=[True, False]) as mock_is_finite: |
| 303 | + self.assertIsNone(evaluator.evaluate(0)) |
| 304 | + |
| 305 | + mock_is_finite.assert_has_calls([mock.call(9000), mock.call(9000)]) |
| 306 | + |
| 307 | + # assert CustomAttributeConditionEvaluator.evaluate returns True only when isFiniteNumber returns |
| 308 | + # True both for condition and user values. |
| 309 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 310 | + side_effect=[True, True]) as mock_is_finite: |
| 311 | + self.assertTrue(evaluator.evaluate(0)) |
| 312 | + |
| 313 | + mock_is_finite.assert_has_calls([mock.call(9000), mock.call(9000)]) |
| 314 | + |
289 | 315 | def test_exact_bool__returns_true__when_user_provided_value_is_equal_to_condition_value(self):
|
290 | 316 |
|
291 | 317 | evaluator = condition_helper.CustomAttributeConditionEvaluator(
|
@@ -594,6 +620,84 @@ def test_less_than_float__returns_null__when_no_user_provided_value(self):
|
594 | 620 |
|
595 | 621 | self.assertIsNone(evaluator.evaluate(0))
|
596 | 622 |
|
| 623 | + def test_greater_than__calls_is_finite_number(self): |
| 624 | + """ Test that CustomAttributeConditionEvaluator.evaluate returns True |
| 625 | + if is_finite_number returns True. Returns None if is_finite_number returns False. """ |
| 626 | + |
| 627 | + evaluator = condition_helper.CustomAttributeConditionEvaluator( |
| 628 | + gt_int_condition_list, {'meters_travelled': 48.1} |
| 629 | + ) |
| 630 | + |
| 631 | + def is_finite_number__rejecting_condition_value(value): |
| 632 | + if value == 48: |
| 633 | + return False |
| 634 | + return True |
| 635 | + |
| 636 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 637 | + side_effect=is_finite_number__rejecting_condition_value) as mock_is_finite: |
| 638 | + self.assertIsNone(evaluator.evaluate(0)) |
| 639 | + |
| 640 | + # assert that isFiniteNumber only needs to reject condition value to stop evaluation. |
| 641 | + mock_is_finite.assert_called_once_with(48) |
| 642 | + |
| 643 | + def is_finite_number__rejecting_user_attribute_value(value): |
| 644 | + if value == 48.1: |
| 645 | + return False |
| 646 | + return True |
| 647 | + |
| 648 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 649 | + side_effect=is_finite_number__rejecting_user_attribute_value) as mock_is_finite: |
| 650 | + self.assertIsNone(evaluator.evaluate(0)) |
| 651 | + |
| 652 | + # assert that isFiniteNumber evaluates user value only if it has accepted condition value. |
| 653 | + mock_is_finite.assert_has_calls([mock.call(48), mock.call(48.1)]) |
| 654 | + |
| 655 | + def is_finite_number__accepting_both_values(value): |
| 656 | + return True |
| 657 | + |
| 658 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 659 | + side_effect=is_finite_number__accepting_both_values): |
| 660 | + self.assertTrue(evaluator.evaluate(0)) |
| 661 | + |
| 662 | + def test_less_than__calls_is_finite_number(self): |
| 663 | + """ Test that CustomAttributeConditionEvaluator.evaluate returns True |
| 664 | + if is_finite_number returns True. Returns None if is_finite_number returns False. """ |
| 665 | + |
| 666 | + evaluator = condition_helper.CustomAttributeConditionEvaluator( |
| 667 | + lt_int_condition_list, {'meters_travelled': 47} |
| 668 | + ) |
| 669 | + |
| 670 | + def is_finite_number__rejecting_condition_value(value): |
| 671 | + if value == 48: |
| 672 | + return False |
| 673 | + return True |
| 674 | + |
| 675 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 676 | + side_effect=is_finite_number__rejecting_condition_value) as mock_is_finite: |
| 677 | + self.assertIsNone(evaluator.evaluate(0)) |
| 678 | + |
| 679 | + # assert that isFiniteNumber only needs to reject condition value to stop evaluation. |
| 680 | + mock_is_finite.assert_called_once_with(48) |
| 681 | + |
| 682 | + def is_finite_number__rejecting_user_attribute_value(value): |
| 683 | + if value == 47: |
| 684 | + return False |
| 685 | + return True |
| 686 | + |
| 687 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 688 | + side_effect=is_finite_number__rejecting_user_attribute_value) as mock_is_finite: |
| 689 | + self.assertIsNone(evaluator.evaluate(0)) |
| 690 | + |
| 691 | + # assert that isFiniteNumber evaluates user value only if it has accepted condition value. |
| 692 | + mock_is_finite.assert_has_calls([mock.call(48), mock.call(47)]) |
| 693 | + |
| 694 | + def is_finite_number__accepting_both_values(value): |
| 695 | + return True |
| 696 | + |
| 697 | + with mock.patch('optimizely.helpers.validator.is_finite_number', |
| 698 | + side_effect=is_finite_number__accepting_both_values): |
| 699 | + self.assertTrue(evaluator.evaluate(0)) |
| 700 | + |
597 | 701 |
|
598 | 702 | class ConditionDecoderTests(base.BaseTest):
|
599 | 703 |
|
|
0 commit comments