更新功能
This commit is contained in:
+61
-151
@@ -1,160 +1,70 @@
|
||||
#include "example.hpp"
|
||||
#include "config_store.hpp"
|
||||
#include "device_tables.hpp"
|
||||
#include "example_descriptors.hpp"
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <filesystem>
|
||||
int main() {
|
||||
using adminive::example::Alert_Config;
|
||||
using adminive::example::Radio_Item_Status;
|
||||
using adminive::example::Radio_Mode;
|
||||
using adminive::example::Radio_Service_Config;
|
||||
using adminive::example::Radio_State;
|
||||
using namespace adminive::example;
|
||||
const auto radio_descriptor = adminive::to_descriptor_json<Radio_State>();
|
||||
assert(radio_descriptor.at("fields").at(0).at("name") == "mode");
|
||||
assert(radio_descriptor.at("fields").at(0).at("list_label") == "模式");
|
||||
assert(radio_descriptor.at("fields").at(0).at("options").at(0).at("label") == "接收");
|
||||
assert(radio_descriptor.at("fields").at(0).at("options").at(2).at("label") == "双工");
|
||||
assert(radio_descriptor.at("list").at("id_label") == "编号");
|
||||
assert(radio_descriptor.at("list").at("default_order_by") == "buffer_count");
|
||||
assert(radio_descriptor.at("list").at("default_order_dir") == "asc");
|
||||
const auto radio_crud = adminive::to_amis_crud_schema<Radio_State>("/admin/radio_states");
|
||||
const auto& radio_table = radio_crud.at("body");
|
||||
assert(radio_table.at("columns").at(0).at("label") == "编号");
|
||||
assert(radio_table.at("columns").at(1).at("map").at("receive") == "接收");
|
||||
assert(radio_table.at("columns").at(2).at("name") == "buffer_count");
|
||||
assert(radio_table.at("headerToolbar").at(0).at("type") == "columns-toggler");
|
||||
assert(radio_table.at("headerToolbar").at(0).at("draggable") == true);
|
||||
assert(radio_table.at("defaultParams").at("orderBy") == "buffer_count");
|
||||
assert(!radio_table.contains("draggable"));
|
||||
const auto serial_descriptor = adminive::to_descriptor_json<Serial_Device_Row>();
|
||||
assert(serial_descriptor.at("list").at("user_reorderable") == true);
|
||||
assert(serial_descriptor.at("fields").at(2).at("options").at(0).at("label") == "无校验");
|
||||
const auto serial_crud = adminive::to_amis_crud_schema<Serial_Device_Row>("/admin/device_tables/serial/items");
|
||||
assert(serial_crud.at("body").at("draggable") == true);
|
||||
assert(serial_crud.at("body").at("saveOrderApi").at("url") == "/admin/device_tables/serial/items/order");
|
||||
const auto network_crud = adminive::to_amis_crud_schema<Network_Device_Row>("/admin/device_tables/network/items");
|
||||
assert(network_crud.at("body").at("columns").at(1).at("label") == "地址");
|
||||
assert(network_crud.at("body").at("columns").at(2).at("map").at("websocket") == "WebSocket");
|
||||
Radio_Service_Config radio_config;
|
||||
const auto radio_form = adminive::to_amis_form_schema(radio_config, "/admin/config/radio/data", "确认修改");
|
||||
assert(radio_form.at("body").at(0).at("type") == "input-text");
|
||||
assert(radio_form.at("body").at(1).at("type") == "select");
|
||||
assert(radio_form.at("body").at(1).at("options").at(2).at("label") == "双工");
|
||||
assert(radio_form.at("body").at(5).at("visibleOn") == "${mode == 'duplex'}");
|
||||
assert(radio_form.at("body").at(6).at("body").at(1).at("type") == "input-date");
|
||||
assert(radio_form.at("body").at(6).at("body").at(2).at("type") == "input-color");
|
||||
Radio_State state;
|
||||
const auto descriptor = adminive::to_descriptor_json<Radio_State>();
|
||||
assert(descriptor.at("name") == "radio_state");
|
||||
assert(descriptor.at("fields").size() == 5);
|
||||
assert(descriptor.at("fields").at(0).at("name") == "mode");
|
||||
assert(descriptor.at("fields").at(0).at("label") == "Operating Mode");
|
||||
assert(descriptor.at("fields").at(0).at("list_label") == "Mode");
|
||||
assert(descriptor.at("fields").at(0).at("value_type") == "enum");
|
||||
assert(descriptor.at("fields").at(0).at("options").size() == 4);
|
||||
assert(descriptor.at("fields").at(0).at("options").at(0).at("value") == "receive");
|
||||
assert(descriptor.at("fields").at(0).at("options").at(2).at("value") == "duplex");
|
||||
assert(descriptor.at("fields").at(0).at("order") == 5);
|
||||
assert(descriptor.at("fields").at(0).at("sortable") == true);
|
||||
assert(descriptor.at("fields").at(1).at("name") == "port");
|
||||
assert(descriptor.at("fields").at(1).at("list_label") == "Listen Port");
|
||||
assert(descriptor.at("fields").at(1).at("minimum") == 1);
|
||||
assert(descriptor.at("fields").at(1).at("maximum") == 65535);
|
||||
assert(descriptor.at("fields").at(2).at("name") == "buffer_count");
|
||||
assert(descriptor.at("fields").at(2).at("multiple_of") == 2);
|
||||
const auto initial = adminive::to_json(state);
|
||||
assert(initial.at("mode") == "receive");
|
||||
assert(initial.at("port") == 9999);
|
||||
Radio_State assigned;
|
||||
auto result = adminive::assign_json(assigned, adminive::Json{{"mode", "transmit"}, {"port", 7000}, {"buffer_count", 6}, {"low_watermark", 10}, {"high_watermark", 20}});
|
||||
assert(result.success);
|
||||
assert(assigned.mode == Radio_Mode::transmit);
|
||||
assert(assigned.port.value() == 7000);
|
||||
result = adminive::apply_json_patch(assigned, adminive::Json{{"mode", "duplex"}, {"port", 7200}});
|
||||
assert(result.success);
|
||||
assert(assigned.mode == Radio_Mode::duplex);
|
||||
assert(assigned.port.value() == 7200);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"buffer_count", 3}});
|
||||
assert(!result.success);
|
||||
assert(state.buffer_count.value() == 2);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"low_watermark", 64}, {"high_watermark", 32}});
|
||||
assert(!result.success);
|
||||
assert(state.low_watermark == 0);
|
||||
result = adminive::apply_patch(state, adminive::Json{{"missing", 1}});
|
||||
assert(!result.success);
|
||||
assert(result.field_errors.contains("missing"));
|
||||
Radio_State created;
|
||||
result = adminive::apply_frontend_create(created, adminive::Json{{"mode", "maintenance"}, {"port", 7300}, {"buffer_count", 10}, {"low_watermark", 12}, {"high_watermark", 24}});
|
||||
assert(result.success);
|
||||
assert(created.mode == Radio_Mode::maintenance);
|
||||
result = adminive::apply_frontend_create(created, adminive::Json{{"port", 7300}});
|
||||
assert(!result.success);
|
||||
assert(result.field_errors.contains("mode"));
|
||||
assert(result.field_errors.contains("buffer_count"));
|
||||
const auto form = adminive::to_amis_form_schema(state, "/admin/radio_state", "Confirm Changes");
|
||||
assert(form.at("type") == "form");
|
||||
assert(form.at("body").size() == 5);
|
||||
assert(form.at("body").at(0).at("type") == "select");
|
||||
assert(form.at("body").at(0).at("options").size() == 4);
|
||||
assert(form.at("body").at(1).at("type") == "input-number");
|
||||
assert(form.at("body").at(2).at("step") == 2);
|
||||
assert(form.at("actions").size() == 2);
|
||||
assert(form.at("actions").at(0).at("type") == "reset");
|
||||
assert(form.at("actions").at(1).at("type") == "submit");
|
||||
assert(form.at("actions").at(1).at("label") == "Confirm Changes");
|
||||
const auto crud = adminive::to_amis_crud_schema<Radio_State>("/admin/radio_states");
|
||||
assert(crud.at("type") == "page");
|
||||
assert(crud.at("body").at("type") == "crud");
|
||||
assert(crud.at("body").at("columns").size() == 7);
|
||||
assert(crud.at("body").at("columns").at(1).at("name") == "mode");
|
||||
assert(crud.at("body").at("columns").at(1).at("type") == "mapping");
|
||||
assert(crud.at("body").at("columns").at(1).at("map").at("duplex") == "Duplex");
|
||||
assert(crud.at("body").at("columns").at(2).at("name") == "buffer_count");
|
||||
assert(crud.at("body").at("columns").at(3).at("name") == "port");
|
||||
assert(!crud.at("body").contains("interval"));
|
||||
const auto& create_form = crud.at("body").at("headerToolbar").at(1).at("dialog").at("body");
|
||||
assert(create_form.at("actions").at(1).at("type") == "submit");
|
||||
assert(create_form.at("actions").at(1).at("label") == "Create");
|
||||
const auto status_descriptor = adminive::to_status_descriptor_json<Radio_Item_Status>();
|
||||
assert(status_descriptor.at("protocol") == "adminive.status");
|
||||
assert(status_descriptor.at("fields").size() == 3);
|
||||
assert(status_descriptor.at("fields").at(0).at("name") == "operating_state");
|
||||
assert(status_descriptor.at("fields").at(0).at("value_type") == "enum");
|
||||
assert(status_descriptor.at("fields").at(0).at("color") == true);
|
||||
const auto first_status = adminive::to_status_json(state.status());
|
||||
const auto second_status = adminive::to_status_json(state.status());
|
||||
assert(first_status.at("operating_state").contains("color"));
|
||||
assert(!first_status.at("operating_state").at("color").get<std::string>().empty());
|
||||
assert(first_status.at("refresh_sequence").at("value") == 1);
|
||||
assert(second_status.at("refresh_sequence").at("value") == 2);
|
||||
const auto status_crud = adminive::to_amis_crud_status_schema<Radio_State>("/admin/radio_states", "/admin/status", &status_descriptor);
|
||||
assert(status_crud.at("body").is_array());
|
||||
assert(status_crud.at("body").at(0).at("type") == "service");
|
||||
assert(status_crud.at("body").at(1).at("columns").size() == 8);
|
||||
const auto& status_column = status_crud.at("body").at(1).at("columns").at(6);
|
||||
assert(status_column.at("label") == "Runtime Status");
|
||||
assert(status_column.at("popOver").at("trigger") == "click");
|
||||
assert(status_column.at("popOver").at("body").at("api").at("url") == "/admin/radio_states/${id}/status");
|
||||
adminive::Http_Collection_Resource<Radio_State> collection_resource("/admin/radio_states", std::vector<Radio_State>{state}, "/admin/status");
|
||||
collection_resource.register_status<&Radio_State::status>(3000);
|
||||
const auto registered_schema = collection_resource.amis_schema();
|
||||
const auto& registered_status_column = registered_schema.at("body").at(1).at("columns").at(6);
|
||||
assert(registered_status_column.at("popOver").at("body").at("interval") == 3000);
|
||||
Radio_Service_Config service_config;
|
||||
const auto service_descriptor = adminive::to_descriptor_json<Radio_Service_Config>();
|
||||
assert(service_descriptor.at("fields").size() == 7);
|
||||
assert(service_descriptor.at("fields").at(0).at("value_type") == "string");
|
||||
assert(service_descriptor.at("fields").at(1).at("value_type") == "enum");
|
||||
assert(service_descriptor.at("fields").at(2).at("value_type") == "integer");
|
||||
assert(service_descriptor.at("fields").at(3).at("value_type") == "number");
|
||||
assert(service_descriptor.at("fields").at(4).at("value_type") == "object");
|
||||
assert(service_descriptor.at("fields").at(4).at("children").size() == 3);
|
||||
assert(service_descriptor.at("fields").at(5).at("visible_on") == "${mode == 'duplex'}");
|
||||
assert(service_descriptor.at("fields").at(6).at("children").at(1).at("widget") == "input-date");
|
||||
assert(service_descriptor.at("fields").at(6).at("children").at(2).at("widget") == "input-color");
|
||||
const auto service_form = adminive::to_amis_form_schema(service_config, "/admin/config/radio/data", "Confirm Changes");
|
||||
assert(service_form.at("body").at(0).at("type") == "input-text");
|
||||
assert(service_form.at("body").at(1).at("type") == "select");
|
||||
assert(service_form.at("body").at(2).at("type") == "input-number");
|
||||
assert(service_form.at("body").at(3).at("type") == "input-number");
|
||||
assert(service_form.at("body").at(4).at("type") == "fieldset");
|
||||
assert(service_form.at("body").at(4).at("body").at(1).at("name") == "primary_endpoint.host");
|
||||
assert(service_form.at("body").at(5).at("visibleOn") == "${mode == 'duplex'}");
|
||||
assert(service_form.at("body").at(6).at("body").at(1).at("type") == "input-date");
|
||||
assert(service_form.at("body").at(6).at("body").at(1).at("valueFormat") == "YYYY-MM-DD");
|
||||
assert(service_form.at("body").at(6).at("body").at(2).at("type") == "input-color");
|
||||
assert(service_form.at("actions").at(1).at("type") == "submit");
|
||||
result = adminive::apply_frontend_patch(service_config, adminive::Json{{"profile_name", "Duplex Profile"}, {"mode", "duplex"}, {"worker_count", 8}, {"receive_gain", 2.5}, {"primary_endpoint", adminive::Json{{"enabled", true}, {"host", "10.0.0.1"}, {"port", 9200}}}, {"backup_endpoint", adminive::Json{{"enabled", true}, {"host", "10.0.0.2"}, {"port", 9201}}}, {"appearance", adminive::Json{{"panel_title", "Duplex Radio"}, {"effective_date", "2026-08-07"}, {"accent_color", "#16a34a"}}}});
|
||||
assert(result.success);
|
||||
assert(service_config.mode == Radio_Mode::duplex);
|
||||
assert(service_config.primary_endpoint.host == "10.0.0.1");
|
||||
assert(service_config.appearance.accent_color == "#16a34a");
|
||||
Alert_Config alert_config;
|
||||
const auto alert_form = adminive::to_amis_form_schema(alert_config, "/admin/config/alerts/data", "Confirm Changes");
|
||||
assert(alert_form.at("body").size() == 8);
|
||||
assert(alert_form.at("body").at(1).at("type") == "input-text");
|
||||
assert(alert_form.at("body").at(2).at("type") == "select");
|
||||
assert(alert_form.at("body").at(3).at("type") == "select");
|
||||
assert(alert_form.at("body").at(4).at("type") == "input-number");
|
||||
assert(alert_form.at("body").at(5).at("type") == "input-date");
|
||||
assert(alert_form.at("body").at(6).at("type") == "input-color");
|
||||
assert(alert_form.at("body").at(7).at("type") == "fieldset");
|
||||
assert(alert_form.at("body").at(7).at("visibleOn") == "${enabled && channel == 'webhook'}");
|
||||
adminive::Http_Resource<Radio_Service_Config> service_resource(service_config, "/admin/config/radio");
|
||||
const auto resource_form = service_resource.amis_schema();
|
||||
assert(resource_form.at("api").at("method") == "post");
|
||||
assert(resource_form.at("api").at("url") == "/admin/config/radio/data");
|
||||
assert(resource_form.at("actions").at(1).at("label") == "Confirm Changes");
|
||||
adminive::example::Server_Status server_status;
|
||||
server_status.server_time = "2026-08-06T00:00:00Z";
|
||||
server_status.poll_sequence = 7;
|
||||
const auto status_json = adminive::to_frontend_json(server_status);
|
||||
assert(status_json.at("service_state") == "running");
|
||||
assert(status_json.at("poll_sequence") == 7);
|
||||
const auto config_root = std::filesystem::temp_directory_path() / "adminive_config_store_test";
|
||||
const auto config_file = config_root / "adminive.json";
|
||||
std::filesystem::remove_all(config_root);
|
||||
{
|
||||
Config_Store store(config_file);
|
||||
assert(std::filesystem::exists(config_file));
|
||||
Radio_Service_Config changed = store.data().radio_service;
|
||||
changed.profile_name = "持久化配置";
|
||||
std::scoped_lock lock(store.mutex());
|
||||
store.persist_radio_service(changed);
|
||||
}
|
||||
{
|
||||
Config_Store store(config_file);
|
||||
assert(store.data().radio_service.profile_name == "持久化配置");
|
||||
Device_Table_Manager manager(store);
|
||||
const auto schema = manager.amis_schema();
|
||||
assert(schema.at("data").at("device_type") == "serial");
|
||||
assert(schema.at("body").at("body").at(0).at("label") == "设备类型");
|
||||
assert(schema.at("body").at("body").at(0).at("options").size() == 2);
|
||||
assert(schema.at("body").at("body").at(2).at("schemaApi").at("url") == "/admin/device_tables/schema?type=${device_type}");
|
||||
}
|
||||
std::filesystem::remove_all(config_root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user