@@ -464,46 +464,47 @@ mod tests {
464464 use crate :: db:: WebhookDedupStore ;
465465
466466 #[ tokio:: test]
467- async fn test_webhook_dedup_not_processed_initially ( ) {
467+ async fn test_webhook_dedup_first_record_returns_true ( ) {
468468 // Use a temp file so connections share state (in-memory DBs are connection-local)
469469 let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
470- let db_path = dir. path ( ) . join ( "test_dedup_initial .db" ) ;
470+ let db_path = dir. path ( ) . join ( "test_dedup_first .db" ) ;
471471 let backend = LibSqlBackend :: new_local ( & db_path) . await . unwrap ( ) ;
472472 backend. run_migrations ( ) . await . unwrap ( ) ;
473473
474- // Message should not be marked as processed initially
475- let is_processed = backend
476- . is_webhook_message_processed ( "whatsapp" , "wamid.test123" )
474+ // First record should return true (new message inserted)
475+ let was_inserted = backend
476+ . record_webhook_message_processed ( "whatsapp" , "wamid.test123" )
477477 . await
478478 . unwrap ( ) ;
479479 assert ! (
480- !is_processed ,
481- "New message should not be marked as processed "
480+ was_inserted ,
481+ "First record should return true (new message) "
482482 ) ;
483483 }
484484
485485 #[ tokio:: test]
486- async fn test_webhook_dedup_record_and_check ( ) {
486+ async fn test_webhook_dedup_duplicate_returns_false ( ) {
487487 // Use a temp file so connections share state (in-memory DBs are connection-local)
488488 let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
489- let db_path = dir. path ( ) . join ( "test_dedup_record .db" ) ;
489+ let db_path = dir. path ( ) . join ( "test_dedup_duplicate .db" ) ;
490490 let backend = LibSqlBackend :: new_local ( & db_path) . await . unwrap ( ) ;
491491 backend. run_migrations ( ) . await . unwrap ( ) ;
492492
493- // Record message as processed
494- backend
495- . record_webhook_message_processed ( "whatsapp" , "wamid.test456 " )
493+ // First record returns true
494+ let was_inserted = backend
495+ . record_webhook_message_processed ( "whatsapp" , "wamid.duplicate " )
496496 . await
497497 . unwrap ( ) ;
498+ assert ! ( was_inserted, "First record should return true" ) ;
498499
499- // Now it should be marked as processed
500- let is_processed = backend
501- . is_webhook_message_processed ( "whatsapp" , "wamid.test456 " )
500+ // Second record (duplicate) returns false
501+ let was_inserted = backend
502+ . record_webhook_message_processed ( "whatsapp" , "wamid.duplicate " )
502503 . await
503504 . unwrap ( ) ;
504505 assert ! (
505- is_processed ,
506- "Recorded message should be marked as processed"
506+ !was_inserted ,
507+ "Duplicate record should return false (already processed) "
507508 ) ;
508509 }
509510
@@ -515,53 +516,31 @@ mod tests {
515516 let backend = LibSqlBackend :: new_local ( & db_path) . await . unwrap ( ) ;
516517 backend. run_migrations ( ) . await . unwrap ( ) ;
517518
518- // Record message for whatsapp
519- backend
519+ // Record message for whatsapp - should return true
520+ let was_inserted = backend
520521 . record_webhook_message_processed ( "whatsapp" , "msg789" )
521522 . await
522523 . unwrap ( ) ;
524+ assert ! ( was_inserted, "First channel record should return true" ) ;
523525
524- // Same message_id on different channel should NOT be processed
525- let is_processed = backend
526- . is_webhook_message_processed ( "telegram" , "msg789" )
526+ // Same message_id on different channel should also return true (independent)
527+ let was_inserted = backend
528+ . record_webhook_message_processed ( "telegram" , "msg789" )
527529 . await
528530 . unwrap ( ) ;
529531 assert ! (
530- !is_processed ,
532+ was_inserted ,
531533 "Different channel should have independent dedup state"
532534 ) ;
533535
534- // Original channel should be processed
535- let is_processed = backend
536- . is_webhook_message_processed ( "whatsapp" , "msg789" )
537- . await
538- . unwrap ( ) ;
539- assert ! ( is_processed, "Original channel should be processed" ) ;
540- }
541-
542- #[ tokio:: test]
543- async fn test_webhook_dedup_duplicate_record_is_idempotent ( ) {
544- // Use a temp file so connections share state (in-memory DBs are connection-local)
545- let dir = tempfile:: tempdir ( ) . unwrap ( ) ;
546- let db_path = dir. path ( ) . join ( "test_dedup_idempotent.db" ) ;
547- let backend = LibSqlBackend :: new_local ( & db_path) . await . unwrap ( ) ;
548- backend. run_migrations ( ) . await . unwrap ( ) ;
549-
550- // Record same message twice (simulating webhook retry)
551- backend
552- . record_webhook_message_processed ( "whatsapp" , "wamid.duplicate" )
553- . await
554- . unwrap ( ) ;
555- backend
556- . record_webhook_message_processed ( "whatsapp" , "wamid.duplicate" )
557- . await
558- . unwrap ( ) ;
559-
560- // Should still be marked as processed (no error, no duplicate row)
561- let is_processed = backend
562- . is_webhook_message_processed ( "whatsapp" , "wamid.duplicate" )
536+ // Duplicate on original channel should return false
537+ let was_inserted = backend
538+ . record_webhook_message_processed ( "whatsapp" , "msg789" )
563539 . await
564540 . unwrap ( ) ;
565- assert ! ( is_processed) ;
541+ assert ! (
542+ !was_inserted,
543+ "Duplicate on original channel should return false"
544+ ) ;
566545 }
567546}
0 commit comments