From 691ac512fdd177a7b67940c396790968c81a0217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chlo=C3=A9?= Date: Sun, 17 Nov 2024 16:46:12 +0100 Subject: [PATCH] Tests de la commande 'crm_brevo_sync_companies' --- lemarche/crm/tests.py | 152 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 lemarche/crm/tests.py diff --git a/lemarche/crm/tests.py b/lemarche/crm/tests.py new file mode 100644 index 000000000..af4ed5aff --- /dev/null +++ b/lemarche/crm/tests.py @@ -0,0 +1,152 @@ +from datetime import timedelta +from unittest.mock import patch + +from django.core.management import call_command +from django.test import TestCase +from django.utils import timezone + +from lemarche.siaes.factories import SiaeFactory +from lemarche.siaes.models import Siae +from lemarche.tenders.factories import TenderFactory +from lemarche.tenders.models import TenderSiae +from lemarche.users.factories import UserFactory +from lemarche.users.models import User + + +now = timezone.now() +date_tomorrow = now + timedelta(days=1) +old_date = timezone.now() - timedelta(days=91) + + +class CrmBrevoSyncCompaniesCommandTest(TestCase): + @classmethod + def setUpTestData(cls): + """Siae instances initialization""" + cls.user_siae = UserFactory(kind=User.KIND_SIAE) + cls.siae_with_name = SiaeFactory(name="Test Company 1") + cls.siae_with_tender = SiaeFactory(users=[cls.user_siae]) + cls.siae_with_brevo_id = SiaeFactory( + brevo_company_id="123456789", + completion_rate=50, + ) + + cls.tender_with_siae = TenderFactory( + siaes=[cls.siae_with_tender, cls.siae_with_brevo_id], deadline_date=date_tomorrow + ) + TenderSiae.objects.create( + tender=cls.tender_with_siae, + siae=cls.siae_with_tender, + email_send_date=now, + detail_contact_click_date=now, + ) + TenderSiae.objects.create( + tender=cls.tender_with_siae, + siae=cls.siae_with_brevo_id, + email_send_date=now, + detail_contact_click_date=now, + ) + TenderSiae.objects.create( + tender=cls.tender_with_siae, + siae=cls.siae_with_brevo_id, + email_send_date=now, # should be updated with 90 days filter + detail_contact_click_date=old_date, # should not be updated with 90 days filter + ) + + @patch("lemarche.utils.apis.api_brevo.create_or_update_company") + def test_new_siaes_are_synced_in_brevo(self, mock_create_or_update_company): + """Test new siaes are synced in brevo""" + call_command("crm_brevo_sync_companies") + + self.assertEqual(mock_create_or_update_company.call_count, 3) + + @patch("lemarche.utils.apis.api_brevo.create_or_update_company") + def test_siae_extra_data_is_set_on_first_sync(self, mock_create_or_update_company): + """Test siae is updated if extra_data is changed.""" + initial_extra_data = self.siae_with_tender.extra_data.copy() + call_command("crm_brevo_sync_companies", recently_updated=True) + + self.assertTrue(mock_create_or_update_company.called) + + siae_with_tender_stats = Siae.objects.with_tender_stats(days=90).filter(id=self.siae_with_tender.id).first() + self.siae_with_tender.refresh_from_db() + + expected_extra_data = { + "completion_rate": self.siae_with_tender.completion_rate, + "recent_tender_email_send_count": siae_with_tender_stats.tender_email_send_count_annotated, + "recent_tender_detail_click_count": siae_with_tender_stats.tender_detail_contact_click_count_annotated, + } + + self.assertNotEqual(initial_extra_data, expected_extra_data, "siae.extra_data aurait dû être mis à jour.") + self.assertEqual( + self.siae_with_tender.extra_data, expected_extra_data, "siae.extra_data n'est pas conforme aux attentes." + ) + + @patch("lemarche.utils.apis.api_brevo.create_or_update_company") + def test_siae_extra_data_is_not_updated_if_no_changes(self, mock_create_or_update_company): + """Test siae.extra_data is not updated if no changes.""" + siae_with_brevo_id_stats = ( + Siae.objects.with_tender_stats(days=90).filter(id=self.siae_with_brevo_id.id).first() + ) + # siae.extra_data should already be set for updates + self.siae_with_brevo_id.extra_data = { + "completion_rate": self.siae_with_brevo_id.completion_rate, # not annotated field + "recent_tender_email_send_count": siae_with_brevo_id_stats.tender_email_send_count_annotated, + "recent_tender_detail_click_count": siae_with_brevo_id_stats.tender_detail_contact_click_count_annotated, + } + self.siae_with_brevo_id.save() + initial_extra_data = self.siae_with_brevo_id.extra_data.copy() + + call_command("crm_brevo_sync_companies", recently_updated=True) + + self.assertTrue(mock_create_or_update_company.called) + + self.siae_with_brevo_id.refresh_from_db() + self.assertEqual( + initial_extra_data, + self.siae_with_brevo_id.extra_data, + "siae.extra_data a été mis à jour alors qu'il n'y avait pas de changement.", + ) + + @patch("lemarche.utils.apis.api_brevo.create_or_update_company") + def test_fields_update_within_90_days_and_ignore_older_changes(self, mock_create_or_update_company): + """Test fields update within 90 days and ignore older changes.""" + call_command("crm_brevo_sync_companies", recently_updated=True) + + # Queryset with 90 days filter + siae_with_recent_stats = Siae.objects.with_tender_stats(days=90).filter(id=self.siae_with_brevo_id.id).first() + # Queryset without 90 days filter + siae_with_all_stats = Siae.objects.with_tender_stats().filter(id=self.siae_with_brevo_id.id).first() + + # Check that the annotated fields have been updated or not + self.assertEqual( + siae_with_all_stats.tender_email_send_count_annotated, 2, "Le compte total d'envois d'email devrait être 2" + ) + self.assertEqual( + siae_with_recent_stats.tender_email_send_count_annotated, + 2, + "Les envois récents d'email dans les 90 jours devraient être 2", + ) + self.assertEqual( + siae_with_all_stats.tender_detail_contact_click_count_annotated, + 2, + "Le compte total de clics de contact devrait être 2", + ) + self.assertEqual( + siae_with_recent_stats.tender_detail_contact_click_count_annotated, + 1, + "Les clics de contact récents dans les 90 jours devraient être 1", + ) + + self.siae_with_brevo_id.refresh_from_db() + + expected_extra_data = { + "completion_rate": self.siae_with_brevo_id.completion_rate, + "recent_tender_email_send_count": siae_with_recent_stats.tender_email_send_count_annotated, + "recent_tender_detail_click_count": siae_with_recent_stats.tender_detail_contact_click_count_annotated, + } + + self.assertEqual( + self.siae_with_brevo_id.extra_data, + expected_extra_data, + "Les valeurs récentes dans extra_data devraient être mises à jour en fonction du filtre de 90 jours.", + )