Skip to content

Commit 43c116a

Browse files
committed
test: Add tests for specific cases
1 parent 8010612 commit 43c116a

File tree

2 files changed

+288
-0
lines changed

2 files changed

+288
-0
lines changed

tests/fixtures/parameter_labels_fixtures.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class MockFilingStatus(Enum):
1111
SINGLE = "Single"
1212
JOINT = "Joint"
1313
HEAD_OF_HOUSEHOLD = "Head of household"
14+
MARRIED_FILING_JOINTLY = "Married filing jointly"
1415

1516

1617
class MockStateCode(Enum):

tests/test_parameter_labels.py

Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,148 @@ def test__given_complex_bracket_path__then_extracts_correct_scale_name(
410410
assert result == "Puerto Rico tax rate (bracket 1 rate)"
411411

412412

413+
class TestSingleLevelBreakdownParam:
414+
"""Tests for single-level breakdown parameters (direct children of breakdown parent)."""
415+
416+
def test__given_single_level_breakdown_with_enum__then_generates_label_with_enum_value(
417+
self,
418+
):
419+
# Given: A parameter that is a direct child of a breakdown parent
420+
parent = create_mock_parent_node(
421+
name="gov.tax.exemptions.by_status",
422+
label="Tax exemption by filing status",
423+
breakdown=["filing_status"],
424+
)
425+
param = create_mock_parameter(
426+
name="gov.tax.exemptions.by_status.MARRIED_FILING_JOINTLY",
427+
parent=parent,
428+
)
429+
system = create_mock_system(
430+
variables={"filing_status": VARIABLE_WITH_FILING_STATUS_ENUM}
431+
)
432+
scale_lookup = {}
433+
434+
# When
435+
result = generate_label_for_parameter(param, system, scale_lookup)
436+
437+
# Then: Label uses enum display value
438+
assert result == "Tax exemption by filing status (Married filing jointly)"
439+
440+
def test__given_single_level_breakdown_without_enum__then_generates_label_with_raw_key(
441+
self,
442+
):
443+
# Given: A parameter whose breakdown variable has no enum
444+
parent = create_mock_parent_node(
445+
name="gov.benefits.by_category",
446+
label="Benefit by category",
447+
breakdown=["benefit_category"],
448+
)
449+
param = create_mock_parameter(
450+
name="gov.benefits.by_category.FOOD_ASSISTANCE",
451+
parent=parent,
452+
)
453+
system = create_mock_system(variables={})
454+
scale_lookup = {}
455+
456+
# When
457+
result = generate_label_for_parameter(param, system, scale_lookup)
458+
459+
# Then: Falls back to raw key
460+
assert result == "Benefit by category (FOOD_ASSISTANCE)"
461+
462+
def test__given_single_level_range_breakdown__then_uses_raw_number(self):
463+
# Given: A single-level breakdown with range (no breakdown_labels)
464+
parent = create_mock_parent_node(
465+
name="gov.benefits.by_size",
466+
label="Benefit by household size",
467+
breakdown=["range(1, 8)"],
468+
)
469+
param = create_mock_parameter(
470+
name="gov.benefits.by_size.4",
471+
parent=parent,
472+
)
473+
system = create_mock_system()
474+
scale_lookup = {}
475+
476+
# When
477+
result = generate_label_for_parameter(param, system, scale_lookup)
478+
479+
# Then: Uses raw number without semantic label
480+
assert result == "Benefit by household size (4)"
481+
482+
def test__given_single_level_range_with_breakdown_label__then_includes_semantic_label(
483+
self,
484+
):
485+
# Given: A single-level breakdown with range and breakdown_labels
486+
parent = create_mock_parent_node(
487+
name="gov.benefits.by_size",
488+
label="Benefit by household size",
489+
breakdown=["range(1, 8)"],
490+
breakdown_labels=["Household size"],
491+
)
492+
param = create_mock_parameter(
493+
name="gov.benefits.by_size.4",
494+
parent=parent,
495+
)
496+
system = create_mock_system()
497+
scale_lookup = {}
498+
499+
# When
500+
result = generate_label_for_parameter(param, system, scale_lookup)
501+
502+
# Then: Includes semantic label
503+
assert result == "Benefit by household size (Household size 4)"
504+
505+
506+
class TestSingleLevelScaleParam:
507+
"""Tests confirming scale/bracket params are unaffected by breakdown changes."""
508+
509+
def test__given_single_bracket_param__then_generates_bracket_label(self):
510+
# Given: A bracket parameter (not a breakdown)
511+
param = create_mock_parameter(name="gov.tax.income.rates[0].rate")
512+
scale = create_mock_scale(
513+
name="gov.tax.income.rates",
514+
label="Income tax rates",
515+
scale_type="marginal_rate",
516+
)
517+
system = create_mock_system()
518+
scale_lookup = {"gov.tax.income.rates": scale}
519+
520+
# When
521+
result = generate_label_for_parameter(param, system, scale_lookup)
522+
523+
# Then: Generates bracket label, not breakdown label
524+
assert result == "Income tax rates (bracket 1 rate)"
525+
526+
def test__given_bracket_param_with_breakdown_parent__then_bracket_takes_precedence(
527+
self,
528+
):
529+
# Given: A bracket parameter even if it has a parent with breakdown
530+
# (This shouldn't happen in practice, but tests the precedence)
531+
parent = create_mock_parent_node(
532+
name="gov.tax.rates",
533+
label="Tax rates",
534+
breakdown=["filing_status"],
535+
)
536+
param = create_mock_parameter(
537+
name="gov.tax.rates[0].rate",
538+
parent=parent,
539+
)
540+
scale = create_mock_scale(
541+
name="gov.tax.rates",
542+
label="Tax rates",
543+
scale_type="marginal_rate",
544+
)
545+
system = create_mock_system()
546+
scale_lookup = {"gov.tax.rates": scale}
547+
548+
# When
549+
result = generate_label_for_parameter(param, system, scale_lookup)
550+
551+
# Then: Bracket notation takes precedence
552+
assert result == "Tax rates (bracket 1 rate)"
553+
554+
413555
class TestFindBreakdownParent:
414556
"""Tests for the _find_breakdown_parent function."""
415557

@@ -605,3 +747,148 @@ def test__given_missing_breakdown_labels__then_uses_raw_values(self):
605747
# Then
606748
# Falls back to raw values when no breakdown_labels
607749
assert result == "SNAP max allotment (CONTIGUOUS_US, 1)"
750+
751+
752+
class TestMixedNestedBreakdowns:
753+
"""Tests for complex mixed breakdowns with enums, ranges, and labels."""
754+
755+
def test__given_enum_range_enum_nesting__then_formats_each_correctly(self):
756+
# Given: A complex 3-level breakdown: enum -> range -> enum
757+
# Example: state -> household_size -> filing_status
758+
breakdown_parent = create_mock_parent_node(
759+
name="gov.tax.credits.earned_income",
760+
label="Earned income credit",
761+
breakdown=["state_code", "range(1, 6)", "filing_status"],
762+
breakdown_labels=["State", "Number of children", "Filing status"],
763+
)
764+
level1 = create_mock_parent_node(
765+
name="gov.tax.credits.earned_income.CA",
766+
parent=breakdown_parent,
767+
)
768+
level2 = create_mock_parent_node(
769+
name="gov.tax.credits.earned_income.CA.2",
770+
parent=level1,
771+
)
772+
param = create_mock_parameter(
773+
name="gov.tax.credits.earned_income.CA.2.SINGLE",
774+
parent=level2,
775+
)
776+
system = create_mock_system(
777+
variables={
778+
"state_code": VARIABLE_WITH_STATE_CODE_ENUM,
779+
"filing_status": VARIABLE_WITH_FILING_STATUS_ENUM,
780+
}
781+
)
782+
scale_lookup = {}
783+
784+
# When
785+
result = generate_label_for_parameter(param, system, scale_lookup)
786+
787+
# Then: Enum values use display names, range uses breakdown_label
788+
assert result == "Earned income credit (CA, Number of children 2, Single)"
789+
790+
def test__given_range_enum_range_nesting__then_formats_each_correctly(self):
791+
# Given: range -> enum -> range nesting
792+
breakdown_parent = create_mock_parent_node(
793+
name="gov.childcare.subsidy",
794+
label="Childcare subsidy",
795+
breakdown=["range(1, 4)", "filing_status", "range(1, 10)"],
796+
breakdown_labels=["Age group", "Filing status", "Household size"],
797+
)
798+
level1 = create_mock_parent_node(
799+
name="gov.childcare.subsidy.2",
800+
parent=breakdown_parent,
801+
)
802+
level2 = create_mock_parent_node(
803+
name="gov.childcare.subsidy.2.HEAD_OF_HOUSEHOLD",
804+
parent=level1,
805+
)
806+
param = create_mock_parameter(
807+
name="gov.childcare.subsidy.2.HEAD_OF_HOUSEHOLD.5",
808+
parent=level2,
809+
)
810+
system = create_mock_system(
811+
variables={"filing_status": VARIABLE_WITH_FILING_STATUS_ENUM}
812+
)
813+
scale_lookup = {}
814+
815+
# When
816+
result = generate_label_for_parameter(param, system, scale_lookup)
817+
818+
# Then: Both ranges use breakdown_labels, enum uses display value
819+
assert (
820+
result
821+
== "Childcare subsidy (Age group 2, Head of household, Household size 5)"
822+
)
823+
824+
def test__given_partial_breakdown_labels__then_uses_labels_where_available(self):
825+
# Given: breakdown_labels list shorter than breakdown list
826+
breakdown_parent = create_mock_parent_node(
827+
name="gov.benefits.utility",
828+
label="Utility allowance",
829+
breakdown=["area_code", "range(1, 20)", "housing_type"],
830+
breakdown_labels=["Area", "Household size"], # Missing label for housing_type
831+
)
832+
level1 = create_mock_parent_node(
833+
name="gov.benefits.utility.AREA_1",
834+
parent=breakdown_parent,
835+
)
836+
level2 = create_mock_parent_node(
837+
name="gov.benefits.utility.AREA_1.3",
838+
parent=level1,
839+
)
840+
param = create_mock_parameter(
841+
name="gov.benefits.utility.AREA_1.3.RENTER",
842+
parent=level2,
843+
)
844+
system = create_mock_system(variables={})
845+
scale_lookup = {}
846+
847+
# When
848+
result = generate_label_for_parameter(param, system, scale_lookup)
849+
850+
# Then: Uses breakdown_labels where available, raw value for missing label
851+
assert result == "Utility allowance (Area AREA_1, Household size 3, RENTER)"
852+
853+
def test__given_four_level_nesting_with_mixed_types__then_generates_all_dimensions(
854+
self,
855+
):
856+
# Given: A deeply nested 4-level breakdown
857+
breakdown_parent = create_mock_parent_node(
858+
name="gov.irs.deductions.sales_tax",
859+
label="State sales tax deduction",
860+
breakdown=["state_code", "filing_status", "range(1, 7)", "range(1, 20)"],
861+
breakdown_labels=["State", "Filing status", "Exemption count", "Income bracket"],
862+
)
863+
level1 = create_mock_parent_node(
864+
name="gov.irs.deductions.sales_tax.NY",
865+
parent=breakdown_parent,
866+
)
867+
level2 = create_mock_parent_node(
868+
name="gov.irs.deductions.sales_tax.NY.JOINT",
869+
parent=level1,
870+
)
871+
level3 = create_mock_parent_node(
872+
name="gov.irs.deductions.sales_tax.NY.JOINT.4",
873+
parent=level2,
874+
)
875+
param = create_mock_parameter(
876+
name="gov.irs.deductions.sales_tax.NY.JOINT.4.12",
877+
parent=level3,
878+
)
879+
system = create_mock_system(
880+
variables={
881+
"state_code": VARIABLE_WITH_STATE_CODE_ENUM,
882+
"filing_status": VARIABLE_WITH_FILING_STATUS_ENUM,
883+
}
884+
)
885+
scale_lookup = {}
886+
887+
# When
888+
result = generate_label_for_parameter(param, system, scale_lookup)
889+
890+
# Then: All 4 dimensions are formatted correctly
891+
assert (
892+
result
893+
== "State sales tax deduction (NY, Joint, Exemption count 4, Income bracket 12)"
894+
)

0 commit comments

Comments
 (0)