# 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