testing_api_cmd_post_categories.c (6373B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2025 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file src/testing/testing_api_cmd_post_categories.c 18 * @brief command to test POST /private/categories 19 * @author Bohdan Potuzhnyi 20 */ 21 #include "platform.h" 22 struct PostCategoriesState; 23 #define TALER_MERCHANT_POST_PRIVATE_CATEGORIES_RESULT_CLOSURE struct PostCategoriesState 24 #include <jansson.h> 25 #include <microhttpd.h> 26 #include <taler/taler_testing_lib.h> 27 #include "taler/taler_merchant_service.h" 28 #include "taler/taler_merchant_testing_lib.h" 29 #include <taler/merchant/post-private-categories.h> 30 31 /** 32 * State of a "POST /private/categories" CMD. 33 */ 34 struct PostCategoriesState 35 { 36 /** 37 * Handle for a "POST /private/categories" request. 38 */ 39 struct TALER_MERCHANT_PostPrivateCategoriesHandle *cph; 40 41 /** 42 * The interpreter state. 43 */ 44 struct TALER_TESTING_Interpreter *is; 45 46 /** 47 * Base URL of the merchant serving the request. 48 */ 49 const char *merchant_url; 50 51 /** 52 * Category name. 53 */ 54 const char *name; 55 56 /** 57 * Category name translations. 58 */ 59 json_t *name_i18n; 60 61 /** 62 * Expected HTTP response code. 63 */ 64 unsigned int http_status; 65 66 /** 67 * Expected category id (0 to ignore). 68 */ 69 uint64_t expected_category_id; 70 71 /** 72 * Category id returned by the backend. 73 */ 74 uint64_t category_id; 75 }; 76 77 /** 78 * Callback for POST /private/categories. 79 * 80 * @param cls closure 81 * @param cpr response details 82 */ 83 static void 84 post_categories_cb (struct PostCategoriesState *pcs, 85 const struct TALER_MERCHANT_PostPrivateCategoriesResponse * 86 cpr) 87 { 88 89 pcs->cph = NULL; 90 if (pcs->http_status != cpr->hr.http_status) 91 { 92 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 93 "Unexpected response code %u (%d) to command %s\n", 94 cpr->hr.http_status, 95 (int) cpr->hr.ec, 96 TALER_TESTING_interpreter_get_current_label (pcs->is)); 97 TALER_TESTING_interpreter_fail (pcs->is); 98 return; 99 } 100 if (MHD_HTTP_OK == cpr->hr.http_status) 101 { 102 pcs->category_id = cpr->details.ok.category_id; 103 if ( (0 != pcs->expected_category_id) && 104 (pcs->expected_category_id != pcs->category_id) ) 105 { 106 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 107 "Unexpected category_id %lu (expected %lu)\n", 108 pcs->category_id, 109 pcs->expected_category_id); 110 TALER_TESTING_interpreter_fail (pcs->is); 111 return; 112 } 113 } 114 TALER_TESTING_interpreter_next (pcs->is); 115 } 116 117 118 /** 119 * Run the "POST /private/categories" CMD. 120 * 121 * @param cls closure. 122 * @param cmd command being run now. 123 * @param is interpreter state. 124 */ 125 static void 126 post_categories_run (void *cls, 127 const struct TALER_TESTING_Command *cmd, 128 struct TALER_TESTING_Interpreter *is) 129 { 130 struct PostCategoriesState *pcs = cls; 131 132 pcs->is = is; 133 pcs->cph = TALER_MERCHANT_post_private_categories_create ( 134 TALER_TESTING_interpreter_get_context (is), 135 pcs->merchant_url, 136 pcs->name); 137 if (NULL != pcs->name_i18n) 138 { 139 TALER_MERCHANT_post_private_categories_set_options ( 140 pcs->cph, 141 TALER_MERCHANT_post_private_categories_option_name_i18n ( 142 pcs->name_i18n)); 143 } 144 { 145 enum TALER_ErrorCode ec; 146 147 ec = TALER_MERCHANT_post_private_categories_start (pcs->cph, 148 &post_categories_cb, 149 pcs); 150 GNUNET_assert (TALER_EC_NONE == ec); 151 } 152 } 153 154 155 /** 156 * Offer internal data to other commands. 157 * 158 * @param cls closure 159 * @param[out] ret result 160 * @param trait name of the trait 161 * @param index index number of the object to extract. 162 * @return #GNUNET_OK on success 163 */ 164 static enum GNUNET_GenericReturnValue 165 post_categories_traits (void *cls, 166 const void **ret, 167 const char *trait, 168 unsigned int index) 169 { 170 struct PostCategoriesState *pcs = cls; 171 struct TALER_TESTING_Trait traits[] = { 172 TALER_TESTING_make_trait_category_id (&pcs->category_id), 173 TALER_TESTING_trait_end () 174 }; 175 176 return TALER_TESTING_get_trait (traits, 177 ret, 178 trait, 179 index); 180 } 181 182 183 /** 184 * Free the state of a "POST /private/categories" CMD, and possibly 185 * cancel a pending operation thereof. 186 * 187 * @param cls closure. 188 * @param cmd command being run. 189 */ 190 static void 191 post_categories_cleanup (void *cls, 192 const struct TALER_TESTING_Command *cmd) 193 { 194 struct PostCategoriesState *pcs = cls; 195 196 if (NULL != pcs->cph) 197 { 198 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 199 "POST /private/categories operation did not complete\n"); 200 TALER_MERCHANT_post_private_categories_cancel (pcs->cph); 201 } 202 json_decref (pcs->name_i18n); 203 GNUNET_free (pcs); 204 } 205 206 207 struct TALER_TESTING_Command 208 TALER_TESTING_cmd_merchant_post_categories ( 209 const char *label, 210 const char *merchant_url, 211 const char *name, 212 json_t *name_i18n, 213 uint64_t expected_category_id, 214 unsigned int http_status) 215 { 216 struct PostCategoriesState *pcs; 217 218 GNUNET_assert ((NULL == name_i18n) || 219 json_is_object (name_i18n)); 220 pcs = GNUNET_new (struct PostCategoriesState); 221 pcs->merchant_url = merchant_url; 222 pcs->name = name; 223 pcs->name_i18n = name_i18n; /* ownership taken */ 224 pcs->http_status = http_status; 225 pcs->expected_category_id = expected_category_id; 226 { 227 struct TALER_TESTING_Command cmd = { 228 .cls = pcs, 229 .label = label, 230 .run = &post_categories_run, 231 .cleanup = &post_categories_cleanup, 232 .traits = &post_categories_traits 233 }; 234 235 return cmd; 236 } 237 } 238 239 240 /* end of testing_api_cmd_post_categories.c */