improve robustness and add unit tests
This commit is contained in:
@@ -112,6 +112,11 @@ func (e *BankOfIsraelExchangeRate) ToLatestExchangeRate(c core.Context) *models.
|
||||
return nil
|
||||
}
|
||||
|
||||
if unit <= 0 {
|
||||
log.Warnf(c, "[bank_of_israel_datasource.ToLatestExchangeRate] unit is less or equal zero, currency is %s, unit is %s", e.Currency, e.Unit)
|
||||
return nil
|
||||
}
|
||||
|
||||
finalRate := unit / rate
|
||||
|
||||
if math.IsInf(finalRate, 0) {
|
||||
|
||||
@@ -177,4 +177,17 @@ func TestBankOfIsraelDataSource_InvalidUnit(t *testing.T) {
|
||||
"</ExchangeRatesResponseCollectioDTO>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
|
||||
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("<ExchangeRatesResponseCollectioDTO xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/BOI.Core.Models.HotData\">\n"+
|
||||
" <ExchangeRates>\n"+
|
||||
" <ExchangeRateResponseDTO>\n"+
|
||||
" <CurrentExchangeRate>1</CurrentExchangeRate>\n"+
|
||||
" <Key>USD</Key>\n"+
|
||||
" <LastUpdate>2024-11-11T13:26:05.6590204Z</LastUpdate>\n"+
|
||||
" <Unit>0</Unit>\n"+
|
||||
" </ExchangeRateResponseDTO>\n"+
|
||||
" </ExchangeRates>\n"+
|
||||
"</ExchangeRatesResponseCollectioDTO>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
}
|
||||
|
||||
@@ -134,6 +134,11 @@ func (e *CentralBankOfHungaryExchangeRate) ToLatestExchangeRate(c core.Context)
|
||||
return nil
|
||||
}
|
||||
|
||||
if unit <= 0 {
|
||||
log.Warnf(c, "[central_bank_of_hungary_datasource.ToLatestExchangeRate] unit is less or equal zero, currency is %s, unit is %s", e.Currency, e.Unit)
|
||||
return nil
|
||||
}
|
||||
|
||||
finalRate := unit / rate
|
||||
|
||||
if math.IsInf(finalRate, 0) {
|
||||
|
||||
@@ -236,7 +236,7 @@ func TestCentralBankOfHungaryDataSource_InvalidUnit(t *testing.T) {
|
||||
"<GetCurrentExchangeRatesResult>"+
|
||||
"<MNBCurrentExchangeRates>"+
|
||||
"<Day date=\"2024-11-15\">"+
|
||||
"<Rate unit=\"\" curr=\"USD\">384,48</Rate>"+
|
||||
"<Rate unit=\"0\" curr=\"USD\">384,48</Rate>"+
|
||||
"</Day>"+
|
||||
"</MNBCurrentExchangeRates>"+
|
||||
"</GetCurrentExchangeRatesResult>"+
|
||||
|
||||
@@ -144,6 +144,9 @@ func (e *NorgesBankExchangeRate) ToLatestExchangeRate(c core.Context, exchangeRa
|
||||
|
||||
if unitExponent > 0 {
|
||||
finalRate = finalRate / math.Pow10(-unitExponent)
|
||||
} else if unitExponent < 0 {
|
||||
log.Warnf(c, "[norges_bank_datasource.ToLatestExchangeRate] unit exponent is less than zero, currency is %s, unit is %s", e.BaseCurrency, e.UnitExponent)
|
||||
return nil
|
||||
}
|
||||
|
||||
if math.IsInf(finalRate, 0) {
|
||||
|
||||
@@ -208,4 +208,15 @@ func TestNorgesBankDataSource_InvalidUnit(t *testing.T) {
|
||||
"</message:StructureSpecificData>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
|
||||
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
|
||||
"<message:StructureSpecificData xmlns:ss=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/structurespecific\" xmlns:footer=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer\" xmlns:ns1=\"urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=NB:EXR(1.0):ObsLevelDim:TIME_PERIOD\" xmlns:message=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message\" xmlns:common=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xsi:schemaLocation=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://registry.sdmx.org/schemas/v2_1/SDMXMessage.xsd urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=NB:EXR(1.0):ObsLevelDim:TIME_PERIOD https://data.norges-bank.no/api/schema/dataflow/NB/EXR/1.0?format=sdmx-2.1\">"+
|
||||
" <message:DataSet>\n"+
|
||||
" <Series BASE_CUR=\"USD\" QUOTE_CUR=\"NOK\" UNIT_MULT=\"-1\">\n"+
|
||||
" <Obs TIME_PERIOD=\"2024-11-15\" OBS_VALUE=\"11.0545\" />\n"+
|
||||
" </Series>\n"+
|
||||
" </message:DataSet>\n"+
|
||||
"</message:StructureSpecificData>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
}
|
||||
|
||||
@@ -174,6 +174,9 @@ func (e *SwissNationalBankExchangeRate) ToLatestExchangeRate(c core.Context) *mo
|
||||
finalRate = finalRate / math.Pow10(unitExponent-1)
|
||||
} else if unitExponent < 0 {
|
||||
finalRate = finalRate * math.Pow10(-unitExponent)
|
||||
} else if unitExponent == 0 {
|
||||
log.Warnf(c, "[swiss_national_bank_datasource.ToLatestExchangeRate] unit exponent is zero, currency is %s", e.TargetCurrency)
|
||||
return nil
|
||||
}
|
||||
|
||||
if math.IsInf(finalRate, 0) {
|
||||
|
||||
@@ -385,4 +385,29 @@ func TestSwissNationalBankDataSource_InvalidUnit(t *testing.T) {
|
||||
"</rss>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
|
||||
actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+
|
||||
"<rss xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns:cb=\"http://www.cbwiki.net/wiki/index.php/Specification_1.2/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" version=\"2.0\">\n"+
|
||||
" <channel>\n"+
|
||||
" <pubDate>Tue, 12 Nov 2024 11:00:50 GMT</pubDate>\n"+
|
||||
" <item>\n"+
|
||||
" <cb:statistics rdf:parseType=\"Resource\">\n"+
|
||||
" <cb:exchangeRate rdf:parseType=\"Resource\">\n"+
|
||||
" <cb:observation rdf:parseType=\"Resource\">\n"+
|
||||
" <cb:value>0.9378</cb:value>\n"+
|
||||
" <cb:unit>CHF</cb:unit>\n"+
|
||||
" <cb:unit_mult>0</cb:unit_mult>\n"+
|
||||
" </cb:observation>\n"+
|
||||
" <cb:baseCurrency>CHF</cb:baseCurrency>\n"+
|
||||
" <cb:targetCurrency>EUR</cb:targetCurrency>\n"+
|
||||
" <cb:observationPeriod rdf:parseType=\"Resource\">\n"+
|
||||
" <cb:period>2024-11-12</cb:period>\n"+
|
||||
" </cb:observationPeriod>\n"+
|
||||
" </cb:exchangeRate>\n"+
|
||||
" </cb:statistics>\n"+
|
||||
" </item>\n"+
|
||||
" </channel>\n"+
|
||||
"</rss>"))
|
||||
assert.Equal(t, nil, err)
|
||||
assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user