#include "../test.h"

#define TEST(name) TEST_CASE("parse-special-codes: " name, "[parse-special-codes]")

TEST("100 continue") {
    ResponseParser p;
    p.set_context_request(new Request(Method::Get, new URI("/"), Headers().add("Expect", "100-continue")));

    auto result = p.parse("HTTP/1.1 100 Continue\r\n\r\n");
    auto res = result.response;
    CHECK(result.state == State::done);
    CHECK(res->code == 100);
    CHECK(p.context_request());

    result = p.parse("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
    CHECK(result.response != res);
    res = result.response;
    CHECK(result.state == State::done);
    CHECK(res->code == 200);
    CHECK_FALSE(p.context_request());
}

TEST("unexpected 100 continue") {
    ResponseParser p;
    p.set_context_request(new Request());

    auto result = p.parse("HTTP/1.1 100 Continue\r\n\r\n");
    CHECK(result.state == State::error);
    CHECK(result.error == errc::unexpected_continue);
}

TEST("204 no content") {
    ResponseParser p;
    p.set_context_request(new Request());

    auto result = p.parse("HTTP/1.1 204 No Content\r\nConnection: keep-alive\r\n\r\n");
    CHECK(result.state == State::done);
    CHECK(result.response->code == 204);
}

TEST("HEAD response with content length") {
    ResponseParser p;
    p.set_context_request(new Request(Method::Head, new URI("/")));
    string raw =
        "HTTP/1.1 200 OK\r\n"
        "Content-Length: 100500\r\n"
        "\r\n";

    auto result = p.parse(raw);
    CHECK(result.state == State::done);
    CHECK(result.response->code == 200);
    CHECK(result.response->headers.get("content-length") == "100500");
}