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

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

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

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

24 25
var mockAddress = "0x4204204204204204204204204204204204204204"

Will Cory's avatar
Will Cory committed
26
var apiConfig = config.ServerConfig{
Will Cory's avatar
Will Cory committed
27
	Host: "localhost",
28
	Port: 0, // random port, to allow parallel tests
Will Cory's avatar
Will Cory committed
29
}
30

Will Cory's avatar
Will Cory committed
31
var metricsConfig = config.ServerConfig{
Will Cory's avatar
Will Cory committed
32
	Host: "localhost",
33
	Port: 0, // random port, to allow parallel tests
Will Cory's avatar
Will Cory committed
34 35
}

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

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

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

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

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

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

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

85 86
func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.Address, cursor string, limit int) (*database.L2BridgeWithdrawalsResponse, error) {
	return &database.L2BridgeWithdrawalsResponse{
Hamdi Allam's avatar
Hamdi Allam committed
87
		Withdrawals: []database.L2BridgeWithdrawalWithTransactionHashes{
88
			{
89 90 91 92 93
				L2BridgeWithdrawal:         withdrawal,
				L2TransactionHash:          common.HexToHash("0x789"),
				L2BlockHash:                common.HexToHash("0x456"),
				ProvenL1TransactionHash:    common.HexToHash("0x123"),
				FinalizedL1TransactionHash: common.HexToHash("0x123"),
94 95 96 97
			},
		},
	}, nil
}
98

99
func (mbv *MockBridgeTransfersView) L1TxDepositSum() (float64, error) {
100 101
	return 69, nil
}
102
func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalSum(database.WithdrawFilter) (float64, error) {
103 104
	return 420, nil
}
105

106
func TestHealthz(t *testing.T) {
107
	logger := testlog.Logger(t, log.LvlInfo)
108 109 110 111 112 113 114 115
	cfg := &Config{
		DB:            &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}},
		HTTPServer:    apiConfig,
		MetricsServer: metricsConfig,
	}
	api, err := NewApi(context.Background(), logger, cfg)
	require.NoError(t, err)
	request, err := http.NewRequest("GET", "http://"+api.Addr()+"/healthz", nil)
116 117 118
	assert.Nil(t, err)

	responseRecorder := httptest.NewRecorder()
119
	api.router.ServeHTTP(responseRecorder, request)
120 121 122 123

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

Hamdi Allam's avatar
Hamdi Allam committed
124
func TestL1BridgeDepositsHandler(t *testing.T) {
125
	logger := testlog.Logger(t, log.LvlInfo)
126 127 128 129 130 131 132 133
	cfg := &Config{
		DB:            &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}},
		HTTPServer:    apiConfig,
		MetricsServer: metricsConfig,
	}
	api, err := NewApi(context.Background(), logger, cfg)
	require.NoError(t, err)
	request, err := http.NewRequest("GET", fmt.Sprintf("http://"+api.Addr()+"/api/v0/deposits/%s", mockAddress), nil)
Will Cory's avatar
Will Cory committed
134
	assert.Nil(t, err)
135

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

Will Cory's avatar
Will Cory committed
139
	assert.Equal(t, http.StatusOK, responseRecorder.Code)
140

141
	var resp models.DepositResponse
142 143 144 145 146 147 148 149 150
	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
151
}
152

Hamdi Allam's avatar
Hamdi Allam committed
153
func TestL2BridgeWithdrawalsByAddressHandler(t *testing.T) {
154
	logger := testlog.Logger(t, log.LvlInfo)
155 156 157 158 159 160 161 162
	cfg := &Config{
		DB:            &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}},
		HTTPServer:    apiConfig,
		MetricsServer: metricsConfig,
	}
	api, err := NewApi(context.Background(), logger, cfg)
	require.NoError(t, err)
	request, err := http.NewRequest("GET", fmt.Sprintf("http://"+api.Addr()+"/api/v0/withdrawals/%s", mockAddress), nil)
Will Cory's avatar
Will Cory committed
163
	assert.Nil(t, err)
164

Will Cory's avatar
Will Cory committed
165
	responseRecorder := httptest.NewRecorder()
166
	api.router.ServeHTTP(responseRecorder, request)
167

168
	var resp models.WithdrawalResponse
169 170 171 172 173 174 175 176 177 178 179
	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())
180 181
	assert.Equal(t, resp.Items[0].L1ProvenTxHash, common.HexToHash("0x123").String())
	assert.Equal(t, resp.Items[0].L1FinalizedTxHash, common.HexToHash("0x123").String())
182 183 184 185
	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)

186
}