frankfurter/spec/provider/adapters/banxico_spec.rb

100 lines
2.6 KiB
Ruby
Raw Normal View History

2026-05-21 01:38:14 -06:00
# frozen_string_literal: true
require_relative "../../helper"
require "provider/adapters/banxico"
class Provider < Sequel::Model(:providers)
module Adapters
describe BANXICO do
let(:adapter) { BANXICO.new }
describe "with API key" do
before do
skip "BANXICO_API_KEY not set" unless ENV["BANXICO_API_KEY"]
VCR.insert_cassette("banxico")
end
after { VCR.eject_cassette }
it "fetches rates since a date" do
dataset = adapter.fetch(after: Date.new(2026, 3, 1), upto: Date.new(2026, 3, 15))
_(dataset).wont_be_empty
end
it "fetches multiple currencies per date" do
dataset = adapter.fetch(after: Date.new(2026, 3, 1), upto: Date.new(2026, 3, 15))
dates = dataset.map { |r| r[:date] }.uniq
sample = dataset.select { |r| r[:date] == dates.first }
_(sample.size).must_be(:>, 1)
end
end
describe "parse" do
it "parses series response" do
json = {
bmx: {
series: [
{
idSerie: "SF43718",
datos: [
{ fecha: "15/03/2026", dato: "17.1234" },
{ fecha: "16/03/2026", dato: "17.2345" },
],
},
{
idSerie: "SF46410",
datos: [
{ fecha: "15/03/2026", dato: "18.5678" },
],
},
],
},
}.to_json
rates = adapter.parse(json)
_(rates.length).must_equal(3)
_(rates[0][:base]).must_equal("USD")
_(rates[0][:quote]).must_equal("MXN")
_(rates[0][:rate]).must_be_close_to(17.1234)
_(rates[2][:base]).must_equal("EUR")
end
it "handles comma-formatted numbers" do
json = {
bmx: {
series: [
{
idSerie: "SF43718",
datos: [{ fecha: "15/03/2026", dato: "17,123.45" }],
},
],
},
}.to_json
rates = adapter.parse(json)
_(rates[0][:rate]).must_be_close_to(17_123.45)
end
it "skips invalid values" do
json = {
bmx: {
series: [
{
idSerie: "SF43718",
datos: [{ fecha: "15/03/2026", dato: "N/E" }],
},
],
},
}.to_json
_(adapter.parse(json)).must_be_empty
end
end
end
end
end