Beispiel #1
0
    def test_besluit_create_fail_besluittype_max_length(self):
        zaak = ZaakFactory.create(zaaktype__concept=False)
        zaak_url = reverse(zaak)

        url = get_operation_url("besluit_create")

        response = self.client.post(
            url,
            {
                "verantwoordelijke_organisatie": "517439943",  # RSIN
                "identificatie": "123123",
                "besluittype": f"http://testserver/{'x'*1000}",
                "zaak": f"http://testserver{zaak_url}",
                "datum": "2018-09-06",
                "toelichting": "Vergunning verleend.",
                "ingangsdatum": "2018-10-01",
                "vervaldatum": "2018-11-01",
                "vervalreden": VervalRedenen.tijdelijk,
            },
        )

        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST,
                         response.data)

        max_length_errors = [
            e for e in response.data["invalid_params"]
            if e["name"] == "besluittype" and e["code"] == "max_length"
        ]
        self.assertEqual(len(max_length_errors), 1)
Beispiel #2
0
    def create_zaak(self, **kwargs):
        from openzaak.components.zaken.tests.factories import ZaakFactory
        from openzaak.tests.utils import mock_service_oas_get

        zaak = ZaakFactory.create(**kwargs)

        mock_service_oas_get(self.adapter, APITypes.zrc, self.base_zaak)
        mock_service_oas_get(self.adapter, APITypes.ztc, self.base_zaaktype)

        if kwargs.get("zaaktype") is not None and isinstance(
                kwargs.get("zaaktype"), str):
            zaaktype_url = kwargs.get("zaaktype")
            zaaktype_identificatie = zaaktype_url.split("/")[-1]
        else:
            zaaktype_url = make_absolute_uri(reverse(zaak.zaaktype))
            zaaktype_identificatie = zaak.zaaktype.identificatie

        self.adapter.get(
            make_absolute_uri(reverse(zaak)),
            json={
                "url": make_absolute_uri(reverse(zaak)),
                "identificatie": zaak.identificatie,
                "zaaktype": zaaktype_url,
            },
        )

        self.adapter.get(
            zaaktype_url,
            json={
                "url": zaaktype_url,
                "identificatie": zaaktype_identificatie,
                "omschrijving": "Melding Openbare Ruimte",
            },
        )
        return zaak
Beispiel #3
0
    def test_oio_retrieve(self):
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        eio1_url = f"http://testserver{reverse(eio1)}"
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1_url, zaak=zaak, object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=
            "https://externe.catalogus.nl/api/v1/informatieobjecttypen/1",
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        eio2_url = f"http://testserver{reverse(eio2)}"
        oio2 = ObjectInformatieObject.objects.create(
            informatieobject=eio2_url, zaak=zaak, object_type=ObjectTypes.zaak)
        url1 = reverse(oio1)
        url2 = reverse(oio2)

        response1 = self.client.get(url1)
        response2 = self.client.get(url2)

        self.assertEqual(response1.status_code, status.HTTP_200_OK)
        self.assertEqual(response2.status_code, status.HTTP_403_FORBIDDEN)
    def test_create_with_objecttype_zaak(self):
        zaak = ZaakFactory.create()
        eio = EnkelvoudigInformatieObjectFactory.create()
        eio_path = reverse(eio)
        eio_url = f"http://testserver{eio_path}"
        # relate the two
        ZaakInformatieObjectFactory.create(zaak=zaak, informatieobject=eio.canonical)

        # get OIO created via signals
        ObjectInformatieObject.objects.get()

        zaak_url = reverse(zaak)

        response = self.client.post(
            self.list_url,
            {
                "object": f"http://testserver{zaak_url}",
                "informatieobject": eio_url,
                "objectType": "zaak",
            },
        )

        self.assertEqual(
            response.status_code, status.HTTP_400_BAD_REQUEST, response.data
        )

        error = get_validation_errors(response, "nonFieldErrors")
        self.assertEqual(error["code"], "unique")
    def test_create_with_objecttype_zaak(self):
        zaak = ZaakFactory.create()
        eio = EnkelvoudigInformatieObjectFactory.create()
        # relate the two
        ZaakInformatieObjectFactory.create(zaak=zaak,
                                           informatieobject=eio.canonical)

        # get OIO created via signals
        oio = ObjectInformatieObject.objects.get()

        zaak_url = reverse(zaak)
        eio_url = reverse(eio)
        oio_url = reverse("objectinformatieobject-detail",
                          kwargs={"uuid": oio.uuid})

        response = self.client.post(
            self.list_url,
            {
                "object": f"http://testserver{zaak_url}",
                "informatieobject": f"http://testserver{eio_url}",
                "objectType": "zaak",
            },
        )

        self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                         response.data)
        self.assertEqual(
            response.data,
            {
                "url": f"http://testserver{oio_url}",
                "informatieobject": f"http://testserver{eio_url}",
                "object": f"http://testserver{zaak_url}",
                "object_type": "zaak",
            },
        )
Beispiel #6
0
    def test_oio_list(self):
        url = reverse("objectinformatieobject-list")
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        eio1_url = f"http://testserver{reverse(eio1)}"
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1_url, zaak=zaak, object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=
            "https://externe.catalogus.nl/api/v1/informatieobjecttypen/1",
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )

        eio2_url = f"http://testserver{reverse(eio2)}"
        ObjectInformatieObject.objects.create(informatieobject=eio2_url,
                                              zaak=zaak,
                                              object_type=ObjectTypes.zaak)

        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

        response_data = response.json()

        self.assertEqual(len(response_data), 1)
        self.assertEqual(response_data[0]["url"],
                         f"http://testserver{reverse(oio1)}")
Beispiel #7
0
    def test_oio_retrieve(self):
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=IOTYPE_EXTERNAL,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        oio2 = ObjectInformatieObject.objects.create(
            informatieobject=eio2.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)
        url1 = reverse(oio1)
        url2 = reverse(oio2)

        response1 = self.client.get(url1)
        response2 = self.client.get(url2)

        self.assertEqual(response1.status_code, status.HTTP_200_OK)
        self.assertEqual(response2.status_code, status.HTTP_403_FORBIDDEN)
    def test_read_with_objecttype_zaak(self):
        zaak = ZaakFactory.create()
        eio = EnkelvoudigInformatieObjectFactory.create()
        eio_path = reverse(eio)
        eio_url = f"http://testserver{eio_path}"
        # relate the two
        ZaakInformatieObjectFactory.create(zaak=zaak, informatieobject=eio.canonical)

        # get OIO created via signals
        oio = ObjectInformatieObject.objects.get()

        oio_url = reverse("objectinformatieobject-detail", kwargs={"uuid": oio.uuid})
        zaak_url = reverse(zaak)

        response = self.client.get(oio_url)

        expeceted_response_data = {
            "url": f"http://testserver{oio_url}",
            "object": f"http://testserver{zaak_url}",
            "informatieobject": eio_url,
            "object_type": "zaak",
        }

        self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
        self.assertEqual(response.data, expeceted_response_data)
Beispiel #9
0
    def test_not_both_zaak_besluit(self):
        zaak = ZaakFactory.create()
        besluit = BesluitFactory.create()

        with self.assertRaises(IntegrityError):
            ObjectInformatieObject.objects.create(
                informatieobject=self.eio_url, zaak=zaak, besluit=besluit)
Beispiel #10
0
    def test_relation_with_non_published_zaaktype(self):
        zaak = ZaakFactory.create(zaaktype__concept=True)
        zaak_url = reverse(zaak)
        besluittype = BesluitTypeFactory.create()
        besluittype_url = reverse(besluittype)
        besluittype.zaaktypes.add(zaak.zaaktype)
        list_url = reverse("besluit-list")

        response = self.client.post(
            list_url,
            {
                "verantwoordelijkeOrganisatie": "000000000",
                "identificatie": "123456",
                "besluittype": f"http://testserver{besluittype_url}",
                "zaak": f"http://testserver{zaak_url}",
                "datum": "2018-09-06",
                "ingangsdatum": "2018-10-01",
            },
        )

        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST,
                         response.data)

        error = get_validation_errors(response, "nonFieldErrors")
        self.assertEqual(error["code"], "zaaktype-mismatch")
Beispiel #11
0
    def test_oio_list(self):
        url = reverse("objectinformatieobject-list")
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=IOTYPE_EXTERNAL,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        ObjectInformatieObject.objects.create(informatieobject=eio2.canonical,
                                              zaak=zaak,
                                              object_type=ObjectTypes.zaak)

        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)

        response_data = response.json()

        self.assertEqual(len(response_data), 1)
        self.assertEqual(response_data[0]["url"],
                         f"http://testserver{reverse(oio1)}")
    def test_post_object_without_created_relations(self):
        """
        Test the (informatieobject, object) unique together validation.

        This is expected to fail, since there is no actual creation in database.
        It will however become relevant again when we're handling remote
        references.
        """
        zaak = ZaakFactory.create()
        eio = EnkelvoudigInformatieObjectFactory.create()
        zaak_url = reverse(zaak)
        eio_url = reverse(eio)

        content = {
            "informatieobject": f"http://testserver{eio_url}",
            "object": f"http://testserver{zaak_url}",
            "objectType": ObjectTypes.zaak,
        }

        # Send to the API
        response = self.client.post(self.list_url, content)

        self.assertEqual(
            response.status_code, status.HTTP_400_BAD_REQUEST, response.data
        )

        error = get_validation_errors(response, "nonFieldErrors")
        self.assertEqual(error["code"], "inconsistent-relation")
    def test_zaak_local(self):
        besluit = BesluitFactory.create(for_zaak=True)

        zaak_before = besluit.zaak
        zaak_after = ZaakFactory.create()
        besluit.zaak = zaak_after
        besluit.save()

        self.assertEqual(besluit.previous_zaak, zaak_before)
Beispiel #14
0
    def test_bulk_create(self):
        canonical = EnkelvoudigInformatieObjectCanonicalFactory.create()
        zaak = ZaakFactory.create()
        oio = ObjectInformatieObject(informatieobject=canonical,
                                     zaak=zaak,
                                     object_type="zaak")

        self.assertRaises(QueryBlocked,
                          ObjectInformatieObject.objects.bulk_create, [oio])
Beispiel #15
0
    def test_detail_oio_limited_to_authorized_zaken(self):
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.
            vertrouwelijk,
        )
        oio2 = ObjectInformatieObject.objects.create(
            informatieobject=eio2.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)

        # must not show up
        eio3 = EnkelvoudigInformatieObjectFactory.create(
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar)
        oio3 = ObjectInformatieObject.objects.create(
            informatieobject=eio3.canonical,
            zaak=zaak,
            object_type=ObjectTypes.zaak)

        with self.subTest(
                informatieobjecttype=oio1.informatieobject.latest_version.
                informatieobjecttype,
                vertrouwelijkheidaanduiding=oio1.informatieobject.
                latest_version.vertrouwelijkheidaanduiding,
        ):
            url = reverse(oio1)

            response = self.client.get(url)

            self.assertEqual(response.status_code, status.HTTP_200_OK)

        # not allowed to see these
        for oio in (oio2, oio3):
            with self.subTest(
                    informatieobjecttype=oio.informatieobject.latest_version.
                    informatieobjecttype,
                    vertrouwelijkheidaanduiding=oio.informatieobject.
                    latest_version.vertrouwelijkheidaanduiding,
            ):
                url = reverse(oio)

                response = self.client.get(url)

                self.assertEqual(response.status_code,
                                 status.HTTP_403_FORBIDDEN)
Beispiel #16
0
    def test_not_both_zaak_besluit(self):
        canonical = EnkelvoudigInformatieObjectCanonicalFactory.create()
        zaak = ZaakFactory.create()
        besluit = BesluitFactory.create()

        with self.assertRaises(IntegrityError):
            ObjectInformatieObject.objects.create(
                informatieobject=canonical, zaak=zaak, besluit=besluit
            )
    def test_zaaktype_detail_external_besluit_not_available(self):
        zaak = ZaakFactory.create()
        ZaakBesluit.objects.create(zaak=zaak, _besluit_url="http://bla.com/404")

        url = reverse("admin:zaken_zaak_change", args=(zaak.pk,))

        with requests_mock.Mocker() as m:
            m.get("http://bla.com/404", status_code=404, json={})
            response = self.app.get(url)

        self.assertEqual(response.status_code, 200)

        self.assertIn("http://bla.com/404", response.text)
    def test_oio(self):
        zaak = ZaakFactory.create(identificatie="12345")
        eio = EnkelvoudigInformatieObjectFactory.create(
            bronorganisatie=730924658,
            identificatie="5d940d52-ff5e-4b18-a769-977af9130c04",
        )
        oio = ObjectInformatieObject.objects.create(
            zaak=zaak, object_type="zaak", informatieobject=eio.canonical)

        self.assertEqual(
            oio.unique_representation(),
            "(730924658 - 5d940d52-ff5e-4b18-a769-977af9130c04) - 12345",
        )
Beispiel #19
0
    def test_detail_oio_limited_to_authorized_zaken_cmis(self):
        zaak = ZaakFactory.create()
        # must show up
        eio1 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar,
        )
        eio1_url = f"http://testserver{reverse(eio1)}"
        oio1 = ObjectInformatieObject.objects.create(
            informatieobject=eio1_url, zaak=zaak, object_type=ObjectTypes.zaak)

        # must not show up
        eio2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype=self.informatieobjecttype,
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.
            vertrouwelijk,
        )
        eio2_url = f"http://testserver{reverse(eio2)}"
        oio2 = ObjectInformatieObject.objects.create(
            informatieobject=eio2_url, zaak=zaak, object_type=ObjectTypes.zaak)

        # must not show up
        eio3 = EnkelvoudigInformatieObjectFactory.create(
            vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.openbaar)
        eio3_url = f"http://testserver{reverse(eio3)}"
        oio3 = ObjectInformatieObject.objects.create(
            informatieobject=eio3_url, zaak=zaak, object_type=ObjectTypes.zaak)

        with self.subTest(
                informatieobjecttype=eio1.informatieobjecttype,
                vertrouwelijkheidaanduiding=eio1.vertrouwelijkheidaanduiding,
        ):
            url = reverse(oio1)

            response = self.client.get(url)

            self.assertEqual(response.status_code, status.HTTP_200_OK)

        # not allowed to see these
        for oio, eio in ((oio2, eio2), (oio3, eio3)):
            with self.subTest(
                    informatieobjecttype=eio.informatieobjecttype,
                    vertrouwelijkheidaanduiding=eio.
                    vertrouwelijkheidaanduiding,
            ):
                url = reverse(oio)

                response = self.client.get(url)

                self.assertEqual(response.status_code,
                                 status.HTTP_403_FORBIDDEN)
Beispiel #20
0
    def test_oio(self):
        zaak = ZaakFactory.create(identificatie="12345")
        eio = EnkelvoudigInformatieObjectFactory.create(
            bronorganisatie=730924658,
            identificatie="5d940d52-ff5e-4b18-a769-977af9130c04",
        )
        eio_url = f"http://testserver{reverse(eio)}"

        oio = ObjectInformatieObject.objects.create(informatieobject=eio_url,
                                                    zaak=zaak,
                                                    object_type="zaak")

        self.assertEqual(
            oio.unique_representation(),
            "(730924658 - 5d940d52-ff5e-4b18-a769-977af9130c04) - 12345",
        )
    def test_zaaktype_detail_external_io_not_available(self):
        zaak = ZaakFactory.create()
        zio = ZaakInformatieObjectFactory.create(zaak=zaak)
        zio._informatieobject = None
        zio._informatieobject_url = "http://bla.com/404"
        zio.save()

        url = reverse("admin:zaken_zaak_change", args=(zaak.pk,))

        with requests_mock.Mocker() as m:
            m.get("http://bla.com/404", status_code=404, json={})
            response = self.app.get(url)

        self.assertEqual(response.status_code, 200)

        self.assertIn("http://bla.com/404", response.text)
Beispiel #22
0
    def test_zaaktype_besluittype_relation(self):
        besluittype = BesluitTypeFactory.create()
        besluittype_url = reverse(besluittype)
        zaak = ZaakFactory.create(zaaktype__concept=False)
        zaak_url = reverse(zaak)
        besluittype.zaaktypes.add(zaak.zaaktype)
        list_url = reverse("besluit-list")

        response = self.client.post(
            list_url,
            {
                "verantwoordelijkeOrganisatie": "000000000",
                "identificatie": "123456",
                "besluittype": f"http://testserver{besluittype_url}",
                "zaak": f"http://testserver{zaak_url}",
                "datum": "2018-09-06",
                "ingangsdatum": "2018-10-01",
            },
        )

        self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                         response.data)
Beispiel #23
0
    def test_validate_no_informatieobjecttype_zaaktype_relation(self):
        zaak = ZaakFactory.create()
        besluit = BesluitFactory.create(zaak=zaak)
        besluit_url = reverse(besluit)
        io = EnkelvoudigInformatieObjectFactory.create()
        io_url = reverse(io)

        url = reverse("besluitinformatieobject-list")

        response = self.client.post(
            url,
            {
                "besluit": f"http://testserver{besluit_url}",
                "informatieobject": f"http://testserver{io_url}",
            },
        )

        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

        error = get_validation_errors(response, "nonFieldErrors")
        self.assertEqual(error["code"],
                         "missing-zaaktype-informatieobjecttype-relation")
    def test_create_new_version(self, m):
        mock_oas_get(m)
        mock_resource_list(m, "procestypen")
        mock_nrc_oas_get(m)
        m.post("https://notificaties-api.vng.cloud/api/v1/notificaties",
               status_code=201)

        zaaktype_old = ZaakTypeFactory.create(
            zaaktype_omschrijving="test",
            vertrouwelijkheidaanduiding="openbaar",
            trefwoorden=["test"],
            verantwoordingsrelatie=["bla"],
        )
        # reverse fk relations
        statustype_old = StatusTypeFactory.create(zaaktype=zaaktype_old)
        resultaattypeomschrijving = "https://example.com/resultaattypeomschrijving/1"
        m.register_uri("GET",
                       resultaattypeomschrijving,
                       json={"omschrijving": "init"})
        resultaattype_old = ResultaatTypeFactory.create(
            zaaktype=zaaktype_old,
            resultaattypeomschrijving=resultaattypeomschrijving)
        roltype_old = RolTypeFactory.create(zaaktype=zaaktype_old)
        eigenschap_old = EigenschapFactory.create(zaaktype=zaaktype_old)
        zaaktypenrelatie_old = ZaakTypenRelatieFactory.create(
            zaaktype=zaaktype_old)
        # m2m relations
        besluittype = BesluitTypeFactory.create(zaaktypen=[zaaktype_old])
        informatieobjecttype = ZaakTypeInformatieObjectTypeFactory.create(
            zaaktype=zaaktype_old).informatieobjecttype
        # not copied
        ZaakFactory.create(zaaktype=zaaktype_old)
        url = reverse("admin:catalogi_zaaktype_change",
                      args=(zaaktype_old.pk, ))

        get_response = self.app.get(url)

        form = get_response.form
        form["datum_einde_geldigheid"] = "2019-01-01"

        with capture_on_commit_callbacks(execute=True):
            post_response = form.submit("_addversion")

        zaaktype_old.refresh_from_db()

        self.assertEqual(zaaktype_old.datum_einde_geldigheid, date(2019, 1, 1))

        zaaktype_new = ZaakType.objects.exclude(pk=zaaktype_old.pk).get()

        # check that the new zaak has the same identificator
        self.assertEqual(zaaktype_new.identificatie,
                         zaaktype_old.identificatie)
        # check version dates
        self.assertEqual(zaaktype_new.datum_einde_geldigheid, None)
        self.assertEqual(zaaktype_new.datum_begin_geldigheid,
                         date(2019, 11, 1))
        self.assertEqual(zaaktype_new.versiedatum, date(2019, 11, 1))
        self.assertTrue(zaaktype_new.concept)
        # response redirect to correct page
        self.assertEqual(
            post_response.location,
            reverse("admin:catalogi_zaaktype_change",
                    args=(zaaktype_new.pk, )),
        )

        # assert the new relations are created
        self.assertNotEqual(zaaktype_new.statustypen.get().id,
                            statustype_old.id)
        self.assertNotEqual(zaaktype_new.resultaattypen.get().id,
                            resultaattype_old.id)
        self.assertNotEqual(zaaktype_new.roltype_set.get().id, roltype_old.id)
        self.assertNotEqual(zaaktype_new.eigenschap_set.get().id,
                            eigenschap_old.id)
        self.assertNotEqual(zaaktype_new.zaaktypenrelaties.get().id,
                            zaaktypenrelatie_old.id)
        # assert m2m relations are saved
        self.assertEqual(zaaktype_new.besluittypen.get().id, besluittype.id)
        self.assertEqual(zaaktype_new.informatieobjecttypen.get().id,
                         informatieobjecttype.id)
        # assert new zaken are not created
        self.assertEqual(zaaktype_new.zaak_set.count(), 0)

        # Verify notification is sent
        called_urls = [item.url for item in m.request_history]
        self.assertIn("https://notificaties-api.vng.cloud/api/v1/notificaties",
                      called_urls)
    def test_create_new_version(self, m):
        mock_oas_get(m)
        mock_resource_list(m, "procestypen")

        zaaktype_old = ZaakTypeFactory.create(
            zaaktype_omschrijving="test",
            vertrouwelijkheidaanduiding="openbaar",
            trefwoorden=["test"],
            verantwoordingsrelatie=["bla"],
        )
        # reverse fk relations
        statustype_old = StatusTypeFactory.create(zaaktype=zaaktype_old)
        resultaattype_old = ResultaatTypeFactory.create(zaaktype=zaaktype_old)
        roltype_old = RolTypeFactory.create(zaaktype=zaaktype_old)
        eigenschap_old = EigenschapFactory.create(zaaktype=zaaktype_old)
        zaaktypenrelatie_old = ZaakTypenRelatieFactory.create(
            zaaktype=zaaktype_old)
        # m2m relations
        besluittype = BesluitTypeFactory.create(zaaktypen=[zaaktype_old])
        informatieobjecttype = ZaakTypeInformatieObjectTypeFactory.create(
            zaaktype=zaaktype_old).informatieobjecttype
        # not copied
        ZaakFactory.create(zaaktype=zaaktype_old)
        url = reverse("admin:catalogi_zaaktype_change",
                      args=(zaaktype_old.pk, ))

        get_response = self.app.get(url)

        form = get_response.form
        form["datum_einde_geldigheid"] = "2019-01-01"

        post_response = form.submit("_addversion")

        zaaktype_old.refresh_from_db()

        self.assertEqual(zaaktype_old.datum_einde_geldigheid, date(2019, 1, 1))

        zaaktype_new = ZaakType.objects.exclude(pk=zaaktype_old.pk).get()

        # check that the new zaak has the same identificator
        self.assertEqual(zaaktype_new.identificatie,
                         zaaktype_old.identificatie)
        # check version dates
        self.assertEqual(zaaktype_new.datum_einde_geldigheid, None)
        self.assertEqual(zaaktype_new.datum_begin_geldigheid,
                         date(2019, 11, 1))
        self.assertEqual(zaaktype_new.versiedatum, date(2019, 11, 1))
        self.assertTrue(zaaktype_new.concept)
        # response redirect to correct page
        self.assertEqual(
            post_response.location,
            reverse("admin:catalogi_zaaktype_change",
                    args=(zaaktype_new.pk, )),
        )

        # assert the new relations are created
        self.assertNotEqual(zaaktype_new.statustypen.get().id,
                            statustype_old.id)
        self.assertNotEqual(zaaktype_new.resultaattypen.get().id,
                            resultaattype_old.id)
        self.assertNotEqual(zaaktype_new.roltype_set.get().id, roltype_old.id)
        self.assertNotEqual(zaaktype_new.eigenschap_set.get().id,
                            eigenschap_old.id)
        self.assertNotEqual(zaaktype_new.zaaktypenrelaties.get().id,
                            zaaktypenrelatie_old.id)
        # assert m2m relations are saved
        self.assertEqual(zaaktype_new.besluittypen.get().id, besluittype.id)
        self.assertEqual(zaaktype_new.informatieobjecttypen.get().id,
                         informatieobjecttype.id)
        # assert new zaken are not created
        self.assertEqual(zaaktype_new.zaak_set.count(), 0)
    def test_us162_voeg_besluit_toe_aan_zaak(self):
        zaak = ZaakFactory.create(zaaktype__concept=False)
        zaak_url = reverse(zaak)
        besluittype = BesluitTypeFactory.create(concept=False)
        besluittype_url = reverse(besluittype)
        besluittype.zaaktypen.add(zaak.zaaktype)
        io = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype__concept=False)
        io_url = reverse(io)
        self.adapter.get(io_url, json=serialise_eio(io, io_url))
        besluittype.informatieobjecttypen.add(io.informatieobjecttype)

        with self.subTest(part="besluit_create"):
            url = get_operation_url("besluit_create")

            response = self.client.post(
                url,
                {
                    "verantwoordelijke_organisatie": "517439943",  # RSIN
                    "identificatie": "123123",
                    "besluittype": f"http://testserver{besluittype_url}",
                    "zaak": f"http://testserver{zaak_url}",
                    "datum": "2018-09-06",
                    "toelichting": "Vergunning verleend.",
                    "ingangsdatum": "2018-10-01",
                    "vervaldatum": "2018-11-01",
                    "vervalreden": VervalRedenen.tijdelijk,
                },
            )

            self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                             response.data)
            self.assertResponseTypes(
                response.data,
                (
                    ("url", str),
                    ("identificatie", str),
                    ("verantwoordelijke_organisatie", str),
                    ("besluittype", str),
                    ("zaak", str),
                    ("datum", str),
                    ("toelichting", str),
                    ("bestuursorgaan", str),
                    ("ingangsdatum", str),
                    ("vervaldatum", str),
                    ("vervalreden", str),
                    ("publicatiedatum", type(None)),
                    ("verzenddatum", type(None)),
                    ("uiterlijke_reactiedatum", type(None)),
                ),
            )

            self.assertEqual(Besluit.objects.count(), 1)

            besluit = Besluit.objects.get()
            self.assertEqual(besluit.verantwoordelijke_organisatie,
                             "517439943")
            self.assertEqual(besluit.besluittype, besluittype)
            self.assertEqual(besluit.zaak, zaak)
            self.assertEqual(besluit.datum, date(2018, 9, 6))
            self.assertEqual(besluit.toelichting, "Vergunning verleend.")
            self.assertEqual(besluit.ingangsdatum, date(2018, 10, 1))
            self.assertEqual(besluit.vervaldatum, date(2018, 11, 1))
            self.assertEqual(besluit.vervalreden, VervalRedenen.tijdelijk)

        with self.subTest(part="besluitinformatieobject_create"):
            url = get_operation_url("besluitinformatieobject_create")

            response = self.client.post(
                url,
                {
                    "besluit": reverse(besluit),
                    "informatieobject": f"http://testserver{io_url}",
                },
            )

            self.assertEqual(response.status_code, status.HTTP_201_CREATED,
                             response.data)
            self.assertResponseTypes(response.data,
                                     (("url", str), ("informatieobject", str)))

            self.assertEqual(besluit.besluitinformatieobject_set.count(), 1)

            self.assertEqual(
                besluit.besluitinformatieobject_set.get().informatieobject.
                uuid, io.uuid)