Mercurial
comparison connectors/tests/route_test.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 278:8d560f50ed4c | 279:b3b547563ec7 |
|---|---|
| 1 #include "connectors/connector.h" | |
| 2 | |
| 3 #include <assert.h> | |
| 4 #include <stdio.h> | |
| 5 #include <string.h> | |
| 6 | |
| 7 static const char *value(Seobeo_Request_Entry *map, const char *key) | |
| 8 { | |
| 9 Seobeo_Request_Entry *entry = Dowa_HashMap_Get_Ptr(map, (char *)key); | |
| 10 return entry ? entry->value : NULL; | |
| 11 } | |
| 12 | |
| 13 typedef struct { | |
| 14 boolean required_csrf; | |
| 15 } Test_Auth_Context; | |
| 16 | |
| 17 static const char *test_only_auth( | |
| 18 Seobeo_Request_Entry *request, boolean require_csrf, | |
| 19 Dowa_Arena *arena, void *opaque) | |
| 20 { | |
| 21 (void)request; | |
| 22 (void)arena; | |
| 23 Test_Auth_Context *context = opaque; | |
| 24 context->required_csrf = require_csrf; | |
| 25 return NULL; | |
| 26 } | |
| 27 | |
| 28 int main(void) | |
| 29 { | |
| 30 Dowa_Arena *arena = Dowa_Arena_Create(64 * 1024); | |
| 31 Test_Auth_Context auth_context = {0}; | |
| 32 Connector_Auth_Adapter test_adapter = { | |
| 33 .resolve_user = test_only_auth, | |
| 34 .context = &auth_context | |
| 35 }; | |
| 36 Connector_Service_Configure(NULL, NULL, test_adapter); | |
| 37 Seobeo_Router_Init(); | |
| 38 Connector_Service_Register_Routes(); | |
| 39 | |
| 40 Seobeo_Request_Entry *request = NULL; | |
| 41 Seobeo_Route_Handler health = Seobeo_Router_Find_Handler( | |
| 42 "GET", "/health", &request, arena); | |
| 43 assert(health); | |
| 44 Seobeo_Request_Entry *response = health(request, arena); | |
| 45 assert(!strcmp(value(response, "status"), "200")); | |
| 46 | |
| 47 request = NULL; | |
| 48 Seobeo_Route_Handler auth_page = Seobeo_Router_Find_Handler( | |
| 49 "GET", "/auth-test.html", &request, arena); | |
| 50 assert(auth_page); | |
| 51 response = auth_page(request, arena); | |
| 52 assert(!strcmp(value(response, "status"), "200")); | |
| 53 assert(strstr(value(response, "content-type"), "text/html")); | |
| 54 assert(strstr(value(response, "body"), "Check Zenbu session")); | |
| 55 | |
| 56 request = NULL; | |
| 57 Seobeo_Route_Handler ai_tools = Seobeo_Router_Find_Handler( | |
| 58 "GET", "/v1/ai/tools", &request, arena); | |
| 59 assert(ai_tools); | |
| 60 response = ai_tools(request, arena); | |
| 61 assert(!strcmp(value(response, "status"), "200")); | |
| 62 assert(strstr(value(response, "body"), "connector.gmail.get")); | |
| 63 | |
| 64 request = NULL; | |
| 65 Seobeo_Route_Handler oauth_start = Seobeo_Router_Find_Handler( | |
| 66 "POST", "/v1/oauth/google/start", &request, arena); | |
| 67 assert(oauth_start); | |
| 68 response = oauth_start(request, arena); | |
| 69 assert(!strcmp(value(response, "status"), "401")); | |
| 70 assert(auth_context.required_csrf); | |
| 71 request = NULL; | |
| 72 assert(!Seobeo_Router_Find_Handler( | |
| 73 "GET", "/v1/oauth/google/start", &request, arena)); | |
| 74 | |
| 75 request = NULL; | |
| 76 Seobeo_Route_Handler auth_session = Seobeo_Router_Find_Handler( | |
| 77 "GET", "/v1/auth/session", &request, arena); | |
| 78 assert(auth_session); | |
| 79 response = auth_session(request, arena); | |
| 80 assert(!strcmp(value(response, "status"), "401")); | |
| 81 assert(strstr(value(response, "body"), "\"authenticated\":false")); | |
| 82 | |
| 83 request = NULL; | |
| 84 Seobeo_Route_Handler rejected = Seobeo_Router_Find_Handler( | |
| 85 "DELETE", "/v1/accounts/google:one/drive/files/file-1", | |
| 86 &request, arena); | |
| 87 assert(rejected); | |
| 88 response = rejected(request, arena); | |
| 89 assert(!strcmp(value(response, "status"), "403")); | |
| 90 assert(strstr(value(response, "body"), "operation_not_allowed")); | |
| 91 | |
| 92 request = NULL; | |
| 93 Seobeo_Route_Handler confirmation = Seobeo_Router_Find_Handler( | |
| 94 "POST", "/v1/confirmations", &request, arena); | |
| 95 assert(confirmation); | |
| 96 response = confirmation(request, arena); | |
| 97 assert(!strcmp(value(response, "status"), "401")); | |
| 98 assert(auth_context.required_csrf); | |
| 99 | |
| 100 request = NULL; | |
| 101 Seobeo_Route_Handler get_policy = Seobeo_Router_Find_Handler( | |
| 102 "GET", "/v1/settings/confirmations/gmail.send", &request, arena); | |
| 103 assert(get_policy); | |
| 104 response = get_policy(request, arena); | |
| 105 assert(!strcmp(value(response, "status"), "401")); | |
| 106 assert(!auth_context.required_csrf); | |
| 107 | |
| 108 request = NULL; | |
| 109 Seobeo_Route_Handler set_policy = Seobeo_Router_Find_Handler( | |
| 110 "PUT", "/v1/settings/confirmations/gmail.send", &request, arena); | |
| 111 assert(set_policy); | |
| 112 response = set_policy(request, arena); | |
| 113 assert(!strcmp(value(response, "status"), "401")); | |
| 114 assert(auth_context.required_csrf); | |
| 115 | |
| 116 request = NULL; | |
| 117 Seobeo_Route_Handler drive_list = Seobeo_Router_Find_Handler( | |
| 118 "GET", "/v1/accounts/google:one/drive/files", &request, arena); | |
| 119 assert(drive_list); | |
| 120 response = drive_list(request, arena); | |
| 121 assert(!strcmp(value(response, "status"), "401")); | |
| 122 assert(!auth_context.required_csrf); | |
| 123 | |
| 124 request = NULL; | |
| 125 assert(Seobeo_Router_Find_Handler( | |
| 126 "POST", "/v1/accounts/google:one/gmail/send", &request, arena)); | |
| 127 request = NULL; | |
| 128 assert(Seobeo_Router_Find_Handler( | |
| 129 "GET", | |
| 130 "/v1/accounts/google:one/gmail/messages/msg/attachments/attachment", | |
| 131 &request, arena)); | |
| 132 request = NULL; | |
| 133 assert(!Seobeo_Router_Find_Handler( | |
| 134 "POST", "/v1/accounts/google:one/gmail/messages/msg/labels", | |
| 135 &request, arena)); | |
| 136 | |
| 137 Seobeo_Router_Destroy(); | |
| 138 Dowa_Arena_Free(arena); | |
| 139 printf("route_test: ok\n"); | |
| 140 return 0; | |
| 141 } |