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