文件
csp/backend/tests/import_http_test.cc
2026-02-23 20:02:46 +08:00

69 行
2.6 KiB
C++

#include <catch2/catch_test_macros.hpp>
#include "csp/app_state.h"
#include "csp/controllers/import_controller.h"
#include "csp/services/auth_service.h"
#include <drogon/HttpRequest.h>
#include <future>
namespace {
drogon::HttpResponsePtr CallLatest(csp::controllers::ImportController& 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.latestJob(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); });
return p.get_future().get();
}
drogon::HttpResponsePtr CallItems(csp::controllers::ImportController& ctl,
int64_t job_id,
const std::string& token) {
auto req = drogon::HttpRequest::newHttpRequest();
req->setMethod(drogon::Get);
req->addHeader("Authorization", "Bearer " + token);
req->setParameter("page", "1");
req->setParameter("page_size", "20");
std::promise<drogon::HttpResponsePtr> p;
ctl.jobItems(req, [&p](const drogon::HttpResponsePtr& resp) { p.set_value(resp); }, job_id);
return p.get_future().get();
}
} // namespace
TEST_CASE("import controller latest and items") {
csp::AppState::Instance().Init(":memory:");
csp::services::AuthService auth(csp::AppState::Instance().db());
const auto login = auth.Register("admin", "password123");
auto& db = csp::AppState::Instance().db();
db.Exec(
"INSERT INTO import_jobs(status,trigger,total_count,processed_count,success_count,"
"failed_count,options_json,last_error,started_at,finished_at,updated_at,created_at)"
"VALUES('success','auto',2,2,2,0,'{\"workers\":3}','',100,120,120,90);");
db.Exec(
"INSERT INTO import_job_items(job_id,source_path,status,title,difficulty,problem_id,"
"error_text,started_at,finished_at,updated_at,created_at)"
"VALUES(1,'CSP-J/2024/Round2/B.pdf','success','B',3,7,'',101,110,120,100);");
csp::controllers::ImportController ctl;
auto latest = CallLatest(ctl, login.token);
REQUIRE(latest->statusCode() == drogon::k200OK);
auto latest_json = latest->jsonObject();
REQUIRE(latest_json != nullptr);
REQUIRE((*latest_json)["ok"].asBool());
REQUIRE((*latest_json)["data"]["job"]["id"].asInt64() == 1);
auto items = CallItems(ctl, 1, login.token);
REQUIRE(items->statusCode() == drogon::k200OK);
auto items_json = items->jsonObject();
REQUIRE(items_json != nullptr);
REQUIRE((*items_json)["ok"].asBool());
REQUIRE((*items_json)["data"]["items"].isArray());
REQUIRE((*items_json)["data"]["items"].size() == 1);
}