Skip to content

Commit dc5a925

Browse files
committed
🧪 [#386] Add tests for review response validation
1 parent e80ab0c commit dc5a925

File tree

3 files changed

+232
-0
lines changed

3 files changed

+232
-0
lines changed

backend/src/openarchiefbeheer/destruction/tests/serializers/test_reviewresponse.py

+57
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1+
from unittest.mock import patch
2+
13
from django.test import TestCase
24
from django.utils.translation import gettext_lazy as _
35

6+
from requests.exceptions import HTTPError
7+
from rest_framework.test import APIRequestFactory
8+
49
from openarchiefbeheer.accounts.tests.factories import UserFactory
510

611
from ...api.serializers import ReviewResponseSerializer
712
from ...constants import DestructionListItemAction, ListStatus, ZaakActionType
813
from ..factories import DestructionListItemReviewFactory, DestructionListReviewFactory
914

15+
factory = APIRequestFactory()
16+
1017

1118
class ReviewResponseSerializerTests(TestCase):
1219
def test_rejecting_suggestion_cannot_have_zaak_action(self):
@@ -121,3 +128,53 @@ def test_selectielijst_zaak_action_requires_selectielijst(self):
121128
"The selectielijstklasse is required for action type is 'selectielijstklasse_and_bewaartermijn'."
122129
),
123130
)
131+
132+
def test_update_archiefactiedatum_selectielijst_api_error(self):
133+
record_manager = UserFactory.create(role__can_start_destruction=True)
134+
review = DestructionListReviewFactory.create(
135+
destruction_list__author=record_manager,
136+
destruction_list__status=ListStatus.changes_requested,
137+
destruction_list__assignee=record_manager,
138+
)
139+
items_review = DestructionListItemReviewFactory.create(
140+
destruction_list_item__with_zaak=True,
141+
destruction_list_item__zaak__selectielijstklasse="https://selectielijst.openzaak.nl/api/v1/resultaten/8320ab7d-3a8d-4c8b-b94a-14b4fa374d0a",
142+
destruction_list_item__destruction_list=review.destruction_list,
143+
review=review,
144+
)
145+
146+
data = {
147+
"review": review.pk,
148+
"comment": "A response about the review.",
149+
"items_responses": [
150+
{
151+
"review_item": items_review.pk,
152+
"action_item": DestructionListItemAction.remove,
153+
"action_zaak_type": ZaakActionType.bewaartermijn,
154+
"action_zaak": {
155+
"archiefactiedatum": "2030-01-01",
156+
},
157+
"comment": "This zaak needs to kept.",
158+
},
159+
],
160+
}
161+
162+
request = factory.get("/foo")
163+
request.user = record_manager
164+
165+
with patch(
166+
"openarchiefbeheer.destruction.api.serializers.retrieve_selectielijstklasse_resultaat",
167+
side_effect=HTTPError,
168+
):
169+
serializer = ReviewResponseSerializer(
170+
data=data, context={"request": request}
171+
)
172+
173+
self.assertFalse(serializer.is_valid())
174+
175+
self.assertEqual(
176+
serializer.errors["items_responses"][0]["non_field_errors"][0],
177+
_(
178+
"Could not validate the selectielijstklasse waardering due to an unexpected response from the Selectielijst API."
179+
),
180+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Authorization:
10+
- Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIiLCJpYXQiOjE3Mjc0Mzg1ODMsImNsaWVudF9pZCI6IiIsInVzZXJfaWQiOiIiLCJ1c2VyX3JlcHJlc2VudGF0aW9uIjoiIn0.lqLUT0G2iqIcCFl8UBTw3xYbLLVcGIWjHs8DUSEJlNQ
11+
Connection:
12+
- keep-alive
13+
User-Agent:
14+
- python-requests/2.32.3
15+
method: GET
16+
uri: https://selectielijst.openzaak.nl/api/v1/resultaten/8320ab7d-3a8d-4c8b-b94a-14b4fa374d0a
17+
response:
18+
body:
19+
string: '{"url":"https://selectielijst.openzaak.nl/api/v1/resultaten/8320ab7d-3a8d-4c8b-b94a-14b4fa374d0a","procesType":"https://selectielijst.openzaak.nl/api/v1/procestypen/e1b73b12-b2f6-4c4e-8929-94f84dd2a57d","nummer":1,"volledigNummer":"1.1.1","generiek":false,"specifiek":true,"naam":"Ingericht","omschrijving":"Inrichten
20+
of wijzigen met een organisatie brede impact","herkomst":"Systeemanalyse","waardering":"blijvend_bewaren","procestermijn":"","procestermijnWeergave":"","bewaartermijn":null,"toelichting":"Organisatiewijziging","algemeenBestuurEnInrichtingOrganisatie":true,"bedrijfsvoeringEnPersoneel":false,"publiekeInformatieEnRegistratie":false,"burgerzaken":false,"veiligheid":false,"verkeerEnVervoer":false,"economie":false,"onderwijs":false,"sportCultuurEnRecreatie":false,"sociaalDomein":false,"volksgezonheidEnMilieu":false,"vhrosv":false,"heffenBelastingen":false,"alleTaakgebieden":false,"procestermijnOpmerking":""}'
21+
headers:
22+
API-version:
23+
- 1.0.0
24+
Allow:
25+
- GET, HEAD, OPTIONS
26+
Connection:
27+
- keep-alive
28+
Content-Length:
29+
- '927'
30+
Content-Type:
31+
- application/json
32+
Date:
33+
- Fri, 27 Sep 2024 12:03:03 GMT
34+
Feature-Policy:
35+
- autoplay 'none'; camera 'none'
36+
Referrer-Policy:
37+
- same-origin
38+
Strict-Transport-Security:
39+
- max-age=63072000
40+
X-Content-Type-Options:
41+
- nosniff
42+
- nosniff
43+
X-Frame-Options:
44+
- DENY
45+
X-XSS-Protection:
46+
- 1; mode=block
47+
- 1; mode=block
48+
status:
49+
code: 200
50+
message: OK
51+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
from unittest.mock import patch
2+
3+
from django.test import TestCase, tag
4+
from django.utils.translation import gettext_lazy as _
5+
6+
from rest_framework.test import APIRequestFactory
7+
from vcr.unittest import VCRMixin
8+
from zgw_consumers.constants import APITypes
9+
from zgw_consumers.test.factories import ServiceFactory
10+
11+
from openarchiefbeheer.accounts.tests.factories import UserFactory
12+
from openarchiefbeheer.config.models import APIConfig
13+
14+
from ...api.serializers import ReviewResponseSerializer
15+
from ...constants import DestructionListItemAction, ListStatus, ZaakActionType
16+
from ..factories import DestructionListItemReviewFactory, DestructionListReviewFactory
17+
18+
factory = APIRequestFactory()
19+
20+
21+
@tag("vcr")
22+
class ReviewResponseSerializerTest(VCRMixin, TestCase):
23+
@classmethod
24+
def setUpClass(cls) -> None:
25+
super().setUpClass()
26+
27+
cls.config = ServiceFactory.create(
28+
api_type=APITypes.orc,
29+
api_root="https://selectielijst.openzaak.nl/api/v1",
30+
)
31+
32+
def test_new_selectielijst_blijvend_bewaren(self):
33+
record_manager = UserFactory.create(role__can_start_destruction=True)
34+
review = DestructionListReviewFactory.create(
35+
destruction_list__author=record_manager,
36+
destruction_list__status=ListStatus.changes_requested,
37+
destruction_list__assignee=record_manager,
38+
)
39+
items_review = DestructionListItemReviewFactory.create(
40+
destruction_list_item__destruction_list=review.destruction_list,
41+
review=review,
42+
)
43+
44+
data = {
45+
"review": review.pk,
46+
"comment": "A response about the review.",
47+
"items_responses": [
48+
{
49+
"review_item": items_review.pk,
50+
"action_item": DestructionListItemAction.remove,
51+
"action_zaak_type": ZaakActionType.selectielijstklasse_and_bewaartermijn,
52+
"action_zaak": {
53+
"selectielijstklasse": "https://selectielijst.openzaak.nl/api/v1/resultaten/8320ab7d-3a8d-4c8b-b94a-14b4fa374d0a",
54+
"archiefactiedatum": "2030-01-01",
55+
},
56+
"comment": "This zaak needs to kept.",
57+
},
58+
],
59+
}
60+
61+
with patch(
62+
"openarchiefbeheer.zaken.utils.APIConfig.get_solo",
63+
return_value=APIConfig(selectielijst_api_service=self.config),
64+
):
65+
serializer = ReviewResponseSerializer(data=data)
66+
67+
self.assertFalse(serializer.is_valid())
68+
69+
self.assertEqual(
70+
serializer.errors["items_responses"][0]["selectielijstklasse"][0],
71+
_(
72+
"The selectielijstklasse has waardering 'blijvend_bewaren', so the archiefactiedatum should be null."
73+
),
74+
)
75+
76+
def test_selectielijst_blijvend_bewaren_update_archiefactiedatum(self):
77+
record_manager = UserFactory.create(role__can_start_destruction=True)
78+
review = DestructionListReviewFactory.create(
79+
destruction_list__author=record_manager,
80+
destruction_list__status=ListStatus.changes_requested,
81+
destruction_list__assignee=record_manager,
82+
)
83+
items_review = DestructionListItemReviewFactory.create(
84+
destruction_list_item__with_zaak=True,
85+
destruction_list_item__zaak__selectielijstklasse="https://selectielijst.openzaak.nl/api/v1/resultaten/8320ab7d-3a8d-4c8b-b94a-14b4fa374d0a",
86+
destruction_list_item__destruction_list=review.destruction_list,
87+
review=review,
88+
)
89+
90+
data = {
91+
"review": review.pk,
92+
"comment": "A response about the review.",
93+
"items_responses": [
94+
{
95+
"review_item": items_review.pk,
96+
"action_item": DestructionListItemAction.remove,
97+
"action_zaak_type": ZaakActionType.bewaartermijn,
98+
"action_zaak": {
99+
"archiefactiedatum": "2030-01-01",
100+
},
101+
"comment": "This zaak needs to kept.",
102+
},
103+
],
104+
}
105+
106+
request = factory.get("/foo")
107+
request.user = record_manager
108+
109+
with patch(
110+
"openarchiefbeheer.zaken.utils.APIConfig.get_solo",
111+
return_value=APIConfig(selectielijst_api_service=self.config),
112+
):
113+
serializer = ReviewResponseSerializer(
114+
data=data, context={"request": request}
115+
)
116+
117+
self.assertFalse(serializer.is_valid())
118+
119+
self.assertEqual(
120+
serializer.errors["items_responses"][0]["archiefactiedatum"][0],
121+
_(
122+
"The selectielijstklasse has waardering 'blijvend_bewaren', so an archiefactiedatum cannot be set."
123+
),
124+
)

0 commit comments

Comments
 (0)