testing_api_cmd_patch_webhook.c (6266B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2022 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as 7 published by the Free Software Foundation; either version 3, or 8 (at your option) any later version. 9 10 TALER is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public 16 License along with TALER; see the file COPYING. If not, see 17 <http://www.gnu.org/licenses/> 18 */ 19 /** 20 * @file testing_api_cmd_patch_webhook.c 21 * @brief command to test PATCH /webhook 22 * @author Priscilla HUANG 23 */ 24 #include "platform.h" 25 #include <taler/taler_exchange_service.h> 26 #include <taler/taler_testing_lib.h> 27 #include "taler_merchant_service.h" 28 #include "taler_merchant_testing_lib.h" 29 30 31 /** 32 * State of a "PATCH /webhook" CMD. 33 */ 34 struct PatchWebhookState 35 { 36 37 /** 38 * Handle for a "GET webhook" request. 39 */ 40 struct TALER_MERCHANT_WebhookPatchHandle *iph; 41 42 /** 43 * The interpreter state. 44 */ 45 struct TALER_TESTING_Interpreter *is; 46 47 /** 48 * Base URL of the merchant serving the request. 49 */ 50 const char *merchant_url; 51 52 /** 53 * ID of the webhook to run GET for. 54 */ 55 const char *webhook_id; 56 57 /** 58 * event of the webhook 59 */ 60 const char *event_type; 61 62 /** 63 * url use by the customer 64 */ 65 const char *url; 66 67 /** 68 * http_method use by the merchant 69 */ 70 const char *http_method; 71 72 /** 73 * header of the webhook 74 */ 75 const char *header_template; 76 77 /** 78 * body_template of the webhook 79 */ 80 const char *body_template; 81 82 /** 83 * Expected HTTP response code. 84 */ 85 unsigned int http_status; 86 87 }; 88 89 90 /** 91 * Callback for a PATCH /webhooks/$ID operation. 92 * 93 * @param cls closure for this function 94 * @param hr response being processed 95 */ 96 static void 97 patch_webhook_cb (void *cls, 98 const struct TALER_MERCHANT_HttpResponse *hr) 99 { 100 struct PatchWebhookState *pis = cls; 101 102 pis->iph = NULL; 103 if (pis->http_status != hr->http_status) 104 { 105 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 106 "Unexpected response code %u (%d) to command %s\n", 107 hr->http_status, 108 (int) hr->ec, 109 TALER_TESTING_interpreter_get_current_label (pis->is)); 110 TALER_TESTING_interpreter_fail (pis->is); 111 return; 112 } 113 switch (hr->http_status) 114 { 115 case MHD_HTTP_NO_CONTENT: 116 break; 117 case MHD_HTTP_UNAUTHORIZED: 118 break; 119 case MHD_HTTP_FORBIDDEN: 120 break; 121 case MHD_HTTP_NOT_FOUND: 122 break; 123 case MHD_HTTP_CONFLICT: 124 break; 125 default: 126 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 127 "Unhandled HTTP status %u for PATCH /webhooks/ID.\n", 128 hr->http_status); 129 } 130 TALER_TESTING_interpreter_next (pis->is); 131 } 132 133 134 /** 135 * Run the "PATCH /webhooks/$ID" CMD. 136 * 137 * 138 * @param cls closure. 139 * @param cmd command being run now. 140 * @param is interpreter state. 141 */ 142 static void 143 patch_webhook_run (void *cls, 144 const struct TALER_TESTING_Command *cmd, 145 struct TALER_TESTING_Interpreter *is) 146 { 147 struct PatchWebhookState *pis = cls; 148 149 pis->is = is; 150 pis->iph = TALER_MERCHANT_webhook_patch ( 151 TALER_TESTING_interpreter_get_context (is), 152 pis->merchant_url, 153 pis->webhook_id, 154 pis->event_type, 155 pis->url, 156 pis->http_method, 157 pis->header_template, 158 pis->body_template, 159 &patch_webhook_cb, 160 pis); 161 GNUNET_assert (NULL != pis->iph); 162 } 163 164 165 /** 166 * Offers information from the PATCH /webhooks CMD state to other 167 * commands. 168 * 169 * @param cls closure 170 * @param[out] ret result (could be anything) 171 * @param trait name of the trait 172 * @param index index number of the object to extract. 173 * @return #GNUNET_OK on success 174 */ 175 static enum GNUNET_GenericReturnValue 176 patch_webhook_traits (void *cls, 177 const void **ret, 178 const char *trait, 179 unsigned int index) 180 { 181 struct PatchWebhookState *pws = cls; 182 struct TALER_TESTING_Trait traits[] = { 183 TALER_TESTING_make_trait_event_type (pws->event_type), 184 TALER_TESTING_make_trait_url (pws->url), 185 TALER_TESTING_make_trait_http_method (pws->http_method), 186 TALER_TESTING_make_trait_header_template (pws->header_template), 187 TALER_TESTING_make_trait_body_template (pws->body_template), 188 TALER_TESTING_make_trait_webhook_id (pws->webhook_id), 189 TALER_TESTING_trait_end (), 190 }; 191 192 return TALER_TESTING_get_trait (traits, 193 ret, 194 trait, 195 index); 196 } 197 198 199 /** 200 * Free the state of a "GET webhook" CMD, and possibly 201 * cancel a pending operation thereof. 202 * 203 * @param cls closure. 204 * @param cmd command being run. 205 */ 206 static void 207 patch_webhook_cleanup (void *cls, 208 const struct TALER_TESTING_Command *cmd) 209 { 210 struct PatchWebhookState *pis = cls; 211 212 if (NULL != pis->iph) 213 { 214 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 215 "PATCH /webhooks/$ID operation did not complete\n"); 216 TALER_MERCHANT_webhook_patch_cancel (pis->iph); 217 } 218 GNUNET_free (pis); 219 } 220 221 222 struct TALER_TESTING_Command 223 TALER_TESTING_cmd_merchant_patch_webhook ( 224 const char *label, 225 const char *merchant_url, 226 const char *webhook_id, 227 const char *event_type, 228 const char *url, 229 const char *http_method, 230 const char *header_template, 231 const char *body_template, 232 unsigned int http_status) 233 { 234 struct PatchWebhookState *pis; 235 236 pis = GNUNET_new (struct PatchWebhookState); 237 pis->merchant_url = merchant_url; 238 pis->webhook_id = webhook_id; 239 pis->http_status = http_status; 240 pis->event_type = event_type; 241 pis->url = url; 242 pis->http_method = http_method; 243 pis->header_template = (NULL == header_template) ? NULL : header_template; 244 pis->body_template = (NULL == body_template) ? NULL : body_template; 245 { 246 struct TALER_TESTING_Command cmd = { 247 .cls = pis, 248 .label = label, 249 .run = &patch_webhook_run, 250 .cleanup = &patch_webhook_cleanup, 251 .traits = &patch_webhook_traits 252 }; 253 254 return cmd; 255 } 256 } 257 258 259 /* end of testing_api_cmd_patch_webhook.c */