95 行
3.1 KiB
C++
95 行
3.1 KiB
C++
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include "csp/app_state.h"
|
|
#include "csp/controllers/contest_controller.h"
|
|
#include "csp/services/auth_service.h"
|
|
|
|
#include <drogon/HttpRequest.h>
|
|
|
|
#include <future>
|
|
|
|
namespace {
|
|
|
|
drogon::HttpResponsePtr CallList(csp::controllers::ContestController& ctl) {
|
|
auto req = drogon::HttpRequest::newHttpRequest();
|
|
req->setMethod(drogon::Get);
|
|
|
|
std::promise<drogon::HttpResponsePtr> 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<drogon::HttpResponsePtr> 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<drogon::HttpResponsePtr> 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<drogon::HttpResponsePtr> 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());
|
|
}
|