package exchangerates import ( "testing" "github.com/stretchr/testify/assert" "github.com/mayswind/ezbookkeeping/pkg/core" "github.com/mayswind/ezbookkeeping/pkg/models" ) const SwissNationalBankMinimumRequiredContent = "\n" + "\n" + " \n" + " Tue, 12 Nov 2024 11:00:50 GMT\n" + " \n" + " \n" + " \n" + " \n" + " 0.9378\n" + " CHF\n" + " 1\n" + " \n" + " CHF\n" + " EUR\n" + " \n" + " 2024-11-12\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " 0.5727\n" + " CHF\n" + " -2\n" + " \n" + " CHF\n" + " JPY\n" + " \n" + " 2024-11-12\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "" func TestSwissNationalBankDataSource_StandardDataExtractBaseCurrency(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(SwissNationalBankMinimumRequiredContent)) assert.Equal(t, nil, err) assert.Equal(t, "CHF", actualLatestExchangeRateResponse.BaseCurrency) } func TestSwissNationalBankDataSource_StandardDataExtractUpdateTime(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(SwissNationalBankMinimumRequiredContent)) assert.Equal(t, nil, err) assert.Equal(t, int64(1731409250), actualLatestExchangeRateResponse.UpdateTime) } func TestSwissNationalBankDataSource_StandardDataExtractExchangeRates(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte(SwissNationalBankMinimumRequiredContent)) assert.Equal(t, nil, err) assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{ Currency: "EUR", Rate: "1.0663254425250588", }) assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{ Currency: "JPY", Rate: "174.6114894360049", }) } func TestSwissNationalBankDataSource_MultipleDateExchanges(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9381\n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-11\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Contains(t, actualLatestExchangeRateResponse.ExchangeRates, &models.LatestExchangeRate{ Currency: "EUR", Rate: "1.0663254425250588", }) } func TestSwissNationalBankDataSource_BlankContent(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() _, err := dataSource.Parse(context, []byte("")) assert.NotEqual(t, nil, err) } func TestSwissNationalBankDataSource_OnlyXMLHeader(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() _, err := dataSource.Parse(context, []byte("")) assert.NotEqual(t, nil, err) } func TestSwissNationalBankDataSource_EmptyRDFContent(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() _, err := dataSource.Parse(context, []byte("\n"+ "\n"+ "")) assert.NotEqual(t, nil, err) } func TestSwissNationalBankDataSource_EmptyChannelContent(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() _, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " \n"+ "")) assert.NotEqual(t, nil, err) } func TestSwissNationalBankDataSource_NoItem(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() _, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ "")) assert.NotEqual(t, nil, err) } func TestSwissNationalBankDataSource_BaseCurrencyNotEqualPreset(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " CHF\n"+ " 1\n"+ " \n"+ " EUR\n"+ " CHF\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) } func TestSwissNationalBankDataSource_UnitCurrencyNotEqualPreset(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " EUR\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) } func TestSwissNationalBankDataSource_InvalidCurrency(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " XXX\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) } func TestSwissNationalBankDataSource_EmptyRate(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) } func TestSwissNationalBankDataSource_InvalidRate(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " null\n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0\n"+ " CHF\n"+ " 1\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) } func TestSwissNationalBankDataSource_InvalidUnit(t *testing.T) { dataSource := &SwissNationalBankDataSource{} context := core.NewNullContext() actualLatestExchangeRateResponse, err := dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " CHF\n"+ " null\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) actualLatestExchangeRateResponse, err = dataSource.Parse(context, []byte("\n"+ "\n"+ " \n"+ " Tue, 12 Nov 2024 11:00:50 GMT\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " 0.9378\n"+ " CHF\n"+ " 0\n"+ " \n"+ " CHF\n"+ " EUR\n"+ " \n"+ " 2024-11-12\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Equal(t, nil, err) assert.Len(t, actualLatestExchangeRateResponse.ExchangeRates, 0) }