feat: rebuild CSP practice workflow, UX and automation
这个提交包含在:
@@ -0,0 +1,60 @@
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
|
||||
#include "csp/app_state.h"
|
||||
#include "csp/controllers/import_controller.h"
|
||||
|
||||
#include <drogon/HttpRequest.h>
|
||||
|
||||
#include <future>
|
||||
|
||||
namespace {
|
||||
|
||||
drogon::HttpResponsePtr CallLatest(csp::controllers::ImportController& ctl) {
|
||||
auto req = drogon::HttpRequest::newHttpRequest();
|
||||
req->setMethod(drogon::Get);
|
||||
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) {
|
||||
auto req = drogon::HttpRequest::newHttpRequest();
|
||||
req->setMethod(drogon::Get);
|
||||
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:");
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户