Files
gocryptotrader/currency/conversion_test.go
Gareth Kirwan 88182ec414 Engine: Remove Default Forex Provider (#1395)
* Currency: Do not use a default forex provider

exchangerate.host now requires an API key.
Instead of finding a new Free (for now) default, this change simply
disables the currency exchange when nothing is enabled.

* SyncManager: Report ?.?? for an unknown forex amount

In a situation where we thought forex was available but we got an error,
this avoids showing 0.00 when there was actually an error.

* Currency: Tests for no default forex

* Currency: Use mock provider for tests

* Currency: Add API key to exchangerate.host

* Currency: Remove Exchangerate.host

Exchangerate.host was bought by apilayer, the old API deprecated, and
replaced with a proxy to the apilayer api.
We already have currencylayer support, so ther's no reason to keep exh.

Worth noting: New ERH keys actually work on currencylayer

* Currencies: Add test coverage for currency layer

* fixup! Currency: Tests for no default forex

Remove duplicate assignment

Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1395178513)

* fixup! Currency: Add API key to exchangerate.host

Remove unused ErrVar

Fixes [review
comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1396647418)

* fixup! Currency: Tests for no default forex

Fix spelling of override in test

Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395#discussion_r1396701476)

* fixup! SyncManager: Report ?.?? for an unknown forex amount

Fix display of non-positive currency conversions.

Fixes [review comment](https://github.com/thrasher-corp/gocryptotrader/pull/1395/files#r1398527134)
2023-11-24 13:50:01 +11:00

236 lines
5.0 KiB
Go

package currency
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func TestNewConversionFromString(t *testing.T) {
conv, err := NewConversionFromString("AUDUSD")
assert.NoError(t, err, "NewConversionFromString should not error")
assert.Equal(t, "AUDUSD", conv.String(), "Should provide correct conversion currency")
r, err := conv.GetRate()
assert.NoError(t, err, "GetRate should not error")
assert.Positive(t, r, "Should provide correct conversion rate")
conv, err = NewConversionFromString("audusd")
assert.NoError(t, err, "NewConversionFromString should not error")
assert.Equal(t, "audusd", conv.String(), "Should provide correct conversion for lowercase")
r, err = conv.GetRate()
assert.NoError(t, err, "GetRate should not error")
assert.Positive(t, r, "Should provide correct conversion rate")
}
func TestNewConversionFromStrings(t *testing.T) {
from := "AUD"
to := "USD"
conv, err := NewConversionFromStrings(from, to)
if err != nil {
t.Error(err)
}
if expected := "AUDUSD"; conv.String() != expected {
t.Errorf("NewConversion() error expected %s but received %s",
expected,
conv)
}
}
func TestNewConversion(t *testing.T) {
from := NewCode("AUD")
to := NewCode("USD")
conv, err := NewConversion(from, to)
if err != nil {
t.Error(err)
}
if expected := "AUDUSD"; conv.String() != expected {
t.Errorf("NewConversion() error expected %s but received %s",
expected,
conv)
}
}
func TestConversionIsInvalid(t *testing.T) {
from := AUD
to := USD
conv, err := NewConversion(from, to)
if err != nil {
t.Fatal(err)
}
if conv.IsInvalid() {
t.Errorf("IsInvalid() error expected false but received %v",
conv.IsInvalid())
}
to = AUD
if _, err = NewConversion(from, to); err == nil {
t.Error("Expected error")
}
}
func TestConversionIsFiatPair(t *testing.T) {
from := AUD
to := USD
conv, err := NewConversion(from, to)
if err != nil {
t.Fatal(err)
}
if !conv.IsFiat() {
t.Errorf("IsFiatPair() error expected true but received %v",
conv.IsFiat())
}
to = LTC
if _, err = NewConversion(from, to); err == nil {
t.Error("Expected error")
}
}
func TestConversionsRatesSystem(t *testing.T) {
var SuperDuperConversionSystem ConversionRates
if SuperDuperConversionSystem.HasData() {
t.Fatalf("HasData() error expected false but received %v",
SuperDuperConversionSystem.HasData())
}
testmap := map[string]float64{
"USDAUD": 1.3969317581,
"USDBRL": 3.7047257979,
"USDCAD": 1.3186386881,
"USDCHF": 1,
"USDCNY": 6.7222712044,
"USDCZK": 22.6406277552,
"USDDKK": 6.5785575736,
"USDEUR": 0.8816787163,
"USDGBP": 0.7665755599,
"USDHKD": 7.8492329395,
"USDILS": 3.6152354082,
"USDINR": 71.154558279,
"USDJPY": 110.7476635514,
"USDKRW": 1122.7913948157,
"USDMXN": 19.1589666725,
"USDNOK": 8.5818197849,
"USDNZD": 1.4559160642,
"USDPLN": 3.8304531829,
"USDRUB": 65.7533062952,
"USDSEK": 9.3196085346,
"USDSGD": 1.3512608006,
"USDTHB": 31.0950449656,
"USDZAR": 14.138070887,
}
err := SuperDuperConversionSystem.Update(testmap)
if err != nil {
t.Fatal(err)
}
err = SuperDuperConversionSystem.Update(nil)
if err == nil {
t.Fatal("Update() error cannot be nil")
}
if !SuperDuperConversionSystem.HasData() {
t.Fatalf("HasData() error expected true but received %v",
SuperDuperConversionSystem.HasData())
}
// * to a rate
p := SuperDuperConversionSystem.m[USD.Item][AUD.Item]
// inverse * to a rate
pi := SuperDuperConversionSystem.m[AUD.Item][USD.Item]
expectedRate := 1396.9317581
if r := *p * 1000; r != expectedRate {
t.Errorf("Convert() error expected %.13f but received %.13f",
expectedRate,
r)
}
expectedInverseRate := float64(1000)
if inverseR := *pi * expectedRate; inverseR != expectedInverseRate {
t.Errorf("Convert() error expected %.13f but received %.13f",
expectedInverseRate,
inverseR)
}
}
func TestGetRate(t *testing.T) {
from := NewCode("AUD")
to := NewCode("USD")
c, err := NewConversion(from, to)
if err != nil {
t.Fatal(err)
}
rate, err := c.GetRate()
if err != nil {
t.Error(err)
}
if rate == 0 {
t.Error("Rate not set")
}
inv, err := c.GetInversionRate()
if err != nil {
t.Error(err)
}
if inv == 0 {
t.Error("Inverted rate not set")
}
conv, err := c.Convert(1)
if err != nil {
t.Error(err)
}
if rate != conv {
t.Errorf("Incorrect rate %v %v", rate, conv)
}
invConv, err := c.ConvertInverse(1)
if err != nil {
t.Error(err)
}
if inv != invConv {
t.Errorf("Incorrect rate %v %v", conv, invConv)
}
var convs ConversionRates
var convRate float64
_, err = convs.GetRate(BTC, USDT)
if err == nil {
t.Errorf("Expected %s", fmt.Errorf("rate not found for from %s to %s conversion",
BTC,
USD))
}
convRate, err = convs.GetRate(USDT, USD)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
convRate, err = convs.GetRate(RUR, RUB)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
convRate, err = convs.GetRate(RUB, RUR)
if err != nil {
t.Error(err)
}
if convRate != 1 {
t.Errorf("Expected rate to be 1")
}
}