# frozen_string_literal: true
require_relative "../../helper"
require "provider/adapters/bcu"
class Provider < Sequel::Model(:providers)
module Adapters
describe BCU do
before do
VCR.insert_cassette("bcu")
end
after do
VCR.eject_cassette
end
let(:adapter) { BCU.new }
it "fetches rates with date range" do
dataset = adapter.fetch(after: Date.new(2026, 3, 27), upto: Date.new(2026, 3, 31))
_(dataset).wont_be_empty
end
it "fetches BCU rates with UYU quote" do
dataset = adapter.fetch(after: Date.new(2026, 3, 27), upto: Date.new(2026, 3, 31))
record = dataset.first
_(record[:quote]).must_equal("UYU")
end
it "fetches numeric rates greater than zero" do
dataset = adapter.fetch(after: Date.new(2026, 3, 27), upto: Date.new(2026, 3, 31))
dataset.each do |record|
_(record[:rate]).must_be_instance_of(Float)
_(record[:rate]).must_be(:>, 0)
end
end
it "fetches ISO currency codes" do
dataset = adapter.fetch(after: Date.new(2026, 3, 27), upto: Date.new(2026, 3, 31))
dataset.each do |record|
_(Money::Currency.find(record[:base])).wont_be_nil
end
end
it "fetches valid dates" do
dataset = adapter.fetch(after: Date.new(2026, 3, 27), upto: Date.new(2026, 3, 31))
dataset.each do |record|
_(record[:date]).must_be_instance_of(Date)
end
end
it "parses SOAP response with correct fields" do
xml = <<~XML
1
0
2026-03-27
2225
DLS. USA BILLETE
DLS.
USA
38.5
39.5
1.0
0
2026-03-27
1111
EURO
EUR
ZONA EURO
42.2
42.8
1.0
0
XML
records = adapter.parse(xml)
_(records.length).must_equal(2)
_(records[0][:base]).must_equal("USD")
_(records[0][:quote]).must_equal("UYU")
_(records[0][:rate]).must_be_close_to(39.0, 0.01)
_(records[0][:date]).must_equal(Date.new(2026, 3, 27))
_(records[1][:base]).must_equal("EUR")
_(records[1][:quote]).must_equal("UYU")
_(records[1][:rate]).must_be_close_to(42.5, 0.01)
end
it "skips unknown currency codes" do
xml = <<~XML
1
0
2026-03-27
2225
DLS. USA BILLETE
DLS.
USA
38.5
39.5
1.0
0
2026-03-27
9999
UNKNOWN
UNK
UNKNOWN
1.0
1.5
1.0
0
XML
records = adapter.parse(xml)
_(records.length).must_equal(1)
_(records.first[:base]).must_equal("USD")
end
it "calculates midpoint rate from TCC and TCV" do
xml = <<~XML
1
0
2026-03-27
2225
DLS. USA BILLETE
DLS.
USA
38.0
40.0
1.0
0
XML
records = adapter.parse(xml)
_(records.first[:rate]).must_equal(39.0)
end
it "skips UYU self-reference currency" do
xml = <<~XML
1
0
2026-03-27
0
PESO URUGUAYO
UYU
URUGUAY
1.0
1.0
1.0
0
XML
records = adapter.parse(xml)
_(records.length).must_equal(0)
end
end
end
end