- from datetime import timedelta as td
- import re
- from unittest.mock import Mock
-
- from django.core import mail
- from django.utils.timezone import now
- from hc.accounts.management.commands.senddeletionnotices import Command
- from hc.accounts.models import Member
- from hc.api.models import Check, Ping
- from hc.test import BaseTestCase
-
-
- def counts(result):
- """ Extract integer values from command's return value. """
- return [int(s) for s in re.findall(r"\d+", result)]
-
-
- class SendDeletionNoticesTestCase(BaseTestCase):
- def setUp(self):
- super().setUp()
-
- # Make alice eligible for notice -- signed up more than 1 year ago
- self.alice.date_joined = now() - td(days=500)
- self.alice.save()
-
- self.profile.sms_limit = 5
- self.profile.save()
-
- # remove members from alice's project
- self.project.member_set.all().delete()
-
- def test_it_sends_notice(self):
- cmd = Command(stdout=Mock())
- cmd.pause = Mock() # don't pause for 1s
-
- result = cmd.handle()
- self.assertEqual(counts(result), [1, 0, 0])
-
- self.profile.refresh_from_db()
- self.assertTrue(self.profile.deletion_notice_date)
-
- email = mail.outbox[0]
- self.assertEqual(email.subject, "Inactive Account Notification")
-
- def test_it_checks_last_login(self):
- # alice has logged in recently:
- self.alice.last_login = now() - td(days=15)
- self.alice.save()
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 0])
-
- self.profile.refresh_from_db()
- self.assertIsNone(self.profile.deletion_notice_date)
-
- def test_it_checks_date_joined(self):
- # alice signed up recently:
- self.alice.date_joined = now() - td(days=15)
- self.alice.save()
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 0])
-
- self.profile.refresh_from_db()
- self.assertIsNone(self.profile.deletion_notice_date)
-
- def test_it_checks_deletion_notice_date(self):
- # alice has already received a deletion notice
- self.profile.deletion_notice_date = now() - td(days=15)
- self.profile.save()
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 0])
-
- def test_it_checks_sms_limit(self):
- # alice has a paid account
- self.profile.sms_limit = 50
- self.profile.save()
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 0])
-
- self.profile.refresh_from_db()
- self.assertIsNone(self.profile.deletion_notice_date)
-
- def test_it_checks_team_members(self):
- # bob has access to alice's project
- Member.objects.create(user=self.bob, project=self.project)
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 1, 0])
-
- self.profile.refresh_from_db()
- self.assertIsNone(self.profile.deletion_notice_date)
-
- def test_it_checks_recent_pings(self):
- check = Check.objects.create(project=self.project)
- Ping.objects.create(owner=check)
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 1])
-
- self.profile.refresh_from_db()
- self.assertIsNone(self.profile.deletion_notice_date)
-
- def test_it_checks_last_active_date(self):
- # alice has been browsing the site recently
- self.profile.last_active_date = now() - td(days=15)
- self.profile.save()
-
- result = Command(stdout=Mock()).handle()
- self.assertEqual(counts(result), [0, 0, 0])
|