defmodule ReadabilityHttpTest do
  use ExUnit.Case
  import Mock
  require IEx

  test "blank response is parsed as plain text" do
    url = "https://tools.ietf.org/rfc/rfc2616.txt"
    content = TestHelper.read_fixture("rfc2616.txt")
    response = %HTTPoison.Response{status_code: 200, headers: [], body: content}

    with_mock HTTPoison, get!: fn _url, _headers, _opts -> response end do
      %Readability.Summary{article_text: result_text} = Readability.summarize(url)

      assert result_text =~ ~r/3 Protocol Parameters/
    end
  end

  test "text/plain response is parsed as plain text" do
    url = "https://tools.ietf.org/rfc/rfc2616.txt"
    content = TestHelper.read_fixture("rfc2616.txt")

    response = %HTTPoison.Response{
      status_code: 200,
      headers: [{"Content-Type", "text/plain"}],
      body: content
    }

    with_mock HTTPoison, get!: fn _url, _headers, _opts -> response end do
      %Readability.Summary{article_text: result_text} = Readability.summarize(url)

      assert result_text =~ ~r/3 Protocol Parameters/
    end
  end

  test "*ml responses are parsed as markup" do
    url = "https://news.bbc.co.uk/test.html"
    content = TestHelper.read_fixture("bbc.html")
    mimes = ["text/html", "application/xml", "application/xhtml+xml"]

    mimes
    |> Enum.each(fn mime ->
      response = %HTTPoison.Response{
        status_code: 200,
        headers: [{"Content-Type", mime}],
        body: content
      }

      with_mock HTTPoison, get!: fn _url, _headers, _opts -> response end do
        %Readability.Summary{article_html: result_html} = Readability.summarize(url)

        assert result_html =~ ~r/connected computing devices\".<\/p><\/div><\/div>$/
      end
    end)
  end

  test "response with charset is parsed correctly" do
    url = "https://news.bbc.co.uk/test.html"
    content = TestHelper.read_fixture("bbc.html")

    response = %HTTPoison.Response{
      status_code: 200,
      headers: [{"Content-Type", "text/html; charset=UTF-8"}],
      body: content
    }

    with_mock HTTPoison, get!: fn _url, _headers, _opts -> response end do
      %Readability.Summary{article_html: result_html} = Readability.summarize(url)

      assert result_html =~ ~r/connected computing devices\".<\/p><\/div><\/div>$/
    end
  end

  test "response with content-type in different case is parsed correctly" do
    # HTTP header keys are case insensitive (RFC2616 - Section 4.2)
    url = "https://news.bbc.co.uk/test.html"
    content = TestHelper.read_fixture("bbc.html")

    response = %HTTPoison.Response{
      status_code: 200,
      headers: [{"content-Type", "text/html; charset=UTF-8"}],
      body: content
    }

    with_mock HTTPoison, get!: fn _url, _headers, _opts -> response end do
      %Readability.Summary{article_html: result_html} = Readability.summarize(url)

      assert result_html =~ ~r/connected computing devices\".<\/p><\/div><\/div>$/
    end
  end
end
