Skip to content

Commit 549dbb9

Browse files
author
Matthew Jadud
authored
Merge pull request #4367 from GSA-TTS/main
2 parents 68087f1 + 9a8317c commit 549dbb9

File tree

6 files changed

+114
-30
lines changed

6 files changed

+114
-30
lines changed

backend/audit/intakelib/transforms/runners.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
22
from copy import deepcopy
33

4+
from .xform_resize_award_references import resize_award_reference
5+
46
from .xform_all_amount_expended_need_to_be_integers import (
57
convert_amount_expended_to_integers,
68
)
@@ -112,9 +114,11 @@ def run_all_secondary_auditors_transforms(ir):
112114
regenerate_uniform_cluster_names,
113115
reformat_federal_agency_prefix,
114116
generate_cfda_keys,
117+
resize_award_reference,
115118
]
116119

117120
audit_findings_transforms = general_transforms + [
118121
reformat_award_reference,
119122
reformat_prior_references,
123+
resize_award_reference,
120124
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import logging
2+
from audit.intakelib.intermediate_representation import (
3+
get_range_by_name,
4+
replace_range_by_name,
5+
)
6+
from audit.intakelib.checks.check_finding_award_references_pattern import (
7+
AWARD_LEN_5_DIGITS,
8+
)
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
def resize_award_reference(ir):
14+
references = get_range_by_name(ir, "award_reference")
15+
new_values = list(map(_format_reference, references["values"]))
16+
new_ir = replace_range_by_name(ir, "award_reference", new_values)
17+
18+
return new_ir
19+
20+
21+
def _format_reference(v):
22+
23+
if v and len(v) < AWARD_LEN_5_DIGITS:
24+
parts = v.split("-")
25+
padding = "0" * (AWARD_LEN_5_DIGITS - len(v))
26+
return f"{parts[0]}-{padding}{parts[1]}"
27+
return v
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from unittest.mock import patch
2+
3+
from django.test import SimpleTestCase
4+
5+
from audit.intakelib.transforms.xform_resize_award_references import (
6+
_format_reference,
7+
resize_award_reference,
8+
)
9+
10+
11+
class TestResizeAwardReference(SimpleTestCase):
12+
13+
@patch("audit.intakelib.transforms.xform_resize_award_references.get_range_by_name")
14+
@patch(
15+
"audit.intakelib.transforms.xform_resize_award_references.replace_range_by_name"
16+
)
17+
def test_resize_award_reference(
18+
self, mock_replace_range_by_name, mock_get_range_by_name
19+
):
20+
"""Test the resize_award_reference function"""
21+
ir = []
22+
references = {
23+
"values": [
24+
"AWARD-123", # Will need padding
25+
"AWARD-4567", # Will need padding
26+
"AWARD-12345", # Correct length, no padding
27+
None, # No change for None
28+
]
29+
}
30+
expected_new_values = [
31+
"AWARD-00123",
32+
"AWARD-04567",
33+
"AWARD-12345",
34+
None,
35+
]
36+
37+
mock_get_range_by_name.return_value = references
38+
new_ir = resize_award_reference(ir)
39+
40+
mock_get_range_by_name.assert_called_once_with(ir, "award_reference")
41+
mock_replace_range_by_name.assert_called_once_with(
42+
ir, "award_reference", expected_new_values
43+
)
44+
45+
self.assertEqual(new_ir, mock_replace_range_by_name.return_value)
46+
47+
def test_format_reference(self):
48+
"""Test the _format_reference function"""
49+
self.assertEqual(_format_reference("AWARD-123"), "AWARD-00123")
50+
self.assertEqual(_format_reference("AWARD-4567"), "AWARD-04567")
51+
self.assertEqual(_format_reference("AWARD-12345"), "AWARD-12345")
52+
self.assertEqual(_format_reference(None), None)
53+
self.assertEqual(_format_reference(""), "")
Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
[
2-
{
3-
"award_reference": "AWARD-0001",
4-
"compliance_requirement": "AB",
5-
"reference_number": "2023-001",
6-
"repeat_prior_reference": "Y",
7-
"prior_references": "2020-001",
8-
"is_valid": "Y",
9-
"questioned_costs": "N",
10-
"significant_deficiency": "N",
11-
"other_matters": "N",
12-
"other_findings": "N",
13-
"modified_opinion": "Y",
14-
"material_weakness": "N"
15-
},
16-
{
17-
"award_reference": "AWARD-0002",
18-
"compliance_requirement": "E",
19-
"reference_number": "2023-001",
20-
"repeat_prior_reference": "N",
21-
"prior_references": "N/A",
22-
"is_valid": "Y",
23-
"questioned_costs": "N",
24-
"significant_deficiency": "N",
25-
"other_matters": "Y",
26-
"other_findings": "N",
27-
"modified_opinion": "N",
28-
"material_weakness": "Y"
29-
}
30-
]
1+
[
2+
{
3+
"award_reference": "AWARD-00001",
4+
"compliance_requirement": "AB",
5+
"reference_number": "2023-001",
6+
"repeat_prior_reference": "Y",
7+
"prior_references": "2020-001",
8+
"is_valid": "Y",
9+
"questioned_costs": "N",
10+
"significant_deficiency": "N",
11+
"other_matters": "N",
12+
"other_findings": "N",
13+
"modified_opinion": "Y",
14+
"material_weakness": "N"
15+
},
16+
{
17+
"award_reference": "AWARD-00002",
18+
"compliance_requirement": "E",
19+
"reference_number": "2023-001",
20+
"repeat_prior_reference": "N",
21+
"prior_references": "N/A",
22+
"is_valid": "Y",
23+
"questioned_costs": "N",
24+
"significant_deficiency": "N",
25+
"other_matters": "Y",
26+
"other_findings": "N",
27+
"modified_opinion": "N",
28+
"material_weakness": "Y"
29+
}
30+
]

0 commit comments

Comments
 (0)