Skip to content

Commit 107f3fe

Browse files
Address PR review: use fixtures in tests and simplify _load_pi_config
1 parent 495c95f commit 107f3fe

2 files changed

Lines changed: 40 additions & 68 deletions

File tree

process_report/loader.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,18 @@ def load_dataframe(self, filepath: str) -> pandas.DataFrame:
114114
return pandas.read_csv(filepath)
115115

116116
@functools.lru_cache
117-
def _load_pi_config(self, filepath: str) -> PIList:
118-
with open(filepath) as file:
117+
def _load_pi_config(self) -> PIList:
118+
with open(invoice_settings.nonbillable_pis_filepath) as file:
119119
pi_list = yaml.safe_load(file)
120120

121121
return PIList.model_validate(pi_list)
122122

123123
def get_nonbillable_pis(self) -> list[str]:
124-
pi_list = self._load_pi_config(invoice_settings.nonbillable_pis_filepath)
125-
return pi_list.get_nonbillable_pis()
124+
return self._load_pi_config().get_nonbillable_pis()
126125

127126
def get_pi_non_billed_su_types(self) -> dict[str, list[str]]:
128127
"""PI usernames -> list of SU types that receive credit (zeroed out)."""
129-
pi_list = self._load_pi_config(invoice_settings.nonbillable_pis_filepath)
130-
return pi_list.get_pi_non_billed_su_types()
128+
return self._load_pi_config().get_pi_non_billed_su_types()
131129

132130
@functools.lru_cache
133131
def get_nonbillable_projects(self) -> pandas.DataFrame:

process_report/tests/unit/test_nonbillable_models.py

Lines changed: 36 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,42 @@
33
from process_report.models import nonbillable_models
44

55

6-
@pytest.mark.parametrize(
7-
"projects_data",
8-
[
9-
[
10-
{
11-
"name": "ProjectA",
12-
"clusters": [{"name": "Cluster1"}, {"name": "Cluster2"}],
13-
},
14-
{
15-
"name": "ProjectB",
16-
"clusters": [
17-
{"name": "Cluster1", "start": "2023-01", "end": "2023-12"}
18-
],
19-
},
20-
{"name": "ProjectC", "start": "2023-06", "end": "2023-07"},
21-
{
22-
"name": "ProjectD",
23-
"is_billable": True,
24-
"clusters": [
25-
{"name": "Cluster1", "start": "2023-05", "end": "2023-09"},
26-
{"name": "Cluster2", "start": "2023-05", "end": "2023-11"},
27-
],
28-
},
29-
{"name": "ProjectE"},
30-
],
31-
],
32-
)
33-
def test_timed_projects(mocker, projects_data):
34-
mocker.patch(
6+
@pytest.fixture
7+
def sample_project_list():
8+
return [
9+
{
10+
"name": "ProjectA",
11+
"clusters": [{"name": "Cluster1"}, {"name": "Cluster2"}],
12+
},
13+
{
14+
"name": "ProjectB",
15+
"clusters": [{"name": "Cluster1", "start": "2023-01", "end": "2023-12"}],
16+
},
17+
{"name": "ProjectC", "start": "2023-06", "end": "2023-07"},
18+
{
19+
"name": "ProjectD",
20+
"is_billable": True,
21+
"clusters": [
22+
{"name": "Cluster1", "start": "2023-05", "end": "2023-09"},
23+
{"name": "Cluster2", "start": "2023-05", "end": "2023-11"},
24+
],
25+
},
26+
{"name": "ProjectE"},
27+
]
28+
29+
30+
@pytest.fixture
31+
def mock_allowed_clusters(mocker):
32+
return mocker.patch(
3533
"process_report.models.nonbillable_models.get_allowed_clusters",
3634
return_value={"Cluster1", "Cluster2"},
3735
)
38-
projects = nonbillable_models.ExcludedProjectList.model_validate(projects_data)
36+
37+
38+
def test_timed_projects(mock_allowed_clusters, sample_project_list):
39+
projects = nonbillable_models.ExcludedProjectList.model_validate(
40+
sample_project_list
41+
)
3942
result = projects.get_nonbillable_projects("2023-09")
4043
timed = [(name, cluster) for name, cluster, is_timed, _ in result if is_timed]
4144
expected = [
@@ -46,39 +49,10 @@ def test_timed_projects(mocker, projects_data):
4649
assert timed == expected
4750

4851

49-
@pytest.mark.parametrize(
50-
"projects_data",
51-
[
52-
[
53-
{
54-
"name": "ProjectA",
55-
"clusters": [{"name": "Cluster1"}, {"name": "Cluster2"}],
56-
},
57-
{
58-
"name": "ProjectB",
59-
"clusters": [
60-
{"name": "Cluster1", "start": "2023-01", "end": "2023-12"}
61-
],
62-
},
63-
{"name": "ProjectC", "start": "2023-06", "end": "2023-07"},
64-
{
65-
"name": "ProjectD",
66-
"is_billable": True,
67-
"clusters": [
68-
{"name": "Cluster1", "start": "2023-05", "end": "2023-09"},
69-
{"name": "Cluster2", "start": "2023-05", "end": "2023-11"},
70-
],
71-
},
72-
{"name": "ProjectE"},
73-
],
74-
],
75-
)
76-
def test_nonbillable_projects(mocker, projects_data):
77-
mocker.patch(
78-
"process_report.models.nonbillable_models.get_allowed_clusters",
79-
return_value={"Cluster1", "Cluster2"},
52+
def test_nonbillable_projects(mock_allowed_clusters, sample_project_list):
53+
projects = nonbillable_models.ExcludedProjectList.model_validate(
54+
sample_project_list
8055
)
81-
projects = nonbillable_models.ExcludedProjectList.model_validate(projects_data)
8256
result = projects.get_nonbillable_projects("2023-09")
8357
expected = [
8458
("ProjectA", "Cluster1", False, False),

0 commit comments

Comments
 (0)