#include #include "postgres/postgres.h" #include "search/search.h" #include "json/json.h" #include "logger/logger.h" #include // Note: This test requires a valid config/postgres.toml pointing to a Supabase instance. // We test against an arbitrary table 'test_items' or standard table. // In this case we'll test against `grid_search_runs` since we know it exists, // using a dummy uuid for testing. // DO NOT RUN UNLESS CONFIGURED. TEST_CASE("Postgres Live Operations", "[postgres_live]") { // Load config std::string supabase_url; std::string supabase_key; try { auto config = toml::parse_file("config/postgres.toml"); supabase_url = config["supabase"]["url"].value_or(""); supabase_key = config["supabase"]["service_key"].value_or(""); } catch (const std::exception &e) { WARN("Skipping postgres live tests. Config missing or invalid: " << e.what()); return; } if (supabase_url.empty() || supabase_key.empty()) { WARN("Skipping postgres live tests. Supabase credentials missing."); return; } postgres::Config pg_cfg; pg_cfg.supabase_url = supabase_url; pg_cfg.supabase_key = supabase_key; postgres::init(pg_cfg); REQUIRE(postgres::ping() == "ok"); std::string test_id = "00000000-0000-0000-0000-0000000000cc"; std::string user_id = "3bb4cfbf-318b-44d3-a9d3-35680e738421"; SECTION("Insert, Query, Update, Upsert, Delete") { // 1. Clean up first just in case postgres::del("grid_search_runs", "id=eq." + test_id); // 2. Insert std::string insert_body = R"({"id": ")" + test_id + R"(", "user_id": ")" + user_id + R"(", "run_id": "test_run", "status": "searching", "request": {}})"; std::string res1 = postgres::insert("grid_search_runs", insert_body); // 3. Query std::string res2 = postgres::query("grid_search_runs", "*", "id=eq." + test_id); WARN("Insert Result: " << res1); WARN("Query Result: " << res2); REQUIRE(json::is_valid(res2)); REQUIRE(res2.find("test_run") != std::string::npos); // 4. Update std::string update_body = R"({"status": "enriching"})"; std::string res3 = postgres::update("grid_search_runs", update_body, "id=eq." + test_id); REQUIRE(json::is_valid(res3)); REQUIRE(res3.find("error") == std::string::npos); // 5. Upsert std::string upsert_body = R"({"id": ")" + test_id + R"(", "user_id": ")" + user_id + R"(", "run_id": "upsert_run", "status": "complete", "request": {}})"; std::string res4 = postgres::upsert("grid_search_runs", upsert_body, "id"); REQUIRE(res4.find("error") == std::string::npos); // Query again to verify upsert std::string res5 = postgres::query("grid_search_runs", "*", "id=eq." + test_id); REQUIRE(res5.find("upsert_run") != std::string::npos); // 6. Delete std::string res6 = postgres::del("grid_search_runs", "id=eq." + test_id); REQUIRE(json::is_valid(res6)); // Verify deleted std::string res7 = postgres::query("grid_search_runs", "*", "id=eq." + test_id); REQUIRE(res7 == "[]"); } }