Skip to content

Commit f43353d

Browse files
fix current iteration validation error (#527)
* fix current iteration validation error * fix current iteration validation error * fix current iteration validation error * Total iterations configured
1 parent 990a9ef commit f43353d

2 files changed

Lines changed: 69 additions & 5 deletions

File tree

src/rules_validation_api/app.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ def main() -> None: # pragma: no cover
4747
json_data = json.load(file)
4848
result = RulesValidation(**json_data)
4949
sys.stdout.write(f"{GREEN}Valid Config{RESET}\n")
50-
sys.stdout.write(
51-
f"{YELLOW}Current Iteration Number is {RESET}{GREEN}"
52-
f"{result.campaign_config.current_iteration.iteration_number}{RESET}\n"
53-
)
50+
51+
display_current_iteration(result)
5452

5553
# Group by class
5654
grouped = defaultdict(list)
@@ -75,5 +73,20 @@ def main() -> None: # pragma: no cover
7573
sys.stderr.write(f"{YELLOW}{clean}{RESET}\n")
7674

7775

76+
def display_current_iteration(result: RulesValidation) -> None:
77+
no_of_iterations = 0
78+
try:
79+
no_of_iterations = len(result.campaign_config.iterations)
80+
current = result.campaign_config.current_iteration
81+
except StopIteration:
82+
current = None
83+
if current is None:
84+
sys.stdout.write(f"{YELLOW}No active iteration could be determined{RESET}\n")
85+
sys.stdout.write(f"{YELLOW}Total iterations configured: {RESET}{GREEN}{no_of_iterations}{RESET}\n")
86+
else:
87+
sys.stdout.write(f"{YELLOW}Current Iteration Number: {RESET}{GREEN}{current.iteration_number}{RESET}\n")
88+
sys.stdout.write(f"{YELLOW}Total iterations configured: {RESET}{GREEN}{no_of_iterations}{RESET}\n")
89+
90+
7891
if __name__ == "__main__": # pragma: no cover
7992
main()

tests/unit/validation/test_app.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
import sys
2+
from io import StringIO
3+
from unittest.mock import Mock, PropertyMock
4+
15
from pydantic import BaseModel, ValidationError
26

3-
from rules_validation_api.app import refine_error
7+
from rules_validation_api.app import display_current_iteration, refine_error
48

59

610
def _raise_validation_error(model_cls, **kwargs) -> ValidationError:
@@ -70,3 +74,50 @@ class Model(BaseModel):
7074
expected_no_lines = 3
7175
assert len(lines) == expected_no_lines
7276
assert lines[0].startswith("❌Validation Error:")
77+
78+
79+
def test_no_current_iteration():
80+
# Arrange
81+
result = Mock()
82+
result.campaign_config = Mock()
83+
84+
# iterations must be a list, not a Mock
85+
result.campaign_config.iterations = []
86+
87+
# current_iteration should raise StopIteration
88+
type(result.campaign_config).current_iteration = PropertyMock(side_effect=StopIteration)
89+
90+
captured = StringIO()
91+
sys.stdout = captured
92+
93+
# Act
94+
display_current_iteration(result)
95+
96+
# Reset stdout
97+
sys.stdout = sys.__stdout__
98+
99+
# Assert
100+
assert "No active iteration could be determined" in captured.getvalue()
101+
102+
103+
def test_current_iteration_exists():
104+
# Arrange
105+
mock_iteration = Mock()
106+
mock_iteration.iteration_number = 7
107+
108+
result = Mock()
109+
result.campaign_config = Mock()
110+
111+
result.campaign_config.iterations = [mock_iteration]
112+
113+
type(result.campaign_config).current_iteration = PropertyMock(return_value=mock_iteration)
114+
115+
captured = StringIO()
116+
sys.stdout = captured
117+
118+
display_current_iteration(result)
119+
120+
sys.stdout = sys.__stdout__
121+
122+
assert "Current Iteration Number:" in captured.getvalue()
123+
assert "7" in captured.getvalue()

0 commit comments

Comments
 (0)