@@ -75,6 +75,9 @@ def migration_db(monkeypatch):
7575ALICE_OLDEST = uuid .UUID ("11111111-1111-1111-1111-111111111111" )
7676ALICE_MIDDLE = uuid .UUID ("22222222-2222-2222-2222-222222222222" )
7777ALICE_NEWEST = uuid .UUID ("33333333-3333-3333-3333-333333333333" )
78+ # Exact-case duplicate of ALICE_OLDEST's email — covers identical (not just
79+ # case-variant) duplicate rows, which can exist before the unique index lands.
80+ ALICE_EXACT_DUP = uuid .UUID ("77777777-7777-7777-7777-777777777777" )
7881BOB = uuid .UUID ("44444444-4444-4444-4444-444444444444" )
7982CAROL_NO_CHILDREN = uuid .UUID ("55555555-5555-5555-5555-555555555555" )
8083CAROL_DUP = uuid .UUID ("66666666-6666-6666-6666-666666666666" )
@@ -83,6 +86,7 @@ def migration_db(monkeypatch):
8386TRANS_ON_ALICE_MIDDLE = uuid .UUID ("a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2" )
8487TRANS_ON_ALICE_NEWEST_1 = uuid .UUID ("a3a3a3a3-a3a3-a3a3-a3a3-a3a3a3a3a3a3" )
8588TRANS_ON_ALICE_NEWEST_2 = uuid .UUID ("a4a4a4a4-a4a4-a4a4-a4a4-a4a4a4a4a4a4" )
89+ TRANS_ON_ALICE_EXACT_DUP = uuid .UUID ("a5a5a5a5-a5a5-a5a5-a5a5-a5a5a5a5a5a5" )
8690TRANS_ON_BOB = uuid .UUID ("b1b1b1b1-b1b1-b1b1-b1b1-b1b1b1b1b1b1" )
8791
8892REC_ON_ALICE_MIDDLE = uuid .UUID ("c1c1c1c1-c1c1-c1c1-c1c1-c1c1c1c1c1c1" )
@@ -103,6 +107,7 @@ def _seed(conn: sa.Connection) -> None:
103107 """
104108 INSERT INTO "user" (id, email, created_datetime, updated_datetime, data_retention_days) VALUES
105109 (:a_old, 'Alice@Example.com', '2025-01-01 00:00:00+00', '2025-01-01 00:00:00+00', NULL),
110+ (:a_dup, 'Alice@Example.com', '2025-01-20 00:00:00+00', '2025-01-20 00:00:00+00', 14),
106111 (:a_mid, 'alice@example.com', '2025-02-01 00:00:00+00', '2025-02-01 00:00:00+00', 30),
107112 (:a_new, 'ALICE@EXAMPLE.COM', '2025-03-01 00:00:00+00', '2025-03-01 00:00:00+00', 7),
108113 (:bob, 'bob@example.com', '2025-01-15 00:00:00+00', '2025-01-15 00:00:00+00', NULL),
@@ -112,6 +117,7 @@ def _seed(conn: sa.Connection) -> None:
112117 ),
113118 {
114119 "a_old" : ALICE_OLDEST ,
120+ "a_dup" : ALICE_EXACT_DUP ,
115121 "a_mid" : ALICE_MIDDLE ,
116122 "a_new" : ALICE_NEWEST ,
117123 "bob" : BOB ,
@@ -125,6 +131,7 @@ def _seed(conn: sa.Connection) -> None:
125131 """
126132 INSERT INTO transcription (id, user_id, created_datetime, updated_datetime) VALUES
127133 (:t_old, :a_old, NOW(), NOW()),
134+ (:t_dup, :a_dup, NOW(), NOW()),
128135 (:t_mid, :a_mid, NOW(), NOW()),
129136 (:t_new_1, :a_new, NOW(), NOW()),
130137 (:t_new_2, :a_new, NOW(), NOW()),
@@ -133,11 +140,13 @@ def _seed(conn: sa.Connection) -> None:
133140 ),
134141 {
135142 "t_old" : TRANS_ON_ALICE_OLDEST ,
143+ "t_dup" : TRANS_ON_ALICE_EXACT_DUP ,
136144 "t_mid" : TRANS_ON_ALICE_MIDDLE ,
137145 "t_new_1" : TRANS_ON_ALICE_NEWEST_1 ,
138146 "t_new_2" : TRANS_ON_ALICE_NEWEST_2 ,
139147 "t_bob" : TRANS_ON_BOB ,
140148 "a_old" : ALICE_OLDEST ,
149+ "a_dup" : ALICE_EXACT_DUP ,
141150 "a_mid" : ALICE_MIDDLE ,
142151 "a_new" : ALICE_NEWEST ,
143152 "bob" : BOB ,
@@ -208,6 +217,7 @@ def test_migration_merges_duplicates_reassigns_fks_and_lowercases(migration_db):
208217 )
209218 assert set (alice_trans ) == {
210219 TRANS_ON_ALICE_OLDEST ,
220+ TRANS_ON_ALICE_EXACT_DUP ,
211221 TRANS_ON_ALICE_MIDDLE ,
212222 TRANS_ON_ALICE_NEWEST_1 ,
213223 TRANS_ON_ALICE_NEWEST_2 ,
0 commit comments