Skip to content
This repository has been archived by the owner on Oct 21, 2024. It is now read-only.

Commit

Permalink
feat(BUX-222): timeout mock arc client added and godocs for creating …
Browse files Browse the repository at this point in the history
…a mock arc
  • Loading branch information
kuba-4chain committed Sep 14, 2023
1 parent 9d2efb6 commit bb4d464
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 42 deletions.
13 changes: 8 additions & 5 deletions broadcast/broadcast-client/client_builder_mocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@ import (
"github.com/bitcoin-sv/go-broadcast-client/broadcast/internal/arc/mocks"
)

// MockType is an enum that is used as parameter to WithMockArc
// client builder in order to create different types of mock.
type MockType int

const (
MockSuccess MockType = iota + 1
MockSuccess MockType = iota
MockFailure
MockTimeout
MockAlreadyOnChain
MockInMempool
)

// WithMockArc creates a mock client for testing purposes. It takes mock type as argument
// and creates a mock client that satisfies the client interface with methods that return
// success or specific error based on this mock type argument.
func (cb *builder) WithMockArc(config ArcClientConfig, mockType MockType) *builder {
var clientToReturn broadcast_api.Client

Expand All @@ -25,8 +28,8 @@ func (cb *builder) WithMockArc(config ArcClientConfig, mockType MockType) *build
case MockFailure:
clientToReturn = mocks.NewArcClientMockFailure()
break

Check failure on line 30 in broadcast/broadcast-client/client_builder_mocks.go

View workflow job for this annotation

GitHub Actions / test-and-lint

S1023: redundant break statement (gosimple)
case MockAlreadyOnChain:
clientToReturn = mocks.NewArcClientMockOnChain()
case MockTimeout:
clientToReturn = mocks.NewArcClientMockTimeout()
break

Check failure on line 33 in broadcast/broadcast-client/client_builder_mocks.go

View workflow job for this annotation

GitHub Actions / test-and-lint

S1023: redundant break statement (gosimple)
default:
clientToReturn = mocks.NewArcClientMock()
Expand Down
2 changes: 1 addition & 1 deletion broadcast/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
// It should be returned for all defined clients in the future.
var ErrClientUndefined = errors.New("client is undefined")

// ErrAllBroadcastersFailed is returned when all configured broadcasters failed to broadcast the transaction.
// ErrAllBroadcastersFailed is returned when all configured broadcasters failed to query or broadcast the transaction.
var ErrAllBroadcastersFailed = errors.New("all broadcasters failed")

// ErrURLEmpty is returned when the API URL is empty.
Expand Down
11 changes: 6 additions & 5 deletions broadcast/internal/arc/mocks/arc_client_mock_no_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,32 @@ import (

type ArcClientMockFailure struct{}

// GetFeeQuote implements broadcast.Client.
// GetFeeQuote returns an error.
func (*ArcClientMockFailure) GetFeeQuote(ctx context.Context) ([]*broadcast_api.FeeQuote, error) {
return nil, broadcast.ErrNoMinerResponse
}

// GetPolicyQuote implements broadcast.Client.
// GetPolicyQuote returns an error.
func (*ArcClientMockFailure) GetPolicyQuote(ctx context.Context) ([]*broadcast_api.PolicyQuoteResponse, error) {
return nil, broadcast.ErrNoMinerResponse
}

// QueryTransaction implements broadcast.Client.
// QueryTransaction returns an error.
func (*ArcClientMockFailure) QueryTransaction(ctx context.Context, txID string) (*broadcast_api.QueryTxResponse, error) {
return nil, broadcast.ErrAllBroadcastersFailed
}

// SubmitBatchTransactions implements broadcast.Client.
// SubmitBatchTransactions returns an error.
func (*ArcClientMockFailure) SubmitBatchTransactions(ctx context.Context, tx []*broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitBatchTxResponse, error) {
return nil, broadcast.ErrAllBroadcastersFailed
}

// SubmitTransaction implements broadcast.Client.
// SubmitTransaction returns an error.
func (*ArcClientMockFailure) SubmitTransaction(ctx context.Context, tx *broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitTxResponse, error) {
return nil, broadcast.ErrAllBroadcastersFailed
}

// NewArcClientMockFailure creates a new mock arc client that returns an error from all its methods.
func NewArcClientMockFailure() broadcast_api.Client {
return &ArcClientMockFailure{}
}
26 changes: 0 additions & 26 deletions broadcast/internal/arc/mocks/arc_client_mock_on_chain.go

This file was deleted.

10 changes: 5 additions & 5 deletions broadcast/internal/arc/mocks/arc_client_mock_success.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const (

type ArcClientMock struct{}

// GetFeeQuote implements broadcast.ClientMock.
// GetFeeQuote returns a successful FeeQuote response.
func (*ArcClientMock) GetFeeQuote(ctx context.Context) ([]*broadcast_api.FeeQuote, error) {
quote1 := &broadcast_api.FeeQuote{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Expand All @@ -40,7 +40,7 @@ func (*ArcClientMock) GetFeeQuote(ctx context.Context) ([]*broadcast_api.FeeQuot
return quotes, nil
}

// GetPolicyQuote implements broadcast.ClientMock.
// GetPolicyQuote return a successful PolicyQuoteResponse.
func (*ArcClientMock) GetPolicyQuote(ctx context.Context) ([]*broadcast_api.PolicyQuoteResponse, error) {
policy1 := &broadcast_api.PolicyQuoteResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Expand Down Expand Up @@ -77,7 +77,7 @@ func (*ArcClientMock) GetPolicyQuote(ctx context.Context) ([]*broadcast_api.Poli
return policies, nil
}

// QueryTransaction implements broadcast.ClientMock.
// QueryTransaction returns a successful QueryTxResponse.
func (*ArcClientMock) QueryTransaction(ctx context.Context, txID string) (*broadcast_api.QueryTxResponse, error) {
return &broadcast_api.QueryTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Expand All @@ -87,7 +87,7 @@ func (*ArcClientMock) QueryTransaction(ctx context.Context, txID string) (*broad
}, nil
}

// SubmitTransaction implements broadcast.ClientMock.
// SubmitTransaction returns a successful SubmitTxResponse.
func (*ArcClientMock) SubmitTransaction(ctx context.Context, tx *broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitTxResponse, error) {
return &broadcast_api.SubmitTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Expand All @@ -99,7 +99,7 @@ func (*ArcClientMock) SubmitTransaction(ctx context.Context, tx *broadcast_api.T
}, nil
}

// SubmitBatchTransactions implements broadcast.ClientMock.
// SubmitBatchTransactions returns a successful SubmitBatchTxResponse.
func (*ArcClientMock) SubmitBatchTransactions(ctx context.Context, tx []*broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitBatchTxResponse, error) {
return &broadcast_api.SubmitBatchTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Expand Down
125 changes: 125 additions & 0 deletions broadcast/internal/arc/mocks/arc_client_mock_timeout.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package mocks

import (
"context"
"time"

broadcast_api "github.com/bitcoin-sv/go-broadcast-client/broadcast"
)

const defaultMockTimeout = 20 * time.Second

type ArcClientMockTimeout struct{}

// GetFeeQuote returns a successful FeeQuote response after a long time.
func (*ArcClientMockTimeout) GetFeeQuote(ctx context.Context) ([]*broadcast_api.FeeQuote, error) {
quote1 := &broadcast_api.FeeQuote{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
MiningFee: broadcast_api.MiningFeeResponse{
Bytes: 1000,
Satoshis: 1,
},
Timestamp: "2023-09-05T17:03:49.537230128Z",
}

quote2 := &broadcast_api.FeeQuote{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl2},
MiningFee: broadcast_api.MiningFeeResponse{
Bytes: 1000,
Satoshis: 2,
},
Timestamp: "2023-09-05T17:05:29.736256927Z",
}

quotes := make([]*broadcast_api.FeeQuote, 2)
quotes = append(quotes, quote1)
quotes = append(quotes, quote2)

time.Sleep(defaultMockTimeout)
return quotes, nil
}

// GetPolicyQuote return a successful PolicyQuoteResponse after a long time.
func (*ArcClientMockTimeout) GetPolicyQuote(ctx context.Context) ([]*broadcast_api.PolicyQuoteResponse, error) {
policy1 := &broadcast_api.PolicyQuoteResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Policy: broadcast_api.PolicyResponse{
MaxScriptSizePolicy: 100000000,
MaxTxSigOpsCountPolicy: 4294967295,
MaxTxSizePolicy: 100000000,
MiningFee: broadcast_api.MiningFeeResponse{
Bytes: 1000,
Satoshis: 1,
},
},
Timestamp: "2023-09-05T17:03:49.537230128Z",
}

policy2 := &broadcast_api.PolicyQuoteResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl2},
Policy: broadcast_api.PolicyResponse{
MaxScriptSizePolicy: 100000000,
MaxTxSigOpsCountPolicy: 4294967295,
MaxTxSizePolicy: 220000000,
MiningFee: broadcast_api.MiningFeeResponse{
Bytes: 1000,
Satoshis: 2,
},
},
Timestamp: "2023-09-05T17:05:29.736256927Z",
}

policies := make([]*broadcast_api.PolicyQuoteResponse, 2)
policies = append(policies, policy1)
policies = append(policies, policy2)

time.Sleep(defaultMockTimeout)
return policies, nil
}

// QueryTransaction returns a successful QueryTxResponse after a long time.
func (*ArcClientMockTimeout) QueryTransaction(ctx context.Context, txID string) (*broadcast_api.QueryTxResponse, error) {
return &broadcast_api.QueryTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Timestamp: "2023-09-05T17:05:29.736256927Z",
TxID: txID,
TxStatus: "SEEN_ON_NETWORK",
}, nil
}

// SubmitTransaction returns a successful SubmitTxResponse after a long time.
func (*ArcClientMockTimeout) SubmitTransaction(ctx context.Context, tx *broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitTxResponse, error) {
time.Sleep(defaultMockTimeout)
return &broadcast_api.SubmitTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
SubmittedTx: &broadcast_api.SubmittedTx{
Status: 200,
Title: "OK",
TxStatus: "SENT_TO_NETWORK",
},
}, nil
}

// SubmitBatchTransactions returns a successful SubmitBatchTxResponse after a long time.
func (*ArcClientMockTimeout) SubmitBatchTransactions(ctx context.Context, tx []*broadcast_api.Transaction, opts ...broadcast_api.TransactionOptFunc) (*broadcast_api.SubmitBatchTxResponse, error) {
time.Sleep(defaultMockTimeout)
return &broadcast_api.SubmitBatchTxResponse{
BaseResponse: broadcast_api.BaseResponse{Miner: MockedApiUrl1},
Transactions: []*broadcast_api.SubmittedTx{
{
Status: 200,
Title: "OK",
TxStatus: "SENT_TO_NETWORK",
},
{
Status: 200,
Title: "OK",
TxStatus: "SENT_TO_NETWORK",
},
},
}, nil
}

func NewArcClientMockTimeout() broadcast_api.Client {
return &ArcClientMockTimeout{}
}

0 comments on commit bb4d464

Please sign in to comment.