Skip to content

Commit 77fd21b

Browse files
authored
Merge pull request #552 from maykinmedia/feature/549-Update-the-DELETE-action-on-onderwerpobject
✨ [#549] Update the DELETE action on onderwerpobject
2 parents 4128959 + f5ac4b0 commit 77fd21b

File tree

6 files changed

+483
-24
lines changed

6 files changed

+483
-24
lines changed

docs/installation/observability/logging.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ API
171171
Additional context: ``uuid``, ``partij_uuid``, ``klantcontact_uuid``, ``token_identifier``, ``token_application``.
172172
* ``onderwerpobject_created`` / ``onderwerpobject_updated`` / ``onderwerpobject_deleted``:
173173
CRUD events for ``Onderwerpobject``.
174-
Additional context: ``uuid``, ``klantcontact_uuid``, ``was_klantcontact_uuid``, ``token_identifier``, ``token_application``.
174+
Additional context: ``uuid``, ``klantcontact_uuid``, ``was_klantcontact_uuid``, ``token_identifier``, ``token_application``. Specific context for ``onderwerpobject_deleted``: ``cascade`` and ``remaining_klantcontacten``.
175175
* ``bijlage_created`` / ``bijlage_updated`` / ``bijlage_deleted``:
176176
CRUD events for ``Bijlage``.
177177
Additional context: ``uuid``, ``klantcontact_uuid``, ``token_identifier``, ``token_application``.

src/openklant/components/klantinteracties/api/tests/test_klantcontacten.py

Lines changed: 310 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,27 @@
33
from django.utils.translation import gettext as _
44

55
from rest_framework import status
6+
from structlog.testing import capture_logs
67
from vng_api_common.tests import reverse
78

89
from openklant.components.klantinteracties.models import (
10+
Actor,
11+
ActorKlantcontact,
912
Betrokkene,
13+
Bijlage,
14+
DigitaalAdres,
15+
InterneTaak,
1016
Klantcontact,
1117
Onderwerpobject,
18+
Taakstatus,
1219
)
1320
from openklant.components.klantinteracties.models.tests.factories import (
1421
ActorFactory,
1522
ActorKlantcontactFactory,
1623
BetrokkeneFactory,
1724
BijlageFactory,
1825
DigitaalAdresFactory,
26+
InterneTaakFactory,
1927
KlantcontactFactory,
2028
MedewerkerFactory,
2129
OnderwerpobjectFactory,
@@ -1652,19 +1660,312 @@ def test_filter_onderwerpobject_by_klantcontact_filters(self):
16521660
self.assertEqual(len(data["results"]), 1)
16531661
self.assertEqual(data["results"][0]["uuid"], str(obj.uuid))
16541662

1655-
def test_destroy_onderwerpobject(self):
1656-
onderwerpobject = OnderwerpobjectFactory.create()
1657-
detail_url = reverse(
1663+
def test_destroy_with_cascade_true(self):
1664+
klantcontact = KlantcontactFactory.create()
1665+
was_klantcontact = KlantcontactFactory.create()
1666+
1667+
onderwerpobject = OnderwerpobjectFactory.create(
1668+
klantcontact=klantcontact,
1669+
was_klantcontact=was_klantcontact,
1670+
)
1671+
1672+
url = reverse(
16581673
"klantinteracties:onderwerpobject-detail",
1659-
kwargs={"uuid": str(onderwerpobject.uuid)},
1674+
kwargs={"uuid": onderwerpobject.uuid},
16601675
)
1661-
response = self.client.delete(detail_url)
1676+
1677+
response = self.client.delete(f"{url}?cascade=true")
1678+
1679+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1680+
1681+
self.assertFalse(
1682+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1683+
)
1684+
1685+
self.assertFalse(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1686+
self.assertFalse(
1687+
Klantcontact.objects.filter(uuid=was_klantcontact.uuid).exists()
1688+
)
1689+
1690+
self.assertEqual(response.json(), {"behouden": []})
1691+
1692+
def test_destroy_with_cascade_false(self):
1693+
klantcontact = KlantcontactFactory.create()
1694+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1695+
1696+
url = reverse(
1697+
"klantinteracties:onderwerpobject-detail",
1698+
kwargs={"uuid": onderwerpobject.uuid},
1699+
)
1700+
1701+
response = self.client.delete(f"{url}?cascade=false")
1702+
16621703
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
16631704

1664-
list_url = reverse("klantinteracties:onderwerpobject-list")
1665-
response = self.client.get(list_url)
1666-
data = response.json()
1667-
self.assertEqual(data["count"], 0)
1705+
self.assertFalse(
1706+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1707+
)
1708+
1709+
self.assertTrue(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1710+
1711+
def test_destroy_with_cascade_shared_klantcontact(self):
1712+
shared_klantcontact = KlantcontactFactory.create()
1713+
shared_was_klantcontact = KlantcontactFactory.create()
1714+
1715+
onderwerpobject1 = OnderwerpobjectFactory.create(
1716+
klantcontact=shared_klantcontact,
1717+
was_klantcontact=shared_was_klantcontact,
1718+
)
1719+
onderwerpobject2 = OnderwerpobjectFactory.create(
1720+
klantcontact=shared_klantcontact,
1721+
was_klantcontact=shared_was_klantcontact,
1722+
)
1723+
1724+
url = reverse(
1725+
"klantinteracties:onderwerpobject-detail",
1726+
kwargs={"uuid": onderwerpobject1.uuid},
1727+
)
1728+
1729+
response = self.client.delete(f"{url}?cascade=true")
1730+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1731+
1732+
self.assertFalse(
1733+
Onderwerpobject.objects.filter(uuid=onderwerpobject1.uuid).exists()
1734+
)
1735+
self.assertTrue(
1736+
Klantcontact.objects.filter(uuid=shared_klantcontact.uuid).exists()
1737+
)
1738+
self.assertTrue(
1739+
Klantcontact.objects.filter(uuid=shared_was_klantcontact.uuid).exists()
1740+
)
1741+
1742+
self.assertTrue(
1743+
Onderwerpobject.objects.filter(uuid=onderwerpobject2.uuid).exists()
1744+
)
1745+
1746+
remaining_urls = response.json()["behouden"]
1747+
1748+
expected_urls = [
1749+
f"http://testserver{reverse('klantinteracties:klantcontact-detail', kwargs={'uuid': shared_klantcontact.uuid, 'version': '1'})}",
1750+
f"http://testserver{reverse('klantinteracties:klantcontact-detail', kwargs={'uuid': shared_was_klantcontact.uuid, 'version': '1'})}",
1751+
]
1752+
1753+
for url in expected_urls:
1754+
self.assertIn(url, remaining_urls)
1755+
1756+
def test_destroy_with_cascade_removes_betrokkene(self):
1757+
klantcontact = KlantcontactFactory.create()
1758+
betrokkene = BetrokkeneFactory.create(klantcontact=klantcontact)
1759+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1760+
1761+
url = reverse(
1762+
"klantinteracties:onderwerpobject-detail",
1763+
kwargs={"uuid": onderwerpobject.uuid},
1764+
)
1765+
response = self.client.delete(f"{url}?cascade=true")
1766+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1767+
1768+
self.assertFalse(
1769+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1770+
)
1771+
self.assertFalse(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1772+
1773+
self.assertFalse(Betrokkene.objects.filter(uuid=betrokkene.uuid).exists())
1774+
self.assertEqual(response.json(), {"behouden": []})
1775+
1776+
def test_digitaaladres_deleted_when_betrokkene_removed(self):
1777+
klantcontact = KlantcontactFactory.create()
1778+
betrokkene = BetrokkeneFactory.create(klantcontact=klantcontact)
1779+
1780+
digitaaladres = DigitaalAdresFactory.create(betrokkene=betrokkene, partij=None)
1781+
1782+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1783+
1784+
url = reverse(
1785+
"klantinteracties:onderwerpobject-detail",
1786+
kwargs={"uuid": onderwerpobject.uuid},
1787+
)
1788+
response = self.client.delete(f"{url}?cascade=true")
1789+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1790+
1791+
self.assertFalse(Betrokkene.objects.filter(uuid=betrokkene.uuid).exists())
1792+
1793+
self.assertFalse(DigitaalAdres.objects.filter(uuid=digitaaladres.uuid).exists())
1794+
1795+
def test_digitaaladres_not_deleted_if_linked_to_partij(self):
1796+
klantcontact = KlantcontactFactory.create()
1797+
betrokkene = BetrokkeneFactory.create(klantcontact=klantcontact)
1798+
1799+
partij = PartijFactory.create()
1800+
digitaaladres = DigitaalAdresFactory.create(
1801+
betrokkene=betrokkene, partij=partij
1802+
)
1803+
1804+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1805+
1806+
url = reverse(
1807+
"klantinteracties:onderwerpobject-detail",
1808+
kwargs={"uuid": onderwerpobject.uuid},
1809+
)
1810+
1811+
response = self.client.delete(f"{url}?cascade=true")
1812+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1813+
1814+
self.assertFalse(Betrokkene.objects.filter(uuid=betrokkene.uuid).exists())
1815+
self.assertTrue(DigitaalAdres.objects.filter(uuid=digitaaladres.uuid).exists())
1816+
1817+
def test_destroy_cascade_deletes_bijlage(self):
1818+
klantcontact = KlantcontactFactory.create()
1819+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1820+
bijlage = BijlageFactory.create(klantcontact=klantcontact)
1821+
1822+
url = reverse(
1823+
"klantinteracties:onderwerpobject-detail",
1824+
kwargs={"uuid": onderwerpobject.uuid},
1825+
)
1826+
response = self.client.delete(f"{url}?cascade=true")
1827+
1828+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1829+
1830+
self.assertFalse(
1831+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1832+
)
1833+
self.assertFalse(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1834+
self.assertFalse(Bijlage.objects.filter(uuid=bijlage.uuid).exists())
1835+
1836+
self.assertEqual(response.json(), {"behouden": []})
1837+
1838+
def test_destroy_cascade_deletes_internetaak(self):
1839+
klantcontact = KlantcontactFactory.create()
1840+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1841+
interne_taak = InterneTaakFactory.create(
1842+
klantcontact=klantcontact, status=Taakstatus.te_verwerken
1843+
)
1844+
1845+
url = reverse(
1846+
"klantinteracties:onderwerpobject-detail",
1847+
kwargs={"uuid": onderwerpobject.uuid},
1848+
)
1849+
response = self.client.delete(f"{url}?cascade=true")
1850+
1851+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1852+
1853+
self.assertFalse(
1854+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1855+
)
1856+
self.assertFalse(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1857+
self.assertFalse(InterneTaak.objects.filter(uuid=interne_taak.uuid).exists())
1858+
1859+
def test_destroy_cascade_deletes_actorklantcontact(self):
1860+
klantcontact = KlantcontactFactory.create()
1861+
onderwerpobject = OnderwerpobjectFactory.create(klantcontact=klantcontact)
1862+
actor = ActorFactory.create()
1863+
actor_kc = ActorKlantcontact.objects.create(
1864+
actor=actor, klantcontact=klantcontact
1865+
)
1866+
1867+
url = reverse(
1868+
"klantinteracties:onderwerpobject-detail",
1869+
kwargs={"uuid": onderwerpobject.uuid},
1870+
)
1871+
response = self.client.delete(f"{url}?cascade=true")
1872+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1873+
self.assertFalse(
1874+
Onderwerpobject.objects.filter(uuid=onderwerpobject.uuid).exists()
1875+
)
1876+
self.assertFalse(Klantcontact.objects.filter(uuid=klantcontact.uuid).exists())
1877+
self.assertFalse(ActorKlantcontact.objects.filter(uuid=actor_kc.uuid).exists())
1878+
self.assertTrue(Actor.objects.filter(uuid=actor.uuid).exists())
1879+
1880+
self.assertEqual(response.json(), {"behouden": []})
1881+
1882+
def test_destroy_with_cascade_true_remaining_klantcontacten(self):
1883+
shared_klantcontact = KlantcontactFactory.create()
1884+
shared_was_klantcontact = KlantcontactFactory.create()
1885+
1886+
onderwerpobject1 = OnderwerpobjectFactory.create(
1887+
klantcontact=shared_klantcontact,
1888+
was_klantcontact=shared_was_klantcontact,
1889+
)
1890+
onderwerpobject2 = OnderwerpobjectFactory.create(
1891+
klantcontact=shared_klantcontact,
1892+
was_klantcontact=shared_was_klantcontact,
1893+
)
1894+
1895+
url = reverse(
1896+
"klantinteracties:onderwerpobject-detail",
1897+
kwargs={"uuid": onderwerpobject1.uuid},
1898+
)
1899+
1900+
response = self.client.delete(f"{url}?cascade=true")
1901+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1902+
1903+
self.assertFalse(
1904+
Onderwerpobject.objects.filter(uuid=onderwerpobject1.uuid).exists()
1905+
)
1906+
1907+
self.assertTrue(
1908+
Onderwerpobject.objects.filter(uuid=onderwerpobject2.uuid).exists()
1909+
)
1910+
1911+
self.assertTrue(
1912+
Klantcontact.objects.filter(uuid=shared_klantcontact.uuid).exists()
1913+
)
1914+
self.assertTrue(
1915+
Klantcontact.objects.filter(uuid=shared_was_klantcontact.uuid).exists()
1916+
)
1917+
1918+
remaining_urls = response.json()["behouden"]
1919+
1920+
expected_urls = [
1921+
self.client.get(
1922+
reverse(
1923+
"klantinteracties:klantcontact-detail",
1924+
kwargs={"uuid": shared_klantcontact.uuid, "version": "1"},
1925+
)
1926+
).request["PATH_INFO"],
1927+
self.client.get(
1928+
reverse(
1929+
"klantinteracties:klantcontact-detail",
1930+
kwargs={"uuid": shared_was_klantcontact.uuid, "version": "1"},
1931+
)
1932+
).request["PATH_INFO"],
1933+
]
1934+
1935+
expected_urls = [f"http://testserver{url}" for url in expected_urls]
1936+
1937+
for url in expected_urls:
1938+
self.assertIn(url, remaining_urls)
1939+
1940+
def test_destroy_with_cascade_true_logs_klantcontact_uuids(self):
1941+
klantcontact = KlantcontactFactory.create()
1942+
was_klantcontact = KlantcontactFactory.create()
1943+
1944+
onderwerpobject = OnderwerpobjectFactory.create(
1945+
klantcontact=klantcontact,
1946+
was_klantcontact=was_klantcontact,
1947+
)
1948+
1949+
url = reverse(
1950+
"klantinteracties:onderwerpobject-detail",
1951+
kwargs={"uuid": onderwerpobject.uuid},
1952+
)
1953+
1954+
with capture_logs() as cap_logs:
1955+
response = self.client.delete(f"{url}?cascade=true")
1956+
self.assertEqual(response.status_code, status.HTTP_200_OK)
1957+
1958+
deleted_logs = [
1959+
log for log in cap_logs if log.get("event") == "onderwerpobject_deleted"
1960+
]
1961+
self.assertEqual(len(deleted_logs), 1)
1962+
1963+
log = deleted_logs[0]
1964+
self.assertEqual(log["uuid"], str(onderwerpobject.uuid))
1965+
self.assertTrue(log["cascade"])
1966+
self.assertEqual(log["klantcontact_uuid"], str(klantcontact.uuid))
1967+
self.assertEqual(log["was_klantcontact_uuid"], str(was_klantcontact.uuid))
1968+
self.assertEqual(log["remaining_klantcontacten"], [])
16681969

16691970

16701971
class ActorKlantcontactTests(APITestCase):

0 commit comments

Comments
 (0)