diff --git a/src/rules_validation_api/app.py b/src/rules_validation_api/app.py index 327e8989b..43aa6530f 100644 --- a/src/rules_validation_api/app.py +++ b/src/rules_validation_api/app.py @@ -47,10 +47,8 @@ def main() -> None: # pragma: no cover json_data = json.load(file) result = RulesValidation(**json_data) sys.stdout.write(f"{GREEN}Valid Config{RESET}\n") - sys.stdout.write( - f"{YELLOW}Current Iteration Number is {RESET}{GREEN}" - f"{result.campaign_config.current_iteration.iteration_number}{RESET}\n" - ) + + display_current_iteration(result) # Group by class grouped = defaultdict(list) @@ -75,5 +73,20 @@ def main() -> None: # pragma: no cover sys.stderr.write(f"{YELLOW}{clean}{RESET}\n") +def display_current_iteration(result: RulesValidation) -> None: + no_of_iterations = 0 + try: + no_of_iterations = len(result.campaign_config.iterations) + current = result.campaign_config.current_iteration + except StopIteration: + current = None + if current is None: + sys.stdout.write(f"{YELLOW}No active iteration could be determined{RESET}\n") + sys.stdout.write(f"{YELLOW}Total iterations configured: {RESET}{GREEN}{no_of_iterations}{RESET}\n") + else: + sys.stdout.write(f"{YELLOW}Current Iteration Number: {RESET}{GREEN}{current.iteration_number}{RESET}\n") + sys.stdout.write(f"{YELLOW}Total iterations configured: {RESET}{GREEN}{no_of_iterations}{RESET}\n") + + if __name__ == "__main__": # pragma: no cover main() diff --git a/tests/unit/validation/test_app.py b/tests/unit/validation/test_app.py index 9f0e2c2f7..0c88bea80 100644 --- a/tests/unit/validation/test_app.py +++ b/tests/unit/validation/test_app.py @@ -1,6 +1,10 @@ +import sys +from io import StringIO +from unittest.mock import Mock, PropertyMock + from pydantic import BaseModel, ValidationError -from rules_validation_api.app import refine_error +from rules_validation_api.app import display_current_iteration, refine_error def _raise_validation_error(model_cls, **kwargs) -> ValidationError: @@ -70,3 +74,50 @@ class Model(BaseModel): expected_no_lines = 3 assert len(lines) == expected_no_lines assert lines[0].startswith("❌Validation Error:") + + +def test_no_current_iteration(): + # Arrange + result = Mock() + result.campaign_config = Mock() + + # iterations must be a list, not a Mock + result.campaign_config.iterations = [] + + # current_iteration should raise StopIteration + type(result.campaign_config).current_iteration = PropertyMock(side_effect=StopIteration) + + captured = StringIO() + sys.stdout = captured + + # Act + display_current_iteration(result) + + # Reset stdout + sys.stdout = sys.__stdout__ + + # Assert + assert "No active iteration could be determined" in captured.getvalue() + + +def test_current_iteration_exists(): + # Arrange + mock_iteration = Mock() + mock_iteration.iteration_number = 7 + + result = Mock() + result.campaign_config = Mock() + + result.campaign_config.iterations = [mock_iteration] + + type(result.campaign_config).current_iteration = PropertyMock(return_value=mock_iteration) + + captured = StringIO() + sys.stdout = captured + + display_current_iteration(result) + + sys.stdout = sys.__stdout__ + + assert "Current Iteration Number:" in captured.getvalue() + assert "7" in captured.getvalue()