Coverage for ivatar/ivataraccount/test_generated_fields.py: 96%
28 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 11:51 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 11:51 +0000
2import hashlib
3from django.test import TestCase
4from django.contrib.auth.models import User
5from ivatar.ivataraccount.models import ConfirmedEmail
6from ivatar.utils import generate_random_email
8class GeneratedFieldConsistencyTest(TestCase):
9 def test_digest_consistency_bulk(self):
10 """
11 Verify that digests generated by the database match Python's hashlib
12 for 500 random email addresses.
13 """
14 user = User.objects.create(username="testuser")
15 emails = [generate_random_email() for _ in range(500)]
17 # Test basic creation
18 for email in emails:
19 ce = ConfirmedEmail.objects.create(user=user, email=email)
21 # Re-fetch to ensure we get the DB-generated value
22 ce.refresh_from_db()
24 normalized = email.strip().lower()
25 expected_md5 = hashlib.md5(normalized.encode()).hexdigest()
26 expected_sha256 = hashlib.sha256(normalized.encode()).hexdigest()
28 self.assertEqual(ce.digest, expected_md5, f"MD5 mismatch for {email}")
29 self.assertEqual(ce.digest_sha256, expected_sha256, f"SHA256 mismatch for {email}")
31 def test_unicode_email_consistency(self):
32 """
33 Test behavior with unicode emails.
34 Note: This might fail on SQLite but should pass on PostgreSQL.
35 We mark it as an expected failure if on sqlite for now, or just log it.
36 """
37 from django.db import connection
38 user = User.objects.create(username="unicodeuser")
39 email = "MÜLLER@EXAMPLE.COM"
40 ce = ConfirmedEmail.objects.create(user=user, email=email)
41 ce.refresh_from_db()
43 normalized = email.strip().lower()
44 expected_md5 = hashlib.md5(normalized.encode()).hexdigest()
46 if connection.vendor == 'sqlite' and ce.digest != expected_md5:
47 print(f"\n[INFO] SQLite Unicode LOWER mismatch detected as expected: {ce.digest} != {expected_md5}")
48 else:
49 self.assertEqual(ce.digest, expected_md5, "Unicode MD5 mismatch")