#include "http_utility.hpp"

#include <array>

#include <gtest/gtest.h>  // IWYU pragma: keep

// IWYU pragma: no_include <gtest/gtest-message.h>
// IWYU pragma: no_include <gtest/gtest-test-part.h>
// IWYU pragma: no_include "gtest/gtest_pred_impl.h"

namespace http_helpers {
namespace {

TEST(isContentTypeAllowed, PositiveTest) {
  EXPECT_TRUE(isContentTypeAllowed("*/*", ContentType::HTML, true));
  EXPECT_TRUE(isContentTypeAllowed("application/octet-stream",
                                   ContentType::OctetStream, false));
  EXPECT_TRUE(isContentTypeAllowed("text/html", ContentType::HTML, false));
  EXPECT_TRUE(
      isContentTypeAllowed("application/json", ContentType::JSON, false));
  EXPECT_TRUE(
      isContentTypeAllowed("application/cbor", ContentType::CBOR, false));
  EXPECT_TRUE(isContentTypeAllowed("application/json, text/html",
                                   ContentType::HTML, false));
}

TEST(isContentTypeAllowed, NegativeTest) {
  EXPECT_FALSE(isContentTypeAllowed("application/octet-stream",
                                    ContentType::HTML, false));
  EXPECT_FALSE(
      isContentTypeAllowed("application/html", ContentType::JSON, false));
  EXPECT_FALSE(
      isContentTypeAllowed("application/json", ContentType::CBOR, false));
  EXPECT_FALSE(
      isContentTypeAllowed("application/cbor", ContentType::HTML, false));
  EXPECT_FALSE(isContentTypeAllowed("application/json, text/html",
                                    ContentType::OctetStream, false));
}

TEST(isContentTypeAllowed, ContainsAnyMimeTypeReturnsTrue) {
  EXPECT_TRUE(
      isContentTypeAllowed("text/html, */*", ContentType::OctetStream, true));
}

TEST(isContentTypeAllowed, ContainsQFactorWeightingReturnsTrue) {
  EXPECT_TRUE(isContentTypeAllowed("text/html, */*;q=0.8",
                                   ContentType::OctetStream, true));
}

TEST(getPreferedContentType, PositiveTest) {
  std::array<ContentType, 1> content_type{ContentType::HTML};
  EXPECT_EQ(getPreferedContentType("text/html, application/json", content_type),
            ContentType::HTML);

  std::array<ContentType, 2> html_json{ContentType::HTML, ContentType::JSON};
  EXPECT_EQ(getPreferedContentType("text/html, application/json", html_json),
            ContentType::HTML);

  std::array<ContentType, 2> json_html{ContentType::JSON, ContentType::HTML};
  EXPECT_EQ(getPreferedContentType("text/html, application/json", json_html),
            ContentType::HTML);

  std::array<ContentType, 2> cbor_json{ContentType::CBOR, ContentType::JSON};
  EXPECT_EQ(
      getPreferedContentType("application/cbor, application::json", cbor_json),
      ContentType::CBOR);

  EXPECT_EQ(getPreferedContentType("application/json", cbor_json),
            ContentType::JSON);
  EXPECT_EQ(getPreferedContentType("*/*", cbor_json), ContentType::ANY);
}

TEST(getPreferedContentType, NegativeTest) {
  std::array<ContentType, 1> content_type{ContentType::CBOR};
  EXPECT_EQ(getPreferedContentType("text/html, application/json", content_type),
            ContentType::NoMatch);
}
}  // namespace
}  // namespace http_helpers
