80 lines
2 KiB
Ruby
80 lines
2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "../../helper"
|
|
require "provider/adapters/boe"
|
|
|
|
class Provider < Sequel::Model(:providers)
|
|
module Adapters
|
|
describe BOE do
|
|
before do
|
|
VCR.insert_cassette("boe", match_requests_on: [:method, :host])
|
|
end
|
|
|
|
after { VCR.eject_cassette }
|
|
|
|
let(:adapter) { BOE.new }
|
|
|
|
it "fetches rates with date range" do
|
|
start = Date.new(2026, 3, 17)
|
|
upto = Date.new(2026, 3, 20)
|
|
|
|
dataset = adapter.fetch(after: start, upto:)
|
|
|
|
dates = dataset.map { |r| r[:date] }.uniq.sort
|
|
|
|
_(dates.size).must_be(:>=, 1)
|
|
_(dates.min).must_be(:>=, start)
|
|
_(dates.max).must_be(:<=, upto)
|
|
end
|
|
|
|
it "fetches multiple currencies per date" do
|
|
dataset = adapter.fetch(after: Date.new(2026, 3, 17), upto: Date.new(2026, 3, 20))
|
|
dates = dataset.map { |r| r[:date] }.uniq
|
|
sample = dataset.select { |r| r[:date] == dates.first }
|
|
|
|
_(sample.size).must_be(:>, 1)
|
|
end
|
|
|
|
it "parses CSV with correct base and quote" do
|
|
csv = <<~CSV
|
|
DATE,XUDLUSS,XUDLERS
|
|
17 Mar 2026,1.3343,1.1577
|
|
CSV
|
|
|
|
records = adapter.parse(csv)
|
|
|
|
usd = records.find { |r| r[:quote] == "USD" }
|
|
eur = records.find { |r| r[:quote] == "EUR" }
|
|
|
|
_(usd[:base]).must_equal("GBP")
|
|
_(usd[:rate]).must_equal(1.3343)
|
|
_(eur[:base]).must_equal("GBP")
|
|
_(eur[:rate]).must_equal(1.1577)
|
|
_(usd[:date]).must_equal(Date.new(2026, 3, 17))
|
|
end
|
|
|
|
it "skips empty values" do
|
|
csv = <<~CSV
|
|
DATE,XUDLUSS,XUDLERS
|
|
17 Mar 2026,1.3343,
|
|
CSV
|
|
|
|
records = adapter.parse(csv)
|
|
|
|
_(records.length).must_equal(1)
|
|
_(records.first[:quote]).must_equal("USD")
|
|
end
|
|
|
|
it "skips zero rates" do
|
|
csv = <<~CSV
|
|
DATE,XUDLUSS
|
|
17 Mar 2026,0
|
|
CSV
|
|
|
|
records = adapter.parse(csv)
|
|
|
|
_(records).must_be_empty
|
|
end
|
|
end
|
|
end
|
|
end
|