def test_get_detail_404(self): ZaakTypeFactory.create(catalogus=self.catalogus) url = get_operation_url('zaaktype_read', uuid=uuid.uuid4()) response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) resp_data = response.json() del resp_data['instance'] self.assertEqual( resp_data, { 'code': 'not_found', 'title': "Niet gevonden.", 'status': 404, 'detail': "Niet gevonden.", 'type': "http://testserver{}".format( django_reverse('vng_api_common:error-detail', kwargs={'exception_class': 'NotFound'})) })
def test_filter_zaaktype_status_alles(self): ZaakTypeFactory.create(concept=True) ZaakTypeFactory.create(concept=False) zaaktype_list_url = get_operation_url('zaaktype_list') response = self.client.get(zaaktype_list_url, {'status': 'alles'}) self.assertEqual(response.status_code, 200) data = response.json()['results'] self.assertEqual(len(data), 2)
def test_filter_zaaktype_status_definitief(self): zaaktype1 = ZaakTypeFactory.create(concept=True) zaaktype2 = ZaakTypeFactory.create(concept=False) zaaktype_list_url = get_operation_url('zaaktype_list') zaaktype2_url = get_operation_url('zaaktype_read', uuid=zaaktype2.uuid) response = self.client.get(zaaktype_list_url, {'status': 'definitief'}) self.assertEqual(response.status_code, 200) data = response.json()['results'] self.assertEqual(len(data), 1) self.assertEqual(data[0]['url'], f'http://testserver{zaaktype2_url}')
def test_filter_identificatie(self): zaaktype1 = ZaakTypeFactory.create(concept=False, zaaktype_identificatie=123) zaaktype2 = ZaakTypeFactory.create(concept=False, zaaktype_identificatie=456) zaaktype_list_url = get_operation_url('zaaktype_list') zaaktype1_url = get_operation_url('zaaktype_read', uuid=zaaktype1.uuid) response = self.client.get(zaaktype_list_url, {'identificatie': 123}) self.assertEqual(response.status_code, 200) data = response.json()['results'] self.assertEqual(len(data), 1) self.assertEqual(data[0]['url'], f'http://testserver{zaaktype1_url}')
def test_filter_trefwoorden(self): zaaktype1 = ZaakTypeFactory.create( concept=False, trefwoorden=['some', 'key', 'words']) zaaktype2 = ZaakTypeFactory.create(concept=False, trefwoorden=['other', 'words']) zaaktype_list_url = get_operation_url('zaaktype_list') zaaktype1_url = get_operation_url('zaaktype_read', uuid=zaaktype1.uuid) response = self.client.get(zaaktype_list_url, {'trefwoorden': 'key'}) self.assertEqual(response.status_code, 200) data = response.json()['results'] self.assertEqual(len(data), 1) self.assertEqual(data[0]['url'], f'http://testserver{zaaktype1_url}')
def test_validate_wrong_resultaattypeomschrijving(self, mock_shape, mock_fetch): zaaktype = ZaakTypeFactory.create(concept=False) zaaktype_url = reverse('zaaktype-detail', kwargs={ 'uuid': zaaktype.uuid, }) resultaattypeomschrijving_url = 'http://example.com/omschrijving/1' data = { 'zaaktype': f'http://testserver{zaaktype_url}', 'omschrijving': 'illum', 'resultaattypeomschrijving': resultaattypeomschrijving_url, 'selectielijstklasse': 'https://garcia.org/', 'archiefnominatie': 'blijvend_bewaren', 'archiefactietermijn': 'P10Y', 'brondatumArchiefprocedure': { 'afleidingswijze': BrondatumArchiefprocedureAfleidingswijze.afgehandeld, 'einddatumBekend': False, 'procestermijn': 'P10Y', 'datumkenmerk': '', 'objecttype': '', 'registratie': '', } } with requests_mock.Mocker() as m: m.register_uri('GET', resultaattypeomschrijving_url, json={ 'omschrijving': 'test' }) response = self.client.post(self.list_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, 'resultaattypeomschrijving') self.assertEqual(error['code'], 'invalid-resource')
def test_get_detail(self): zaaktype = ZaakTypeFactory.create(catalogus=self.catalogus) zaaktype_url = reverse('zaaktype-detail', kwargs={'uuid': zaaktype.uuid}) specificatie = EigenschapSpecificatieFactory.create( kardinaliteit='1', lengte='1', groep='groep', ) eigenschap = EigenschapFactory.create( eigenschapnaam='Beoogd product', zaaktype=zaaktype, specificatie_van_eigenschap=specificatie) eigenschap_detail_url = reverse('eigenschap-detail', kwargs={'uuid': eigenschap.uuid}) response = self.api_client.get(eigenschap_detail_url) self.assertEqual(response.status_code, 200) expected = { 'url': 'http://testserver{}'.format(eigenschap_detail_url), 'naam': 'Beoogd product', 'definitie': '', 'specificatie': { 'formaat': '', 'groep': 'groep', 'kardinaliteit': '1', 'lengte': '1', 'waardenverzameling': [] }, 'toelichting': '', 'zaaktype': 'http://testserver{}'.format(zaaktype_url), } self.assertEqual(expected, response.json())
def test_get_detail(self): zaaktype = ZaakTypeFactory.create(catalogus=self.catalogus) zaaktype_url = reverse("zaaktype-detail", kwargs={"uuid": zaaktype.uuid}) specificatie = EigenschapSpecificatieFactory.create( kardinaliteit="1", lengte="1", groep="groep" ) eigenschap = EigenschapFactory.create( eigenschapnaam="Beoogd product", zaaktype=zaaktype, specificatie_van_eigenschap=specificatie, ) eigenschap_detail_url = reverse( "eigenschap-detail", kwargs={"uuid": eigenschap.uuid} ) response = self.api_client.get(eigenschap_detail_url) self.assertEqual(response.status_code, 200) expected = { "url": "http://testserver{}".format(eigenschap_detail_url), "naam": "Beoogd product", "definitie": "", "specificatie": { "formaat": "", "groep": "groep", "kardinaliteit": "1", "lengte": "1", "waardenverzameling": [], }, "toelichting": "", "zaaktype": "http://testserver{}".format(zaaktype_url), } self.assertEqual(expected, response.json())
def test_update_eigenschap_add_relation_to_non_concept_zaaktype_fails(self): zaaktype = ZaakTypeFactory.create(concept=False) zaaktype_url = reverse(zaaktype) eigenschap = EigenschapFactory.create() eigenschap_url = reverse(eigenschap) data = { "naam": "aangepast", "definitie": "test", "toelichting": "", "zaaktype": zaaktype_url, "specificatie": { "groep": "test", "formaat": "tekst", "lengte": "5", "kardinaliteit": "1", "waardenverzameling": [], }, } response = self.client.put(eigenschap_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], ZaakTypeConceptValidator.code)
def test_changing_besluittype_informatieobjecttype_m2m_invalidates_both_etags( self): """ Changing the M2M should modify both resources, resulting in 200 for when both resources are retrieved """ besluittype = BesluitTypeFactory.create() besluittype._etag = calculate_etag(besluittype) besluittype.save(update_fields=["_etag"]) besluittype_etag = besluittype._etag zaaktype = ZaakTypeFactory.create() zaaktype._etag = calculate_etag(zaaktype) zaaktype.save(update_fields=["_etag"]) zaaktype_etag = zaaktype._etag besluittype.zaaktypen.set([zaaktype]) besluittype.save() response = self.client.get(reverse(besluittype), HTTP_IF_NONE_MATCH=f'"{besluittype_etag}"') self.assertEqual(response.status_code, status.HTTP_200_OK) response = self.client.get(reverse(zaaktype), HTTP_IF_NONE_MATCH=f'"{zaaktype_etag}"') self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_update_ziot_not_concept_informatieobjecttype(self): zaaktype = ZaakTypeFactory.create() zaaktype_url = reverse(zaaktype) informatieobjecttype = InformatieObjectTypeFactory.create( catalogus=zaaktype.catalogus, concept=False) informatieobjecttype_url = reverse(informatieobjecttype) ziot = ZaakInformatieobjectTypeFactory.create( zaaktype=zaaktype, informatieobjecttype=informatieobjecttype) ziot_url = reverse(ziot) data = { "zaaktype": f"http://testserver{zaaktype_url}", "informatieobjecttype": f"http://testserver{informatieobjecttype_url}", "volgnummer": 13, "richting": RichtingChoices.inkomend, } response = self.client.put(ziot_url, data) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["volgnummer"], 13) ziot.refresh_from_db() self.assertEqual(ziot.volgnummer, 13)
def test_create_eigenschap(self): zaaktype = ZaakTypeFactory.create(catalogus=self.catalogus) zaaktype_url = reverse("zaaktype-detail", kwargs={"uuid": zaaktype.uuid}) eigenschap_list_url = reverse("eigenschap-list") data = { "naam": "Beoogd product", "definitie": "test", "toelichting": "", "zaaktype": "http://testserver{}".format(zaaktype_url), "specificatie": { "groep": "test", "formaat": "tekst", "lengte": "5", "kardinaliteit": "1", "waardenverzameling": [], }, } response = self.client.post(eigenschap_list_url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) eigenschap = Eigenschap.objects.get() self.assertEqual(eigenschap.eigenschapnaam, "Beoogd product") self.assertEqual(eigenschap.zaaktype, zaaktype) specificatie = eigenschap.specificatie_van_eigenschap self.assertEqual(specificatie.groep, "test") self.assertEqual(specificatie.formaat, "tekst") self.assertEqual(specificatie.lengte, "5") self.assertEqual(specificatie.kardinaliteit, "1") self.assertEqual(specificatie.waardenverzameling, [])
def test_update_ziot_not_concept_zaaktype_and_informatieobjecttype_fails( self): zaaktype = ZaakTypeFactory.create(concept=False) zaaktype_url = reverse(zaaktype) informatieobjecttype = InformatieObjectTypeFactory.create( catalogus=zaaktype.catalogus, concept=False) informatieobjecttype_url = reverse(informatieobjecttype) ziot = ZaakInformatieobjectTypeFactory.create( zaaktype=zaaktype, informatieobjecttype=informatieobjecttype) ziot_url = reverse(ziot) data = { "zaaktype": f"http://testserver{zaaktype_url}", "informatieobjecttype": f"http://testserver{informatieobjecttype_url}", "volgnummer": 13, "richting": RichtingChoices.inkomend, } response = self.client.put(ziot_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "non-concept-relation")
def test_conditional_get_stale(self): zaaktype = ZaakTypeFactory.create(with_etag=True) response = self.client.get(reverse(zaaktype), HTTP_IF_NONE_MATCH=f'"not-an-md5"') self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_delete_zaaktype(self): zaaktype = ZaakTypeFactory.create() zaaktype_url = get_operation_url('zaaktype_read', uuid=zaaktype.uuid) response = self.client.delete(zaaktype_url) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertFalse(ZaakType.objects.filter(id=zaaktype.id))
def setUp(self): super().setUp() self.zaaktype = ZaakTypeFactory.create( maakt_deel_uit_van=self.catalogus) specificatie = EigenschapSpecificatieFactory.create( kardinaliteit='1', lengte='1', groep='groep', ) self.eigenschap_one = EigenschapFactory.create( eigenschapnaam='Beoogd product', is_van=self.zaaktype, specificatie_van_eigenschap=specificatie) referentie = EigenschapReferentieFactory.create( x_path_element='x_path_element', namespace='namespace', ) self.eigenschap_two = EigenschapFactory.create( eigenschapnaam='Aard product', is_van=self.zaaktype, referentie_naar_eigenschap=referentie) self.eigenschap_list_url = reverse('api:eigenschap-list', kwargs={ 'version': self.API_VERSION, 'catalogus_pk': self.catalogus.pk, 'zaaktype_pk': self.zaaktype.pk }) self.eigenschap_one_detail_url = reverse('api:eigenschap-detail', kwargs={ 'version': self.API_VERSION, 'catalogus_pk': self.catalogus.pk, 'zaaktype_pk': self.zaaktype.pk, 'pk': self.eigenschap_one.pk }) self.eigenschap_two_detail_url = reverse('api:eigenschap-detail', kwargs={ 'version': self.API_VERSION, 'catalogus_pk': self.catalogus.pk, 'zaaktype_pk': self.zaaktype.pk, 'pk': self.eigenschap_two.pk })
def setUp(self): super().setUp() self.zaaktype = ZaakTypeFactory.create(catalogus=self.catalogus) self.zaaktype_list_url = get_operation_url( 'zaaktype_list', catalogus_uuid=self.catalogus.uuid) self.zaaktype_detail_url = get_operation_url( 'zaaktype_read', catalogus_uuid=self.catalogus.uuid, uuid=self.zaaktype.uuid)
def test_partial_update_eigenschap_fail_not_concept_zaaktype(self): zaaktype = ZaakTypeFactory.create(concept=False) eigenschap = EigenschapFactory.create(zaaktype=zaaktype) eigenschap_url = reverse(eigenschap) response = self.client.patch(eigenschap_url, {"naam": "aangepast"}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], ZaakTypeConceptValidator.code)
def test_delete_zaaktype_fail_not_concept(self): zaaktype = ZaakTypeFactory.create(concept=False) zaaktype_url = get_operation_url('zaaktype_read', uuid=zaaktype.uuid) response = self.client.delete(zaaktype_url) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) data = response.json() self.assertEqual(data['detail'], 'Alleen concepten kunnen worden verwijderd.')
def test_publish_zaaktype(self): zaaktype = ZaakTypeFactory.create() zaaktype_url = get_operation_url('zaaktype_publish', uuid=zaaktype.uuid) response = self.client.post(zaaktype_url) self.assertEqual(response.status_code, status.HTTP_200_OK) zaaktype.refresh_from_db() self.assertEqual(zaaktype.concept, False)
def test_no_changes_gives_304(self): """ Because changes are made to the zaaktype, a code 200 should be returned """ zaaktype = ZaakTypeFactory.create(toelichting="bla") zaaktype._etag = calculate_etag(zaaktype) zaaktype.save(update_fields=["_etag"]) etag = zaaktype._etag response = self.client.get(reverse(zaaktype), HTTP_IF_NONE_MATCH=f'"{etag}"') self.assertEqual(response.status_code, status.HTTP_304_NOT_MODIFIED)
def test_overlap_open_end_date(self): ZaakTypeFactory.create(catalogus=self.catalogus, zaaktype_identificatie=1, datum_begin_geldigheid=date(2019, 1, 1), datum_einde_geldigheid=None, zaaktype_omschrijving="zaaktype") data = { "omschrijving": "zaaktype", "identificatie": 1, "catalogus": f"http://testserver{reverse(self.catalogus)}", "beginGeldigheid": "2019-02-01", "vertrouwelijkheidaanduiding": VertrouwelijkheidsAanduiding.openbaar, "doel": "doel", "aanleiding": "aanleiding", "indicatieInternOfExtern": "extern", "handelingInitiator": "aanvragen", "onderwerp": "dummy", "handelingBehandelaar": "behandelen", "doorlooptijd": "P7D", "opschortingEnAanhoudingMogelijk": False, "verlengingMogelijk": False, "publicatieIndicatie": False, "productenOfDiensten": [], "referentieproces": { "naam": "ref", }, "besluittypen": [], "gerelateerdeZaaktypen": [], "versiedatum": "2019-02-01", } response = self.client.post(self.url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "beginGeldigheid") self.assertEqual(error["code"], "overlap")
def test_ophalen_mogelijke_behandelaars(self): """ Toon aan dat het mogelijk is om een lijst van mogelijke behandelaars op te halen. Zie https://github.com/VNG-Realisatie/gemma-zaken/issues/182#issuecomment-408899919 voor context """ zaaktype = ZaakTypeFactory.create() roltype_behandelaar = RolTypeFactory.create( zaaktype=zaaktype, omschrijving_generiek=RolOmschrijving.behandelaar, ) MogelijkeBetrokkeneFactory.create_batch(2, roltype=roltype_behandelaar) # unrelated, but same ZAAKTYPE, should not show up MogelijkeBetrokkeneFactory.create( roltype__zaaktype=zaaktype, roltype__omschrijving_generiek=RolOmschrijving.adviseur ) url = get_operation_url( 'roltype_list', catalogus_uuid=zaaktype.catalogus.uuid, zaaktype_uuid=zaaktype.uuid ) response = self.client.get(url, { 'omschrijvingGeneriek': RolOmschrijving.behandelaar, }) self.assertEqual(response.status_code, 200) response_data = response.json() self.assertEqual(len(response_data), 1) self.assertResponseTypes(response_data[0], ( ('url', str), ('zaaktype', str), ('omschrijving', str), ('omschrijvingGeneriek', str), ('mogelijkeBetrokkenen', list), )) mogelijke_betrokkenen = response_data[0]['mogelijkeBetrokkenen'] self.assertEqual(len(mogelijke_betrokkenen), 2) self.assertResponseTypes(mogelijke_betrokkenen[0], ( ('betrokkene', str), ('betrokkeneType', str), ))
def test_create_resultaattype(self, mock_shape, mock_fetch): zaaktype = ZaakTypeFactory.create( selectielijst_procestype=PROCESTYPE_URL, ) zaaktype_url = reverse('zaaktype-detail', kwargs={ 'uuid': zaaktype.uuid, }) resultaattypeomschrijving_url = 'http://example.com/omschrijving/1' data = { 'zaaktype': f'http://testserver{zaaktype_url}', 'omschrijving': 'illum', 'resultaattypeomschrijving': resultaattypeomschrijving_url, 'selectielijstklasse': SELECTIELIJSTKLASSE_URL, 'archiefnominatie': 'blijvend_bewaren', 'archiefactietermijn': 'P10Y', 'brondatumArchiefprocedure': { 'afleidingswijze': BrondatumArchiefprocedureAfleidingswijze.afgehandeld, 'einddatumBekend': False, 'procestermijn': 'P10Y', 'datumkenmerk': '', 'objecttype': '', 'registratie': '', } } responses = { SELECTIELIJSTKLASSE_URL: { 'url': SELECTIELIJSTKLASSE_URL, 'procesType': PROCESTYPE_URL, 'procestermijn': Procestermijn.nihil, }, } with mock_client(responses): with requests_mock.Mocker() as m: m.register_uri('GET', resultaattypeomschrijving_url, json={ 'omschrijving': 'test' }) response = self.client.post(self.list_url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) resultaattype = ResultaatType.objects.get() self.assertEqual(resultaattype.omschrijving_generiek, 'test') self.assertEqual(resultaattype.zaaktype, zaaktype) self.assertEqual( resultaattype.brondatum_archiefprocedure_afleidingswijze, BrondatumArchiefprocedureAfleidingswijze.afgehandeld )
def test_partial_update_statustype_add_relation_to_non_concept_zaaktype_fails( self): zaaktype = ZaakTypeFactory.create(concept=False) zaaktype_url = reverse(zaaktype) statustype = StatusTypeFactory.create() statustype_url = reverse(statustype) response = self.client.patch(statustype_url, {"zaaktype": zaaktype_url}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], ZaakTypeConceptValidator.code)
def test_partial_update_ziot_informatieobjecttype(self): zaaktype = ZaakTypeFactory.create() ziot = ZaakInformatieobjectTypeFactory.create(zaaktype=zaaktype) ziot_url = reverse(ziot) informatieobjecttype = InformatieObjectTypeFactory.create() informatieobjecttype_url = reverse(informatieobjecttype) response = self.client.patch( ziot_url, {"informatieobjecttype": informatieobjecttype_url}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "relations-incorrect-catalogus")
def test_partial_update_statustype(self): zaaktype = ZaakTypeFactory.create() zaaktype_url = reverse(zaaktype) statustype = StatusTypeFactory.create(zaaktype=zaaktype) statustype_url = reverse(statustype) response = self.client.patch(statustype_url, {"omschrijving": "aangepast"}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["omschrijving"], "aangepast") statustype.refresh_from_db() self.assertEqual(statustype.statustype_omschrijving, "aangepast")
def test_ophalen_servicenorm_doorlooptijd(self): zaaktype = ZaakTypeFactory.create() url = get_operation_url( "zaaktype_read", catalogus_uuid=zaaktype.catalogus.uuid, uuid=zaaktype.uuid ) response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertResponseTypes( response_data, (("doorlooptijd", str), ("servicenorm", type(None))) ) self.assertEqual(response_data["doorlooptijd"], "P30D")
def test_partial_update_ziot(self): zaaktype = ZaakTypeFactory.create() informatieobjecttype = InformatieObjectTypeFactory.create( catalogus=zaaktype.catalogus) ziot = ZaakInformatieobjectTypeFactory.create( zaaktype=zaaktype, informatieobjecttype=informatieobjecttype) ziot_url = reverse(ziot) response = self.client.patch(ziot_url, {"volgnummer": 12}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["volgnummer"], 12) ziot.refresh_from_db() self.assertEqual(ziot.volgnummer, 12)
def test_invalidate_etag_after_change(self): """ Because changes are made to the zaaktype, a code 200 should be returned """ zaaktype = ZaakTypeFactory.create(toelichting="bla") zaaktype._etag = calculate_etag(zaaktype) zaaktype.save(update_fields=["_etag"]) etag = zaaktype._etag zaaktype.toelichting = "same" zaaktype.save() response = self.client.get(reverse(zaaktype), HTTP_IF_NONE_MATCH=f'"{etag}"') self.assertEqual(response.status_code, status.HTTP_200_OK)