@@ -77,6 +77,15 @@ impl MockEscrowContract {
7777 env. storage ( ) . instance ( ) . set ( & delivery_id, & record) ;
7878 }
7979 }
80+
81+ pub fn freeze_funds ( env : Env , delivery_id : u64 ) {
82+ if env. storage ( ) . instance ( ) . has ( & delivery_id) {
83+ let mut record: shared_types:: EscrowRecord =
84+ env. storage ( ) . instance ( ) . get ( & delivery_id) . unwrap ( ) ;
85+ record. status = shared_types:: EscrowStatus :: Paused ;
86+ env. storage ( ) . instance ( ) . set ( & delivery_id, & record) ;
87+ }
88+ }
8089}
8190
8291fn setup_test ( ) -> (
@@ -250,6 +259,10 @@ fn test_raise_dispute_active_delivery() {
250259 let delivery = MockDeliveryContractClient :: new ( & env, & delivery_id) . get_delivery ( & did ( 1 ) ) ;
251260 assert_eq ! ( delivery. status, delivery_contract:: DeliveryStatus :: Disputed ) ;
252261
262+ // Verify escrow status changed to Paused in MockEscrowContract
263+ let escrow = MockEscrowContractClient :: new ( & env, & escrow_id) . get_escrow ( & 1 ) ;
264+ assert_eq ! ( escrow. status, shared_types:: EscrowStatus :: Paused ) ;
265+
253266 // Verify local dispute case in DisputeResolutionContract
254267 let case = dispute_client. get_dispute ( & did ( 1 ) ) ;
255268 assert_eq ! ( case. delivery_id, did( 1 ) ) ;
@@ -472,3 +485,49 @@ fn test_integration_resolve_dispute_split_funds() {
472485 assert_eq ! ( sender_balance, 600 ) ; // 60% of 1000 refunded
473486 assert_eq ! ( driver_balance, 400 ) ; // 40% of 1000 paid to driver
474487}
488+
489+ #[ test]
490+ fn test_resolve_dispute_pay_driver_by_admin ( ) {
491+ let ( env, admin, sender, recipient, driver, delivery_id, escrow_id, dispute_client) = setup_test ( ) ;
492+
493+ // Setup mock delivery
494+ let delivery_record = create_mock_delivery_record ( & env, did ( 8 ) , sender. clone ( ) , recipient. clone ( ) , delivery_contract:: DeliveryStatus :: Active , None ) ;
495+ set_mock_delivery ( & env, & delivery_id, did ( 8 ) , & delivery_record) ;
496+
497+ // Setup mock escrow as Paused (representing escrow paused after dispute raised)
498+ let token = Address :: generate ( & env) ;
499+ let escrow_record = create_mock_escrow_record ( sender. clone ( ) , recipient. clone ( ) , driver. clone ( ) , token, shared_types:: EscrowStatus :: Paused ) ;
500+ set_mock_escrow ( & env, & escrow_id, 8 , & escrow_record) ;
501+
502+ // Raise dispute to initialize local dispute case
503+ dispute_client. raise_dispute ( & sender, & did ( 8 ) ) ;
504+
505+ // Resolve dispute
506+ dispute_client. resolve_dispute_pay_driver ( & admin, & did ( 8 ) ) ;
507+
508+ // Verify local dispute status is ResolvedPayout
509+ let case = dispute_client. get_dispute ( & did ( 8 ) ) ;
510+ assert_eq ! ( case. status, DisputeStatus :: ResolvedPayout ) ;
511+
512+ // Verify mock escrow status updated to Released
513+ let escrow = MockEscrowContractClient :: new ( & env, & escrow_id) . get_escrow ( & 8 ) ;
514+ assert_eq ! ( escrow. status, shared_types:: EscrowStatus :: Released ) ;
515+ }
516+
517+ #[ test]
518+ #[ should_panic( expected = "HostError: Error(Contract, #1)" ) ] // SwiftChainError::Unauthorized
519+ fn test_unauthorized_resolve_pay_driver_fails ( ) {
520+ let ( env, _admin, sender, recipient, driver, delivery_id, escrow_id, dispute_client) = setup_test ( ) ;
521+
522+ let delivery_record = create_mock_delivery_record ( & env, did ( 9 ) , sender. clone ( ) , recipient. clone ( ) , delivery_contract:: DeliveryStatus :: Active , None ) ;
523+ set_mock_delivery ( & env, & delivery_id, did ( 9 ) , & delivery_record) ;
524+
525+ let token = Address :: generate ( & env) ;
526+ let escrow_record = create_mock_escrow_record ( sender. clone ( ) , recipient. clone ( ) , driver. clone ( ) , token, shared_types:: EscrowStatus :: Paused ) ;
527+ set_mock_escrow ( & env, & escrow_id, 9 , & escrow_record) ;
528+
529+ dispute_client. raise_dispute ( & sender, & did ( 9 ) ) ;
530+
531+ // Attacker (sender) tries to resolve dispute pay driver
532+ dispute_client. resolve_dispute_pay_driver ( & sender, & did ( 9 ) ) ;
533+ }
0 commit comments