arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/api/coordinator_test.go
api/coordinator_test.goRaw
 1package api
 2
 3import (
 4	"fmt"
 5	"testing"
 6
 7	"github.com/hermeznetwork/hermez-node/common"
 8	"github.com/hermeznetwork/hermez-node/db/historydb"
 9	"github.com/mitchellh/copystructure"
10	"github.com/stretchr/testify/assert"
11)
12
13type testCoordinatorsResponse struct {
14	Coordinators []historydb.CoordinatorAPI `json:"coordinators"`
15	PendingItems uint64                     `json:"pendingItems"`
16}
17
18func (t testCoordinatorsResponse) GetPending() (pendingItems, lastItemID uint64) {
19	pendingItems = t.PendingItems
20	lastItemID = t.Coordinators[len(t.Coordinators)-1].ItemID
21	return pendingItems, lastItemID
22}
23
24func (t *testCoordinatorsResponse) Len() int { return len(t.Coordinators) }
25
26func (t testCoordinatorsResponse) New() Pendinger { return &testCoordinatorsResponse{} }
27
28func genTestCoordinators(coordinators []common.Coordinator) []historydb.CoordinatorAPI {
29	testCoords := []historydb.CoordinatorAPI{}
30	for i := 0; i < len(coordinators); i++ {
31		testCoords = append(testCoords, historydb.CoordinatorAPI{
32			Bidder:      coordinators[i].Bidder,
33			Forger:      coordinators[i].Forger,
34			EthBlockNum: coordinators[i].EthBlockNum,
35			URL:         coordinators[i].URL,
36		})
37	}
38	return testCoords
39}
40
41func TestGetCoordinators(t *testing.T) {
42	endpoint := apiURL + "coordinators"
43	fetchedCoordinators := []historydb.CoordinatorAPI{}
44	appendIter := func(intr interface{}) {
45		for i := 0; i < len(intr.(*testCoordinatorsResponse).Coordinators); i++ {
46			tmp, err := copystructure.Copy(intr.(*testCoordinatorsResponse).Coordinators[i])
47			if err != nil {
48				panic(err)
49			}
50			fetchedCoordinators = append(fetchedCoordinators, tmp.(historydb.CoordinatorAPI))
51		}
52	}
53
54	// All
55	limit := 5
56	path := fmt.Sprintf("%s?limit=%d", endpoint, limit)
57	err := doGoodReqPaginated(path, historydb.OrderAsc, &testCoordinatorsResponse{}, appendIter)
58	assert.NoError(t, err)
59	assertCoordinators(t, tc.coordinators, fetchedCoordinators)
60
61	// All in reverse order
62	fetchedCoordinators = []historydb.CoordinatorAPI{}
63	err = doGoodReqPaginated(path, historydb.OrderDesc, &testCoordinatorsResponse{}, appendIter)
64	assert.NoError(t, err)
65	reversedCoordinators := []historydb.CoordinatorAPI{}
66	for i := 0; i < len(tc.coordinators); i++ {
67		reversedCoordinators = append(reversedCoordinators, tc.coordinators[len(tc.coordinators)-1-i])
68	}
69	assertCoordinators(t, reversedCoordinators, fetchedCoordinators)
70
71	// Test GetCoordinator
72	for _, coord := range tc.coordinators {
73		path = fmt.Sprintf("%s/%s", endpoint, coord.Forger.String())
74		fetchedCoordinator := historydb.CoordinatorAPI{}
75		assert.NoError(t, doGoodReq("GET", path, nil, &fetchedCoordinator))
76		assertCoordinator(t, coord, fetchedCoordinator)
77	}
78
79	// 400
80	path = fmt.Sprintf("%s/0x001", endpoint)
81	err = doBadReq("GET", path, nil, 400)
82	assert.NoError(t, err)
83	// 404
84	path = fmt.Sprintf("%s/0xaa942cfcd25ad4d90a62358b0dd84f33b398262a", endpoint)
85	err = doBadReq("GET", path, nil, 404)
86	assert.NoError(t, err)
87}
88
89func assertCoordinator(t *testing.T, expected, actual historydb.CoordinatorAPI) {
90	actual.ItemID = 0
91	assert.Equal(t, expected, actual)
92}
93
94func assertCoordinators(t *testing.T, expected, actual []historydb.CoordinatorAPI) {
95	assert.Equal(t, len(expected), len(actual))
96	for i := 0; i < len(expected); i++ {
97		assertCoordinator(t, expected[i], actual[i])
98	}
99}