|
15 | 15 | StatusText, |
16 | 16 | ) |
17 | 17 | from eligibility_signposting_api.model.person import Person |
| 18 | +from eligibility_signposting_api.services.processors.token_parser import ParsedToken |
18 | 19 | from eligibility_signposting_api.services.processors.token_processor import TokenProcessor |
19 | 20 |
|
20 | 21 |
|
@@ -652,3 +653,61 @@ def test_person_level_attribute_with_add_days_explicit_source(self): |
652 | 653 |
|
653 | 654 | # 1990-03-27 + 91 days = 1990-06-26 |
654 | 655 | 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