#include #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); }