@@ -261,6 +261,10 @@ def test_logout_endpoint(client: TestClient):
261
261
262
262
263
263
def test_register_with_existing_email (client : TestClient , test_user : User ):
264
+ """Test that registration fails with an existing non-deleted user's email"""
265
+ # Ensure test user is not deleted
266
+ assert not test_user .deleted
267
+
264
268
response = client .post (
265
269
"/auth/register" ,
266
270
data = {
@@ -273,6 +277,34 @@ def test_register_with_existing_email(client: TestClient, test_user: User):
273
277
assert response .status_code == 400
274
278
275
279
280
+ def test_register_with_deleted_user_email (client : TestClient , test_user : User , session : Session ):
281
+ """Test that registration succeeds with a deleted user's email"""
282
+ # Mark test user as deleted
283
+ test_user .deleted = True
284
+ session .add (test_user )
285
+ session .commit ()
286
+
287
+ response = client .post (
288
+ "/auth/register" ,
289
+ data = {
290
+ "name" : "New User" ,
291
+ "email" : test_user .email ,
292
+ "password" : "Test123!@#" ,
293
+ "confirm_password" : "Test123!@#"
294
+ },
295
+ follow_redirects = False
296
+ )
297
+ assert response .status_code == 303
298
+
299
+ # Verify new user was created
300
+ new_user = session .exec (select (User ).where (
301
+ User .email == test_user .email ,
302
+ User .deleted == False
303
+ )).first ()
304
+ assert new_user is not None
305
+ assert new_user .id != test_user .id
306
+
307
+
276
308
def test_login_with_invalid_credentials (client : TestClient , test_user : User ):
277
309
response = client .post (
278
310
"/auth/login" ,
@@ -361,3 +393,74 @@ def test_password_reset_email_url(client: TestClient, session: Session, test_use
361
393
assert parsed .path == str (reset_password_path )
362
394
assert query_params ["email" ][0 ] == test_user .email
363
395
assert query_params ["token" ][0 ] == reset_token .token
396
+
397
+
398
+ def test_deleted_user_cannot_login (client : TestClient , test_user : User , session : Session ):
399
+ """Test that a deleted user cannot log in"""
400
+ # First mark the user as deleted
401
+ test_user .deleted = True
402
+ session .add (test_user )
403
+ session .commit ()
404
+
405
+ response = client .post (
406
+ "/auth/login" ,
407
+ data = {
408
+ "email" : test_user .email ,
409
+ "password" : "Test123!@#"
410
+ }
411
+ )
412
+ assert response .status_code == 400
413
+
414
+
415
+ def test_deleted_user_cannot_use_tokens (client : TestClient , test_user : User , session : Session ):
416
+ """Test that a deleted user's tokens become invalid"""
417
+ # Create tokens before marking user as deleted
418
+ access_token = create_access_token ({"sub" : test_user .email })
419
+ refresh_token = create_refresh_token ({"sub" : test_user .email })
420
+
421
+ # Mark user as deleted
422
+ test_user .deleted = True
423
+ session .add (test_user )
424
+ session .commit ()
425
+
426
+ # Set tokens in cookies
427
+ client .cookies .set ("access_token" , access_token )
428
+ client .cookies .set ("refresh_token" , refresh_token )
429
+
430
+ # Try to refresh tokens
431
+ response = client .post ("/auth/refresh" , follow_redirects = False )
432
+ assert response .status_code == 303 # user is redirected to login
433
+
434
+
435
+ def test_deleted_user_cannot_use_reset_token (client : TestClient , session : Session , test_user : User ):
436
+ """Test that a deleted user cannot use a previously issued reset token"""
437
+ # First create a reset token
438
+ response = client .post (
439
+ "/auth/forgot_password" ,
440
+ data = {"email" : test_user .email },
441
+ follow_redirects = False
442
+ )
443
+ assert response .status_code == 303
444
+
445
+ # Get the reset token
446
+ reset_token = session .exec (select (PasswordResetToken )
447
+ .where (PasswordResetToken .user_id == test_user .id )).first ()
448
+ assert reset_token is not None
449
+
450
+ # Now mark user as deleted
451
+ test_user .deleted = True
452
+ session .add (test_user )
453
+ session .commit ()
454
+
455
+ # Try to use the reset token
456
+ response = client .post (
457
+ "/auth/reset_password" ,
458
+ data = {
459
+ "email" : test_user .email ,
460
+ "token" : reset_token .token ,
461
+ "new_password" : "NewPass123!@#" ,
462
+ "confirm_new_password" : "NewPass123!@#"
463
+ },
464
+ follow_redirects = False
465
+ )
466
+ assert response .status_code == 400
0 commit comments