def test_weekly_email_report_content(self, mock_email_message): with self.settings( EMAIL_HOST="localhost", CELERY_TASK_ALWAYS_EAGER=True, ): send_weekly_email_reports() self.assertEqual( mock_email_message.call_args[1]["campaign_key"], f"weekly_report_for_team_{self.team.pk}_on_2020-09-14", ) # Campaign key self.assertEqual( mock_email_message.call_args[1]["subject"], "PostHog weekly report for Sep 14, 2020 to Sep 20", ) # Email subject self.assertEqual(mock_email_message.call_args[1]["template_name"], "weekly_report") template_context = mock_email_message.call_args[1]["template_context"] self.assertEqual(template_context["team"], "The Bakery") self.assertEqual( template_context["period_start"], datetime.datetime(2020, 9, 14, tzinfo=pytz.UTC), ) self.assertEqual( template_context["period_end"], datetime.datetime(2020, 9, 20, 23, 59, 59, 999999, tzinfo=pytz.UTC), ) self.assertEqual( template_context["active_users"], 6, ) self.assertEqual( template_context["active_users_delta"], 0.5, ) self.assertEqual( round(template_context["user_distribution"]["new"], 2), 0.17, ) self.assertEqual( template_context["user_distribution"]["retained"], 0.5, ) self.assertEqual( round(template_context["user_distribution"]["resurrected"], 2), 0.33, ) self.assertEqual( template_context["churned_users"], { "abs": 1, "ratio": 0.25, "delta": None }, )
def test_weekly_email_report(self) -> None: record_count: int = MessagingRecord.objects.count() expected_recipients: List[str] = [ "*****@*****.**", "*****@*****.**" ] with self.settings( EMAIL_HOST="localhost", SITE_URL="http://localhost:9999", CELERY_TASK_ALWAYS_EAGER=True, ): send_weekly_email_reports() self.assertSetEqual({",".join(outmail.to) for outmail in mail.outbox}, set(expected_recipients)) self.assertEqual( mail.outbox[0].subject, "PostHog weekly report for Sep 14, 2020 to Sep 20", ) self.assertEqual( mail.outbox[0].body, "", ) # no plain-text version support yet html_message = mail.outbox[0].alternatives[0][0] # type: ignore self.assertIn( "http://localhost:9999/static/posthog-logo.png", html_message, ) # absolute URLs are used self.assertIn('style="font-weight: 600"', html_message) # CSS is inlined self.assertIn( "Your PostHog weekly report is ready! Your team had 6 active users last week! 🎉", html_message, ) # preheader # Ensure records are properly saved to prevent duplicate emails self.assertEqual(MessagingRecord.objects.count(), record_count + 2) for email in expected_recipients: email_hash = hashlib.sha256( f"{settings.SECRET_KEY}_{email}".encode()).hexdigest() record = MessagingRecord.objects.get( email_hash=email_hash, campaign_key= f"weekly_report_for_team_{self.team.pk}_on_2020-09-14", ) self.assertTrue( (timezone.now() - record.sent_at).total_seconds() < 5)
def send_weekly_email_report(): if settings.EMAIL_REPORTS_ENABLED: from posthog.tasks.email import send_weekly_email_reports send_weekly_email_reports()