mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-20 09:44:26 +08:00
add Central Bank of Hungary exchange rates data source
This commit is contained in:
@@ -346,6 +346,7 @@ custom_map_tile_server_default_zoom_level = 14
|
|||||||
# "danmarks_national_bank": https://www.nationalbanken.dk/en/what-we-do/stable-prices-monetary-policy-and-the-danish-economy/exchange-rates
|
# "danmarks_national_bank": https://www.nationalbanken.dk/en/what-we-do/stable-prices-monetary-policy-and-the-danish-economy/exchange-rates
|
||||||
# "euro_central_bank": https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html
|
# "euro_central_bank": https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html
|
||||||
# "national_bank_of_georgia": https://nbg.gov.ge/en/monetary-policy/currency
|
# "national_bank_of_georgia": https://nbg.gov.ge/en/monetary-policy/currency
|
||||||
|
# "central_bank_of_hungary": https://www.mnb.hu/en/arfolyamok
|
||||||
# "bank_of_israel": https://www.boi.org.il/en/economic-roles/financial-markets/exchange-rates/
|
# "bank_of_israel": https://www.boi.org.il/en/economic-roles/financial-markets/exchange-rates/
|
||||||
# "norges_bank": https://www.norges-bank.no/en/topics/Statistics/exchange_rates/
|
# "norges_bank": https://www.norges-bank.no/en/topics/Statistics/exchange_rates/
|
||||||
# "national_bank_of_poland": https://nbp.pl/en/statistic-and-financial-reporting/rates/
|
# "national_bank_of_poland": https://nbp.pl/en/statistic-and-financial-reporting/rates/
|
||||||
|
|||||||
@@ -119,6 +119,22 @@ func TestExchangeRatesApiLatestExchangeRateHandler_NationalBankOfGeorgiaDataSour
|
|||||||
checkExchangeRatesHaveSpecifiedCurrencies(t, exchangeRateResponse.BaseCurrency, supportedCurrencyCodes, exchangeRateResponse.ExchangeRates)
|
checkExchangeRatesHaveSpecifiedCurrencies(t, exchangeRateResponse.BaseCurrency, supportedCurrencyCodes, exchangeRateResponse.ExchangeRates)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExchangeRatesApiLatestExchangeRateHandler_CentralBankOfHungaryDataSource(t *testing.T) {
|
||||||
|
exchangeRateResponse := executeLatestExchangeRateHandler(t, settings.CentralBankOfHungaryDataSource)
|
||||||
|
|
||||||
|
if exchangeRateResponse == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, "HUF", exchangeRateResponse.BaseCurrency)
|
||||||
|
|
||||||
|
supportedCurrencyCodes := []string{"AUD", "BGN", "BRL", "CAD", "CHF", "CNY", "CZK", "DKK", "EUR",
|
||||||
|
"GBP", "HKD", "IDR", "ILS", "INR", "ISK", "JPY", "KRW", "MXN", "MYR", "NOK", "NZD",
|
||||||
|
"PHP", "PLN", "RON", "RSD", "RUB", "SEK", "SGD", "THB", "TRY", "UAH", "USD", "ZAR"}
|
||||||
|
|
||||||
|
checkExchangeRatesHaveSpecifiedCurrencies(t, exchangeRateResponse.BaseCurrency, supportedCurrencyCodes, exchangeRateResponse.ExchangeRates)
|
||||||
|
}
|
||||||
|
|
||||||
func TestExchangeRatesApiLatestExchangeRateHandler_BankOfIsraelDataSource(t *testing.T) {
|
func TestExchangeRatesApiLatestExchangeRateHandler_BankOfIsraelDataSource(t *testing.T) {
|
||||||
exchangeRateResponse := executeLatestExchangeRateHandler(t, settings.BankOfIsraelDataSource)
|
exchangeRateResponse := executeLatestExchangeRateHandler(t, settings.BankOfIsraelDataSource)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,203 @@
|
|||||||
|
package exchangerates
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/xml"
|
||||||
|
"math"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/log"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/models"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/validators"
|
||||||
|
)
|
||||||
|
|
||||||
|
const centralBankOfHungaryExchangeRateServiceUrl = "http://www.mnb.hu/arfolyamok.asmx"
|
||||||
|
const centralBankOfHungaryExchangeRateServiceCurrentExchangeRatesSoapAction = "http://www.mnb.hu/webservices/MNBArfolyamServiceSoap/GetCurrentExchangeRates"
|
||||||
|
const centralBankOfHungaryExchangeRateReferenceUrl = "https://www.mnb.hu/en/arfolyamok"
|
||||||
|
const centralBankOfHungaryDataSource = "Magyar Nemzeti Bank"
|
||||||
|
const centralBankOfHungaryBaseCurrency = "HUF"
|
||||||
|
|
||||||
|
const centralBankOfHungaryUpdateDateFormat = "2006-01-02 15"
|
||||||
|
const centralBankOfHungaryUpdateDateTimezone = "Europe/Budapest"
|
||||||
|
|
||||||
|
// CentralBankOfHungaryDataSource defines the structure of exchange rates data source of central bank of Hungary
|
||||||
|
type CentralBankOfHungaryDataSource struct {
|
||||||
|
ExchangeRatesDataSource
|
||||||
|
}
|
||||||
|
|
||||||
|
// CentralBankOfHungaryExchangeRateServiceResponse represents the response data of exchange rate service for central bank of Hungary
|
||||||
|
type CentralBankOfHungaryExchangeRateServiceResponse struct {
|
||||||
|
XMLName xml.Name `xml:"Envelope"`
|
||||||
|
GetCurrentExchangeRatesResult string `xml:"Body>GetCurrentExchangeRatesResponse>GetCurrentExchangeRatesResult"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CentralBankOfHungaryCurrentExchangeRatesResult represents the current exchange rate result data from central bank of Hungary
|
||||||
|
type CentralBankOfHungaryCurrentExchangeRatesResult struct {
|
||||||
|
XMLName xml.Name `xml:"MNBCurrentExchangeRates"`
|
||||||
|
AllExchangeRates []*CentralBankOfHungaryExchangeRates `xml:"Day"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CentralBankOfHungaryExchangeRates represents the exchange rates data from Danmarks Nationalbank
|
||||||
|
type CentralBankOfHungaryExchangeRates struct {
|
||||||
|
Date string `xml:"date,attr"`
|
||||||
|
ExchangeRates []*CentralBankOfHungaryExchangeRate `xml:"Rate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CentralBankOfHungaryExchangeRate represents the exchange rate data from central bank of Hungary
|
||||||
|
type CentralBankOfHungaryExchangeRate struct {
|
||||||
|
Currency string `xml:"curr,attr"`
|
||||||
|
Unit string `xml:"unit,attr"`
|
||||||
|
Rate string `xml:",chardata"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToLatestExchangeRateResponse returns a view-object according to original data from central bank of Hungary
|
||||||
|
func (e *CentralBankOfHungaryCurrentExchangeRatesResult) ToLatestExchangeRateResponse(c core.Context) *models.LatestExchangeRateResponse {
|
||||||
|
if len(e.AllExchangeRates) < 1 {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRateResponse] all exchange rates is empty")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
latestCentralBankOfHungaryExchangeRate := e.AllExchangeRates[0]
|
||||||
|
|
||||||
|
if len(latestCentralBankOfHungaryExchangeRate.ExchangeRates) < 1 {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRateResponse] exchange rates is empty")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
exchangeRates := make(models.LatestExchangeRateSlice, 0, len(e.AllExchangeRates))
|
||||||
|
|
||||||
|
for i := 0; i < len(latestCentralBankOfHungaryExchangeRate.ExchangeRates); i++ {
|
||||||
|
exchangeRate := latestCentralBankOfHungaryExchangeRate.ExchangeRates[i]
|
||||||
|
|
||||||
|
if _, exists := validators.AllCurrencyNames[exchangeRate.Currency]; !exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
finalExchangeRate := exchangeRate.ToLatestExchangeRate(c)
|
||||||
|
|
||||||
|
if finalExchangeRate == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
exchangeRates = append(exchangeRates, finalExchangeRate)
|
||||||
|
}
|
||||||
|
|
||||||
|
timezone, err := time.LoadLocation(centralBankOfHungaryUpdateDateTimezone)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRateResponse] failed to get timezone, timezone name is %s", centralBankOfHungaryUpdateDateTimezone)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
updateDateTime := latestCentralBankOfHungaryExchangeRate.Date + " 11" // The exchange rates are fixed at 11 am.
|
||||||
|
updateTime, err := time.ParseInLocation(centralBankOfHungaryUpdateDateFormat, updateDateTime, timezone)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRateResponse] failed to parse update date, datetime is %s", updateDateTime)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
latestExchangeRateResp := &models.LatestExchangeRateResponse{
|
||||||
|
DataSource: centralBankOfHungaryDataSource,
|
||||||
|
ReferenceUrl: centralBankOfHungaryExchangeRateReferenceUrl,
|
||||||
|
UpdateTime: updateTime.Unix(),
|
||||||
|
BaseCurrency: centralBankOfHungaryBaseCurrency,
|
||||||
|
ExchangeRates: exchangeRates,
|
||||||
|
}
|
||||||
|
|
||||||
|
return latestExchangeRateResp
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToLatestExchangeRate returns a data pair according to original data from central bank of Hungary
|
||||||
|
func (e *CentralBankOfHungaryExchangeRate) ToLatestExchangeRate(c core.Context) *models.LatestExchangeRate {
|
||||||
|
rate, err := utils.StringToFloat64(strings.ReplaceAll(e.Rate, ",", "."))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRate] failed to parse rate, currency is %s, rate is %s", e.Currency, e.Rate)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if rate <= 0 {
|
||||||
|
log.Warnf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRate] rate is invalid, currency is %s, rate is %s", e.Currency, e.Rate)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
unit, err := utils.StringToFloat64(e.Unit)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRate] failed to parse unit, currency is %s, unit is %s", e.Currency, e.Unit)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
finalRate := unit / rate
|
||||||
|
|
||||||
|
if math.IsInf(finalRate, 0) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &models.LatestExchangeRate{
|
||||||
|
Currency: e.Currency,
|
||||||
|
Rate: utils.Float64ToString(finalRate),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildRequests returns the central bank of Hungary exchange rates http requests
|
||||||
|
func (e *CentralBankOfHungaryDataSource) BuildRequests() ([]*http.Request, error) {
|
||||||
|
req, err := http.NewRequest("POST", centralBankOfHungaryExchangeRateServiceUrl, bytes.NewReader([]byte(
|
||||||
|
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRates xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"/>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>")))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("Content-Type", "text/xml; charset=utf-8")
|
||||||
|
req.Header.Set("SOAPAction", centralBankOfHungaryExchangeRateServiceCurrentExchangeRatesSoapAction)
|
||||||
|
|
||||||
|
return []*http.Request{req}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse returns the common response entity according to the central bank of Hungary data source raw response
|
||||||
|
func (e *CentralBankOfHungaryDataSource) Parse(c core.Context, content []byte) (*models.LatestExchangeRateResponse, error) {
|
||||||
|
responseXmlDecoder := xml.NewDecoder(bytes.NewReader(content))
|
||||||
|
|
||||||
|
centralBankOfHungaryServiceResponse := &CentralBankOfHungaryExchangeRateServiceResponse{}
|
||||||
|
err := responseXmlDecoder.Decode(centralBankOfHungaryServiceResponse)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.Parse] failed to parse service response xml data, content is %s, because %s", string(content), err.Error())
|
||||||
|
return nil, errs.ErrFailedToRequestRemoteApi
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(centralBankOfHungaryServiceResponse.GetCurrentExchangeRatesResult) < 1 {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.Parse] exchange rates response is empty")
|
||||||
|
return nil, errs.ErrFailedToRequestRemoteApi
|
||||||
|
}
|
||||||
|
|
||||||
|
resultXmlDecoder := xml.NewDecoder(strings.NewReader(centralBankOfHungaryServiceResponse.GetCurrentExchangeRatesResult))
|
||||||
|
|
||||||
|
centralBankOfHungaryExchangeRatesResult := &CentralBankOfHungaryCurrentExchangeRatesResult{}
|
||||||
|
err = resultXmlDecoder.Decode(centralBankOfHungaryExchangeRatesResult)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.Parse] failed to parse exchange rates response xml data, content is %s, because %s", string(content), err.Error())
|
||||||
|
return nil, errs.ErrFailedToRequestRemoteApi
|
||||||
|
}
|
||||||
|
|
||||||
|
latestExchangeRateResponse := centralBankOfHungaryExchangeRatesResult.ToLatestExchangeRateResponse(c)
|
||||||
|
|
||||||
|
if latestExchangeRateResponse == nil {
|
||||||
|
log.Errorf(c, "[central_bank_of_hungary_datasource.Parse] failed to parse latest exchange rate data, content is %s", string(content))
|
||||||
|
return nil, errs.ErrFailedToRequestRemoteApi
|
||||||
|
}
|
||||||
|
|
||||||
|
return latestExchangeRateResponse, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,248 @@
|
|||||||
|
package exchangerates
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
const centralBankOfHungaryDataSourceMinimumRequiredContent = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
|
||||||
|
"<s:Body>" +
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
|
||||||
|
"<GetCurrentExchangeRatesResult>" +
|
||||||
|
"<MNBCurrentExchangeRates>" +
|
||||||
|
"<Day date=\"2024-11-15\">" +
|
||||||
|
"<Rate unit=\"100\" curr=\"JPY\">247,46</Rate>" +
|
||||||
|
"<Rate unit=\"1\" curr=\"USD\">384,48</Rate>" +
|
||||||
|
"</Day>" +
|
||||||
|
"</MNBCurrentExchangeRates>" +
|
||||||
|
"</GetCurrentExchangeRatesResult>" +
|
||||||
|
"</GetCurrentExchangeRatesResponse>" +
|
||||||
|
"</s:Body>" +
|
||||||
|
"</s:Envelope>"
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_StandardDataExtractBaseCurrency(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(centralBankOfHungaryDataSourceMinimumRequiredContent))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Equal(t, "HUF", actualLatestExchangeRateResponse.BaseCurrency)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_StandardDataExtractUpdateTime(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(centralBankOfHungaryDataSourceMinimumRequiredContent))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Equal(t, int64(1731664800), actualLatestExchangeRateResponse.UpdateTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_StandardDataExtractExchangeRates(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(centralBankOfHungaryDataSourceMinimumRequiredContent))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
|
||||||
|
Currency: "JPY",
|
||||||
|
Rate: "0.4041057140547967",
|
||||||
|
})
|
||||||
|
assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{
|
||||||
|
Currency: "USD",
|
||||||
|
Rate: "0.002600915522263837",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_BlankContent(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte(""))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_MissingSoapBody(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_MissingGetCurrentExchangeRatesResponse(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_MissingGetCurrentExchangeRatesResult(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_EmptyGetCurrentExchangeRatesResult(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_InvalidGetCurrentExchangeRatesResult(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
_, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.NotEqual(t, nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_InvalidCurrency(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"1\" curr=\"XXX\">1</Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_EmptyRate(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"1\" curr=\"USD\"></Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_InvalidRate(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"1\" curr=\"USD\">null</Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"1\" curr=\"USD\">0</Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCentralBankOfHungaryDataSource_InvalidUnit(t *testing.T) {
|
||||||
|
dataSource := &CentralBankOfHungaryDataSource{}
|
||||||
|
context := core.NewNullContext()
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"null\" curr=\"USD\">384,48</Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
|
||||||
|
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
|
||||||
|
"<s:Body>"+
|
||||||
|
"<GetCurrentExchangeRatesResponse xmlns=\"http://www.mnb.hu/webservices/\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"+
|
||||||
|
"<GetCurrentExchangeRatesResult>"+
|
||||||
|
"<MNBCurrentExchangeRates>"+
|
||||||
|
"<Day date=\"2024-11-15\">"+
|
||||||
|
"<Rate unit=\"\" curr=\"USD\">384,48</Rate>"+
|
||||||
|
"</Day>"+
|
||||||
|
"</MNBCurrentExchangeRates>"+
|
||||||
|
"</GetCurrentExchangeRatesResult>"+
|
||||||
|
"</GetCurrentExchangeRatesResponse>"+
|
||||||
|
"</s:Body>"+
|
||||||
|
"</s:Envelope>"))
|
||||||
|
assert.Equal(t, nil, err)
|
||||||
|
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||||
|
}
|
||||||
@@ -35,6 +35,9 @@ func InitializeExchangeRatesDataSource(config *settings.Config) error {
|
|||||||
} else if config.ExchangeRatesDataSource == settings.NationalBankOfGeorgiaDataSource {
|
} else if config.ExchangeRatesDataSource == settings.NationalBankOfGeorgiaDataSource {
|
||||||
Container.Current = &NationalBankOfGeorgiaDataSource{}
|
Container.Current = &NationalBankOfGeorgiaDataSource{}
|
||||||
return nil
|
return nil
|
||||||
|
} else if config.ExchangeRatesDataSource == settings.CentralBankOfHungaryDataSource {
|
||||||
|
Container.Current = &CentralBankOfHungaryDataSource{}
|
||||||
|
return nil
|
||||||
} else if config.ExchangeRatesDataSource == settings.BankOfIsraelDataSource {
|
} else if config.ExchangeRatesDataSource == settings.BankOfIsraelDataSource {
|
||||||
Container.Current = &BankOfIsraelDataSource{}
|
Container.Current = &BankOfIsraelDataSource{}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ const (
|
|||||||
DanmarksNationalbankDataSource string = "danmarks_national_bank"
|
DanmarksNationalbankDataSource string = "danmarks_national_bank"
|
||||||
EuroCentralBankDataSource string = "euro_central_bank"
|
EuroCentralBankDataSource string = "euro_central_bank"
|
||||||
NationalBankOfGeorgiaDataSource string = "national_bank_of_georgia"
|
NationalBankOfGeorgiaDataSource string = "national_bank_of_georgia"
|
||||||
|
CentralBankOfHungaryDataSource string = "central_bank_of_hungary"
|
||||||
BankOfIsraelDataSource string = "bank_of_israel"
|
BankOfIsraelDataSource string = "bank_of_israel"
|
||||||
NorgesBankDataSource string = "norges_bank"
|
NorgesBankDataSource string = "norges_bank"
|
||||||
NationalBankOfPolandDataSource string = "national_bank_of_poland"
|
NationalBankOfPolandDataSource string = "national_bank_of_poland"
|
||||||
@@ -891,6 +892,7 @@ func loadExchangeRatesConfiguration(config *Config, configFile *ini.File, sectio
|
|||||||
dataSource == DanmarksNationalbankDataSource ||
|
dataSource == DanmarksNationalbankDataSource ||
|
||||||
dataSource == EuroCentralBankDataSource ||
|
dataSource == EuroCentralBankDataSource ||
|
||||||
dataSource == NationalBankOfGeorgiaDataSource ||
|
dataSource == NationalBankOfGeorgiaDataSource ||
|
||||||
|
dataSource == CentralBankOfHungaryDataSource ||
|
||||||
dataSource == BankOfIsraelDataSource ||
|
dataSource == BankOfIsraelDataSource ||
|
||||||
dataSource == NorgesBankDataSource ||
|
dataSource == NorgesBankDataSource ||
|
||||||
dataSource == NationalBankOfPolandDataSource ||
|
dataSource == NationalBankOfPolandDataSource ||
|
||||||
|
|||||||
Reference in New Issue
Block a user