Skip to content

Commit 46aaf3b

Browse files
Split discount and PISU credit processor tests
- Moved test_one_eligible_project_only and test_all_eligible_projects into new test_pi_su_credit_processor.py - Kept test_preexisting_credit in test_discount_processor.py, using DiscountProcessor directly - Added new_pi_su_credit_processor() factory to tests/util.py
1 parent 72b6e76 commit 46aaf3b

4 files changed

Lines changed: 135 additions & 68 deletions

File tree

.vscode/settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"python-envs.defaultEnvManager": "ms-python.python:system",
3+
"python-envs.pythonProjects": []
4+
}

process_report/tests/unit/processors/test_discount_processor.py

Lines changed: 12 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import pandas
44

55
from process_report.invoices import invoice
6-
from process_report.processors.pi_su_credit_processor import PISUCreditProcessor
6+
from process_report.processors.discount_processor import DiscountProcessor
77

88

99
class TestDiscountProcessor(TestCase):
@@ -52,13 +52,21 @@ def test_preexisting_credit(
5252
balance=[90],
5353
)
5454

55-
processor = PISUCreditProcessor(
55+
processor = DiscountProcessor(
5656
invoice_month="2024-06",
5757
data=invoice_data,
5858
name="test",
59-
pi_su_mapping={"PI": ["Openstack Storage"]},
6059
)
61-
processor.process()
60+
processor.apply_flat_discount(
61+
invoice=invoice_data,
62+
pi_projects=invoice_data,
63+
pi_balance_field=invoice.PI_BALANCE_FIELD,
64+
discount_amount=invoice_data[invoice.COST_FIELD].sum(),
65+
discount_field=invoice.CREDIT_FIELD,
66+
balance_field=invoice.BALANCE_FIELD,
67+
code_field=invoice.CREDIT_CODE_FIELD,
68+
discount_code="0005",
69+
)
6270
output_invoice = processor.data
6371

6472
expected_invoice = self._get_test_invoice(
@@ -72,67 +80,3 @@ def test_preexisting_credit(
7280
)
7381

7482
assert expected_invoice.equals(output_invoice)
75-
76-
def test_one_eligible_project_only(self):
77-
"""If PI has multiple projects but only one is eligible, only that project should get the credit"""
78-
invoice_data = self._get_test_invoice(
79-
pi=["PI", "PI"],
80-
costs=[50, 75],
81-
su_type=["Openstack Storage", "HPC"],
82-
)
83-
84-
processor = PISUCreditProcessor(
85-
invoice_month="2024-06",
86-
data=invoice_data,
87-
name="test",
88-
pi_su_mapping={
89-
"PI": ["Openstack Storage"]
90-
}, # Only Openstack Storage SU type is eligible for credit, not HPC
91-
)
92-
processor.process()
93-
output_invoice = processor.data
94-
95-
expected_invoice = self._get_test_invoice(
96-
pi=["PI", "PI"],
97-
costs=[50, 75],
98-
su_type=["Openstack Storage", "HPC"],
99-
credit=[50, None],
100-
credit_code=["0005", None],
101-
pi_balance=[0, 75],
102-
balance=[0, 75],
103-
)
104-
105-
expected_invoice = expected_invoice.astype(output_invoice.dtypes)
106-
assert expected_invoice.equals(output_invoice)
107-
108-
def test_all_eligible_projects(self):
109-
"""PI has multiple projects and all are eligible, so all should get the credit"""
110-
invoice_data = self._get_test_invoice(
111-
pi=["PI", "PI"],
112-
costs=[40, 60],
113-
su_type=["Openstack Storage", "Openstack Compute"],
114-
)
115-
116-
processor = PISUCreditProcessor(
117-
invoice_month="2024-06",
118-
data=invoice_data,
119-
name="test",
120-
pi_su_mapping={
121-
"PI": ["Openstack Storage", "Openstack Compute"]
122-
}, # Both SU types are eligible for credit
123-
)
124-
processor.process()
125-
output_invoice = processor.data
126-
127-
expected_invoice = self._get_test_invoice(
128-
pi=["PI", "PI"],
129-
costs=[40, 60],
130-
su_type=["Openstack Storage", "Openstack Compute"],
131-
credit=[40, 60],
132-
credit_code=["0005", "0005"],
133-
pi_balance=[0, 0],
134-
balance=[0, 0],
135-
)
136-
137-
expected_invoice = expected_invoice.astype(output_invoice.dtypes)
138-
assert expected_invoice.equals(output_invoice)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
from unittest import TestCase
2+
3+
import pandas
4+
5+
from process_report.invoices import invoice
6+
from process_report.tests import util as test_utils
7+
8+
9+
class TestPISUCreditProcessor(TestCase):
10+
def _get_test_invoice(
11+
self,
12+
pi,
13+
costs,
14+
su_type,
15+
credit=None,
16+
credit_code=None,
17+
pi_balance=None,
18+
balance=None,
19+
):
20+
if credit is None:
21+
credit = [None for _ in range(len(pi))]
22+
if credit_code is None:
23+
credit_code = [None for _ in range(len(pi))]
24+
if pi_balance is None:
25+
pi_balance = costs
26+
if balance is None:
27+
balance = costs
28+
29+
return pandas.DataFrame(
30+
{
31+
invoice.PI_FIELD: pi,
32+
invoice.SU_TYPE_FIELD: su_type,
33+
invoice.COST_FIELD: costs,
34+
invoice.CREDIT_FIELD: credit,
35+
invoice.CREDIT_CODE_FIELD: credit_code,
36+
invoice.PI_BALANCE_FIELD: pi_balance,
37+
invoice.BALANCE_FIELD: balance,
38+
}
39+
)
40+
41+
def test_one_eligible_project_only(self):
42+
"""If PI has multiple projects but only one is eligible, only that project should get the credit"""
43+
44+
invoice_data = self._get_test_invoice(
45+
pi=["PI", "PI"],
46+
costs=[50, 75],
47+
su_type=["Openstack Storage", "HPC"],
48+
)
49+
50+
processor = test_utils.new_pi_su_credit_processor(
51+
invoice_month="2024-06",
52+
data=invoice_data,
53+
pi_su_mapping={
54+
"PI": ["Openstack Storage"]
55+
}, # Only Openstack Storage SU type is eligible for credit, not HPC
56+
)
57+
processor.process()
58+
output_invoice = processor.data
59+
60+
expected_invoice = self._get_test_invoice(
61+
pi=["PI", "PI"],
62+
costs=[50, 75],
63+
su_type=["Openstack Storage", "HPC"],
64+
credit=[50, None],
65+
credit_code=["0005", None],
66+
pi_balance=[0, 75],
67+
balance=[0, 75],
68+
)
69+
70+
expected_invoice = expected_invoice.astype(output_invoice.dtypes)
71+
assert expected_invoice.equals(output_invoice)
72+
73+
def test_all_eligible_projects(self):
74+
"""PI has multiple projects and all are eligible, so all should get the credit"""
75+
invoice_data = self._get_test_invoice(
76+
pi=["PI", "PI"],
77+
costs=[40, 60],
78+
su_type=["Openstack Storage", "Openstack Compute"],
79+
)
80+
81+
processor = test_utils.new_pi_su_credit_processor(
82+
invoice_month="2024-06",
83+
data=invoice_data,
84+
name="test",
85+
pi_su_mapping={
86+
"PI": ["Openstack Storage", "Openstack Compute"]
87+
}, # Both SU types are eligible for credit
88+
)
89+
processor.process()
90+
output_invoice = processor.data
91+
92+
expected_invoice = self._get_test_invoice(
93+
pi=["PI", "PI"],
94+
costs=[40, 60],
95+
su_type=["Openstack Storage", "Openstack Compute"],
96+
credit=[40, 60],
97+
credit_code=["0005", "0005"],
98+
pi_balance=[0, 0],
99+
balance=[0, 0],
100+
)
101+
102+
expected_invoice = expected_invoice.astype(output_invoice.dtypes)
103+
assert expected_invoice.equals(output_invoice)

process_report/tests/util.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
bu_subsidy_processor,
1717
prepayment_processor,
1818
validate_cluster_name_processor,
19+
pi_su_credit_processor,
1920
)
2021

2122

@@ -205,3 +206,18 @@ def new_validate_cluster_name_processor(
205206
return validate_cluster_name_processor.ValidateClusterNameProcessor(
206207
invoice_month, data, name
207208
)
209+
210+
211+
def new_pi_su_credit_processor(
212+
name="",
213+
invoice_month="0000-00",
214+
data=None,
215+
pi_su_mapping=None,
216+
):
217+
if data is None:
218+
data = pandas.DataFrame()
219+
if pi_su_mapping is None:
220+
pi_su_mapping = {}
221+
return pi_su_credit_processor.PISUCreditProcessor(
222+
invoice_month, data, name, pi_su_mapping
223+
)

0 commit comments

Comments
 (0)