api_test.go 5.61 KB
Newer Older
1
package api
2 3

import (
4
	"encoding/json"
5
	"fmt"
6 7 8 9
	"net/http"
	"net/http/httptest"
	"testing"

10
	"github.com/ethereum-optimism/optimism/indexer/api/routes"
Will Cory's avatar
Will Cory committed
11
	"github.com/ethereum-optimism/optimism/indexer/config"
Will Cory's avatar
Will Cory committed
12
	"github.com/ethereum-optimism/optimism/indexer/database"
13
	"github.com/ethereum-optimism/optimism/op-node/testlog"
Will Cory's avatar
Will Cory committed
14
	"github.com/ethereum/go-ethereum/common"
15
	"github.com/ethereum/go-ethereum/log"
16
	"github.com/stretchr/testify/assert"
17
	"github.com/stretchr/testify/require"
18 19
)

Hamdi Allam's avatar
Hamdi Allam committed
20 21
// MockBridgeTransfersView mocks the BridgeTransfersView interface
type MockBridgeTransfersView struct{}
22

23 24
var mockAddress = "0x4204204204204204204204204204204204204204"

Will Cory's avatar
Will Cory committed
25
var apiConfig = config.ServerConfig{
Will Cory's avatar
Will Cory committed
26 27 28
	Host: "localhost",
	Port: 8080,
}
Will Cory's avatar
Will Cory committed
29
var metricsConfig = config.ServerConfig{
Will Cory's avatar
Will Cory committed
30 31 32 33
	Host: "localhost",
	Port: 7300,
}

Hamdi Allam's avatar
Hamdi Allam committed
34 35
var (
	deposit = database.L1BridgeDeposit{
Hamdi Allam's avatar
Hamdi Allam committed
36 37 38 39 40 41
		TransactionSourceHash: common.HexToHash("abc"),
		BridgeTransfer: database.BridgeTransfer{
			CrossDomainMessageHash: &common.Hash{},
			Tx:                     database.Transaction{},
			TokenPair:              database.TokenPair{},
		},
Hamdi Allam's avatar
Hamdi Allam committed
42 43 44
	}

	withdrawal = database.L2BridgeWithdrawal{
45
		TransactionWithdrawalHash: common.HexToHash("0x420"),
Hamdi Allam's avatar
Hamdi Allam committed
46 47 48 49 50
		BridgeTransfer: database.BridgeTransfer{
			CrossDomainMessageHash: &common.Hash{},
			Tx:                     database.Transaction{},
			TokenPair:              database.TokenPair{},
		},
Hamdi Allam's avatar
Hamdi Allam committed
51 52 53 54 55
	}
)

func (mbv *MockBridgeTransfersView) L1BridgeDeposit(hash common.Hash) (*database.L1BridgeDeposit, error) {
	return &deposit, nil
Hamdi Allam's avatar
Hamdi Allam committed
56 57
}

Hamdi Allam's avatar
Hamdi Allam committed
58
func (mbv *MockBridgeTransfersView) L1BridgeDepositWithFilter(filter database.BridgeTransfer) (*database.L1BridgeDeposit, error) {
Hamdi Allam's avatar
Hamdi Allam committed
59
	return &deposit, nil
Hamdi Allam's avatar
Hamdi Allam committed
60 61
}

Hamdi Allam's avatar
Hamdi Allam committed
62
func (mbv *MockBridgeTransfersView) L2BridgeWithdrawal(address common.Hash) (*database.L2BridgeWithdrawal, error) {
Hamdi Allam's avatar
Hamdi Allam committed
63
	return &withdrawal, nil
Hamdi Allam's avatar
Hamdi Allam committed
64 65
}

Hamdi Allam's avatar
Hamdi Allam committed
66
func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalWithFilter(filter database.BridgeTransfer) (*database.L2BridgeWithdrawal, error) {
Hamdi Allam's avatar
Hamdi Allam committed
67
	return &withdrawal, nil
Hamdi Allam's avatar
Hamdi Allam committed
68 69
}

70 71
func (mbv *MockBridgeTransfersView) L1BridgeDepositsByAddress(address common.Address, cursor string, limit int) (*database.L1BridgeDepositsResponse, error) {
	return &database.L1BridgeDepositsResponse{
Hamdi Allam's avatar
Hamdi Allam committed
72
		Deposits: []database.L1BridgeDepositWithTransactionHashes{
73 74 75
			{
				L1BridgeDeposit:   deposit,
				L1TransactionHash: common.HexToHash("0x123"),
76 77
				L2TransactionHash: common.HexToHash("0x555"),
				L1BlockHash:       common.HexToHash("0x456"),
78
			},
Hamdi Allam's avatar
Hamdi Allam committed
79 80
		},
	}, nil
Hamdi Allam's avatar
Hamdi Allam committed
81 82
}

83 84
func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.Address, cursor string, limit int) (*database.L2BridgeWithdrawalsResponse, error) {
	return &database.L2BridgeWithdrawalsResponse{
Hamdi Allam's avatar
Hamdi Allam committed
85
		Withdrawals: []database.L2BridgeWithdrawalWithTransactionHashes{
86
			{
87 88 89 90 91
				L2BridgeWithdrawal:         withdrawal,
				L2TransactionHash:          common.HexToHash("0x789"),
				L2BlockHash:                common.HexToHash("0x456"),
				ProvenL1TransactionHash:    common.HexToHash("0x123"),
				FinalizedL1TransactionHash: common.HexToHash("0x123"),
92 93 94 95
			},
		},
	}, nil
}
96
func TestHealthz(t *testing.T) {
97
	logger := testlog.Logger(t, log.LvlInfo)
Will Cory's avatar
Will Cory committed
98
	api := NewApi(logger, &MockBridgeTransfersView{}, apiConfig, metricsConfig)
99 100 101 102 103 104 105 106 107
	request, err := http.NewRequest("GET", "/healthz", nil)
	assert.Nil(t, err)

	responseRecorder := httptest.NewRecorder()
	api.Router.ServeHTTP(responseRecorder, request)

	assert.Equal(t, http.StatusOK, responseRecorder.Code)
}

Hamdi Allam's avatar
Hamdi Allam committed
108
func TestL1BridgeDepositsHandler(t *testing.T) {
109
	logger := testlog.Logger(t, log.LvlInfo)
Will Cory's avatar
Will Cory committed
110
	api := NewApi(logger, &MockBridgeTransfersView{}, apiConfig, metricsConfig)
111
	request, err := http.NewRequest("GET", fmt.Sprintf("/api/v0/deposits/%s", mockAddress), nil)
Will Cory's avatar
Will Cory committed
112
	assert.Nil(t, err)
113

Will Cory's avatar
Will Cory committed
114 115
	responseRecorder := httptest.NewRecorder()
	api.Router.ServeHTTP(responseRecorder, request)
116

Will Cory's avatar
Will Cory committed
117
	assert.Equal(t, http.StatusOK, responseRecorder.Code)
118 119 120 121 122 123 124 125 126 127 128

	var resp routes.DepositResponse
	err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp)
	assert.Nil(t, err)

	require.Len(t, resp.Items, 1)

	assert.Equal(t, resp.Items[0].L1BlockHash, common.HexToHash("0x456").String())
	assert.Equal(t, resp.Items[0].L1TxHash, common.HexToHash("0x123").String())
	assert.Equal(t, resp.Items[0].Timestamp, deposit.Tx.Timestamp)
	assert.Equal(t, resp.Items[0].L2TxHash, common.HexToHash("555").String())
Will Cory's avatar
Will Cory committed
129
}
130

Hamdi Allam's avatar
Hamdi Allam committed
131
func TestL2BridgeWithdrawalsByAddressHandler(t *testing.T) {
132
	logger := testlog.Logger(t, log.LvlInfo)
Will Cory's avatar
Will Cory committed
133
	api := NewApi(logger, &MockBridgeTransfersView{}, apiConfig, metricsConfig)
134
	request, err := http.NewRequest("GET", fmt.Sprintf("/api/v0/withdrawals/%s", mockAddress), nil)
Will Cory's avatar
Will Cory committed
135
	assert.Nil(t, err)
136

Will Cory's avatar
Will Cory committed
137 138
	responseRecorder := httptest.NewRecorder()
	api.Router.ServeHTTP(responseRecorder, request)
139

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
	var resp routes.WithdrawalResponse
	err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp)
	assert.Nil(t, err)

	require.Len(t, resp.Items, 1)

	assert.Equal(t, resp.Items[0].Guid, withdrawal.TransactionWithdrawalHash.String())
	assert.Equal(t, resp.Items[0].L2BlockHash, common.HexToHash("0x456").String())
	assert.Equal(t, resp.Items[0].From, withdrawal.Tx.FromAddress.String())
	assert.Equal(t, resp.Items[0].To, withdrawal.Tx.ToAddress.String())
	assert.Equal(t, resp.Items[0].TransactionHash, common.HexToHash("0x789").String())
	assert.Equal(t, resp.Items[0].Amount, withdrawal.Tx.Amount.String())
	assert.Equal(t, resp.Items[0].ProofTransactionHash, common.HexToHash("0x123").String())
	assert.Equal(t, resp.Items[0].ClaimTransactionHash, common.HexToHash("0x123").String())
	assert.Equal(t, resp.Items[0].L1TokenAddress, withdrawal.TokenPair.RemoteTokenAddress.String())
	assert.Equal(t, resp.Items[0].L2TokenAddress, withdrawal.TokenPair.LocalTokenAddress.String())
	assert.Equal(t, resp.Items[0].Timestamp, withdrawal.Tx.Timestamp)

158
}