This commit is contained in:
2026-08-08 22:39:18 +08:00
parent d1cff37a2a
commit 464f3a166a
22 changed files with 510 additions and 54 deletions
+47 -3
View File
@@ -6,12 +6,18 @@
#include <utility>
#include <vector>
namespace drogon_test {
struct Config {
std::string name{"default"};
};
struct Status {
std::string user;
};
struct Config {
std::string name{"default"};
Status status() {
if(name == "status-error") {
throw std::runtime_error("item status failed");
}
return Status{name};
}
};
}
namespace adminive {
template <>
@@ -76,6 +82,27 @@ int main() {
});
ADMINIVE_CHECK(response->status == drogon::k200OK);
ADMINIVE_CHECK(Json::parse(response->body).at("data").at("kind") == "form");
adminive::Drogon_Bind_Options nonstd_options = options;
nonstd_options.context_factory = [](const drogon::HttpRequestPtr&) -> adminive::Request_Context {
throw 7;
};
adminive::Drogon_Resource<drogon_test::Config, Json> nonstd_resource(config, "/context-error");
nonstd_resource.bind(app, nonstd_options);
adminive::Drogon_Status_Resource<drogon_test::Status, Json> nonstd_status("/status-context-error", [](const adminive::Request_Context&) {
return drogon_test::Status{};
});
nonstd_status.bind(app, nonstd_options);
response.reset();
app.handle("/context-error/data", drogon::Post, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(response->status == drogon::k500InternalServerError);
response.reset();
app.handle("/status-context-error/data", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(response->status == drogon::k500InternalServerError);
ADMINIVE_CHECK(tasks.empty());
request->body = R"({"name":"updated"})";
request->user = "wyc";
response.reset();
@@ -114,6 +141,7 @@ int main() {
});
ADMINIVE_CHECK(response->status == drogon::k200OK);
adminive::Drogon_Collection_Resource<drogon_test::Config, Json> collection("/configs", {drogon_test::Config{"first"}});
collection.register_status<&drogon_test::Config::status>(25);
collection.bind(app, options);
response.reset();
app.handle("/configs/view", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
@@ -174,6 +202,22 @@ int main() {
tasks.erase(tasks.begin());
ADMINIVE_CHECK(response->status == drogon::k200OK);
ADMINIVE_CHECK(Json::parse(response->body).at("data").at("name") == "changed");
request->body = R"({"name":"status-error"})";
response.reset();
app.handle("/configs/2", drogon::Patch, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
tasks.front()();
tasks.erase(tasks.begin());
ADMINIVE_CHECK(response->status == drogon::k200OK);
response.reset();
app.handle("/configs/2/status", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(!response);
tasks.front()();
tasks.erase(tasks.begin());
ADMINIVE_CHECK(response->status == drogon::k500InternalServerError);
response.reset();
app.handle("/configs/1", drogon::Delete, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;