diff --git a/pkg/exchangerates/bank_of_canada_datasource_test.go b/pkg/exchangerates/bank_of_canada_datasource_test.go
new file mode 100644
index 00000000..bbc5318b
--- /dev/null
+++ b/pkg/exchangerates/bank_of_canada_datasource_test.go
@@ -0,0 +1,196 @@
+package exchangerates
+
+import (
+ "testing"
+
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/mayswind/lab/pkg/core"
+ "github.com/mayswind/lab/pkg/models"
+)
+
+const bankOfCanadaMinimumRequiredContent = "{\n" +
+ " \"observations\": [\n" +
+ " {\n" +
+ " \"d\": \"2019-12-31\",\n" +
+ " \"FXVNDCAD\": {\n" +
+ " \"v\": \"0.000056\"\n" +
+ " }\n" +
+ " },\n" +
+ " {\n" +
+ " \"d\": \"2021-04-01\",\n" +
+ " \"FXCNYCAD\": {\n" +
+ " \"v\": \"0.1913\"\n" +
+ " },\n" +
+ " \"FXUSDCAD\": {\n" +
+ " \"v\": \"1.2565\"\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ "}"
+
+func TestBankOfCanadaDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(bankOfCanadaMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Equal(t, "CAD", actualLatestExchangeRateResponse.BaseCurrency)
+}
+
+func TestBankOfCanadaDataSource_StandardDataExtractExchangeRates(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(bankOfCanadaMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "USD",
+ Rate: "0.7958615200955034",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "CNY",
+ Rate: "5.2273915316257185",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "VND",
+ Rate: "17857.14285714286",
+ })
+}
+
+func TestBankOfCanadaDataSource_BlankContent(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestBankOfCanadaDataSource_EmptyJsonObject(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("{}"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestBankOfCanadaDataSource_EmptyObservationsContent(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": []"+
+ "}"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestBankOfCanadaDataSource_InvalidObservationFormat(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": [\n"+
+ " {\n"+
+ " \"d\": \"2021-04-01\",\n"+
+ " \"CNYCAD\": {\n"+
+ " \"v\": \"0.1913\"\n"+
+ " }\n"+
+ " }\n"+
+ " ]\n"+
+ "}"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestBankOfCanadaDataSource_InvalidObservationFormat2(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": [\n"+
+ " {\n"+
+ " \"d\": \"2021-04-01\",\n"+
+ " \"FXCADCNY\": {\n"+
+ " \"v\": \"0.1913\"\n"+
+ " }\n"+
+ " }\n"+
+ " ]\n"+
+ "}"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestBankOfCanadaDataSource_InvalidCurrency(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": [\n"+
+ " {\n"+
+ " \"d\": \"2021-04-01\",\n"+
+ " \"FXXXXCAD\": {\n"+
+ " \"v\": \"1\"\n"+
+ " }\n"+
+ " }\n"+
+ " ]\n"+
+ "}"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestBankOfCanadaDataSource_EmptyRate(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": [\n"+
+ " {\n"+
+ " \"d\": \"2021-04-01\",\n"+
+ " \"FXUSDCAD\": {\n"+
+ " \"v\": \"\"\n"+
+ " }\n"+
+ " }\n"+
+ " ]\n"+
+ "}"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestBankOfCanadaDataSource_InvalidRate(t *testing.T) {
+ dataSource := &BankOfCanadaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("{"+
+ " \"observations\": [\n"+
+ " {\n"+
+ " \"d\": \"2021-04-01\",\n"+
+ " \"FXUSDCAD\": {\n"+
+ " \"v\": null\n"+
+ " }\n"+
+ " }\n"+
+ " ]\n"+
+ "}"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
diff --git a/pkg/exchangerates/czech_national_bank_datasource_test.go b/pkg/exchangerates/czech_national_bank_datasource_test.go
new file mode 100644
index 00000000..64d908f2
--- /dev/null
+++ b/pkg/exchangerates/czech_national_bank_datasource_test.go
@@ -0,0 +1,141 @@
+package exchangerates
+
+import (
+ "testing"
+
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/mayswind/lab/pkg/core"
+ "github.com/mayswind/lab/pkg/models"
+)
+
+const czechNationalBankMinimumRequiredContent = "01 Apr 2021 #64\n" +
+ "Country|Currency|Amount|Code|Rate\n" +
+ "China|renminbi|1|CNY|3.379\n" +
+ "USA|dollar|1|USD|22.206\n"
+
+func TestCzechNationalBankDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(czechNationalBankMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Equal(t, "CZK", actualLatestExchangeRateResponse.BaseCurrency)
+}
+
+func TestCzechNationalBankDataSource_StandardDataExtractExchangeRates(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(czechNationalBankMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "USD",
+ Rate: "0.04503287399801856",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "CNY",
+ Rate: "0.2959455460195324",
+ })
+}
+
+func TestCzechNationalBankDataSource_BlankContent(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestCzechNationalBankDataSource_OnlyHeader(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("01 Apr 2021 #64"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestCzechNationalBankDataSource_OnlyHeaderAndTitle(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Code|Rate"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestCzechNationalBankDataSource_TitleMissingCode(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Rate\n"+
+ "China|renminbi|1|3.379\n"+
+ "USA|dollar|1|22.206\n"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestCzechNationalBankDataSource_TitleMissingRate(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Code\n"+
+ "China|renminbi|1|CNY\n"+
+ "USA|dollar|1|USD\n"))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestCzechNationalBankDataSource_InvalidCurrency(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Code|Rate\n"+
+ "XXX|xxx|1|XXX|1\n"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestCzechNationalBankDataSource_EmptyRate(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Code|Rate\n"+
+ "USA|dollar|1|USD|\n"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestCzechNationalBankDataSource_InvalidRate(t *testing.T) {
+ dataSource := &CzechNationalBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("01 Apr 2021 #64\n"+
+ "Country|Currency|Amount|Code|Rate\n"+
+ "USA|dollar|1|USD|null\n"))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
diff --git a/pkg/exchangerates/euro_central_bank_datasource_test.go b/pkg/exchangerates/euro_central_bank_datasource_test.go
new file mode 100644
index 00000000..9abe84da
--- /dev/null
+++ b/pkg/exchangerates/euro_central_bank_datasource_test.go
@@ -0,0 +1,150 @@
+package exchangerates
+
+import (
+ "testing"
+
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/mayswind/lab/pkg/core"
+ "github.com/mayswind/lab/pkg/models"
+)
+
+const euroCentralBankMinimumRequiredContent = "\n" +
+ "\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ ""
+
+func TestEuroCentralBankDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(euroCentralBankMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Equal(t, "EUR", actualLatestExchangeRateResponse.BaseCurrency)
+}
+
+func TestEuroCentralBankDataSource_StandardDataExtractExchangeRates(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(euroCentralBankMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "USD",
+ Rate: "1.1746",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "CNY",
+ Rate: "7.7195",
+ })
+}
+
+func TestEuroCentralBankDataSource_BlankContent(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestEuroCentralBankDataSource_OnlyXMLHeader(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestEuroCentralBankDataSource_EmptyEnvelopeContent(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("" +
+ "" +
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestEuroCentralBankDataSource_EmptyCubeContent(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("" +
+ "" +
+ "" +
+ "" +
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestEuroCentralBankDataSource_InvalidCurrency(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestEuroCentralBankDataSource_EmptyRate(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestEuroCentralBankDataSource_InvalidRate(t *testing.T) {
+ dataSource := &EuroCentralBankDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
diff --git a/pkg/exchangerates/national_bank_of_poland_datasource_test.go b/pkg/exchangerates/national_bank_of_poland_datasource_test.go
new file mode 100644
index 00000000..776fdda4
--- /dev/null
+++ b/pkg/exchangerates/national_bank_of_poland_datasource_test.go
@@ -0,0 +1,120 @@
+package exchangerates
+
+import (
+ "testing"
+
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/mayswind/lab/pkg/core"
+ "github.com/mayswind/lab/pkg/models"
+)
+
+const nationalBankOfPolandMinimumRequiredContent = "\n" +
+ "\n" +
+ " 3.8986\n" +
+ " 0.5941\n" +
+ ""
+
+func TestNationalBankOfPolandDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(nationalBankOfPolandMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Equal(t, "PLN", actualLatestExchangeRateResponse.BaseCurrency)
+}
+
+func TestNationalBankOfPolandDataSource_StandardDataExtractExchangeRates(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(nationalBankOfPolandMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "USD",
+ Rate: "0.25650233417124096",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "CNY",
+ Rate: "1.68321831341525",
+ })
+}
+
+func TestNationalBankOfPolandDataSource_BlankContent(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestNationalBankOfPolandDataSource_OnlyXMLHeader(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestNationalBankOfPolandDataSource_EmptyExchangeRatesContent(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestNationalBankOfPolandDataSource_InvalidCurrency(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " 1\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestNationalBankOfPolandDataSource_EmptyRate(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestNationalBankOfPolandDataSource_InvalidRate(t *testing.T) {
+ dataSource := &NationalBankOfPolandDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " null\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
diff --git a/pkg/exchangerates/reserve_bank_of_australia_datasource_test.go b/pkg/exchangerates/reserve_bank_of_australia_datasource_test.go
new file mode 100644
index 00000000..96cb7132
--- /dev/null
+++ b/pkg/exchangerates/reserve_bank_of_australia_datasource_test.go
@@ -0,0 +1,284 @@
+package exchangerates
+
+import (
+ "testing"
+
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/mayswind/lab/pkg/core"
+ "github.com/mayswind/lab/pkg/models"
+)
+
+const reserveBankOfAustraliaMinimumRequiredContent = "\n" +
+ "\n" +
+ " \n" +
+ " 2021-04-01T16:45:00+11:00\n" +
+ " \n" +
+ " - \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " 0.7543\n" +
+ " AUD\n" +
+ " \n" +
+ " AUD\n" +
+ " USD\n" +
+ " \n" +
+ " \n" +
+ "
\n" +
+ " - \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " 4.9577\n" +
+ " AUD\n" +
+ " \n" +
+ " AUD\n" +
+ " CNY\n" +
+ " \n" +
+ " \n" +
+ "
\n" +
+ ""
+
+func TestReserveBankOfAustraliaDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(reserveBankOfAustraliaMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Equal(t, "AUD", actualLatestExchangeRateResponse.BaseCurrency)
+}
+
+func TestReserveBankOfAustraliaDataSource_StandardDataExtractExchangeRates(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(reserveBankOfAustraliaMinimumRequiredContent))
+ assert.Equal(t, nil, err)
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "USD",
+ Rate: "0.7543",
+ })
+ assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
+ Currency: "CNY",
+ Rate: "4.9577",
+ })
+}
+
+func TestReserveBankOfAustraliaDataSource_BlankContent(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestReserveBankOfAustraliaDataSource_OnlyXMLHeader(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte(""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestReserveBankOfAustraliaDataSource_EmptyRDFContent(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestReserveBankOfAustraliaDataSource_EmptyChannelContent(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " "+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " 0.7543\n"+
+ " AUD\n"+
+ " \n"+
+ " AUD\n"+
+ " USD\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestReserveBankOfAustraliaDataSource_NoItem(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ _, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ ""))
+ assert.NotEqual(t, nil, err)
+}
+
+func TestReserveBankOfAustraliaDataSource_BaseCurrencyNotEqualPreset(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " 0.7543\n"+
+ " AUD\n"+
+ " \n"+
+ " USD\n"+
+ " USD\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestReserveBankOfAustraliaDataSource_UnitCurrencyNotEqualPreset(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " 0.7543\n"+
+ " USD\n"+
+ " \n"+
+ " AUD\n"+
+ " USD\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestReserveBankOfAustraliaDataSource_InvalidCurrency(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " 1\n"+
+ " AUD\n"+
+ " \n"+
+ " AUD\n"+
+ " XXX\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestReserveBankOfAustraliaDataSource_EmptyRate(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " AUD\n"+
+ " \n"+
+ " AUD\n"+
+ " USD\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}
+
+func TestReserveBankOfAustraliaDataSource_InvalidRate(t *testing.T) {
+ dataSource := &ReserveBankOfAustraliaDataSource{}
+ context := &core.Context{
+ Context: &gin.Context{},
+ }
+
+ actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+
+ "\n"+
+ " \n"+
+ " 2021-04-01T16:45:00+11:00\n"+
+ " \n"+
+ " - \n"+
+ " \n"+
+ " \n"+
+ " \n"+
+ " null\n"+
+ " AUD\n"+
+ " \n"+
+ " AUD\n"+
+ " USD\n"+
+ " \n"+
+ " \n"+
+ "
\n"+
+ ""))
+ assert.Equal(t, nil, err)
+ assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
+}