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

42 行
1.3 KiB
C++

#include <catch2/catch_test_macros.hpp>
#include "csp/db/sqlite_db.h"
#include "csp/services/auth_service.h"
#include "csp/services/experience_service.h"
TEST_CASE("experience only increases on rating gains") {
auto db = csp::db::SqliteDb::OpenMemory();
csp::db::ApplyMigrations(db);
csp::db::SeedDemoData(db);
csp::services::AuthService auth(db);
const auto user = auth.Register("xp_user", "password123");
csp::services::ExperienceService xp(db);
const auto s0 = xp.GetSummary(user.user_id);
REQUIRE(s0.user_id == user.user_id);
REQUIRE(s0.experience >= 0);
const int base_exp = s0.experience;
db.Exec("UPDATE users SET rating=rating+10 WHERE id=" +
std::to_string(user.user_id));
const auto s1 = xp.GetSummary(user.user_id);
REQUIRE(s1.experience == base_exp + 10);
db.Exec("UPDATE users SET rating=rating-4 WHERE id=" +
std::to_string(user.user_id));
const auto s2 = xp.GetSummary(user.user_id);
REQUIRE(s2.experience == base_exp + 10);
db.Exec("UPDATE users SET rating=rating+3 WHERE id=" +
std::to_string(user.user_id));
const auto s3 = xp.GetSummary(user.user_id);
REQUIRE(s3.experience == base_exp + 13);
const auto rows = xp.ListHistory(user.user_id, 20);
REQUIRE(rows.size() >= 2);
REQUIRE(rows[0].xp_delta == 3);
REQUIRE(rows[1].xp_delta == 10);
}