from datetime import timedelta as td import time from unittest.mock import patch from django.core import signing from django.utils.timezone import now from hc.test import BaseTestCase class UnsubscribeReportsTestCase(BaseTestCase): def test_it_unsubscribes(self): self.profile.next_report_date = now() self.profile.nag_period = td(hours=1) self.profile.next_nag_date = now() self.profile.save() sig = signing.TimestampSigner(salt="reports").sign("alice") url = "/accounts/unsubscribe_reports/%s/" % sig r = self.client.post(url) self.assertContains(r, "Unsubscribed") self.profile.refresh_from_db() self.assertEqual(self.profile.reports, "off") self.assertIsNone(self.profile.next_report_date) self.assertEqual(self.profile.nag_period.total_seconds(), 0) self.assertIsNone(self.profile.next_nag_date) def test_bad_signature_gets_rejected(self): url = "/accounts/unsubscribe_reports/invalid/" r = self.client.get(url) self.assertContains(r, "Incorrect Link") def test_it_serves_confirmation_form(self): sig = signing.TimestampSigner(salt="reports").sign("alice") url = "/accounts/unsubscribe_reports/%s/" % sig r = self.client.get(url) self.assertContains(r, "Please press the button below") self.assertNotContains(r, "submit()") def test_aged_signature_autosubmits(self): with patch("django.core.signing.time") as mock_time: mock_time.time.return_value = time.time() - 301 signer = signing.TimestampSigner(salt="reports") sig = signer.sign("alice") url = "/accounts/unsubscribe_reports/%s/" % sig r = self.client.get(url) self.assertContains(r, "Please press the button below") self.assertContains(r, "submit()")