@@ -10,6 +10,8 @@ import {
1010 TransactionControllerOptions ,
1111 TransactionStatus ,
1212 PublishHook ,
13+ PublishBatchHookRequest ,
14+ PublishBatchHookTransaction ,
1315} from '@metamask/transaction-controller' ;
1416import { TransactionPayPublishHook } from '@metamask/transaction-pay-controller' ;
1517import {
@@ -581,4 +583,165 @@ describe('Transaction Controller Init', () => {
581583 } ) ;
582584 } ) ;
583585 } ) ;
586+
587+ describe ( 'publishBatch hook' , ( ) => {
588+ const mockTransactionMeta : TransactionMeta = {
589+ id : 'batch-tx-last' ,
590+ chainId : CHAIN_ID_MOCK ,
591+ status : TransactionStatus . approved ,
592+ time : Date . now ( ) ,
593+ txParams : {
594+ from : '0x0000000000000000000000000000000000000000' ,
595+ } ,
596+ networkClientId : 'test-network' ,
597+ } ;
598+
599+ it ( 'calls upsertTransactionUIMetricsFragment with sentinel_stx for each batch tx with an id on STX success' , async ( ) => {
600+ jest
601+ . mocked ( smartTransactionsModule . getSmartTransactionCommonParams )
602+ . mockReturnValue ( {
603+ isSmartTransaction : true ,
604+ featureFlags : {
605+ extensionReturnTxHashAsap : false ,
606+ extensionReturnTxHashAsapBatch : false ,
607+ extensionSkipSmartTransactionStatusPage : false ,
608+ mobileActive : false ,
609+ extensionActive : false ,
610+ } ,
611+ isHardwareWalletAccount : false ,
612+ } ) ;
613+
614+ jest
615+ . mocked ( smartTransactionsModule . submitBatchSmartTransactionHook )
616+ . mockResolvedValue ( { results : [ ] } ) ;
617+
618+ const upsertFragmentMock = jest . fn ( ) ;
619+ const requestMock = buildInitRequestMock ( ) ;
620+ requestMock . getTransactionMetricsRequest . mockReturnValue ( {
621+ upsertTransactionUIMetricsFragment : upsertFragmentMock ,
622+ } as unknown as ReturnType <
623+ typeof requestMock . getTransactionMetricsRequest
624+ > ) ;
625+
626+ TransactionControllerInit ( requestMock ) ;
627+
628+ const { hooks } = transactionControllerClassMock . mock . calls [ 0 ] [ 0 ] ;
629+ const controllerInstance =
630+ transactionControllerClassMock . mock . instances [ 0 ] ;
631+ // @ts -expect-error Partial mock state
632+ controllerInstance . state = {
633+ transactions : [ mockTransactionMeta ] ,
634+ } ;
635+
636+ await hooks ?. publishBatch ?.( {
637+ transactions : [
638+ { id : 'batch-tx-1' } as unknown as PublishBatchHookTransaction ,
639+ { id : 'batch-tx-last' } as unknown as PublishBatchHookTransaction ,
640+ ] ,
641+ } as unknown as PublishBatchHookRequest ) ;
642+
643+ expect ( upsertFragmentMock ) . toHaveBeenCalledTimes ( 2 ) ;
644+ expect ( upsertFragmentMock ) . toHaveBeenCalledWith ( 'batch-tx-1' , {
645+ // eslint-disable-next-line @typescript-eslint/naming-convention
646+ properties : { transaction_submission_method : 'sentinel_stx' } ,
647+ } ) ;
648+ expect ( upsertFragmentMock ) . toHaveBeenCalledWith ( 'batch-tx-last' , {
649+ // eslint-disable-next-line @typescript-eslint/naming-convention
650+ properties : { transaction_submission_method : 'sentinel_stx' } ,
651+ } ) ;
652+ } ) ;
653+
654+ it ( 'skips upsertTransactionUIMetricsFragment for batch txs without an id' , async ( ) => {
655+ jest
656+ . mocked ( smartTransactionsModule . getSmartTransactionCommonParams )
657+ . mockReturnValue ( {
658+ isSmartTransaction : true ,
659+ featureFlags : {
660+ extensionReturnTxHashAsap : false ,
661+ extensionReturnTxHashAsapBatch : false ,
662+ extensionSkipSmartTransactionStatusPage : false ,
663+ mobileActive : false ,
664+ extensionActive : false ,
665+ } ,
666+ isHardwareWalletAccount : false ,
667+ } ) ;
668+
669+ jest
670+ . mocked ( smartTransactionsModule . submitBatchSmartTransactionHook )
671+ . mockResolvedValue ( { results : [ ] } ) ;
672+
673+ const upsertFragmentMock = jest . fn ( ) ;
674+ const requestMock = buildInitRequestMock ( ) ;
675+ requestMock . getTransactionMetricsRequest . mockReturnValue ( {
676+ upsertTransactionUIMetricsFragment : upsertFragmentMock ,
677+ } as unknown as ReturnType <
678+ typeof requestMock . getTransactionMetricsRequest
679+ > ) ;
680+
681+ TransactionControllerInit ( requestMock ) ;
682+
683+ const { hooks } = transactionControllerClassMock . mock . calls [ 0 ] [ 0 ] ;
684+ const controllerInstance =
685+ transactionControllerClassMock . mock . instances [ 0 ] ;
686+ // @ts -expect-error Partial mock state
687+ controllerInstance . state = {
688+ transactions : [ mockTransactionMeta ] ,
689+ } ;
690+
691+ await hooks ?. publishBatch ?.( {
692+ transactions : [
693+ { } as unknown as PublishBatchHookTransaction ,
694+ { id : 'batch-tx-last' } as unknown as PublishBatchHookTransaction ,
695+ ] ,
696+ } as unknown as PublishBatchHookRequest ) ;
697+
698+ expect ( upsertFragmentMock ) . toHaveBeenCalledTimes ( 1 ) ;
699+ expect ( upsertFragmentMock ) . toHaveBeenCalledWith ( 'batch-tx-last' , {
700+ // eslint-disable-next-line @typescript-eslint/naming-convention
701+ properties : { transaction_submission_method : 'sentinel_stx' } ,
702+ } ) ;
703+ } ) ;
704+
705+ it ( 'does not call upsertTransactionUIMetricsFragment when publishBatchHook returns undefined' , async ( ) => {
706+ jest
707+ . mocked ( smartTransactionsModule . getSmartTransactionCommonParams )
708+ . mockReturnValue ( {
709+ isSmartTransaction : false ,
710+ featureFlags : {
711+ extensionReturnTxHashAsap : false ,
712+ extensionReturnTxHashAsapBatch : false ,
713+ extensionSkipSmartTransactionStatusPage : false ,
714+ mobileActive : false ,
715+ extensionActive : false ,
716+ } ,
717+ isHardwareWalletAccount : false ,
718+ } ) ;
719+
720+ const upsertFragmentMock = jest . fn ( ) ;
721+ const requestMock = buildInitRequestMock ( ) ;
722+ requestMock . getTransactionMetricsRequest . mockReturnValue ( {
723+ upsertTransactionUIMetricsFragment : upsertFragmentMock ,
724+ } as unknown as ReturnType <
725+ typeof requestMock . getTransactionMetricsRequest
726+ > ) ;
727+
728+ TransactionControllerInit ( requestMock ) ;
729+
730+ const { hooks } = transactionControllerClassMock . mock . calls [ 0 ] [ 0 ] ;
731+ const controllerInstance =
732+ transactionControllerClassMock . mock . instances [ 0 ] ;
733+ // @ts -expect-error Partial mock state
734+ controllerInstance . state = {
735+ transactions : [ mockTransactionMeta ] ,
736+ } ;
737+
738+ await hooks ?. publishBatch ?.( {
739+ transactions : [
740+ { id : 'batch-tx-last' } as unknown as PublishBatchHookTransaction ,
741+ ] ,
742+ } as unknown as PublishBatchHookRequest ) ;
743+
744+ expect ( upsertFragmentMock ) . not . toHaveBeenCalled ( ) ;
745+ } ) ;
746+ } ) ;
584747} ) ;
0 commit comments