# 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 }

  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 cache control header' do
    %w[/ /latest /2012-11-20].each do |path|
      get path
      headers['Cache-Control'].wont_be_nil
    end
  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
end
