#include "gallery.hpp" #include "adminive_test.hpp" #include #include 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); bool status_endpoint_verified{}; for(const auto& item : docs.at("cases")) { if(item.at("id") != "status") { continue; } ADMINIVE_CHECK(item.at("endpoints") == Json::array({"/admin/status", "/admin/radio_states/{id}/status"})); status_endpoint_verified = true; } ADMINIVE_CHECK(status_endpoint_verified); 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()) { ++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()] = 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() > 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/items?score=92"), 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().find("rollback failed") != std::string::npos); server.stop(); thread.join(); return 0; }