diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-05-18 21:05:19 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-05-18 21:05:19 +0200 |
commit | 83afcc2e6ab7e4be1b62614445087e4df22b83f7 (patch) | |
tree | 09535025454cd79471ee5ce1cdb59b524eb614e9 /src | |
parent | 031e2fed3aae424bc47f6634fa52415729c75ed3 (diff) |
implement delete transfer cmd
Diffstat (limited to 'src')
-rw-r--r-- | src/include/taler_merchant_testing_lib.h | 31 | ||||
-rw-r--r-- | src/testing/Makefile.am | 1 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_delete_transfer.c | 202 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_get_transfers.c | 3 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_post_transfers.c | 19 |
5 files changed, 256 insertions, 0 deletions
diff --git a/src/include/taler_merchant_testing_lib.h b/src/include/taler_merchant_testing_lib.h index bfc407cb..51dbb856 100644 --- a/src/include/taler_merchant_testing_lib.h +++ b/src/include/taler_merchant_testing_lib.h @@ -997,6 +997,19 @@ TALER_TESTING_cmd_merchant_post_transfer ( /** + * We have discovered the @a serial for a POST transfer + * command. Store it (for the bank row trait). + * + * @param cmd command to update + * @param serial serial number to store (identifies the row) + */ +void +TALER_TESTING_cmd_merchant_post_transfer_set_serial ( + struct TALER_TESTING_Command *cmd, + uint64_t serial); + + +/** * Define a GET /transfers CMD. * * @param label command label. @@ -1017,6 +1030,24 @@ TALER_TESTING_cmd_merchant_get_transfers (const char *label, ...); +/** + * Define a "DELETE transfer" CMD. + * + * @param label command label. + * @param merchant_url base URL of the merchant for the + * DELETE /transfers/$ID request. + * @param transfer_ref reference to a command that + * yields the transfer ID to delete + * @param http_status expected HTTP response code. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_merchant_delete_transfer (const char *label, + const char *merchant_url, + const char *transfer_ref, + unsigned int http_status); + + /* ******************* /reserves *************** */ diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am index b2ec0860..d4e41bd2 100644 --- a/src/testing/Makefile.am +++ b/src/testing/Makefile.am @@ -37,6 +37,7 @@ libtalermerchanttesting_la_SOURCES = \ testing_api_cmd_delete_order.c \ testing_api_cmd_delete_product.c \ testing_api_cmd_delete_reserve.c \ + testing_api_cmd_delete_transfer.c \ testing_api_cmd_forget_order.c \ testing_api_cmd_lock_product.c \ testing_api_cmd_instance_auth.c \ diff --git a/src/testing/testing_api_cmd_delete_transfer.c b/src/testing/testing_api_cmd_delete_transfer.c new file mode 100644 index 00000000..6ccef365 --- /dev/null +++ b/src/testing/testing_api_cmd_delete_transfer.c @@ -0,0 +1,202 @@ +/* + This file is part of TALER + Copyright (C) 2021 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, or + (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with TALER; see the file COPYING. If not, see + <http://www.gnu.org/licenses/> +*/ +/** + * @file testing_api_cmd_delete_transfer.c + * @brief command to test DELETE /transfers/$TRANSFER_ID + * @author Jonathan Buchanan + */ +#include "platform.h" +#include <taler/taler_exchange_service.h> +#include <taler/taler_testing_lib.h> +#include "taler_merchant_service.h" +#include "taler_merchant_testing_lib.h" + + +/** + * State of a "DELETE /transfer/$TRANSFER_ID" CMD. + */ +struct DeleteTransferState +{ + + /** + * Handle for a "DELETE transfer" request. + */ + struct TALER_MERCHANT_TransferDeleteHandle *tdh; + + /** + * The interpreter state. + */ + struct TALER_TESTING_Interpreter *is; + + /** + * Base URL of the merchant serving the request. + */ + const char *merchant_url; + + /** + * Ref to cmd with ID of the transfer to run DELETE for. + */ + const char *transfer_ref; + + /** + * Expected HTTP response code. + */ + unsigned int http_status; + +}; + + +/** + * Callback for a DELETE /transfers/$ID operation. + * + * @param cls closure for this function + * @param hr response being processed + */ +static void +delete_transfer_cb (void *cls, + const struct TALER_MERCHANT_HttpResponse *hr) +{ + struct DeleteTransferState *dts = cls; + + dts->tdh = NULL; + if (dts->http_status != hr->http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u (%d) to command %s\n", + hr->http_status, + (int) hr->ec, + TALER_TESTING_interpreter_get_current_label (dts->is)); + TALER_TESTING_interpreter_fail (dts->is); + return; + } + switch (hr->http_status) + { + case MHD_HTTP_NO_CONTENT: + break; + case MHD_HTTP_UNAUTHORIZED: + break; + case MHD_HTTP_NOT_FOUND: + break; + case MHD_HTTP_CONFLICT: + break; + default: + GNUNET_break (0); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Unhandled HTTP status %u for DELETE transfer.\n", + hr->http_status); + } + TALER_TESTING_interpreter_next (dts->is); +} + + +/** + * Run the "DELETE transfer" CMD. + * + * + * @param cls closure. + * @param cmd command being run now. + * @param is interpreter state. + */ +static void +delete_transfer_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct DeleteTransferState *dts = cls; + const struct TALER_TESTING_Command *ref; + const uint64_t *tid; + + dts->is = is; + ref = TALER_TESTING_interpreter_lookup_command (is, + dts->transfer_ref); + if (NULL == ref) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (dts->is); + return; + } + if (GNUNET_OK != + TALER_TESTING_get_trait_bank_row (ref, + &tid)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (dts->is); + return; + } + if (0 == tid) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (dts->is); + return; + } + dts->tdh = TALER_MERCHANT_transfer_delete (is->ctx, + dts->merchant_url, + *tid, + &delete_transfer_cb, + dts); + GNUNET_assert (NULL != dts->tdh); +} + + +/** + * Free the state of a "DELETE transfer" CMD, and possibly + * cancel a pending operation thereof. + * + * @param cls closure. + * @param cmd command being run. + */ +static void +delete_transfer_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct DeleteTransferState *dts = cls; + + if (NULL != dts->tdh) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "DELETE /transfers/$TRANSFER_ID operation did not complete\n"); + TALER_MERCHANT_transfer_delete_cancel (dts->tdh); + } + GNUNET_free (dts); +} + + +struct TALER_TESTING_Command +TALER_TESTING_cmd_merchant_delete_transfer (const char *label, + const char *merchant_url, + const char *transfer_ref, + unsigned int http_status) +{ + struct DeleteTransferState *dts; + + dts = GNUNET_new (struct DeleteTransferState); + dts->merchant_url = merchant_url; + dts->transfer_ref = transfer_ref; + dts->http_status = http_status; + { + struct TALER_TESTING_Command cmd = { + .cls = dts, + .label = label, + .run = &delete_transfer_run, + .cleanup = &delete_transfer_cleanup + }; + + return cmd; + } +} diff --git a/src/testing/testing_api_cmd_get_transfers.c b/src/testing/testing_api_cmd_get_transfers.c index 3c0181cb..e82e6436 100644 --- a/src/testing/testing_api_cmd_get_transfers.c +++ b/src/testing/testing_api_cmd_get_transfers.c @@ -153,6 +153,9 @@ get_transfers_cb ( TALER_TESTING_interpreter_fail (gts->is); return; } + TALER_TESTING_cmd_merchant_post_transfer_set_serial ( + (struct TALER_TESTING_Command *) transfer_cmd, + transfers[i].credit_serial); } { const char *payto_uri; diff --git a/src/testing/testing_api_cmd_post_transfers.c b/src/testing/testing_api_cmd_post_transfers.c index 72b6f132..e78af34e 100644 --- a/src/testing/testing_api_cmd_post_transfers.c +++ b/src/testing/testing_api_cmd_post_transfers.c @@ -100,6 +100,12 @@ struct PostTransfersState const char **deposits; /** + * Serial number of the wire transfer in the merchant backend, + * set by #TALER_TESTING_cmd_merchant_get_transfers(). 0 if unknown. + */ + uint64_t serial; + + /** * Length of @e deposits. */ unsigned int deposits_length; @@ -338,6 +344,7 @@ post_transfers_traits (void *cls, TALER_TESTING_make_trait_amount_obj (1, &pts->wire_fee), TALER_TESTING_make_trait_string (1, pts->exchange_url), TALER_TESTING_make_trait_absolute_time (0, &pts->execution_time), + TALER_TESTING_make_trait_bank_row (&pts->serial), TALER_TESTING_trait_end (), }; @@ -537,4 +544,16 @@ TALER_TESTING_cmd_merchant_post_transfer ( } +void +TALER_TESTING_cmd_merchant_post_transfer_set_serial ( + struct TALER_TESTING_Command *cmd, + uint64_t serial) +{ + struct PostTransfersState *pts = cmd->cls; + + GNUNET_assert (cmd->run = &post_transfers_run); + pts->serial = serial; +} + + /* end of testing_api_cmd_post_transfers.c */ |