#include #include "csp/app_state.h" #include "csp/controllers/contest_controller.h" #include "csp/services/auth_service.h" #include #include namespace { drogon::HttpResponsePtr CallList(csp::controllers::ContestController& ctl) { auto req = drogon::HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); std::promise p; ctl.list(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); }); return p.get_future().get(); } drogon::HttpResponsePtr CallGet(csp::controllers::ContestController& ctl, int64_t contest_id, const std::string& token) { auto req = drogon::HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); req->addHeader("Authorization", "Bearer " + token); std::promise p; ctl.getById(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); }, contest_id); return p.get_future().get(); } drogon::HttpResponsePtr CallRegister(csp::controllers::ContestController& ctl, int64_t contest_id, const std::string& token) { auto req = drogon::HttpRequest::newHttpRequest(); req->setMethod(drogon::Post); req->addHeader("Authorization", "Bearer " + token); std::promise p; ctl.registerForContest(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); }, contest_id); return p.get_future().get(); } drogon::HttpResponsePtr CallBoard(csp::controllers::ContestController& ctl, int64_t contest_id) { auto req = drogon::HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); std::promise p; ctl.leaderboard(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); }, contest_id); return p.get_future().get(); } } // namespace TEST_CASE("contest controller list/get/register/leaderboard") { csp::AppState::Instance().Init(":memory:"); csp::services::AuthService auth(csp::AppState::Instance().db()); const auto user = auth.Register("contest_http_user", "password123"); csp::controllers::ContestController ctl; auto list = CallList(ctl); REQUIRE(list->statusCode() == drogon::k200OK); auto list_json = list->jsonObject(); REQUIRE(list_json != nullptr); REQUIRE((*list_json)["data"].isArray()); REQUIRE((*list_json)["data"].size() >= 1); const int64_t contest_id = (*list_json)["data"][0]["id"].asInt64(); auto get = CallGet(ctl, contest_id, user.token); REQUIRE(get->statusCode() == drogon::k200OK); auto reg = CallRegister(ctl, contest_id, user.token); REQUIRE(reg->statusCode() == drogon::k200OK); auto board = CallBoard(ctl, contest_id); REQUIRE(board->statusCode() == drogon::k200OK); auto board_json = board->jsonObject(); REQUIRE(board_json != nullptr); REQUIRE((*board_json)["data"].isArray()); }