|
| 1 | +import itertools |
1 | 2 | import time |
| 3 | +import typing |
2 | 4 | import unittest |
| 5 | +from dataclasses import dataclass |
| 6 | +from enum import Enum |
3 | 7 | from math import floor |
4 | 8 |
|
5 | 9 | import pytest |
@@ -84,64 +88,72 @@ def test_non_string_comparator(self): |
84 | 88 | assert not targeting(flag_key, rule, EvaluationContext(attributes=context)) |
85 | 89 |
|
86 | 90 |
|
87 | | -@pytest.mark.skip( |
88 | | - "semvers are not working as expected, 'v' prefix is not valid within current implementation" |
| 91 | +class VersionPrefixed(Enum): |
| 92 | + NONE = "None" |
| 93 | + FIRST = "First" |
| 94 | + SECOND = "Second" |
| 95 | + BOTH = "Both" |
| 96 | + |
| 97 | + |
| 98 | +@dataclass |
| 99 | +class SemVerTest: |
| 100 | + title: str |
| 101 | + rule: typing.List[str] |
| 102 | + result: typing.Optional[bool] |
| 103 | + |
| 104 | + |
| 105 | +semver_operations: typing.List[SemVerTest] = [ |
| 106 | + # Successful and working rules |
| 107 | + SemVerTest("equals", ["1.2.3", "=", "1.2.3"], True), |
| 108 | + SemVerTest("not equals", ["1.2.3", "!=", "1.2.4"], True), |
| 109 | + SemVerTest("lesser", ["1.2.3", "<", "1.2.4"], True), |
| 110 | + SemVerTest("lesser equals", ["1.2.3", "<=", "1.2.3"], True), |
| 111 | + SemVerTest("greater", ["1.2.4", ">", "1.2.3"], True), |
| 112 | + SemVerTest("greater equals", ["1.2.3", ">=", "1.2.3"], True), |
| 113 | + SemVerTest("match major", ["1.2.3", "^", "1.0.0"], True), |
| 114 | + SemVerTest("match minor", ["5.0.3", "~", "5.0.8"], True), |
| 115 | + # Wrong rules |
| 116 | + SemVerTest("wrong operator", ["1.0.0", "-", "1.0.0"], None), |
| 117 | + SemVerTest("wrong versions", ["myVersion_1", "=", "myVersion_1"], None), |
| 118 | + SemVerTest( |
| 119 | + "too many arguments", ["myVersion_2", "+", "myVersion_1", "myVersion_1"], None |
| 120 | + ), |
| 121 | + SemVerTest("too many arguments", ["1.2.3", "=", "1.2.3", "myVersion_1"], None), |
| 122 | +] |
| 123 | + |
| 124 | + |
| 125 | +def semver_test_naming(vals): |
| 126 | + if isinstance(vals, SemVerTest): |
| 127 | + return vals.title |
| 128 | + elif isinstance(vals, VersionPrefixed): |
| 129 | + return f"prefixing '{vals.value}'" |
| 130 | + elif isinstance(vals, str): |
| 131 | + return f"with '{vals}'" |
| 132 | + |
| 133 | + |
| 134 | +@pytest.mark.parametrize( |
| 135 | + ("semver_test", "prefix_state", "prefix"), |
| 136 | + itertools.product(semver_operations, VersionPrefixed, ["V", "v"]), |
| 137 | + ids=semver_test_naming, |
89 | 138 | ) |
90 | | -class SemVerOperator(unittest.TestCase): |
91 | | - def test_should_support_equal_operator(self): |
92 | | - rule = {"sem_ver": ["v1.2.3", "=", "1.2.3"]} |
| 139 | +def test_sem_ver_operator(semver_test: SemVerTest, prefix_state, prefix): |
| 140 | + """Testing SemVer operator `semver_test.title` for `semver_test.rule` prefixing `prefix_state.value` version(s) with `prefix`""" |
| 141 | + version1 = semver_test.rule[0] |
| 142 | + operator = semver_test.rule[1] |
| 143 | + version2 = semver_test.rule[2] |
93 | 144 |
|
94 | | - assert targeting(flag_key, rule) |
95 | | - |
96 | | - def test_should_support_neq_operator(self): |
97 | | - rule = {"sem_ver": ["v1.2.3", "!=", "1.2.4"]} |
98 | | - |
99 | | - assert targeting(flag_key, rule) |
100 | | - |
101 | | - def test_should_support_lt_operator(self): |
102 | | - rule = {"sem_ver": ["v1.2.3", "<", "1.2.4"]} |
103 | | - |
104 | | - assert targeting(flag_key, rule) |
105 | | - |
106 | | - def test_should_support_lte_operator(self): |
107 | | - rule = {"sem_ver": ["v1.2.3", "<=", "1.2.3"]} |
108 | | - |
109 | | - assert targeting(flag_key, rule) |
110 | | - |
111 | | - def test_should_support_gte_operator(self): |
112 | | - rule = {"sem_ver": ["v1.2.3", ">=", "1.2.3"]} |
113 | | - |
114 | | - assert targeting(flag_key, rule) |
| 145 | + if prefix_state is VersionPrefixed.FIRST or prefix_state is VersionPrefixed.BOTH: |
| 146 | + version1 = prefix + version1 |
115 | 147 |
|
116 | | - def test_should_support_gt_operator(self): |
117 | | - rule = {"sem_ver": ["v1.2.4", ">", "1.2.3"]} |
| 148 | + if prefix_state is VersionPrefixed.SECOND or prefix_state is VersionPrefixed.BOTH: |
| 149 | + version2 = prefix + version2 |
118 | 150 |
|
119 | | - assert targeting(flag_key, rule) |
120 | | - |
121 | | - def test_should_support_major_comparison_operator(self): |
122 | | - rule = {"sem_ver": ["v1.2.3", "^", "v1.0.0"]} |
123 | | - |
124 | | - assert targeting(flag_key, rule) |
125 | | - |
126 | | - def test_should_support_minor_comparison_operator(self): |
127 | | - rule = {"sem_ver": ["v5.0.3", "~", "v5.0.8"]} |
128 | | - |
129 | | - assert targeting(flag_key, rule) |
| 151 | + semver_rule = [version1, operator, version2] |
| 152 | + semver_rule.extend(semver_test.rule[3:]) |
130 | 153 |
|
131 | | - def test_should_handle_unknown_operator(self): |
132 | | - rule = {"sem_ver": ["v1.0.0", "-", "v1.0.0"]} |
| 154 | + gen_rule = {"sem_ver": semver_rule} |
133 | 155 |
|
134 | | - assert targeting(flag_key, rule) |
135 | | - |
136 | | - def test_should_handle_invalid_targetings(self): |
137 | | - rule = {"sem_ver": ["myVersion_1", "=", "myVersion_1"]} |
138 | | - |
139 | | - assert not targeting(flag_key, rule) |
140 | | - |
141 | | - def test_should_validate_targetings(self): |
142 | | - rule = {"sem_ver": ["myVersion_2", "+", "myVersion_1", "myVersion_1"]} |
143 | | - |
144 | | - assert targeting(flag_key, rule) |
| 156 | + assert targeting(flag_key, gen_rule) is semver_test.result |
145 | 157 |
|
146 | 158 |
|
147 | 159 | class FractionalOperator(unittest.TestCase): |
|
0 commit comments