aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-20 09:35:06 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-20 09:35:41 +0200
commitcc0bf3467b33c32922ec78eb0cf4fffbd90483c2 (patch)
treeac52b8ca3d6680fefeac39b9fea55b7d49898069 /tests
parentb6aeaa8995ae81562a4bf11937959b09027116ff (diff)
downloadbokf-cc0bf3467b33c32922ec78eb0cf4fffbd90483c2.tar.gz
bokf-cc0bf3467b33c32922ec78eb0cf4fffbd90483c2.zip
commands: declarative argument schemas with dispatch validation
Diffstat (limited to 'tests')
-rw-r--r--tests/test_core.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/test_core.c b/tests/test_core.c
index 885523c..a8d8b54 100644
--- a/tests/test_core.c
+++ b/tests/test_core.c
@@ -150,6 +150,32 @@ static int64_t vat_box(yyjson_doc *d, const char *box)
return find_amount(d, "result.boxes", "box", box, "amount_ore");
}
+static yyjson_val *find_arg(yyjson_doc *d, const char *name)
+{
+ yyjson_val *arr = jget(d, "result.command.args");
+ size_t n = arr && yyjson_is_arr(arr) ? yyjson_arr_size(arr) : 0;
+ for (size_t i = 0; i < n; i++) {
+ yyjson_val *o = yyjson_arr_get(arr, i);
+ yyjson_val *nv = o ? yyjson_obj_get(o, "name") : NULL;
+ if (nv && yyjson_is_str(nv) &&
+ strcmp(yyjson_get_str(nv), name) == 0)
+ return o;
+ }
+ return NULL;
+}
+
+static int arg_field_is(yyjson_val *arg, const char *field, const char *expect)
+{
+ yyjson_val *v = arg ? yyjson_obj_get(arg, field) : NULL;
+ return v && yyjson_is_str(v) && strcmp(yyjson_get_str(v), expect) == 0;
+}
+
+static int arg_required(yyjson_val *arg)
+{
+ yyjson_val *v = arg ? yyjson_obj_get(arg, "required") : NULL;
+ return v && yyjson_is_bool(v) && yyjson_get_bool(v);
+}
+
static yyjson_doc *call_sie_import(const char *session, int64_t org,
const char *b64, int dry)
{
@@ -705,6 +731,48 @@ int main(void)
CHECK_STR(d, "result.command.name", "session.open");
yyjson_doc_free(d);
+ d = call(reqf("{\"v\":1,\"id\":\"30a\",\"cmd\":\"describe\","
+ "\"session\":\"%s\",\"args\":{\"cmd\":\"voucher.post\"}}",
+ g_session));
+ CHECK_OK(d);
+ CHECK_STR(d, "result.command.name", "voucher.post");
+ CHECK(arg_required(find_arg(d, "date")));
+ CHECK(arg_field_is(find_arg(d, "date"), "type", "date"));
+ CHECK(arg_field_is(find_arg(d, "rows"), "type", "json"));
+ yyjson_doc_free(d);
+
+ d = call(reqf("{\"v\":1,\"id\":\"30b\",\"cmd\":\"describe\","
+ "\"session\":\"%s\",\"args\":{\"cmd\":\"account.create\"}}",
+ g_session));
+ CHECK_OK(d);
+ CHECK_STR(d, "result.command.name", "account.create");
+ CHECK(arg_required(find_arg(d, "number")));
+ CHECK(arg_field_is(find_arg(d, "number"), "type", "string"));
+ yyjson_doc_free(d);
+
+ d = call(reqf("{\"v\":1,\"id\":\"30c\",\"cmd\":\"voucher.post\","
+ "\"session\":\"%s\",\"org\":%d,\"args\":"
+ "{\"description\":\"Saknar datum\",\"rows\":["
+ "{\"account\":\"1930\",\"debit_ore\":100},"
+ "{\"account\":\"3001\",\"credit_ore\":100}]}}",
+ g_session, (int)org_id));
+ CHECK_STR(d, "error.code", "INVALID_ARGS");
+ yyjson_doc_free(d);
+
+ d = call(reqf("{\"v\":1,\"id\":\"30d\",\"cmd\":\"account.create\","
+ "\"session\":\"%s\",\"org\":%d,\"args\":{\"number\":1930,"
+ "\"name\":\"Fel typ\",\"type\":\"expense\"}}",
+ g_session, (int)org_id));
+ CHECK_STR(d, "error.code", "INVALID_ARGS");
+ yyjson_doc_free(d);
+
+ d = call(reqf("{\"v\":1,\"id\":\"30e\",\"cmd\":\"org.member_set_role\","
+ "\"session\":\"%s\",\"org\":%d,\"args\":"
+ "{\"username\":\"admin\",\"role\":\"king\"}}",
+ g_session, (int)org_id));
+ CHECK_STR(d, "error.code", "INVALID_ARGS");
+ yyjson_doc_free(d);
+
d = call(reqf("{\"v\":1,\"id\":\"31\",\"cmd\":\"agent.instructions\","
"\"session\":\"%s\"}",
g_session));