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

1from unittest import mock 

2 

3from django.test import TestCase, override_settings 

4 

5from freezegun import freeze_time 

6 

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 

13 

14 

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"] 

28 

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) 

35 

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 ) 

42 

43 create_payment(renewal, self.member, Payment.CASH) 

44 renewal.refresh_from_db() 

45 renewal.status = Renewal.STATUS_COMPLETED 

46 renewal.save() 

47 

48 invoice1 = MoneybirdExternalInvoice.objects.create( 

49 payable_object=renewal, 

50 needs_synchronization=False, 

51 moneybird_invoice_id="1", 

52 ) 

53 

54 with freeze_time("2023-11-01"): 

55 with override_settings(SUSPEND_SIGNALS=False): 

56 count_deleted = execute_data_minimisation() 

57 

58 self.assertGreaterEqual(count_deleted, 1) 

59 

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) 

64 

65 # Recreate the removed renewal. 

66 with freeze_time("2023-09-01"): 

67 renewal.status = Renewal.STATUS_COMPLETED 

68 renewal.save() 

69 

70 with override_settings(SUSPEND_SIGNALS=False): 

71 # But (bulk)-deleting outside of data minimisation should still delete it. 

72 Renewal.objects.all().delete() 

73 

74 invoice1.refresh_from_db() 

75 self.assertTrue(invoice1.needs_deletion) 

76 self.assertFalse(invoice1.needs_synchronization)