feat: rebuild CSP practice workflow, UX and automation

这个提交包含在:
Codex CLI
2026-02-13 15:49:05 +08:00
父节点 d33deed4c5
当前提交 e2ab522b78
修改 105 个文件,包含 15669 行新增428 行删除

查看文件

@@ -0,0 +1,34 @@
#include <catch2/catch_test_macros.hpp>
#include "csp/db/sqlite_db.h"
#include "csp/services/import_service.h"
TEST_CASE("import service query latest job and items") {
auto db = csp::db::SqliteDb::OpenMemory();
csp::db::ApplyMigrations(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('running','manual',10,3,2,1,'{}','',100,null,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/Round1/A.pdf','success','A',2,11,'',101,102,120,100);");
csp::services::ImportService svc(db);
const auto latest = svc.GetLatestJob();
REQUIRE(latest.has_value());
REQUIRE(latest->id == 1);
REQUIRE(latest->status == "running");
REQUIRE(latest->processed_count == 3);
csp::services::ImportJobItemQuery q;
q.page = 1;
q.page_size = 20;
const auto items = svc.ListItems(1, q);
REQUIRE(items.size() == 1);
REQUIRE(items[0].source_path == "CSP-J/2024/Round1/A.pdf");
REQUIRE(items[0].status == "success");
REQUIRE(items[0].problem_id.has_value());
}