def test_create_gebruiksrechten_limited_to_authorized_zaken(self): url = reverse('gebruiksrechten-list') eio1 = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/not_ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar) eio2 = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim) for eio in [eio1, eio2]: with self.subTest(informatieobjecttype=eio.informatieobjecttype, vertrouwelijkheidaanduiding=eio. vertrouwelijkheidaanduiding): response = self.client.post( url, { 'informatieobject': reverse('enkelvoudiginformatieobject-detail', kwargs={'uuid': eio.uuid}), 'startdatum': '2018-12-24T00:00:00Z', 'omschrijvingVoorwaarden': 'Een hele set onredelijke voorwaarden', }) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_gebruiksrechten_limited_to_authorized_zaken(self): url = reverse("gebruiksrechten-list") eio1 = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/not_ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar, ) eio2 = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim, ) for eio in [eio1, eio2]: with self.subTest( informatieobjecttype=eio.informatieobjecttype, vertrouwelijkheidaanduiding=eio. vertrouwelijkheidaanduiding, ): response = self.client.post( url, { "informatieobject": reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid}, ), "startdatum": "2018-12-24T00:00:00Z", "omschrijvingVoorwaarden": "Een hele set onredelijke voorwaarden", }, ) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_eio_list_shows_latest_versions(self): eio1 = EnkelvoudigInformatieObjectFactory.create(beschrijving="object1") eio1_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio1.uuid} ) lock = self.client.post(f"{eio1_url}/lock").data["lock"] self.client.patch(eio1_url, {"beschrijving": "object1 versie2", "lock": lock}) eio2 = EnkelvoudigInformatieObjectFactory.create(beschrijving="object2") eio2_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio2.uuid} ) lock = self.client.post(f"{eio2_url}/lock").data["lock"] self.client.patch(eio2_url, {"beschrijving": "object2 versie2", "lock": lock}) response = self.client.get(reverse(EnkelvoudigInformatieObject)) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.data["results"] self.assertEqual(len(response_data), 2) self.assertEqual(response_data[0]["beschrijving"], "object1 versie2") self.assertEqual(response_data[1]["beschrijving"], "object2 versie2")
def test_eio_list_shows_latest_versions(self): eio1 = EnkelvoudigInformatieObjectFactory.create( beschrijving='object1') eio1_url = reverse('enkelvoudiginformatieobject-detail', kwargs={ 'uuid': eio1.uuid, }) lock = self.client.post(f'{eio1_url}/lock').data['lock'] self.client.patch(eio1_url, { 'beschrijving': 'object1 versie2', 'lock': lock }) eio2 = EnkelvoudigInformatieObjectFactory.create( beschrijving='object2') eio2_url = reverse('enkelvoudiginformatieobject-detail', kwargs={ 'uuid': eio2.uuid, }) lock = self.client.post(f'{eio2_url}/lock').data['lock'] self.client.patch(eio2_url, { 'beschrijving': 'object2 versie2', 'lock': lock }) response = self.client.get(reverse(EnkelvoudigInformatieObject)) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.data['results'] self.assertEqual(len(response_data), 2) self.assertEqual(response_data[0]['beschrijving'], 'object1 versie2') self.assertEqual(response_data[1]['beschrijving'], 'object2 versie2')
def test_validate_unknown_query_params(self): EnkelvoudigInformatieObjectFactory.create_batch(2) url = get_operation_url("enkelvoudiginformatieobject_list") response = self.client.get(url, {"someparam": "somevalue"}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "unknown-parameters")
def test_filter_by_identification(self): EnkelvoudigInformatieObjectFactory.create(identificatie='foo') EnkelvoudigInformatieObjectFactory.create(identificatie='bar') response = self.client.get(self.list_url, {'identificatie': 'foo'}) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json()['results'] self.assertEqual(len(response_data), 1) self.assertEqual(response_data[0]['identificatie'], 'foo')
def test_pagination_page_param(self): EnkelvoudigInformatieObjectFactory.create_batch(2) response = self.client.get(self.list_url, {"page": 1}) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertEqual(response_data["count"], 2) self.assertIsNone(response_data["previous"]) self.assertIsNone(response_data["next"])
def test_filter_by_identification(self): EnkelvoudigInformatieObjectFactory.create(identificatie="foo") EnkelvoudigInformatieObjectFactory.create(identificatie="bar") response = self.client.get(self.list_url, {"identificatie": "foo"}) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json()["results"] self.assertEqual(len(response_data), 1) self.assertEqual(response_data[0]["identificatie"], "foo")
def test_io_list(self): """ Assert you can only list INFORMATIEOBJECTen of the informatieobjecttypes and vertrouwelijkheidaanduiding of your authorization """ EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/not_ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype='https://informatieobjecttype.nl/not_ok', vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim) url = reverse('enkelvoudiginformatieobject-list') response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) results = response.data['results'] self.assertEqual(len(results), 1) self.assertEqual(results[0]['informatieobjecttype'], 'https://informatieobjecttype.nl/ok') self.assertEqual(results[0]['vertrouwelijkheidaanduiding'], VertrouwelijkheidsAanduiding.openbaar)
def test_pagination_default(self): """ Deleting a Besluit causes all related objects to be deleted as well. """ EnkelvoudigInformatieObjectFactory.create_batch(2) response = self.client.get(self.list_url) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertEqual(response_data["count"], 2) self.assertIsNone(response_data["previous"]) self.assertIsNone(response_data["next"])
def test_read_superuser(self): """ superuser read everything """ self.applicatie.heeft_alle_autorisaties = True self.applicatie.save() EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar, ) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/not_ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar, ) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim, ) EnkelvoudigInformatieObjectFactory.create( informatieobjecttype="https://informatieobjecttype.nl/not_ok", vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. zeer_geheim, ) url = reverse("enkelvoudiginformatieobject-list") response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertEqual(len(response_data), 4)
def test_conditional_get_stale(self): eio = EnkelvoudigInformatieObjectFactory.create(with_etag=True) response = self.client.get(reverse(eio), HTTP_IF_NONE_MATCH=f'"not-an-md5"') self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_eio_partial_update(self): eio = EnkelvoudigInformatieObjectFactory.create( beschrijving='beschrijving1') eio_url = reverse('enkelvoudiginformatieobject-detail', kwargs={ 'uuid': eio.uuid, }) lock = self.client.post(f'{eio_url}/lock').data['lock'] response = self.client.patch(eio_url, { 'beschrijving': 'beschrijving2', 'lock': lock }) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertEqual(response_data['beschrijving'], 'beschrijving2') eios = EnkelvoudigInformatieObject.objects.filter( uuid=eio.uuid).order_by('-versie') self.assertEqual(len(eios), 2) latest_version = eios.first() self.assertEqual(latest_version.versie, 2) self.assertEqual(latest_version.beschrijving, 'beschrijving2') first_version = eios[1] self.assertEqual(first_version.versie, 1) self.assertEqual(first_version.beschrijving, 'beschrijving1')
def test_update_eio_only_size(self): """ Test the update process of the size metadata Input: * lock document * update bestandsomvang with positive integer Expected result: * 400 status because the new bestandsomvang is not related to the file size """ eio = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype=INFORMATIEOBJECTTYPE ) detail_url = reverse(eio) lock_url = get_operation_url("enkelvoudiginformatieobject_lock", uuid=eio.uuid) # lock response_lock = self.client.post(lock_url) lock = response_lock.json()["lock"] # update metadata response = self.client.patch(detail_url, {"bestandsomvang": 20, "lock": lock}) self.assertEqual( response.status_code, status.HTTP_400_BAD_REQUEST, response.data ) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "file-size")
def test_update_eio_only_file_without_size(self): """ Test the update process of the file without changing file size Input: * lock document * update inhoud with another base64 encoded file Expected result: * 400 status because the new file size is not related to the bestandsomvang """ eio = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype=INFORMATIEOBJECTTYPE ) detail_url = reverse(eio) lock_url = get_operation_url("enkelvoudiginformatieobject_lock", uuid=eio.uuid) # lock response_lock = self.client.post(lock_url) lock = response_lock.json()["lock"] # update metadata response = self.client.patch( detail_url, { "inhoud": b64encode(b"some other file content").decode("utf-8"), "lock": lock, }, ) self.assertEqual( response.status_code, status.HTTP_400_BAD_REQUEST, response.data ) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "file-size")
def test_sync_create_fails(self): self.mocked_sync_create.side_effect = SyncError("Sync failed") enkelvoudig_informatie = EnkelvoudigInformatieObjectFactory.create() enkelvoudig_informatie_url = reverse( 'enkelvoudiginformatieobject-detail', kwargs={ 'version': '1', 'uuid': enkelvoudig_informatie.uuid, }) content = { 'informatieobject': 'http://testserver' + enkelvoudig_informatie_url, 'object': BESLUIT, 'objectType': ObjectTypes.besluit, } # Send to the API response = self.client.post(self.list_url, content) # Test response self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) # transaction must be rolled back self.assertFalse(ObjectInformatieObject.objects.exists())
def test_update_zaak(self): eo = EnkelvoudigInformatieObjectFactory.create() zio = ObjectInformatieObjectFactory.create(is_zaak=True) eo_detail_url = reverse('enkelvoudiginformatieobject-detail', kwargs={ 'version': '1', 'uuid': eo.uuid, }) zio_detail_url = reverse('objectinformatieobject-detail', kwargs={ 'version': '1', 'uuid': zio.uuid, }) response = self.client.patch( zio_detail_url, { 'object': 'https://something.different', 'informatieobject': eo_detail_url, 'objectType': ObjectTypes.besluit, }) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data) for field in ['object', 'informatieobject', 'objectType']: with self.subTest(field=field): error = get_validation_errors(response, field) self.assertEqual(error['code'], IsImmutableValidator.code)
def test_registratiedatum_ignored(self): enkelvoudig_informatie = EnkelvoudigInformatieObjectFactory.create() enkelvoudig_informatie_url = reverse( 'enkelvoudiginformatieobject-detail', kwargs={ 'version': '1', 'uuid': enkelvoudig_informatie.uuid, }) content = { 'informatieobject': 'http://testserver' + enkelvoudig_informatie_url, 'object': ZAAK, 'objectType': ObjectTypes.zaak, 'registratiedatum': '2018-09-19T12:25:20+0200', } # Send to the API self.client.post(self.list_url, content) oio = ObjectInformatieObject.objects.get() self.assertEqual( oio.registratiedatum, datetime(2018, 9, 20, 12, 0, 0).replace(tzinfo=timezone.utc))
def test_update_eio_status_definitief_forbidden(self, *mocks): eio = EnkelvoudigInformatieObjectFactory.create( beschrijving="beschrijving1", informatieobjecttype=INFORMATIEOBJECTTYPE, status=Statussen.definitief, ) eio_url = reverse("enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid}) eio_response = self.client.get(eio_url) eio_data = eio_response.data lock = self.client.post(f"{eio_url}/lock").data["lock"] eio_data.update({ "beschrijving": "beschrijving2", "inhoud": b64encode(b"aaaaa"), "bestandsomvang": 5, "lock": lock, }) for i in ["integriteit", "ondertekening"]: eio_data.pop(i) response = self.client.put(eio_url, eio_data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) error = get_validation_errors(response, "nonFieldErrors") self.assertEqual(error["code"], "modify-status-definitief")
def test_create_objectinformatieobject_audittrail(self): informatieobject = EnkelvoudigInformatieObjectFactory.create() content = { 'informatieobject': reverse('enkelvoudiginformatieobject-detail', kwargs={'uuid': informatieobject.uuid}), 'object': ZAAK, 'objectType': ObjectTypes.zaak, } # Send to the API objectinformatieobject_response = self.client.post( self.objectinformatieobject_list_url, content).data informatieobject_url = objectinformatieobject_response[ 'informatieobject'] audittrails = AuditTrail.objects.filter( hoofd_object=informatieobject_url) self.assertEqual(audittrails.count(), 1) # Verify that the audittrail for the ObjectInformatieObject creation # contains the correct information objectinformatieobject_create_audittrail = audittrails.get() self.assertEqual(objectinformatieobject_create_audittrail.bron, 'DRC') self.assertEqual(objectinformatieobject_create_audittrail.actie, 'create') self.assertEqual(objectinformatieobject_create_audittrail.resultaat, 201) self.assertEqual(objectinformatieobject_create_audittrail.oud, None) self.assertEqual(objectinformatieobject_create_audittrail.nieuw, objectinformatieobject_response)
def test_create(self): enkelvoudig_informatie = EnkelvoudigInformatieObjectFactory.create() enkelvoudig_informatie_url = reverse( 'enkelvoudiginformatieobject-detail', kwargs={ 'version': '1', 'uuid': enkelvoudig_informatie.uuid, }) content = { 'zaak': ZAAK, 'informatieobject': 'http://testserver' + enkelvoudig_informatie_url, } # Send to the API response = self.client.post(self.list_url, content) # Test response self.assertEqual(response.status_code, status.HTTP_201_CREATED) # Test database self.assertEqual(ZaakInformatieObject.objects.count(), 1) stored_object = ZaakInformatieObject.objects.get() self.assertEqual(stored_object.zaak, ZAAK) expected_url = reverse('zaakinformatieobject-detail', kwargs={ 'version': '1', 'uuid': stored_object.uuid, }) expected_response = content.copy() expected_response['url'] = f'http://testserver{expected_url}' self.assertEqual(response.json(), expected_response)
def test_eio_partial_update(self): eio = EnkelvoudigInformatieObjectFactory.create(beschrijving="beschrijving1") eio_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid} ) lock = self.client.post(f"{eio_url}/lock").data["lock"] response = self.client.patch( eio_url, {"beschrijving": "beschrijving2", "lock": lock} ) self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = response.json() self.assertEqual(response_data["beschrijving"], "beschrijving2") eios = EnkelvoudigInformatieObject.objects.filter(uuid=eio.uuid).order_by( "-versie" ) self.assertEqual(len(eios), 2) latest_version = eios.first() self.assertEqual(latest_version.versie, 2) self.assertEqual(latest_version.beschrijving, "beschrijving2") first_version = eios[1] self.assertEqual(first_version.versie, 1) self.assertEqual(first_version.beschrijving, "beschrijving1")
def test_destroy_no_relations_allowed(self): """ Assert that destroying is possible when there are no relations. """ eio = EnkelvoudigInformatieObjectFactory.create() url = reverse(eio) response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
def test_read_detail_file(self): self.autorisatie.scopes = [SCOPE_DOCUMENTEN_ALLES_LEZEN] self.autorisatie.save() eio = EnkelvoudigInformatieObjectFactory.create(informatieobjecttype=INFORMATIEOBJECTTYPE) file_url = get_operation_url('enkelvoudiginformatieobject_download', uuid=eio.uuid) response = self.client.get(file_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.content.decode("utf-8"), 'some data')
def test_update_eio_put(self): """ Test the full update process of the document Input: * lock document * update inhoud with another base64 encoded file * update all other fields Expected result: * new version of document created during lock * file link has another version * file link points to the new file * bestandsdelen objects are not created """ eio = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype=INFORMATIEOBJECTTYPE ) detail_url = reverse(eio) lock_url = get_operation_url("enkelvoudiginformatieobject_lock", uuid=eio.uuid) # lock response_lock = self.client.post(lock_url) lock = response_lock.json()["lock"] # get data eio_response = self.client.get(detail_url) eio_data = eio_response.data # update eio_data.update( { "beschrijving": "beschrijving2", "inhoud": b64encode(b"aaaaa"), "bestandsomvang": 5, "lock": lock, } ) for i in ["integriteit", "ondertekening"]: eio_data.pop(i) response = self.client.put(detail_url, eio_data) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() eio_new = eio.canonical.latest_version file_url = get_operation_url( "enkelvoudiginformatieobject_download", uuid=eio_new.uuid ) self.assertEqual(eio.canonical.bestandsdelen.count(), 0) self.assertEqual(data["inhoud"], f"http://testserver{file_url}?versie=2") self.assertEqual(eio_new.inhoud.file.read(), b"aaaaa")
def test_eio_detail_filter_by_wrong_registratie_op_gives_404(self): eio = EnkelvoudigInformatieObjectFactory.create(beschrijving="beschrijving1") eio_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid} ) lock = self.client.post(f"{eio_url}/lock").data["lock"] self.client.patch(eio_url, {"beschrijving": "beschrijving2", "lock": lock}) response = self.client.get(eio_url, {"registratieOp": "2019-01-01T11:59:00"}) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
def test_read(self): test_object = EnkelvoudigInformatieObjectFactory.create( informatieobjecttype=INFORMATIEOBJECTTYPE ) # Retrieve from the API detail_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"version": "1", "uuid": test_object.uuid}, ) response = self.client.get(detail_url) # Test response self.assertEqual(response.status_code, status.HTTP_200_OK) file_url = get_operation_url( "enkelvoudiginformatieobject_download", uuid=test_object.uuid ) expected = { "url": f"http://testserver{detail_url}", "identificatie": test_object.identificatie, "bronorganisatie": test_object.bronorganisatie, "creatiedatum": "2018-06-27", "titel": "some titel", "auteur": "some auteur", "status": "", "formaat": "some formaat", "taal": "nld", "beginRegistratie": test_object.begin_registratie.isoformat().replace( "+00:00", "Z" ), "versie": 1, "bestandsnaam": "", "inhoud": f"http://testserver{file_url}?versie=1", "bestandsomvang": test_object.inhoud.size, "link": "", "beschrijving": "", "ontvangstdatum": None, "verzenddatum": None, "ondertekening": {"soort": "", "datum": None}, "indicatieGebruiksrecht": None, "vertrouwelijkheidaanduiding": "openbaar", "integriteit": {"algoritme": "", "waarde": "", "datum": None}, "informatieobjecttype": INFORMATIEOBJECTTYPE, "locked": False, "bestandsdelen": [], } response_data = response.json() self.assertEqual(sorted(response_data.keys()), sorted(expected.keys())) for key in response_data.keys(): with self.subTest(field=key): self.assertEqual(response_data[key], expected[key])
def test_eio_download_with_accept_application_octet_stream_header(self): eio = EnkelvoudigInformatieObjectFactory.create( beschrijving="beschrijving1", inhoud__data=b"inhoud1" ) eio_url = get_operation_url( "enkelvoudiginformatieobject_download", uuid=eio.uuid ) response = self.client.get(eio_url, HTTP_ACCEPT="application/octet-stream") self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_eio_detail_filter_by_version(self): eio = EnkelvoudigInformatieObjectFactory.create(beschrijving="beschrijving1") eio_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid} ) lock = self.client.post(f"{eio_url}/lock").data["lock"] self.client.patch(eio_url, {"beschrijving": "beschrijving2", "lock": lock}) response = self.client.get(eio_url, {"versie": 1}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["beschrijving"], "beschrijving1")
def test_eio_delete(self): eio = EnkelvoudigInformatieObjectFactory.create(beschrijving="beschrijving1") eio_url = reverse( "enkelvoudiginformatieobject-detail", kwargs={"uuid": eio.uuid} ) lock = self.client.post(f"{eio_url}/lock").data["lock"] self.client.patch(eio_url, {"beschrijving": "beschrijving2", "lock": lock}) response = self.client.delete(eio_url) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertFalse(EnkelvoudigInformatieObjectCanonical.objects.exists()) self.assertFalse(EnkelvoudigInformatieObject.objects.exists())