106 行
3.8 KiB
C++
106 行
3.8 KiB
C++
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include "csp/app_state.h"
|
|
#include "csp/controllers/me_controller.h"
|
|
#include "csp/services/auth_service.h"
|
|
#include "csp/services/problem_service.h"
|
|
|
|
#include <drogon/HttpRequest.h>
|
|
|
|
#include <future>
|
|
|
|
namespace {
|
|
|
|
drogon::HttpResponsePtr CallProfile(csp::controllers::MeController& ctl,
|
|
const std::string& token) {
|
|
auto req = drogon::HttpRequest::newHttpRequest();
|
|
req->setMethod(drogon::Get);
|
|
req->addHeader("Authorization", "Bearer " + token);
|
|
|
|
std::promise<drogon::HttpResponsePtr> p;
|
|
ctl.profile(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); });
|
|
return p.get_future().get();
|
|
}
|
|
|
|
drogon::HttpResponsePtr CallListWrongBook(csp::controllers::MeController& ctl,
|
|
const std::string& token) {
|
|
auto req = drogon::HttpRequest::newHttpRequest();
|
|
req->setMethod(drogon::Get);
|
|
req->addHeader("Authorization", "Bearer " + token);
|
|
|
|
std::promise<drogon::HttpResponsePtr> p;
|
|
ctl.listWrongBook(req,
|
|
[&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); });
|
|
return p.get_future().get();
|
|
}
|
|
|
|
drogon::HttpResponsePtr CallPatchWrongBook(csp::controllers::MeController& ctl,
|
|
const std::string& token,
|
|
int64_t problem_id,
|
|
const std::string& note) {
|
|
Json::Value body;
|
|
body["note"] = note;
|
|
auto req = drogon::HttpRequest::newHttpJsonRequest(body);
|
|
req->setMethod(drogon::Patch);
|
|
req->addHeader("Authorization", "Bearer " + token);
|
|
|
|
std::promise<drogon::HttpResponsePtr> p;
|
|
ctl.upsertWrongBookNote(req,
|
|
[&p](const drogon::HttpResponsePtr& resp) {
|
|
p.set_value(resp);
|
|
},
|
|
problem_id);
|
|
return p.get_future().get();
|
|
}
|
|
|
|
drogon::HttpResponsePtr CallDeleteWrongBook(csp::controllers::MeController& ctl,
|
|
const std::string& token,
|
|
int64_t problem_id) {
|
|
auto req = drogon::HttpRequest::newHttpRequest();
|
|
req->setMethod(drogon::Delete);
|
|
req->addHeader("Authorization", "Bearer " + token);
|
|
|
|
std::promise<drogon::HttpResponsePtr> p;
|
|
ctl.deleteWrongBookItem(req,
|
|
[&p](const drogon::HttpResponsePtr& resp) {
|
|
p.set_value(resp);
|
|
},
|
|
problem_id);
|
|
return p.get_future().get();
|
|
}
|
|
|
|
} // namespace
|
|
|
|
TEST_CASE("me controller profile and wrong-book") {
|
|
csp::AppState::Instance().Init(":memory:");
|
|
|
|
csp::services::AuthService auth(csp::AppState::Instance().db());
|
|
const auto login = auth.Register("me_http_user", "password123");
|
|
|
|
csp::services::ProblemService problems(csp::AppState::Instance().db());
|
|
const auto list = problems.List(csp::services::ProblemQuery{});
|
|
REQUIRE_FALSE(list.items.empty());
|
|
const int64_t problem_id = list.items.front().id;
|
|
|
|
csp::controllers::MeController ctl;
|
|
|
|
auto profile = CallProfile(ctl, login.token);
|
|
REQUIRE(profile->statusCode() == drogon::k200OK);
|
|
auto profile_json = profile->jsonObject();
|
|
REQUIRE(profile_json != nullptr);
|
|
REQUIRE((*profile_json)["ok"].asBool());
|
|
|
|
auto patch = CallPatchWrongBook(ctl, login.token, problem_id, "复盘记录");
|
|
REQUIRE(patch->statusCode() == drogon::k200OK);
|
|
|
|
auto list_resp = CallListWrongBook(ctl, login.token);
|
|
REQUIRE(list_resp->statusCode() == drogon::k200OK);
|
|
auto list_json = list_resp->jsonObject();
|
|
REQUIRE(list_json != nullptr);
|
|
REQUIRE((*list_json)["data"].isArray());
|
|
REQUIRE((*list_json)["data"].size() >= 1);
|
|
|
|
auto del = CallDeleteWrongBook(ctl, login.token, problem_id);
|
|
REQUIRE(del->statusCode() == drogon::k200OK);
|
|
}
|