Skip to content

Commit 939de77

Browse files
authored
♻️(tooling-tests) refactor patching container creation in presentation tests (#656)
1 parent 471baba commit 939de77

5 files changed

Lines changed: 39 additions & 36 deletions

File tree

src/web/tests/candidate/presentation/views/test_cv_results_view.py

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ def cv_metadata_pending():
2626
)
2727

2828

29+
@pytest.fixture
30+
def mock_execute():
31+
with patch(
32+
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
33+
) as mock:
34+
yield mock
35+
36+
2937
def test_cv_results_invalid_uuid_returns_404(client, db):
3038
response = client.get("/candidate/cv/invalid-uuid/results/")
3139

@@ -46,9 +54,6 @@ def test_cv_results_invalid_uuid_returns_404(client, db):
4654
),
4755
],
4856
)
49-
@patch(
50-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
51-
)
5257
def test_cv_results_selects_response_from_status_and_request_type(
5358
mock_execute,
5459
client,
@@ -88,9 +93,6 @@ def test_cv_results_selects_response_from_status_and_request_type(
8893
mock_execute.assert_not_called()
8994

9095

91-
@patch(
92-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
93-
)
9496
def test_cv_results_htmx_results_zone_target_returns_results_list_template(
9597
mock_execute, client, db, cv_metadata_completed
9698
):
@@ -110,9 +112,6 @@ def test_cv_results_htmx_results_zone_target_returns_results_list_template(
110112
assertContains(response, "Poste ciblé")
111113

112114

113-
@patch(
114-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
115-
)
116115
def test_cv_results_htmx_poll_pending_to_completed_transition(
117116
mock_execute, client, db, cv_metadata_pending
118117
):
@@ -165,9 +164,6 @@ def test_cv_results_htmx_request_sets_redirect_header(client, db):
165164
assert response["HX-Redirect"] == reverse("candidate:cv_upload")
166165

167166

168-
@patch(
169-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
170-
)
171167
def test_cv_results_htmx_empty_opportunities_shows_no_results(
172168
mock_execute, client, db, cv_metadata_completed
173169
):
@@ -183,9 +179,6 @@ def test_cv_results_htmx_empty_opportunities_shows_no_results(
183179
assertTemplateUsed(response, "candidate/components/_no_results_content.html")
184180

185181

186-
@patch(
187-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
188-
)
189182
def test_cv_results_no_results_includes_tally_iframe(
190183
mock_execute, client, db, settings, cv_metadata_completed
191184
):
@@ -203,9 +196,6 @@ def test_cv_results_no_results_includes_tally_iframe(
203196
assertContains(response, f"cv_uuid={cv_metadata_completed.id}")
204197

205198

206-
@patch(
207-
"application.candidate.usecases.match_cv_to_opportunities.MatchCVToOpportunitiesUsecase.execute"
208-
)
209199
def test_cv_results_with_results_includes_tally_modal(
210200
mock_execute, client, db, settings, cv_metadata_completed
211201
):

src/web/tests/candidate/presentation/views/test_cv_upload_view.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@
1212
from tests.utils.pdf_test_utils import create_minimal_valid_pdf
1313

1414

15+
@pytest.fixture
16+
def mock_container():
17+
with patch(
18+
"presentation.candidate.views.cv_flow.create_candidate_container"
19+
) as mock:
20+
yield mock
21+
22+
1523
def test_cv_upload_page_loads_correctly(client, db):
1624
response = client.get(reverse("candidate:cv_upload"))
1725

@@ -25,7 +33,6 @@ def test_cv_upload_page_loads_correctly(client, db):
2533

2634

2735
@pytest.mark.parametrize("filename", ["cv.pdf", "CV.PDF"])
28-
@patch("presentation.candidate.views.cv_flow.create_candidate_container")
2936
def test_cv_upload_valid_pdf_redirects_to_results(mock_container, client, db, filename):
3037
# Mock the usecases
3138
mock_uuid = str(uuid4())

src/web/tests/ingestion/presentation/views/test_list_metiers.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
URL = reverse("ingestion:metiers_list")
1414

1515

16+
@pytest.fixture
17+
def mock_container():
18+
with patch("presentation.ingestion.views.create_ingestion_container") as mock:
19+
yield mock
20+
21+
1622
def test_unauthenticated_access(api_client):
1723
response = api_client.get(URL)
1824
assert response.status_code == status.HTTP_401_UNAUTHORIZED
@@ -32,8 +38,9 @@ def _make_paginated_mock(mock_container, num_metiers, metiers_slice):
3238
mock_usecase.execute.return_value = mock_page
3339
mock_container.return_value.list_metiers_usecase.return_value = mock_usecase
3440

41+
return mock_usecase
42+
3543

36-
@patch("presentation.ingestion.views.create_ingestion_container")
3744
def test_empty_result(mock_container, authenticated_client):
3845
_make_paginated_mock(mock_container, num_metiers=0, metiers_slice=[])
3946

@@ -48,7 +55,6 @@ def test_empty_result(mock_container, authenticated_client):
4855
}
4956

5057

51-
@patch("presentation.ingestion.views.create_ingestion_container")
5258
def test_call_without_arg(mock_container, authenticated_client):
5359
metiers = [MetierFactory.create_entity() for _ in range(2)]
5460

@@ -77,7 +83,6 @@ def test_call_without_arg(mock_container, authenticated_client):
7783

7884

7985
@pytest.mark.parametrize("domain", [None, "TRE"])
80-
@patch("presentation.ingestion.views.create_ingestion_container")
8186
def test_call_with_args(mock_container, authenticated_client, domain):
8287
_make_paginated_mock(mock_container, num_metiers=0, metiers_slice=[])
8388

@@ -89,7 +94,6 @@ def test_call_with_args(mock_container, authenticated_client, domain):
8994
)
9095

9196

92-
@patch("presentation.ingestion.views.create_ingestion_container")
9397
def test_returns_error_500(mock_container, authenticated_client):
9498
mock_usecase = MagicMock()
9599
mock_usecase.execute.side_effect = Exception("db error")
@@ -100,7 +104,6 @@ def test_returns_error_500(mock_container, authenticated_client):
100104

101105

102106
@patch("presentation.ingestion.views.IngestionPagination.page_size", new=2)
103-
@patch("presentation.ingestion.views.create_ingestion_container")
104107
def test_pagination_page_arg(mock_container, authenticated_client):
105108
num_metiers = 5
106109
metiers = [MetierFactory.create_entity() for _ in range(num_metiers)]
@@ -135,7 +138,6 @@ def test_pagination_page_arg(mock_container, authenticated_client):
135138

136139

137140
@patch("presentation.ingestion.views.IngestionPagination.page_size", new=2)
138-
@patch("presentation.ingestion.views.create_ingestion_container")
139141
def test_pagination_out_of_bond(mock_container, authenticated_client):
140142
num_metiers = 3
141143
metiers = [MetierFactory.create_entity() for _ in range(num_metiers)]
@@ -159,7 +161,6 @@ def test_pagination_out_of_bond(mock_container, authenticated_client):
159161
assert data["next"] is None
160162

161163

162-
@patch("presentation.ingestion.views.create_ingestion_container")
163164
def test_invalid_payload(mock_container, authenticated_client):
164165
_make_paginated_mock(mock_container, num_metiers=0, metiers_slice=[])
165166

src/web/tests/ingestion/presentation/views/test_list_offers.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
URL = reverse("ingestion:offers_list")
1616

1717

18+
@pytest.fixture
19+
def mock_container():
20+
with patch("presentation.ingestion.views.create_ingestion_container") as mock:
21+
yield mock
22+
23+
1824
def test_unauthenticated_access(api_client):
1925
response = api_client.get(URL)
2026
assert response.status_code == status.HTTP_401_UNAUTHORIZED
@@ -34,8 +40,9 @@ def _make_paginated_mock(mock_container, num_offers, offers_slice):
3440
mock_usecase.execute.return_value = mock_page
3541
mock_container.return_value.list_offers_usecase.return_value = mock_usecase
3642

43+
return mock_usecase
44+
3745

38-
@patch("presentation.ingestion.views.create_ingestion_container")
3946
def test_empty_result(mock_container, authenticated_client, list_offers_usecase):
4047
_make_paginated_mock(mock_container, num_offers=0, offers_slice=[])
4148

@@ -50,7 +57,6 @@ def test_empty_result(mock_container, authenticated_client, list_offers_usecase)
5057
}
5158

5259

53-
@patch("presentation.ingestion.views.create_ingestion_container")
5460
def test_call_without_arg(mock_container, authenticated_client):
5561
first_offer = OfferFactory.create_entity(
5662
contract_type=ContractType.TERRITORIAL,
@@ -91,7 +97,6 @@ def test_call_without_arg(mock_container, authenticated_client):
9197

9298

9399
@pytest.mark.parametrize("active,external_id_contains", [(True, None), (False, "123")])
94-
@patch("presentation.ingestion.views.create_ingestion_container")
95100
def test_call_with_args(
96101
mock_container, authenticated_client, active, external_id_contains
97102
):
@@ -108,7 +113,6 @@ def test_call_with_args(
108113
)
109114

110115

111-
@patch("presentation.ingestion.views.create_ingestion_container")
112116
def test_returns_error_500(mock_container, authenticated_client):
113117
mock_usecase = MagicMock()
114118
mock_usecase.execute.side_effect = Exception("db error")
@@ -119,7 +123,6 @@ def test_returns_error_500(mock_container, authenticated_client):
119123

120124

121125
@patch("presentation.ingestion.views.IngestionPagination.page_size", new=2)
122-
@patch("presentation.ingestion.views.create_ingestion_container")
123126
def test_pagination_page_arg(mock_container, authenticated_client):
124127
num_offers = 5
125128
offers = [OfferFactory.create_entity() for _ in range(num_offers)]
@@ -156,7 +159,6 @@ def test_pagination_page_arg(mock_container, authenticated_client):
156159

157160

158161
@patch("presentation.ingestion.views.IngestionPagination.page_size", new=2)
159-
@patch("presentation.ingestion.views.create_ingestion_container")
160162
def test_pagination_out_of_bond(mock_container, authenticated_client):
161163
num_offers = 3
162164
offers = [OfferFactory.create_entity() for _ in range(num_offers)]

src/web/tests/ingestion/presentation/views/test_list_sources.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest.mock import patch
22

3+
import pytest
34
from django.urls import reverse
45
from rest_framework import status
56

@@ -8,6 +9,12 @@
89
URL = reverse("ingestion:sources_list")
910

1011

12+
@pytest.fixture
13+
def mock_container():
14+
with patch("presentation.ingestion.views.create_ingestion_container") as mock:
15+
yield mock
16+
17+
1118
def test_unauthenticated_returns_401(api_client):
1219
response = api_client.get(URL)
1320
assert response.status_code == status.HTTP_401_UNAUTHORIZED
@@ -24,7 +31,6 @@ def test_invalid_api_key_returns_401(api_client):
2431
assert response.status_code == status.HTTP_401_UNAUTHORIZED
2532

2633

27-
@patch("presentation.ingestion.views.create_ingestion_container")
2834
def test_empty_list(mock_container, api_key_client):
2935
usecase = mock_container.return_value.list_sources_usecase.return_value
3036
usecase.execute.return_value = []
@@ -35,7 +41,6 @@ def test_empty_list(mock_container, api_key_client):
3541
assert response.json() == []
3642

3743

38-
@patch("presentation.ingestion.views.create_ingestion_container")
3944
def test_returns_all_sources(mock_container, api_key_client):
4045
sources = [SourceFactory.create_entity() for _ in range(2)]
4146
usecase = mock_container.return_value.list_sources_usecase.return_value
@@ -47,7 +52,6 @@ def test_returns_all_sources(mock_container, api_key_client):
4752
assert len(response.json()) == 2 # noqa: PLR2004
4853

4954

50-
@patch("presentation.ingestion.views.create_ingestion_container")
5155
def test_response_shape(mock_container, api_key_client):
5256
source = SourceFactory.create_entity()
5357
usecase = mock_container.return_value.list_sources_usecase.return_value
@@ -66,7 +70,6 @@ def test_response_shape(mock_container, api_key_client):
6670
}
6771

6872

69-
@patch("presentation.ingestion.views.create_ingestion_container")
7073
def test_returns_500_on_error(mock_container, api_key_client):
7174
usecase = mock_container.return_value.list_sources_usecase.return_value
7275
usecase.execute.side_effect = Exception("db error")

0 commit comments

Comments
 (0)