Coverage for website/moneybirdsynchronization/tests/test_signals.py: 100.00%
42 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from unittest import mock
3from django.test import TestCase, override_settings
5from freezegun import freeze_time
7from members.models import Member
8from moneybirdsynchronization.models import MoneybirdExternalInvoice
9from payments.models import Payment
10from payments.services import create_payment
11from registrations.models import Renewal
12from registrations.services import execute_data_minimisation
15# Each test method has a mock_api argument that is a MagicMock instance, replacing the
16# MoneybirdAPIService *class*. To check calls or set behaviour of a MoneybirdAPIService
17# *instance*, use `mock_api.return_value.<MoneybirdAPIService method>`.
18@mock.patch("moneybirdsynchronization.moneybird.MoneybirdAPIService", autospec=True)
19@override_settings( # Settings needed to enable synchronization.
20 MONEYBIRD_START_DATE="2023-09-01",
21 MONEYBIRD_ADMINISTRATION_ID="123",
22 MONEYBIRD_API_KEY="foo",
23 MONEYBIRD_SYNC_ENABLED=True,
24 SUSPEND_SIGNALS=True,
25)
26class SignalsTest(TestCase):
27 fixtures = ["members.json"]
29 @classmethod
30 def setUpTestData(cls):
31 cls.member = Member.objects.get(pk=1)
32 cls.member2 = Member.objects.get(pk=2)
33 cls.member3 = Member.objects.get(pk=3)
34 cls.member4 = Member.objects.get(pk=4)
36 def test_dataminimisation_does_not_trigger_invoice_deletion(self, mock_api):
37 with freeze_time("2023-09-01"):
38 renewal = Renewal.objects.create(
39 member=self.member,
40 length=Renewal.MEMBERSHIP_YEAR,
41 )
43 create_payment(renewal, self.member, Payment.CASH)
44 renewal.refresh_from_db()
45 renewal.status = Renewal.STATUS_COMPLETED
46 renewal.save()
48 invoice1 = MoneybirdExternalInvoice.objects.create(
49 payable_object=renewal,
50 needs_synchronization=False,
51 moneybird_invoice_id="1",
52 )
54 with freeze_time("2023-11-01"):
55 with override_settings(SUSPEND_SIGNALS=False):
56 count_deleted = execute_data_minimisation()
58 self.assertGreaterEqual(count_deleted, 1)
60 # The invoice should not be scheduled for deletion.
61 invoice1.refresh_from_db()
62 self.assertFalse(invoice1.needs_deletion)
63 self.assertFalse(invoice1.needs_synchronization)
65 # Recreate the removed renewal.
66 with freeze_time("2023-09-01"):
67 renewal.status = Renewal.STATUS_COMPLETED
68 renewal.save()
70 with override_settings(SUSPEND_SIGNALS=False):
71 # But (bulk)-deleting outside of data minimisation should still delete it.
72 Renewal.objects.all().delete()
74 invoice1.refresh_from_db()
75 self.assertTrue(invoice1.needs_deletion)
76 self.assertFalse(invoice1.needs_synchronization)