@@ -671,6 +671,96 @@ func TestClient_GetAccount(t *testing.T) {
671671 })
672672}
673673
674+ func TestClient_BroadcastTx (t * testing.T ) {
675+ logger := zerolog .Nop ()
676+ ctx := context .Background ()
677+
678+ t .Run ("no endpoints configured" , func (t * testing.T ) {
679+ client := & Client {
680+ logger : logger ,
681+ txClients : []tx.ServiceClient {},
682+ }
683+
684+ resp , err := client .BroadcastTx (ctx , []byte ("txbytes" ))
685+ require .Error (t , err )
686+ assert .Contains (t , err .Error (), "no endpoints configured" )
687+ assert .Nil (t , resp )
688+ })
689+
690+ t .Run ("successful broadcast" , func (t * testing.T ) {
691+ mockClient := & mockTxServiceClient {
692+ broadcastResp : & tx.BroadcastTxResponse {
693+ TxResponse : & sdktypes.TxResponse {TxHash : "0xabc" , Code : 0 },
694+ },
695+ }
696+
697+ client := & Client {
698+ logger : logger ,
699+ txClients : []tx.ServiceClient {mockClient },
700+ }
701+
702+ resp , err := client .BroadcastTx (ctx , []byte ("txbytes" ))
703+ require .NoError (t , err )
704+ assert .Equal (t , "0xabc" , resp .TxResponse .TxHash )
705+ })
706+
707+ t .Run ("failover on first endpoint failure" , func (t * testing.T ) {
708+ failing := & mockTxServiceClient {err : assert .AnError }
709+ success := & mockTxServiceClient {
710+ broadcastResp : & tx.BroadcastTxResponse {
711+ TxResponse : & sdktypes.TxResponse {TxHash : "0xdef" },
712+ },
713+ }
714+
715+ client := & Client {
716+ logger : logger ,
717+ txClients : []tx.ServiceClient {failing , success },
718+ }
719+
720+ resp , err := client .BroadcastTx (ctx , []byte ("txbytes" ))
721+ require .NoError (t , err )
722+ assert .Equal (t , "0xdef" , resp .TxResponse .TxHash )
723+ })
724+ }
725+
726+ func TestClient_GetTxsByEvents_MismatchedLengths (t * testing.T ) {
727+ logger := zerolog .Nop ()
728+ mockClient := & mockTxServiceClient {
729+ getTxsEventResp : & tx.GetTxsEventResponse {
730+ Txs : []* tx.Tx {},
731+ TxResponses : []* sdktypes.TxResponse {{TxHash : "0x1" }},
732+ },
733+ }
734+
735+ client := & Client {
736+ logger : logger ,
737+ txClients : []tx.ServiceClient {mockClient },
738+ }
739+
740+ _ , err := client .GetTxsByEvents (context .Background (), "test.event" , 0 , 0 , 0 )
741+ require .Error (t , err )
742+ assert .Contains (t , err .Error (), "mismatched Txs" )
743+ }
744+
745+ func TestClient_GetGasPrice_NilResponse (t * testing.T ) {
746+ logger := zerolog .Nop ()
747+ mockClient := & mockUExecutorQueryClient {
748+ gasPriceResp : & uexecutortypes.QueryGasPriceResponse {
749+ GasPrice : nil ,
750+ },
751+ }
752+
753+ client := & Client {
754+ logger : logger ,
755+ uexecutorClients : []uexecutortypes.QueryClient {mockClient },
756+ }
757+
758+ price , err := client .GetGasPrice (context .Background (), "eip155:1" )
759+ require .Error (t , err )
760+ assert .Contains (t , err .Error (), "GasPrice response is nil" )
761+ assert .Nil (t , price )
762+ }
763+
674764// Mock implementations
675765
676766type mockRegistryQueryClient struct {
@@ -744,6 +834,7 @@ func (m *mockUTSSQueryClient) KeyById(ctx context.Context, req *utsstypes.QueryK
744834type mockTxServiceClient struct {
745835 tx.ServiceClient
746836 getTxsEventResp * tx.GetTxsEventResponse
837+ broadcastResp * tx.BroadcastTxResponse
747838 err error
748839}
749840
@@ -754,6 +845,13 @@ func (m *mockTxServiceClient) GetTxsEvent(ctx context.Context, req *tx.GetTxsEve
754845 return m .getTxsEventResp , nil
755846}
756847
848+ func (m * mockTxServiceClient ) BroadcastTx (ctx context.Context , req * tx.BroadcastTxRequest , opts ... grpc.CallOption ) (* tx.BroadcastTxResponse , error ) {
849+ if m .err != nil {
850+ return nil , m .err
851+ }
852+ return m .broadcastResp , nil
853+ }
854+
757855func (m * mockTxServiceClient ) GetTx (ctx context.Context , req * tx.GetTxRequest , opts ... grpc.CallOption ) (* tx.GetTxResponse , error ) {
758856 return nil , nil
759857}
0 commit comments