# frozen_string_literal: true

require_relative "helper"
require "rack/test"
require "app"

describe "the app" do
  include Rack::Test::Methods

  let(:app) { App.freeze }

  def json
    Oj.load(last_response.body)
  end

  it "handles unfound pages" do
    get "/foo"

    _(last_response.status).must_equal(404)
  end

  it "will not process an invalid date" do
    get "/v1/2010-31-01"

    _(last_response).must_be(:unprocessable?)
  end

  it "will not process an invalid amount" do
    get "/v1/latest?amount=0&from=USD&to=EUR"

    _(last_response).must_be(:unprocessable?)
  end

  it "will not process a date before 2000" do
    get "/v1/1999-01-01"

    _(last_response).must_be(:not_found?)
  end

  it "will not process an unavailable base" do
    get "/v1/latest?base=UAH"

    _(last_response).must_be(:not_found?)
  end

  it "handles malformed queries" do
    get "/v1/latest?base=USD?callback=?"

    _(last_response).must_be(:not_found?)
  end

  it "does not return stale dates" do
    Sequel::Model.db.transaction(savepoint: true) do
      get "/v1/latest"
      date = json["date"]
      latest_date = Rate.where(provider: "ECB").select(:date).where(Sequel[:date] <= Date.today).order(Sequel.desc(:date)).limit(1)
      Rate.where(provider: "ECB", date: latest_date).delete
      get "/v1/latest"

      _(json["date"]).wont_equal(date)
      raise Sequel::Rollback
    end
  end

  it "will not process circular conversions" do
    get "/v1/latest?from=EUR&to=EUR"

    _(last_response).must_be(:unprocessable?)
    get "/v1/latest?from=USD&to=USD"

    _(last_response).must_be(:unprocessable?)
  end
end
