103 lines
2.7 KiB
Ruby
103 lines
2.7 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require_relative "../../helper"
|
||
|
|
require "provider/adapters/hkma"
|
||
|
|
|
||
|
|
class Provider < Sequel::Model(:providers)
|
||
|
|
module Adapters
|
||
|
|
describe HKMA do
|
||
|
|
before do
|
||
|
|
VCR.insert_cassette("hkma", match_requests_on: [:method, :host, :path])
|
||
|
|
end
|
||
|
|
|
||
|
|
after { VCR.eject_cassette }
|
||
|
|
|
||
|
|
let(:adapter) { HKMA.new }
|
||
|
|
|
||
|
|
it "fetches rates with date range" do
|
||
|
|
dataset = adapter.fetch(after: Date.new(2026, 2, 25), upto: Date.new(2026, 2, 28))
|
||
|
|
|
||
|
|
_(dataset).wont_be_empty
|
||
|
|
end
|
||
|
|
|
||
|
|
it "fetches multiple currencies per date" do
|
||
|
|
dataset = adapter.fetch(after: Date.new(2026, 2, 25), upto: Date.new(2026, 2, 28))
|
||
|
|
dates = dataset.map { |r| r[:date] }.uniq
|
||
|
|
sample = dataset.select { |r| r[:date] == dates.first }
|
||
|
|
|
||
|
|
_(sample.size).must_be(:>, 1)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "parses records with correct base, quote, and rate" do
|
||
|
|
records = adapter.parse([
|
||
|
|
{
|
||
|
|
"end_of_day" => "2026-02-28",
|
||
|
|
"usd" => 7.8245,
|
||
|
|
"eur" => 9.245,
|
||
|
|
"gbp" => 10.549,
|
||
|
|
},
|
||
|
|
])
|
||
|
|
|
||
|
|
usd = records.find { |r| r[:base] == "USD" }
|
||
|
|
|
||
|
|
_(usd).wont_be_nil
|
||
|
|
_(usd[:quote]).must_equal("HKD")
|
||
|
|
_(usd[:rate]).must_equal(7.8245)
|
||
|
|
_(usd[:date]).must_equal(Date.new(2026, 2, 28))
|
||
|
|
end
|
||
|
|
|
||
|
|
it "parses all currency fields" do
|
||
|
|
record = {
|
||
|
|
"end_of_day" => "2026-02-28",
|
||
|
|
"usd" => 7.8245,
|
||
|
|
"eur" => 9.245,
|
||
|
|
"gbp" => 10.549,
|
||
|
|
"jpy" => 0.05012,
|
||
|
|
"cad" => 5.7355,
|
||
|
|
"aud" => 5.5855,
|
||
|
|
"sgd" => 6.1855,
|
||
|
|
"twd" => 0.255,
|
||
|
|
"chf" => 10.169,
|
||
|
|
"cny" => 1.14015,
|
||
|
|
"krw" => 0.005433,
|
||
|
|
"thb" => 0.25235,
|
||
|
|
"myr" => 2.01045,
|
||
|
|
"php" => 0.1345,
|
||
|
|
"inr" => 0.0855,
|
||
|
|
"idr" => 0.0004666,
|
||
|
|
"zar" => 0.4915,
|
||
|
|
}
|
||
|
|
|
||
|
|
records = adapter.parse([record])
|
||
|
|
|
||
|
|
_(records.length).must_equal(17)
|
||
|
|
_(records.map { |r| r[:base] }.sort).must_equal(
|
||
|
|
["AUD", "CAD", "CHF", "CNY", "EUR", "GBP", "IDR", "INR", "JPY", "KRW", "MYR", "PHP", "SGD", "THB", "TWD", "USD", "ZAR"],
|
||
|
|
)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "skips null currency values" do
|
||
|
|
records = adapter.parse([
|
||
|
|
{
|
||
|
|
"end_of_day" => "1999-12-31",
|
||
|
|
"usd" => 7.7915,
|
||
|
|
"dem" => nil,
|
||
|
|
"eur" => nil,
|
||
|
|
},
|
||
|
|
])
|
||
|
|
|
||
|
|
_(records.map { |r| r[:base] }).must_equal(["USD"])
|
||
|
|
end
|
||
|
|
|
||
|
|
it "skips records with missing end_of_day" do
|
||
|
|
records = adapter.parse([
|
||
|
|
{ "usd" => 7.8, "eur" => 9.2 },
|
||
|
|
{ "end_of_day" => "2026-02-28", "usd" => 7.8245 },
|
||
|
|
])
|
||
|
|
|
||
|
|
_(records.length).must_equal(1)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|