require_relative '../test_helper'
require 'aws-xray-sdk/facets/rack'
require 'rack'

class TestFacetRack < Minitest::Test

  ENV_WITH_QUERY_STRING = {
    "GATEWAY_INTERFACE" => "CGI/1.1",
    "PATH_INFO" => "/index.html",
    "QUERY_STRING" => "",
    "REMOTE_ADDR" => "::1",
    "REMOTE_HOST" => "localhost",
    "REQUEST_METHOD" => "GET",
    "REQUEST_URI" => "http://localhost:3000/index.html?foo=bar",
    "SCRIPT_NAME" => "",
    "SERVER_NAME" => "localhost",
    "SERVER_PORT" => "3000",
    "SERVER_PROTOCOL" => "HTTP/1.1",
    "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)",
    "HTTP_HOST" => "localhost:3000",
    "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0",
    "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3",
    "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
    "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61",
    "HTTP_CONNECTION" => "keep-alive",
    "HTTP_CACHE_CONTROL" => "max-age=0",
    "rack.version" => [1, 2],
    "rack.multithread" => true,
    "rack.multiprocess" => false,
    "rack.run_once" => false,
    "rack.url_scheme" => "http",
    "HTTP_VERSION" => "HTTP/1.1",
    "REQUEST_PATH" => "/index.html"
  }.freeze


  @@app = Minitest::Mock.new
  def @@app.call(env)
    return 200, {}, ""
  end

  def setup
    @@recorder = XRay::Recorder.new
    config = {
      name: "rack_test",
      emitter: XRay::TestHelper::StubbedEmitter.new,
      sampler: XRay::TestHelper::StubbedDefaultSampler.new
    }
    @@recorder.configure(config)
  end

  def test_rack_http_url_excludes_query_string
    middleware = XRay::Rack::Middleware.new(@@app, :recorder => @@recorder)
    middleware.call ENV_WITH_QUERY_STRING
    segment = @@recorder.emitter.entities[0]
    assert_equal "http://localhost:3000/index.html", segment.http_request[:url]
  end

  def test_rack_returns_xray_header
    middleware = XRay::Rack::Middleware.new(@@app, :recorder => @@recorder)
    _, headers, _ = middleware.call ENV_WITH_QUERY_STRING
    assert_equal true, headers.has_key?(XRay::Facets::Helper::TRACE_HEADER)
    assert_match /^Root=/, headers[XRay::Facets::Helper::TRACE_HEADER]
    refute_match /ParentId=/, headers[XRay::Facets::Helper::TRACE_HEADER]
    refute_match /Sampled=/, headers[XRay::Facets::Helper::TRACE_HEADER]
  end

end
