添加AGENTS SKILL
This commit is contained in:
@@ -129,6 +129,25 @@ int main() {
|
||||
});
|
||||
ADMINIVE_CHECK(response->status == drogon::k200OK);
|
||||
ADMINIVE_CHECK(Json::parse(response->body).at("data").at("total") == 1);
|
||||
request->parameters = {{"unknown", "value"}};
|
||||
response.reset();
|
||||
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
|
||||
response = value;
|
||||
});
|
||||
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
|
||||
request->parameters = {{"orderBy", "unknown"}, {"orderDir", "asc"}};
|
||||
response.reset();
|
||||
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
|
||||
response = value;
|
||||
});
|
||||
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
|
||||
request->parameters = {{"orderBy", "name"}, {"orderDir", "sideways"}};
|
||||
response.reset();
|
||||
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
|
||||
response = value;
|
||||
});
|
||||
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
|
||||
request->parameters.clear();
|
||||
response.reset();
|
||||
app.handle("/configs/1", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
|
||||
response = value;
|
||||
|
||||
@@ -72,6 +72,9 @@ public:
|
||||
std::string_view getBody() const noexcept {
|
||||
return body;
|
||||
}
|
||||
const std::map<std::string, std::string>& getParameters() const noexcept {
|
||||
return parameters;
|
||||
}
|
||||
const std::string& getParameter(const std::string& name) const {
|
||||
const auto iterator = parameters.find(name);
|
||||
return iterator == parameters.end() ? empty_parameter_ : iterator->second;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "adminive/adapters/httplib.hpp"
|
||||
#include "adminive_test.hpp"
|
||||
#include <atomic>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
@@ -14,6 +15,9 @@ struct Config {
|
||||
struct Item_Status {
|
||||
std::string state{"ready"};
|
||||
};
|
||||
struct Overview_Status {
|
||||
std::string user;
|
||||
};
|
||||
struct Row {
|
||||
std::string name;
|
||||
bool enabled{true};
|
||||
@@ -39,6 +43,13 @@ struct Type_Descriptor<httplib_adapter_test::Item_Status> {
|
||||
}
|
||||
};
|
||||
template <>
|
||||
struct Type_Descriptor<httplib_adapter_test::Overview_Status> {
|
||||
static auto get() {
|
||||
using T = httplib_adapter_test::Overview_Status;
|
||||
return object<T>("httplib_overview_status", ADMINIVE_FIELD(T, user));
|
||||
}
|
||||
};
|
||||
template <>
|
||||
struct Type_Descriptor<httplib_adapter_test::Row> {
|
||||
static auto get() {
|
||||
using T = httplib_adapter_test::Row;
|
||||
@@ -77,17 +88,30 @@ int main() {
|
||||
committed_remote = context.remote_address;
|
||||
};
|
||||
adminive::Http_Resource<Config, Json> resource(config, "/config", transaction);
|
||||
adminive::Http_Status_Resource<Overview_Status, Json> status("/status", [](const adminive::Request_Context& context) {
|
||||
if(context.user == "status-error") {
|
||||
throw std::runtime_error("status failed");
|
||||
}
|
||||
return Overview_Status{context.user};
|
||||
}, 25);
|
||||
adminive::Http_Collection_Resource<Row, Json> collection("/rows", {Row{"alpha", true, 70}, Row{"beta", false, 90}, Row{"gamma", true, 50}});
|
||||
collection.register_status<&Row::status>(25);
|
||||
httplib::Server server;
|
||||
resource.bind(server, adminive::Httplib_Bind_Options{[](const httplib::Request& request) {
|
||||
adminive::Httplib_Bind_Options options;
|
||||
options.context_factory = [](const httplib::Request& request) {
|
||||
const std::string user = request.get_header_value("X-User");
|
||||
if(user == "context-error") {
|
||||
throw std::runtime_error("context failed");
|
||||
}
|
||||
adminive::Request_Context context;
|
||||
context.user = request.get_header_value("X-User");
|
||||
context.user = user;
|
||||
context.request_id = request.get_header_value("X-Request-Id");
|
||||
context.remote_address = request.remote_addr;
|
||||
context.attributes.emplace("transport", "httplib");
|
||||
return context;
|
||||
}});
|
||||
};
|
||||
resource.bind(server, options);
|
||||
status.bind(server, options);
|
||||
collection.bind(server);
|
||||
const int port = server.bind_to_any_port("127.0.0.1");
|
||||
ADMINIVE_CHECK(port > 0);
|
||||
@@ -107,6 +131,15 @@ int main() {
|
||||
ADMINIVE_CHECK(committed_user == "alice");
|
||||
ADMINIVE_CHECK(committed_request_id == "request-42");
|
||||
ADMINIVE_CHECK(committed_remote == "127.0.0.1");
|
||||
httplib::Headers context_error_headers{{"X-User", "context-error"}};
|
||||
check_status(client.Post("/config/data", context_error_headers, R"({"name":"not-applied"})", "application/json"), 500);
|
||||
ADMINIVE_CHECK(config.name == "updated");
|
||||
check_status(client.Get("/status/descriptor"), 200);
|
||||
check_status(client.Get("/status/amis"), 200);
|
||||
ADMINIVE_CHECK(body_json(client.Get("/status/data", headers)).at("data").at("user").at("value") == "alice");
|
||||
httplib::Headers status_error_headers{{"X-User", "status-error"}};
|
||||
check_status(client.Get("/status/data", status_error_headers), 500);
|
||||
check_status(client.Get("/status/data", context_error_headers), 500);
|
||||
ADMINIVE_CHECK(body_json(client.Get("/rows/descriptor")).at("data").at("name") == "httplib_row");
|
||||
ADMINIVE_CHECK(body_json(client.Get("/rows/view")).at("data").at("kind") == "table");
|
||||
ADMINIVE_CHECK(body_json(client.Get("/rows?perPage=2&page=1&orderBy=score&orderDir=desc")).at("data").at("items").at(0).at("name") == "beta");
|
||||
|
||||
Reference in New Issue
Block a user