from datetime import timedelta as td from django.test.utils import override_settings from django.utils.timezone import now from hc.api.models import TokenBucket from hc.test import BaseTestCase # This is sha1("alice@example.org" + "test-secred") ALICE_HASH = "d60db3b2343e713a4de3e92d4eb417e4f05f06ab" @override_settings(SECRET_KEY="test-secret") class TokenBucketTestCase(BaseTestCase): def test_it_works(self): r = TokenBucket.authorize_login_email("alice@example.org") self.assertTrue(r) obj = TokenBucket.objects.get() self.assertEqual(obj.tokens, 0.95) self.assertEqual(obj.value, "em-" + ALICE_HASH) def test_it_handles_insufficient_tokens(self): TokenBucket.objects.create(value="em-" + ALICE_HASH, tokens=0.04) r = TokenBucket.authorize_login_email("alice@example.org") self.assertFalse(r) def test_it_tops_up(self): obj = TokenBucket(value="em-" + ALICE_HASH) obj.tokens = 0 obj.updated = now() - td(minutes=30) obj.save() r = TokenBucket.authorize_login_email("alice@example.org") self.assertTrue(r) obj.refresh_from_db() self.assertAlmostEqual(obj.tokens, 0.45, places=5) def test_it_normalizes_email(self): emails = ("alice+alias@example.org", "a.li.ce@example.org") for email in emails: TokenBucket.authorize_login_email(email) self.assertEqual(TokenBucket.objects.count(), 1)