Skip to content

Commit a412906

Browse files
committed
eli-579 upping test coverage
1 parent 2591a12 commit a412906

2 files changed

Lines changed: 91 additions & 0 deletions

File tree

tests/unit/services/processors/test_derived_values.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,38 @@ def test_function_args_priority_over_vaccine_config(self):
260260
# 2025-01-01 + 30 days = 2025-01-31
261261
assert_that(result, is_(equal_to("20250131")))
262262

263+
def test_calculate_returns_empty_when_source_attribute_is_none(self):
264+
"""Test that empty string is returned when source_attribute is None."""
265+
handler = AddDaysHandler(default_days=91)
266+
context = DerivedValueContext(
267+
person_data=[{"ATTRIBUTE_TYPE": "COVID", "LAST_SUCCESSFUL_DATE": "20250101"}],
268+
attribute_name="COVID",
269+
source_attribute=None, # This should cause early return None in _find_source_date
270+
function_args=None,
271+
date_format=None,
272+
attribute_level="TARGET",
273+
)
274+
275+
result = handler.calculate(context)
276+
277+
assert_that(result, is_(equal_to("")))
278+
279+
def test_calculate_returns_empty_when_source_attribute_is_empty(self):
280+
"""Test that empty string is returned when source_attribute is empty string."""
281+
handler = AddDaysHandler(default_days=91)
282+
context = DerivedValueContext(
283+
person_data=[{"ATTRIBUTE_TYPE": "COVID", "LAST_SUCCESSFUL_DATE": "20250101"}],
284+
attribute_name="COVID",
285+
source_attribute="", # This should cause early return None in _find_source_date
286+
function_args=None,
287+
date_format=None,
288+
attribute_level="TARGET",
289+
)
290+
291+
result = handler.calculate(context)
292+
293+
assert_that(result, is_(equal_to("")))
294+
263295

264296
class TestDerivedValueRegistry:
265297
"""Tests for the DerivedValueRegistry class."""

tests/unit/services/processors/test_token_processor.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
StatusText,
1616
)
1717
from eligibility_signposting_api.model.person import Person
18+
from eligibility_signposting_api.services.processors.token_parser import ParsedToken
1819
from eligibility_signposting_api.services.processors.token_processor import TokenProcessor
1920

2021

@@ -652,3 +653,61 @@ def test_person_level_attribute_with_add_days_explicit_source(self):
652653

653654
# 1990-03-27 + 91 days = 1990-06-26
654655
assert result.status_text == "Future date: 19900626"
656+
657+
def test_derived_value_with_no_function_name_raises_error(self):
658+
"""Test that derived tokens without function name raise ValueError."""
659+
# This would happen if token parsing goes wrong somehow
660+
parsed_token = ParsedToken(
661+
attribute_level="TARGET",
662+
attribute_name="COVID",
663+
attribute_value="NEXT_DOSE_DUE",
664+
function_name=None, # This should cause the error
665+
function_args=None,
666+
format=None,
667+
)
668+
669+
with pytest.raises(ValueError, match="No function specified in token"):
670+
TokenProcessor.get_derived_value(
671+
parsed_token=parsed_token,
672+
person_data=[{"ATTRIBUTE_TYPE": "COVID", "LAST_SUCCESSFUL_DATE": "20250101"}],
673+
present_attributes={"COVID"},
674+
token="[[TARGET.COVID.NEXT_DOSE_DUE:]]", # Malformed token
675+
)
676+
677+
def test_derived_value_with_unknown_function_raises_error(self):
678+
"""Test that derived tokens with unknown function raise ValueError."""
679+
parsed_token = ParsedToken(
680+
attribute_level="TARGET",
681+
attribute_name="COVID",
682+
attribute_value="NEXT_DOSE_DUE",
683+
function_name="UNKNOWN_FUNCTION", # This function doesn't exist
684+
function_args="30",
685+
format=None,
686+
)
687+
688+
with pytest.raises(ValueError, match="Unknown function 'UNKNOWN_FUNCTION' in token"):
689+
TokenProcessor.get_derived_value(
690+
parsed_token=parsed_token,
691+
person_data=[{"ATTRIBUTE_TYPE": "COVID", "LAST_SUCCESSFUL_DATE": "20250101"}],
692+
present_attributes={"COVID"},
693+
token="[[TARGET.COVID.NEXT_DOSE_DUE:UNKNOWN_FUNCTION(30)]]",
694+
)
695+
696+
def test_derived_value_handler_exception_gets_wrapped(self):
697+
"""Test that exceptions from derived value handlers are wrapped with context."""
698+
parsed_token = ParsedToken(
699+
attribute_level="TARGET",
700+
attribute_name="COVID",
701+
attribute_value="NEXT_DOSE_DUE",
702+
function_name="ADD_DAYS",
703+
function_args="invalid_arg", # This will cause the handler to raise ValueError
704+
format=None,
705+
)
706+
707+
with pytest.raises(ValueError, match=r"Error calculating derived value for token.*Invalid days argument"):
708+
TokenProcessor.get_derived_value(
709+
parsed_token=parsed_token,
710+
person_data=[{"ATTRIBUTE_TYPE": "COVID", "LAST_SUCCESSFUL_DATE": "20250101"}],
711+
present_attributes={"COVID"},
712+
token="[[TARGET.COVID.NEXT_DOSE_DUE:ADD_DAYS(invalid_arg)]]",
713+
)

0 commit comments

Comments
 (0)