forked from firdasafridi/go-indodax
-
Notifications
You must be signed in to change notification settings - Fork 0
/
websocket_service_test.go
108 lines (90 loc) · 2.53 KB
/
websocket_service_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package indodax
import (
"errors"
"fmt"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"os"
"sync"
"sync/atomic"
"testing"
)
func TestWsOrderBookServe(t *testing.T) {
var wg sync.WaitGroup
wg.Add(1)
aEvent := atomic.Pointer[OrderBookEvent]{}
aErr := atomic.Pointer[error]{}
eventHandler := func(event *OrderBookEvent) {
aEvent.Store(event)
wg.Done()
}
errHandler := func(err error) {
aErr.Store(&err)
wg.Done()
}
doneC, stopC, err := WsOrderBookServe(OBS("btc", "idr"), eventHandler, errHandler)
assert.NoError(t, err)
wg.Wait()
stopC <- struct{}{}
<-doneC
if pErr := aErr.Load(); pErr != nil {
require.NoError(t, *pErr)
}
e := aEvent.Load()
assert.NotNil(t, e)
assert.Equal(t, "btcidr", e.Pair, "pair")
assert.NotEmpty(t, e.Ask, "ask")
assert.NotEmpty(t, e.Bid, "bid")
}
func OBS(base, quote string) OrderBookSymbol {
return OrderBookSymbol{
Base: base,
Quote: quote,
}
}
func Test_toOrderBookEvent(t *testing.T) {
c, err := os.ReadFile("orderbook_response.json")
require.NoError(t, err)
e, offset, err, isTargetedMessage := toOrderBookEvent("market:order-book-btcidr", OBS("btc", "idr"), 0, c)
require.NoError(t, err)
require.True(t, isTargetedMessage)
require.NotNil(t, e)
assert.Equal(t, 6563500, int(offset))
if assert.Len(t, e.Ask, 2) {
assertOrderBookEntry(t, e.Ask[0], "0.74041081", "195433655", "263953000")
assertOrderBookEntry(t, e.Ask[1], "0.00762000", "2011337", "263955000")
}
if assert.Len(t, e.Bid, 2) {
assertOrderBookEntry(t, e.Bid[0], "0.01769092", "4669554", "263952000")
assertOrderBookEntry(t, e.Bid[1], "0.00037693", "99490", "263949000")
}
}
func assertOrderBookEntry(t *testing.T, got OrderBookEntry, wantBase, wantQuote, wantPrice string) {
assert.Equal(t, wantBase, fmt.Sprintf("%0.8f", got.BaseVolume), "base")
assert.Equal(t, wantQuote, fmt.Sprintf("%0.0f", got.QuoteVolume), "quote")
assert.Equal(t, wantPrice, fmt.Sprintf("%0.0f", got.Price), "price")
}
func Test_firstError(t *testing.T) {
err1 := errors.New("hello")
err2 := errors.New("world")
type args struct {
fst error
snd error
}
tests := []struct {
name string
args args
wantErr error
}{
{"nil-nil", args{nil, nil}, nil},
{"nil-err", args{nil, err2}, err2},
{"err-nil", args{err1, nil}, err1},
{"err-err", args{err1, err2}, err1},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := firstError(tt.args.fst, tt.args.snd)
assert.Equal(t, tt.wantErr, got, fmt.Sprintf("firstError(%v, %v)", tt.args.fst, tt.args.snd))
})
}
}