@@ -749,15 +749,15 @@ describe('DipsManager', () => {
749749 } )
750750 } )
751751
752- test ( 'successful cancel + final collect attempt' , async ( ) => {
753- const mockReceipt = { hash : '0xcancel123' }
752+ test ( 'pre-cancel collect attempt + successful cancel' , async ( ) => {
754753 const mockCollectReceipt = { hash : '0xcollect456' }
754+ const mockReceipt = { hash : '0xcancel123' }
755755
756- // Mock cancel transaction
756+ // Order: collect (best-effort, before cancel) then the SP cancel.
757757 network . transactionManager . executeTransaction = jest
758758 . fn ( )
759+ . mockResolvedValueOnce ( mockCollectReceipt ) // collect (before cancel)
759760 . mockResolvedValueOnce ( mockReceipt ) // cancel
760- . mockResolvedValueOnce ( mockCollectReceipt ) // collect
761761
762762 // Mock block number and graph node methods for collect
763763 network . networkProvider . getBlockNumber = jest . fn ( ) . mockResolvedValue ( 100 )
@@ -773,35 +773,49 @@ describe('DipsManager', () => {
773773 const result = await dipsManager . cancelAgreement ( mockAgreement . id , mockAgreement )
774774
775775 expect ( result ) . toBe ( true )
776- // executeTransaction called twice: once for cancel , once for collect
776+ // executeTransaction called twice: once for collect , once for cancel
777777 expect ( network . transactionManager . executeTransaction ) . toHaveBeenCalledTimes ( 2 )
778778 // Tracker should be cleaned up (untracked = ready)
779779 expect (
780780 dipsManager . collectionTracker . isReadyForCollection ( mockAgreement . id , 0 ) ,
781781 ) . toBe ( true )
782782 } )
783783
784- test ( 'cancel fails returns false, no collect attempted' , async ( ) => {
785- // Mock cancel transaction failure
784+ test ( 'cancel fails returns false (after the pre-cancel collect attempt)' , async ( ) => {
785+ const mockCollectReceipt = { hash : '0xcollect456' }
786+
787+ // Collect (before cancel) succeeds, then the on-chain cancel reverts.
786788 network . transactionManager . executeTransaction = jest
787789 . fn ( )
788- . mockRejectedValueOnce ( new Error ( 'cancel tx reverted' ) )
790+ . mockResolvedValueOnce ( mockCollectReceipt ) // collect (before cancel)
791+ . mockRejectedValueOnce ( new Error ( 'cancel tx reverted' ) ) // cancel
792+
793+ network . networkProvider . getBlockNumber = jest . fn ( ) . mockResolvedValue ( 100 )
794+ graphNode . entityCount = jest . fn ( ) . mockResolvedValue ( [ 250000 ] )
795+ graphNode . subgraphFeatures = jest . fn ( ) . mockResolvedValue ( { network : 'mainnet' } )
796+ graphNode . blockHashFromNumber = jest . fn ( ) . mockResolvedValue ( '0xblockhash' )
797+ graphNode . proofOfIndexing = jest
798+ . fn ( )
799+ . mockResolvedValue (
800+ '0x0000000000000000000000000000000000000000000000000000000000000001' ,
801+ )
789802
790803 const result = await dipsManager . cancelAgreement ( mockAgreement . id , mockAgreement )
791804
792805 expect ( result ) . toBe ( false )
793- // executeTransaction called only once (for cancel)
794- expect ( network . transactionManager . executeTransaction ) . toHaveBeenCalledTimes ( 1 )
806+ // collect attempted first, then the failing cancel
807+ expect ( network . transactionManager . executeTransaction ) . toHaveBeenCalledTimes ( 2 )
795808 } )
796809
797- test ( 'cancel succeeds but collect fails returns true, tracker still cleaned up' , async ( ) => {
810+ test ( 'pre- cancel collect fails but cancel succeeds returns true, tracker cleaned up' , async ( ) => {
798811 const mockReceipt = { hash : '0xcancel123' }
799812
800- // Mock cancel succeeds
813+ // Collect (before cancel) reverts — outside the collection window — then
814+ // the SP cancel succeeds anyway.
801815 network . transactionManager . executeTransaction = jest
802816 . fn ( )
817+ . mockRejectedValueOnce ( new Error ( 'collect failed' ) ) // collect (before cancel)
803818 . mockResolvedValueOnce ( mockReceipt ) // cancel succeeds
804- . mockRejectedValueOnce ( new Error ( 'collect failed' ) ) // collect fails
805819
806820 // Mock block number and graph node methods
807821 network . networkProvider . getBlockNumber = jest . fn ( ) . mockResolvedValue ( 100 )
@@ -817,7 +831,7 @@ describe('DipsManager', () => {
817831 const result = await dipsManager . cancelAgreement ( mockAgreement . id , mockAgreement )
818832
819833 expect ( result ) . toBe ( true )
820- // Tracker should be cleaned up even though collect failed
834+ // Tracker should be cleaned up even though the pre-cancel collect failed
821835 expect (
822836 dipsManager . collectionTracker . isReadyForCollection ( mockAgreement . id , 0 ) ,
823837 ) . toBe ( true )
0 commit comments