1// Copyright (C) 2019 Storj Labs, Inc.
2// See LICENSE for copying information.
3
4package coinpayments
5
6import (
7	"bytes"
8	"io"
9	"net/http"
10	"testing"
11
12	"github.com/shopspring/decimal"
13	"github.com/stretchr/testify/require"
14
15	"storj.io/common/testcontext"
16	"storj.io/storj/satellite/payments/monetary"
17)
18
19const (
20	// reference https://www.coinpayments.net/apidoc-rates
21	ratesJSON = `{
22		"USD": {
23			"is_fiat": 1,
24			"rate_btc": "0.0001234215748657146721341",
25			"last_update": "1633015701",
26			"tx_fee": "0.00000000",
27			"status": "online",
28			"name": "United States Dollar",
29			"confirms": "3",
30			"capabilities": [
31				"payments", "wallet", "transfers", "convert"
32			]
33		},
34		"BTC": {
35			"is_fiat": 0,
36			"rate_btc": "1.000000000000000000000000",
37			"last_update": "1632931502",
38			"tx_fee": "0.00100000",
39			"status": "online",
40			"name": "Bitcoin",
41			"confirms": "2",
42			"capabilities": [
43				"payments", "wallet", "transfers", "convert"
44			]
45		},
46		"LTCT": {
47			"is_fiat": 0,
48			"rate_btc": "999999.999999999999999999",
49			"last_update": "1628027418",
50			"tx_fee": "0.00000000",
51			"status": "online",
52			"name": "LTCT test coins",
53			"confirms": "2",
54			"capabilities": []
55		}
56	}`
57
58	resultJSON = `{"error": "ok", "result": ` + ratesJSON + `}`
59
60	publicKey  = "hi i am a public key"
61	privateKey = "hi i am a private key"
62)
63
64type dumbMockClient struct {
65	response string
66}
67
68func (c *dumbMockClient) Do(req *http.Request) (*http.Response, error) {
69	return &http.Response{
70		Status:        "OK",
71		StatusCode:    http.StatusOK,
72		Body:          io.NopCloser(bytes.NewBuffer([]byte(c.response))),
73		ContentLength: int64(len(c.response)),
74	}, nil
75}
76
77func TestProcessingConversionRates(t *testing.T) {
78	rateService := Client{
79		creds: Credentials{PublicKey: publicKey, PrivateKey: privateKey},
80		http:  &dumbMockClient{response: resultJSON},
81	}
82
83	rateInfos, err := rateService.ConversionRates().Get(testcontext.New(t))
84	require.NoError(t, err)
85
86	require.Truef(t, rateInfos["BTC"].RateBTC.Equal(decimal.NewFromFloat(1.0)),
87		"expected 1.0, but got %v", rateInfos["BTC"].RateBTC.String())
88	require.Truef(t, rateInfos["USD"].RateBTC.LessThan(decimal.NewFromInt(1)),
89		"expected value less than 1, but got %v", rateInfos["USD"].RateBTC.String())
90
91	rateInfo, ok := rateInfos.ForCurrency(monetary.USDollars)
92	require.True(t, ok)
93	require.True(t, rateInfo.IsFiat)
94
95	_, ok = rateInfos.ForCurrency(monetary.LiveGoats)
96	require.False(t, ok)
97
98	rateInfo, ok = rateInfos.ForCurrency(CurrencyLTCT)
99	require.True(t, ok)
100	require.True(t, rateInfo.TXFee.Equal(decimal.NewFromInt(0)))
101}
102