Files
Adminive/backend/service/tests/gallery_test.cpp
T
2026-08-08 19:16:58 +08:00

88 lines
4.7 KiB
C++

#include "gallery.hpp"
#include "adminive_test.hpp"
#include <string>
#include <thread>
namespace {
using adminive::example::Json;
Json body_json(const httplib::Result& result) {
ADMINIVE_CHECK(result);
return Json::parse(result->body);
}
void check_status(const httplib::Result& result, int status) {
ADMINIVE_CHECK(result);
ADMINIVE_CHECK(result->status == status);
}
}
int main() {
adminive::example::Component_Gallery gallery;
httplib::Server server;
gallery.bind(server);
const int port = server.bind_to_any_port("127.0.0.1");
ADMINIVE_CHECK(port > 0);
std::thread thread([&] {
ADMINIVE_CHECK(server.listen_after_bind());
});
httplib::Client client("127.0.0.1", port);
const Json docs = body_json(client.Get("/admin/gallery/docs")).at("data");
ADMINIVE_CHECK(docs.at("cases").size() == 14);
ADMINIVE_CHECK(docs.at("capabilities").at("adapters").size() > 5);
ADMINIVE_CHECK(docs.at("examples").at("form_create_view").at("mode") == "create");
std::size_t creatable_fields = 0;
for(const auto& field : docs.at("examples").at("descriptor").at("fields")) {
if(field.at("creatable").get<bool>()) {
++creatable_fields;
}
}
ADMINIVE_CHECK(creatable_fields > 5);
Json field_policies = Json::object();
for(const auto& field : docs.at("examples").at("field_policies")) {
field_policies[field.at("name").get<std::string>()] = field;
}
ADMINIVE_CHECK(field_policies.at("backend_only").at("writable") == true);
ADMINIVE_CHECK(field_policies.at("backend_only").at("editable") == false);
ADMINIVE_CHECK(field_policies.at("backend_only").at("creatable") == false);
ADMINIVE_CHECK(field_policies.at("hidden_backend").at("writable") == true);
ADMINIVE_CHECK(field_policies.at("hidden_backend").at("readable") == false);
ADMINIVE_CHECK(field_policies.at("no_default_text").at("include_default") == false);
ADMINIVE_CHECK(docs.at("examples").at("data").contains("backend_only"));
ADMINIVE_CHECK(!docs.at("examples").at("data").contains("hidden_backend"));
for(const auto& field : docs.at("examples").at("descriptor").at("fields")) {
if(field.at("name") == "no_default_text") {
ADMINIVE_CHECK(!field.contains("default"));
}
}
ADMINIVE_CHECK(!docs.at("examples").at("adapter_data").contains("secret"));
ADMINIVE_CHECK(docs.at("examples").at("reflection_descriptor").at("fields").size() == 2);
ADMINIVE_CHECK(docs.at("examples").at("collection_list_view").at("mode") == "list");
const Json manifest = body_json(client.Get("/admin/gallery/frontend/manifest")).at("data");
ADMINIVE_CHECK(manifest.at("slots").size() == 3);
ADMINIVE_CHECK(manifest.at("slots").at("alpha").at("component_kind") == "amis_schema");
const Json managed = body_json(client.Get("/admin/gallery/managed")).at("data");
ADMINIVE_CHECK(managed.at("lock_count").get<std::size_t>() > 0);
const Json boundaries = body_json(client.Get("/admin/gallery/boundaries")).at("data");
ADMINIVE_CHECK(boundaries.size() == 11);
ADMINIVE_CHECK(boundaries.at(4).at("id") == "manifest-duplicate-slot");
ADMINIVE_CHECK(boundaries.at(4).at("rejected") == true);
check_status(client.Get("/admin/gallery/lab/invalid-filter"), 400);
const Json item_status = body_json(client.Get("/admin/gallery/items/1/status")).at("data");
ADMINIVE_CHECK(item_status.at("state").at("value") == "enabled");
httplib::Headers headers{{"X-Adminive-User", "gallery-test"}, {"X-Request-Id", "request-1"}};
const auto success = client.Post("/admin/gallery/transaction/success", headers, R"({"name":"success"})", "application/json");
check_status(success, 200);
ADMINIVE_CHECK(body_json(success).at("demo").at("events") == Json::array({"prepare", "commit"}));
const auto prepare = client.Post("/admin/gallery/transaction/prepare-reject", headers, R"({"name":"prepare"})", "application/json");
check_status(prepare, 500);
ADMINIVE_CHECK(body_json(prepare).at("demo").at("events") == Json::array({"prepare", "rollback"}));
const auto commit = client.Post("/admin/gallery/transaction/commit-fail", headers, R"({"name":"commit"})", "application/json");
check_status(commit, 500);
const Json commit_json = body_json(commit);
ADMINIVE_CHECK(commit_json.at("demo").at("events") == Json::array({"prepare", "commit", "rollback"}));
ADMINIVE_CHECK(commit_json.at("demo").at("context").at("user") == "gallery-test");
const auto rollback = client.Post("/admin/gallery/transaction/rollback-fail", headers, R"({"name":"rollback"})", "application/json");
check_status(rollback, 500);
ADMINIVE_CHECK(body_json(rollback).at("msg").get<std::string>().find("rollback failed") != std::string::npos);
server.stop();
thread.join();
return 0;
}