require "test_helper"
require 'rack/test'
require 'prometheus_exporter/middleware'

class PrometheusExporterMiddlewareTest < Minitest::Test
  include Rack::Test::Methods

  class FakeClient
    attr_reader :last_send

    def send_json(args)
      @last_send = args
    end
  end

  def client
    @client ||= FakeClient.new
  end

  def inner_app
    Proc.new do |env|
      [200, {}, "OK"]
    end
  end

  def now
    @now = Process.clock_gettime(Process::CLOCK_REALTIME)
  end

  def app
    @middleware ||= begin
      app = PrometheusExporter::Middleware.new(inner_app, client: client, instrument: true)
      def app.request_start
        1234567891.123
      end
      app
    end
  end

  def test_converting_apache_request_start
    now_microsec = '1234567890123456'

    header 'X-Request-Start', "t=#{now_microsec}"
    get '/'
    assert last_response.ok?

    refute_nil client.last_send
    refute_nil client.last_send[:queue_time]
    assert_in_delta 1, client.last_send[:queue_time], 0.05
  end

  def test_converting_nginx_request_start
    now = '1234567890.123'
    header 'X-Request-Start', "t=#{now}"
    get '/'
    assert last_response.ok?

    refute_nil client.last_send
    refute_nil client.last_send[:queue_time]
    assert_in_delta 1, client.last_send[:queue_time], 0.05
  end

  def test_a_header_in_wrong_format
    header 'X-Request-Start', ""
    get '/'
    assert last_response.ok?

    refute_nil client.last_send
    assert_nil client.last_send[:queue_time]
  end
end
