122 lines
2.6 KiB
Ruby
122 lines
2.6 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require_relative "../helper"
|
||
|
|
require "rack/test"
|
||
|
|
require "versions/v1"
|
||
|
|
|
||
|
|
describe Versions::V1 do
|
||
|
|
include Rack::Test::Methods
|
||
|
|
|
||
|
|
let(:app) { Versions::V1.freeze }
|
||
|
|
let(:json) { Oj.load(last_response.body) }
|
||
|
|
let(:headers) { last_response.headers }
|
||
|
|
let(:historical_date) { Fixtures.business_day(30).to_s }
|
||
|
|
let(:range_start) { (Fixtures.latest_date - 365).to_s }
|
||
|
|
let(:range_end) { Fixtures.latest_date.to_s }
|
||
|
|
|
||
|
|
it "returns latest quotes" do
|
||
|
|
get "/latest"
|
||
|
|
|
||
|
|
_(last_response).must_be(:ok?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "sets base currency" do
|
||
|
|
get "/latest"
|
||
|
|
res = Oj.load(last_response.body)
|
||
|
|
get "/latest?from=USD"
|
||
|
|
|
||
|
|
_(json).wont_equal(res)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "sets base amount" do
|
||
|
|
get "/latest?amount=10"
|
||
|
|
|
||
|
|
_(json["rates"]["USD"]).must_be(:>, 10)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "filters symbols" do
|
||
|
|
get "/latest?to=USD"
|
||
|
|
|
||
|
|
_(json["rates"].keys).must_equal(["USD"])
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns historical quotes" do
|
||
|
|
get "/#{historical_date}"
|
||
|
|
|
||
|
|
_(json["rates"]).wont_be(:empty?)
|
||
|
|
_(json["date"]).must_equal(historical_date)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "works around holidays" do
|
||
|
|
sunday = Fixtures.recent_sunday.to_s
|
||
|
|
get "/#{sunday}"
|
||
|
|
|
||
|
|
_(json["rates"]).wont_be(:empty?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns latest quotes when querying future date" do
|
||
|
|
tomorrow = (Date.today + 1).to_s
|
||
|
|
get "/#{tomorrow}"
|
||
|
|
|
||
|
|
_(last_response).must_be(:ok?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns an ETag" do
|
||
|
|
["/latest", "/#{historical_date}"].each do |path|
|
||
|
|
get path
|
||
|
|
|
||
|
|
_(headers["ETag"]).wont_be_nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns a cache control header" do
|
||
|
|
["/latest", "/#{historical_date}"].each do |path|
|
||
|
|
get path
|
||
|
|
|
||
|
|
_(headers["Cache-Control"]).wont_be_nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
it "converts an amount" do
|
||
|
|
get "/latest?from=GBP&to=USD&amount=100"
|
||
|
|
|
||
|
|
_(json["rates"]["USD"]).must_be(:>, 100)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns rates for a given period" do
|
||
|
|
get "/#{range_start}..#{range_end}"
|
||
|
|
|
||
|
|
_(json["start_date"]).wont_be(:empty?)
|
||
|
|
_(json["end_date"]).wont_be(:empty?)
|
||
|
|
_(json["rates"]).wont_be(:empty?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns rates when given period does not include end date" do
|
||
|
|
get "/#{range_start}.."
|
||
|
|
|
||
|
|
_(json["start_date"]).wont_be(:empty?)
|
||
|
|
_(json["end_date"]).wont_be(:empty?)
|
||
|
|
_(json["rates"]).wont_be(:empty?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns currencies" do
|
||
|
|
get "/currencies"
|
||
|
|
|
||
|
|
_(json["USD"]).must_equal("United States Dollar")
|
||
|
|
end
|
||
|
|
|
||
|
|
it "returns empty currencies when no data" do
|
||
|
|
Rate.dataset.delete
|
||
|
|
get "/currencies"
|
||
|
|
|
||
|
|
_(last_response).must_be(:ok?)
|
||
|
|
_(json).must_be(:empty?)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "sets charset to utf-8" do
|
||
|
|
get "/currencies"
|
||
|
|
|
||
|
|
_(last_response.headers["content-type"]).must_be(:end_with?, "charset=utf-8")
|
||
|
|
end
|
||
|
|
end
|