frankfurter/spec/api_spec.rb
2017-01-08 23:21:57 +00:00

107 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require_relative 'helper'
require 'rack/test'
require 'api'
describe 'the API' do
include Rack::Test::Methods
let(:app) { Sinatra::Application }
let(:json) { Oj.load(last_response.body) }
let(:headers) { last_response.headers }
before do
App.cache.flush
end
it 'describes itself' do
get '/'
last_response.must_be :ok?
end
it 'returns latest quotes' do
get '/latest'
last_response.must_be :ok?
end
it 'sets base currency' do
get '/latest?base=USD'
json['base'].must_equal 'USD'
end
it 'sets base amount' do
get '/latest?amount=10'
json['rates']['USD'].must_be :>, 10
end
it 'filters symbols' do
get '/latest?symbols=USD'
json['rates'].keys.must_equal %w(USD)
end
it 'aliases base as from' do
get '/latest?from=USD'
json['base'].must_equal 'USD'
end
it 'aliases symbols as to' do
get '/latest?to=USD'
json['rates'].keys.must_equal %w(USD)
end
it 'returns historical quotes' do
get '/2012-11-20'
json['rates'].wont_be :empty?
json['date'].must_equal '2012-11-20'
end
it 'works around holidays' do
get '/2010-01-01'
json['rates'].wont_be :empty?
end
it 'returns a last modified header' do
%w(/ /latest /2012-11-20).each do |path|
get path
headers['Last-Modified'].wont_be_nil
end
end
it 'allows cross-origin requests' do
%w(/ /latest /2012-11-20).each do |path|
header 'Origin', '*'
get path
assert headers.key?('Access-Control-Allow-Methods')
end
end
it 'responds to preflight requests' do
%w(/ /latest /2012-11-20).each do |path|
header 'Origin', '*'
header 'Access-Control-Request-Method', 'GET'
header 'Access-Control-Request-Headers', 'Content-Type'
options path
assert headers.key?('Access-Control-Allow-Methods')
end
end
it 'converts an amount' do
get '/latest?from=GBP&to=USD&amount=100'
json['rates']['USD'].must_be :>, 100
end
it 'caches quotes' do
App.cache.set '/latest', 'foo'
get '/latest'
last_response.body.must_equal 'foo'
end
it 'sets Content-Type header to JSON when caching' do
2.times do
get '/latest'
last_response.headers['Content-Type'].must_equal 'application/json'
end
end
end