/*
This file is part of TALER
Copyright (C) 2014-2023 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
*/
/**
* @file test_merchant_api.c
* @brief testcase to test exchange's HTTP API interface
* @author Sree Harsha Totakura
* @author Christian Grothoff
* @author Marcello Stanisci
*/
#include "platform.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "taler_merchant_testing_lib.h"
/**
* The 'poll-orders-conclude-1' and other 'conclude'
* commands should NOT wait for this timeout!
*/
#define POLL_ORDER_TIMEOUT \
GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
/**
* The 'poll-orders-conclude-1x' and other 'conclude'
* commands that should (!) wait for this timeout! Hence,
* here we use a short value!
*/
#define POLL_ORDER_SHORT_TIMEOUT \
GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2)
/**
* Configuration file we use. One (big) configuration is used
* for the various components for this test.
*/
static char *config_file;
#define PAYTO_I1 "payto://x-taler-bank/localhost/3?receiver-name=3"
/**
* Exchange base URL. Could also be taken from config.
*/
#define EXCHANGE_URL "http://localhost:8081/"
/**
* Payto URI of the customer (payer).
*/
static const char *payer_payto;
/**
* Payto URI of the exchange (escrow account).
*/
static const char *exchange_payto;
/**
* Payto URI of the merchant (receiver).
*/
static const char *merchant_payto;
/**
* Credentials for the test.
*/
static struct TALER_TESTING_Credentials cred;
/**
* Merchant base URL.
*/
static const char *merchant_url;
/**
* Merchant instance "i1a" base URL.
*/
static char *merchant_url_i1a;
/**
* Account number of the exchange at the bank.
*/
#define EXCHANGE_ACCOUNT_NAME "2"
/**
* Account number of some user.
*/
#define USER_ACCOUNT_NAME "62"
/**
* Account number of some other user.
*/
#define USER_ACCOUNT_NAME2 "63"
/**
* Account number used by the merchant
*/
#define MERCHANT_ACCOUNT_NAME "3"
static const char *order_1_transfers[] = {
"post-transfer-1",
NULL
};
static const char *order_1_forgets_1[] = {
"forget-1",
NULL
};
static const char *order_1_forgets_2[] = {
"forget-1",
"forget-order-array-elem",
NULL
};
static const char *order_1_forgets_3[] = {
"forget-1",
"forget-order-array-elem",
"forget-order-array-wc",
NULL
};
/**
* Execute the taler-merchant-webhook command with
* our configuration file.
*
* @param label label to use for the command.
*/
static struct TALER_TESTING_Command
cmd_webhook (const char *label)
{
return TALER_TESTING_cmd_webhook (label, config_file);
}
/**
* Execute the taler-exchange-wirewatch command with
* our configuration file.
*
* @param label label to use for the command.
*/
static struct TALER_TESTING_Command
cmd_exec_wirewatch (const char *label)
{
return TALER_TESTING_cmd_exec_wirewatch (label,
config_file);
}
/**
* Execute the taler-exchange-aggregator, closer and transfer commands with
* our configuration file.
*
* @param label label to use for the command.
*/
#define CMD_EXEC_AGGREGATOR(label) \
TALER_TESTING_cmd_exec_aggregator (label "-aggregator", config_file), \
TALER_TESTING_cmd_exec_transfer (label "-transfer", config_file)
/**
* Run wire transfer of funds from some user's account to the
* exchange.
*
* @param label label to use for the command.
* @param amount amount to transfer, i.e. "EUR:1"
* @param url exchange_url
*/
static struct TALER_TESTING_Command
cmd_transfer_to_exchange (const char *label,
const char *amount)
{
return TALER_TESTING_cmd_admin_add_incoming (label,
amount,
&cred.ba,
payer_payto);
}
/**
* Main function that will tell the interpreter what commands to
* run.
*
* @param cls closure
*/
static void
run (void *cls,
struct TALER_TESTING_Interpreter *is)
{
struct TALER_TESTING_Command get_private_order_id[] = {
TALER_TESTING_cmd_merchant_post_instances ("instance-create-default",
merchant_url,
"default",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_account (
"instance-create-default-account",
merchant_url,
PAYTO_I1,
NULL, NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_kyc_get ("instance-create-kyc-0",
merchant_url,
NULL,
NULL,
EXCHANGE_URL,
MHD_HTTP_NO_CONTENT,
TALER_AML_NORMAL),
TALER_TESTING_cmd_merchant_post_orders_no_claim (
"create-proposal-bad-currency",
merchant_url,
MHD_HTTP_BAD_REQUEST,
"4",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"CHF:5.0"),
TALER_TESTING_cmd_merchant_post_orders_no_claim ("create-proposal-4",
merchant_url,
MHD_HTTP_OK,
"4",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_merchant_get_order ("get-order-4",
merchant_url,
"create-proposal-4",
TALER_MERCHANT_OSC_UNPAID,
false,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_delete_order ("delete-order-4",
merchant_url,
"4",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_purge_instance ("purge-default",
merchant_url,
"default",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command pay[] = {
/**
* Move money to the exchange's bank account.
*/
cmd_transfer_to_exchange ("create-reserve-1",
"EUR:10.02"),
/**
* Make a reserve exist, according to the previous transfer.
*/
cmd_exec_wirewatch ("wirewatch-1"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-2",
"EUR:10.02",
payer_payto,
exchange_payto,
"create-reserve-1"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
"create-reserve-1",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
"create-reserve-1",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_orders ("get-orders-empty",
merchant_url,
MHD_HTTP_OK,
NULL),
/**
* Check the reserve is depleted.
*/
TALER_TESTING_cmd_status ("withdraw-status-1",
"create-reserve-1",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_delete_order ("delete-order-nx",
merchant_url,
"1",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_poll_orders_start ("poll-orders-1-start",
merchant_url,
POLL_ORDER_TIMEOUT),
TALER_TESTING_cmd_merchant_claim_order ("claim-order-nx",
merchant_url,
MHD_HTTP_NOT_FOUND,
NULL,
"1"),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"1",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"x-taler-bank",
"",
"",
NULL),
TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-pay-w1",
merchant_url,
"webhook-pay-1",
"pay",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_testserver ("launch-http-server-for-webhooks",
12345),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1-idem",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"1",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"x-taler-bank",
"",
"",
"create-proposal-1"),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1x",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"1x",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"x-taler-bank",
"",
"",
NULL),
TALER_TESTING_cmd_merchant_claim_order ("reclaim-1",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1",
NULL),
TALER_TESTING_cmd_merchant_claim_order ("reclaim-1-bad-nonce",
merchant_url,
MHD_HTTP_CONFLICT,
NULL,
"1"),
TALER_TESTING_cmd_merchant_claim_order ("reclaim-1x",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1x",
NULL),
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-1-pre-exists",
cred.cfg,
merchant_url,
MHD_HTTP_CONFLICT,
"1",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_poll_orders_conclude ("poll-orders-1-conclude",
MHD_HTTP_OK,
"poll-orders-1-start"),
TALER_TESTING_cmd_merchant_get_orders ("get-orders-1",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1x",
"create-proposal-1",
NULL),
TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1",
merchant_url,
"create-proposal-1",
false,
false,
false,
MHD_HTTP_PAYMENT_REQUIRED),
TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_CLAIMED,
false,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_wallet_poll_order_start ("poll-order-wallet-start-1",
merchant_url,
"create-proposal-1",
POLL_ORDER_TIMEOUT,
NULL),
TALER_TESTING_cmd_wallet_poll_order_start2 ("poll-order-wallet-start-1x",
merchant_url,
"create-proposal-1x",
POLL_ORDER_SHORT_TIMEOUT,
NULL, /* no refund */
"session-0"),
TALER_TESTING_cmd_poll_order_start ("poll-order-merchant-1-start",
merchant_url,
"1",
POLL_ORDER_TIMEOUT),
TALER_TESTING_cmd_merchant_pay_order ("deposit-simple",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99",
"session-0"),
TALER_TESTING_cmd_poll_order_conclude ("poll-order-merchant-1-conclude",
MHD_HTTP_OK,
"poll-order-merchant-1-start"),
TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude",
MHD_HTTP_OK,
NULL,
"poll-order-wallet-start-1"),
/* Check for webhook */
cmd_webhook ("pending-webhooks-pay-w1"),
/* Check webhook did anything: have a command that inspects traits of the testserver
and check if the traits have the right values set! */
TALER_TESTING_cmd_checkserver ("check-http-server-for-webhooks",
"launch-http-server-for-webhooks",
0),
/* Here we expect to run into a timeout, as we do not pay this one */
TALER_TESTING_cmd_wallet_poll_order_conclude2 ("poll-order-1x-conclude",
MHD_HTTP_PAYMENT_REQUIRED,
NULL,
"poll-order-wallet-start-1x",
"1"),
TALER_TESTING_cmd_merchant_post_orders_paid ("verify-order-1-paid",
merchant_url,
"deposit-simple",
"session-1",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1-2",
merchant_url,
"create-proposal-1",
true,
false,
false,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1-2a",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_PAID,
false,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_get_orders ("get-orders-1-paid",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1x",
"create-proposal-1",
NULL),
TALER_TESTING_cmd_merchant_pay_order ("replay-simple",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99",
"session-0"),
TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-1"),
CMD_EXEC_AGGREGATOR ("run-aggregator"),
TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-498c",
EXCHANGE_URL,
"EUR:4.98",
exchange_payto,
merchant_payto),
TALER_TESTING_cmd_merchant_post_transfer ("post-transfer-1",
&cred.ba,
PAYTO_I1,
merchant_url,
"EUR:4.98",
MHD_HTTP_NO_CONTENT,
"deposit-simple",
NULL),
TALER_TESTING_cmd_run_tme ("run taler-merchant-exchange-1",
config_file),
TALER_TESTING_cmd_merchant_post_transfer2 ("post-transfer-bad",
merchant_url,
PAYTO_I1,
"EUR:4.98",
NULL,
/*non-routable IP address
so we are sure to not get
any reply*/
"http://192.0.2.1/404/",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_transfers ("get-transfers-1",
merchant_url,
PAYTO_I1,
MHD_HTTP_OK,
"post-transfer-1",
"post-transfer-bad",
NULL),
TALER_TESTING_cmd_merchant_delete_transfer ("delete-transfer-1",
merchant_url,
"post-transfer-bad",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-2b",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_PAID,
true,
order_1_transfers, /* "post-transfer-1" */
false,
NULL,
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_forget_order ("forget-1",
merchant_url,
MHD_HTTP_NO_CONTENT,
"create-proposal-1",
NULL,
"$.dummy_obj",
NULL),
TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-1",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_PAID,
true,
order_1_transfers,
false,
NULL,
order_1_forgets_1,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_forget_order ("forget-unforgettable",
merchant_url,
MHD_HTTP_CONFLICT,
"create-proposal-1",
NULL,
"$.amount",
NULL),
TALER_TESTING_cmd_merchant_forget_order ("forget-order-nx",
merchant_url,
MHD_HTTP_NOT_FOUND,
NULL,
"nx-order",
"$.dummy_obj",
NULL),
TALER_TESTING_cmd_merchant_forget_order ("forget-order-array-elem",
merchant_url,
MHD_HTTP_NO_CONTENT,
"create-proposal-1",
NULL,
"$.dummy_array[0].item",
NULL),
TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-2",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_PAID,
true,
order_1_transfers,
false,
NULL,
order_1_forgets_2,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_forget_order ("forget-order-array-wc",
merchant_url,
MHD_HTTP_NO_CONTENT,
"create-proposal-1",
NULL,
"$.dummy_array[*].item",
NULL),
TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-3",
merchant_url,
"create-proposal-1",
TALER_MERCHANT_OSC_PAID,
true,
order_1_transfers,
false,
NULL,
order_1_forgets_3,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_forget_order ("forget-order-malformed",
merchant_url,
MHD_HTTP_BAD_REQUEST,
"create-proposal-1",
NULL,
"$.dummy_array[abc].item",
NULL),
TALER_TESTING_cmd_merchant_post_products ("post-products-p3",
merchant_url,
"product-3",
"a product",
"EUR:1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_products2 ("post-products-p4",
merchant_url,
"product-4age",
"an age-restricted product",
NULL,
"unit",
"EUR:1",
"", /* image */
NULL,
4,
16 /* minimum age */,
NULL,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_product ("patch-products-p3",
merchant_url,
"product-3",
"a product",
json_object (),
"can",
"EUR:1",
"data:image/jpeg;base64,RAWDATA",
json_array (),
5,
0,
json_object (),
GNUNET_TIME_relative_to_timestamp (
GNUNET_TIME_UNIT_MINUTES),
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_lock_product ("lock-product-p3",
merchant_url,
"product-3",
GNUNET_TIME_UNIT_MINUTES,
2,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-wm-nx",
cred.cfg,
merchant_url,
MHD_HTTP_NOT_FOUND,
"order-p3",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"unsupported-wire-method",
"product-3/2",
"", /* locks */
NULL),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-pd-nx",
cred.cfg,
merchant_url,
MHD_HTTP_NOT_FOUND,
"order-p3",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"x-taler-bank",
"unknown-product/2",
"",
NULL),
TALER_TESTING_cmd_merchant_post_orders2 (
"create-proposal-p3-not-enough-stock",
cred.cfg,
merchant_url,
MHD_HTTP_GONE,
"order-p3",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
true,
"EUR:5.0",
"x-taler-bank",
"product-3/24",
"",
NULL),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"order-p3",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
false,
"EUR:5.0",
"x-taler-bank",
"product-3/3",
"lock-product-p3",
NULL),
TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p4-age",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"order-p4-age",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
false,
"EUR:5.0",
"x-taler-bank",
"product-4age",
"", /* locks */
NULL),
TALER_TESTING_cmd_merchant_get_order4 ("get-order-merchant-p4-age",
merchant_url,
"create-proposal-p4-age",
TALER_MERCHANT_OSC_CLAIMED,
16,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_delete_order ("delete-order-paid",
merchant_url,
"1",
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-no-id",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
NULL,
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_merchant_delete_webhook ("post-webhooks-pay-w1",
merchant_url,
"webhook-pay-1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-2"),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command double_spending[] = {
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-2",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"2",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal-2",
merchant_url,
MHD_HTTP_OK,
"create-proposal-2",
NULL),
TALER_TESTING_cmd_merchant_pay_order ("deposit-double-2",
merchant_url,
MHD_HTTP_CONFLICT,
"create-proposal-2",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_end ()
};
const char *order_1r_refunds[] = {
"refund-increase-1r",
"refund-increase-1r-2",
NULL
};
struct TALER_TESTING_Command refund[] = {
cmd_transfer_to_exchange ("create-reserve-1r",
"EUR:10.02"),
/**
* Make a reserve exist, according to the previous transfer.
*/
cmd_exec_wirewatch ("wirewatch-1r"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-2r",
"EUR:10.02",
payer_payto,
exchange_payto,
"create-reserve-1r"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1r",
"create-reserve-1r",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2r",
"create-reserve-1r",
"EUR:5",
0,
MHD_HTTP_OK),
/**
* Check the reserve is depleted.
*/
TALER_TESTING_cmd_status ("withdraw-status-1r",
"create-reserve-1r",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-1r",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"1r",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_wallet_poll_order_start ("poll-order-wallet-refund-1-low",
merchant_url,
"create-proposal-1r",
POLL_ORDER_TIMEOUT,
"EUR:0.01"),
TALER_TESTING_cmd_wallet_poll_order_start (
"poll-order-wallet-refund-1-high",
merchant_url,
"create-proposal-1r",
POLL_ORDER_TIMEOUT,
"EUR:0.2"),
TALER_TESTING_cmd_merchant_pay_order ("pay-for-refund-1r",
merchant_url,
MHD_HTTP_OK,
"create-proposal-1r",
"withdraw-coin-1r",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_poll_order_start ("poll-payment-refund-1",
merchant_url,
"1r", /* proposal name, not cmd ref! */
POLL_ORDER_TIMEOUT),
TALER_TESTING_cmd_merchant_order_refund ("refund-increase-1r",
merchant_url,
"refund test",
"1r", /* order ID */
"EUR:0.1",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude-low",
MHD_HTTP_OK,
"EUR:0.1",
"poll-order-wallet-refund-1-low"),
TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r",
merchant_url,
"create-proposal-1r",
true,
true,
true,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_order_refund ("refund-increase-1r-2",
merchant_url,
"refund test 2",
"1r", /* order ID */
"EUR:1.0",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude-high",
MHD_HTTP_OK,
"EUR:1.0",
"poll-order-wallet-refund-1-high"),
TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r-2",
merchant_url,
"create-proposal-1r",
true,
true,
true,
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_order_refund ("obtain-refund-1r",
merchant_url,
"create-proposal-1r",
MHD_HTTP_OK,
"refund-increase-1r",
"refund-increase-1r-2",
NULL),
TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r-3",
merchant_url,
"create-proposal-1r",
true,
true,
false,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1r",
merchant_url,
"create-proposal-1r",
TALER_MERCHANT_OSC_PAID,
true,
MHD_HTTP_OK,
"refund-increase-1r",
"refund-increase-1r-2",
NULL),
TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1r-2",
merchant_url,
"create-proposal-1r",
TALER_MERCHANT_OSC_PAID,
false,
NULL,
true,
order_1r_refunds,
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_poll_order_conclude ("poll-payment-refund-conclude-1",
MHD_HTTP_OK,
"poll-payment-refund-1"),
/* Test /refund on a contract that was never paid. */
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-not-to-be-paid",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"1-unpaid",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
/* Try to increase an unpaid proposal. */
TALER_TESTING_cmd_merchant_order_refund ("refund-increase-unpaid-proposal",
merchant_url,
"refund test",
"1-unpaid",
"EUR:0.1",
MHD_HTTP_CONFLICT),
/* Try to increase a non existent proposal. */
TALER_TESTING_cmd_merchant_order_refund (
"refund-increase-nonexistent-proposal",
merchant_url,
"refund test",
"non-existent-id",
"EUR:0.1",
MHD_HTTP_NOT_FOUND),
/*
The following block will (1) create a new
reserve, then (2) a proposal, then (3) pay for
it, and finally (4) attempt to pick up a refund
from it without any increasing taking place
in the first place.
*/
cmd_transfer_to_exchange ("create-reserve-unincreased-refund",
"EUR:5.01"),
cmd_exec_wirewatch ("wirewatch-unincreased-refund"),
TALER_TESTING_cmd_check_bank_admin_transfer (
"check_bank_transfer-unincreased-refund",
"EUR:5.01",
payer_payto,
exchange_payto,
"create-reserve-unincreased-refund"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-unincreased-refund",
"create-reserve-unincreased-refund",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders (
"create-proposal-unincreased-refund",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"unincreased-proposal",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_merchant_pay_order ("pay-unincreased-proposal",
merchant_url,
MHD_HTTP_OK,
"create-proposal-unincreased-refund",
"withdraw-coin-unincreased-refund",
"EUR:5",
"EUR:4.99",
NULL),
CMD_EXEC_AGGREGATOR ("run-aggregator-unincreased-refund"),
TALER_TESTING_cmd_check_bank_transfer (
"check_bank_transfer-paid-unincreased-refund",
EXCHANGE_URL,
"EUR:8.97", /* '4.98 from above', plus 4.99 from 'pay-for-refund-1r'
and MINUS 0.1 MINUS 0.9 from
'refund-increase-1r' and 'refund-increase-1r-2' */
exchange_payto,
merchant_payto),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command auth[] = {
TALER_TESTING_cmd_merchant_post_instances ("instance-create-i1a",
merchant_url,
"i1a",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_account (
"instance-create-i1a-account",
merchant_url_i1a,
PAYTO_I1,
NULL, NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-1",
merchant_url_i1a,
"nx-product",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-1",
merchant_url_i1a,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-2",
merchant_url_i1a,
"nx-product",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-2",
merchant_url_i1a,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_instance_auth (
"instance-create-i1a-auth-ok",
merchant_url,
"i1a",
RFC_8959_PREFIX "my-secret",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-3",
merchant_url_i1a,
"nx-product",
MHD_HTTP_UNAUTHORIZED,
NULL),
TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-3",
merchant_url_i1a,
MHD_HTTP_UNAUTHORIZED,
NULL),
TALER_TESTING_cmd_set_authorization ("set-auth-valid",
"Bearer " RFC_8959_PREFIX "my-secret"),
TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-4",
merchant_url_i1a,
"nx-product",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-4",
merchant_url_i1a,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_instance_auth (
"instance-create-i1a-change-auth",
merchant_url_i1a,
NULL,
RFC_8959_PREFIX "my-other-secret",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-5",
merchant_url_i1a,
"nx-product",
MHD_HTTP_UNAUTHORIZED,
NULL),
TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-5",
merchant_url_i1a,
MHD_HTTP_UNAUTHORIZED,
NULL),
TALER_TESTING_cmd_merchant_purge_instance ("instance-delete-i1a-fail",
merchant_url_i1a,
NULL,
MHD_HTTP_UNAUTHORIZED),
TALER_TESTING_cmd_set_authorization (
"set-auth-valid-again",
"Bearer " RFC_8959_PREFIX "my-other-secret"),
TALER_TESTING_cmd_merchant_post_instance_auth (
"instance-create-i1a-auth-ok-idempotent",
merchant_url_i1a,
NULL,
RFC_8959_PREFIX "my-other-secret",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_instance_auth (
"instance-create-i1a-clear-auth",
merchant_url_i1a,
NULL,
NULL,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_set_authorization ("set-auth-none",
NULL),
TALER_TESTING_cmd_merchant_purge_instance ("instance-delete-i1a",
merchant_url_i1a,
NULL,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command pay_again[] = {
cmd_transfer_to_exchange ("create-reserve-20",
"EUR:20.04"),
cmd_exec_wirewatch ("wirewatch-20"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-10",
"EUR:20.04",
payer_payto,
exchange_payto,
"create-reserve-20"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10a",
"create-reserve-20",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10b",
"create-reserve-20",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10c",
"create-reserve-20",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10d",
"create-reserve-20",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_status ("withdraw-status-20",
"create-reserve-20",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-10",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"10",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:10.0"),
TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-10",
merchant_url,
MHD_HTTP_CONFLICT,
"create-proposal-10",
"withdraw-coin-10a;withdraw-coin-1",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_merchant_pay_order ("pay-again-10",
merchant_url,
MHD_HTTP_OK,
"create-proposal-10",
"withdraw-coin-10a;withdraw-coin-10b",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_merchant_pay_order ("pay-too-much-10",
merchant_url,
MHD_HTTP_CONFLICT,
"create-proposal-10",
"withdraw-coin-10c;withdraw-coin-10d",
"EUR:5",
"EUR:4.99",
NULL),
CMD_EXEC_AGGREGATOR ("run-aggregator-10"),
TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-9.97-10",
EXCHANGE_URL,
"EUR:9.97",
exchange_payto,
merchant_payto),
TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-10"),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command pay_abort[] = {
cmd_transfer_to_exchange ("create-reserve-11",
"EUR:10.02"),
cmd_exec_wirewatch ("wirewatch-11"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-11",
"EUR:10.02",
payer_payto,
exchange_payto,
"create-reserve-11"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-11a",
"create-reserve-11",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-11b",
"create-reserve-11",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_status ("withdraw-status-11",
"create-reserve-11",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders ("create-proposal-11",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"11",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:10.0"),
TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-11-good",
merchant_url,
MHD_HTTP_BAD_REQUEST,
"create-proposal-11",
"withdraw-coin-11a",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-11-bad",
merchant_url,
MHD_HTTP_CONFLICT,
"create-proposal-11",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_merchant_order_abort ("pay-abort-11",
merchant_url,
"pay-fail-partial-double-11-good",
MHD_HTTP_OK),
CMD_EXEC_AGGREGATOR ("run-aggregator-11"),
TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-11"),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command templates[] = {
cmd_transfer_to_exchange ("create-reserve-20x",
"EUR:20.04"),
cmd_exec_wirewatch ("wirewatch-20x"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-20x",
"EUR:20.04",
payer_payto,
exchange_payto,
"create-reserve-20x"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xa",
"create-reserve-20x",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xb",
"create-reserve-20x",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xc",
"create-reserve-20x",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xd",
"create-reserve-20x",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_status ("withdraw-status-20x",
"create-reserve-20x",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_templates ("get-templates-empty",
merchant_url,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1",
merchant_url,
"template-1",
"a template",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1-idem",
merchant_url,
"template-1",
"a template",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1-non-idem",
merchant_url,
"template-1",
"a different template",
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_get_templates ("get-templates-t1",
merchant_url,
MHD_HTTP_OK,
"post-templates-t1",
NULL),
TALER_TESTING_cmd_merchant_get_template ("get-template-t1",
merchant_url,
"template-1",
MHD_HTTP_OK,
"post-templates-t1"),
TALER_TESTING_cmd_merchant_post_templates ("post-templates-t2",
merchant_url,
"template-2",
"a template",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_template (
"patch-templates-t2",
merchant_url,
"template-2",
"another template",
NULL,
GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("minimum_age", 0),
GNUNET_JSON_pack_time_rel ("pay_duration",
GNUNET_TIME_UNIT_MINUTES)),
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_template ("get-template-t2",
merchant_url,
"template-2",
MHD_HTTP_OK,
"patch-templates-t2"),
TALER_TESTING_cmd_merchant_get_template ("get-template-nx",
merchant_url,
"template-nx",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_post_otp_devices (
"post-otp-device",
merchant_url,
"otp-dev",
"my OTP device",
"FEE4P2J",
TALER_MCA_WITH_PRICE,
0,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_template (
"patch-templates-t3-nx",
merchant_url,
"template-3",
"updated template",
"otp-dev",
GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("minimum_age", 0),
GNUNET_JSON_pack_time_rel ("pay_duration",
GNUNET_TIME_UNIT_MINUTES)),
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_post_templates2 (
"post-templates-t3-amount",
merchant_url,
"template-amount",
"a different template with an amount",
NULL,
GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("minimum_age", 0),
GNUNET_JSON_pack_time_rel ("pay_duration",
GNUNET_TIME_UNIT_MINUTES),
GNUNET_JSON_pack_string ("amount",
"EUR:4")),
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-t1",
"post-templates-t1",
NULL,
merchant_url,
"1",
"summary-1",
"EUR:9.98",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-t1-amount-missing",
"post-templates-t1",
NULL,
merchant_url,
"2",
"summary-1",
NULL,
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-t1-summary-missing",
"post-templates-t1",
NULL,
merchant_url,
"3",
NULL,
"EUR:10",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-t1-amount-conflict",
"post-templates-t3-amount",
NULL,
merchant_url,
"4",
"summary-1",
"EUR:10",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-t1-amount-duplicate",
"post-templates-t3-amount",
NULL,
merchant_url,
"4",
"summary-1",
"EUR:4",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_pay_order ("pay-100",
merchant_url,
MHD_HTTP_OK,
"using-templates-t1",
"withdraw-coin-xa;withdraw-coin-xb",
"EUR:4.99",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty",
merchant_url,
"t1",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty",
merchant_url,
"template-1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_using_templates (
"post-templates-t1-deleted",
"post-templates-t1",
NULL,
merchant_url,
"0",
"summary-1",
"EUR:5",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_post_otp_devices (
"post-otp-device",
merchant_url,
"otp-dev-2",
"my OTP device",
"secret",
TALER_MCA_WITH_PRICE,
0,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_templates2 (
"post-templates-with-pos-key",
merchant_url,
"template-key",
"a different template with POS KEY",
"otp-dev-2",
GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("minimum_age", 0),
GNUNET_JSON_pack_time_rel ("pay_duration",
GNUNET_TIME_UNIT_MINUTES)),
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_using_templates (
"using-templates-pos-key",
"post-templates-with-pos-key",
"post-otp-device",
merchant_url,
"1",
"summary-1-pos",
"EUR:9.98",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_pay_order ("pay-with-pos",
merchant_url,
MHD_HTTP_OK,
"using-templates-pos-key",
"withdraw-coin-xc;withdraw-coin-xd",
"EUR:4.99",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command webhooks[] = {
TALER_TESTING_cmd_merchant_get_webhooks ("get-webhooks-empty",
merchant_url,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1",
merchant_url,
"webhook-1",
"Paid",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1-idem",
merchant_url,
"webhook-1",
"Paid",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1-non-idem",
merchant_url,
"webhook-1",
"Refund",
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_get_webhooks ("get-webhooks-w1",
merchant_url,
MHD_HTTP_OK,
"post-webhooks-w1",
NULL),
TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-w1",
merchant_url,
"webhook-1",
MHD_HTTP_OK,
"post-webhooks-w1"),
TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w2",
merchant_url,
"webhook-2",
"Paid",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_webhook ("patch-webhooks-w2",
merchant_url,
"webhook-2",
"Refund2",
"http://localhost:38188/",
"POST",
"Authorization:WHWOXZXPLL",
"Amount",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-w2",
merchant_url,
"webhook-2",
MHD_HTTP_OK,
"patch-webhooks-w2"),
TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-nx",
merchant_url,
"webhook-nx",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_patch_webhook ("patch-webhooks-w3-nx",
merchant_url,
"webhook-3",
"Paid2",
"https://example.com",
"POST",
"Authorization:WHWOXZXPLL",
"Amount",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_delete_webhook ("get-webhooks-empty",
merchant_url,
"w1",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_delete_webhook ("get-webhooks-empty",
merchant_url,
"webhook-1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command repurchase[] = {
cmd_transfer_to_exchange (
"create-reserve-30x",
"EUR:30.06"),
cmd_exec_wirewatch (
"wirewatch-30x"),
TALER_TESTING_cmd_check_bank_admin_transfer (
"check_bank_transfer-30x",
"EUR:30.06",
payer_payto,
exchange_payto,
"create-reserve-30x"),
TALER_TESTING_cmd_withdraw_amount (
"withdraw-coin-rep",
"create-reserve-30x",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders3 (
"post-order-repurchase-original",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"repurchase-original",
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
GNUNET_TIME_UNIT_FOREVER_TS,
"https://fulfillment.example.com/",
"EUR:1.0"),
TALER_TESTING_cmd_merchant_pay_order (
"repurchase-pay-first",
merchant_url,
MHD_HTTP_OK,
"post-order-repurchase-original",
"withdraw-coin-rep",
"EUR:1.00",
"EUR:0.99",
"repurchase-session"),
TALER_TESTING_cmd_wallet_get_order (
"repurchase-wallet-check-primary-order",
merchant_url,
"post-order-repurchase-original",
true,
false,
false,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order3 (
"repurchase-check-primary-payment",
merchant_url,
"post-order-repurchase-original",
TALER_MERCHANT_OSC_PAID,
"repurchase-session",
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order3 (
"repurchase-check-primary-payment-bad-binding",
merchant_url,
"post-order-repurchase-original",
TALER_MERCHANT_OSC_CLAIMED, /* someone else has it! */
"wrong-session",
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_orders3 (
"post-order-repurchase-secondary",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"repurchase-secondary",
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
GNUNET_TIME_UNIT_FOREVER_TS,
"https://fulfillment.example.com/",
"EUR:1.0"),
TALER_TESTING_cmd_merchant_get_order3 (
"repurchase-check-secondary-payment",
merchant_url,
"post-order-repurchase-secondary",
TALER_MERCHANT_OSC_UNPAID,
"repurchase-session",
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order3 (
"repurchase-check-secondary-payment",
merchant_url,
"post-order-repurchase-secondary",
TALER_MERCHANT_OSC_UNPAID,
"repurchase-session",
"post-order-repurchase-original",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_get_order2 (
"repurchase-wallet-check-order-secondary",
merchant_url,
"post-order-repurchase-secondary",
"repurchase-session",
false,
false,
false,
"post-order-repurchase-original",
MHD_HTTP_PAYMENT_REQUIRED),
TALER_TESTING_cmd_wallet_get_order2 (
"repurchase-wallet-check-order-secondary-bad-session",
merchant_url,
"post-order-repurchase-secondary",
"wrong-session",
false,
false,
false,
NULL,
MHD_HTTP_PAYMENT_REQUIRED),
TALER_TESTING_cmd_merchant_order_refund (
"refund-repurchased",
merchant_url,
"refund repurchase",
"repurchase-original",
"EUR:1.0",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_get_order2 (
"repurchase-wallet-check-primary-order-refunded-no-session",
merchant_url,
"post-order-repurchase-original",
NULL,
true,
true,
true,
"post-order-repurchase-original",
MHD_HTTP_OK),
TALER_TESTING_cmd_wallet_get_order2 (
"repurchase-wallet-check-primary-order-refunded",
merchant_url,
"post-order-repurchase-original",
"repurchase-session",
true,
true,
true,
"post-order-repurchase-original",
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_order3 (
"repurchase-check-refunded",
merchant_url,
"post-order-repurchase-secondary",
TALER_MERCHANT_OSC_CLAIMED,
"repurchase-session",
NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command tokens[] = {
/**
* Move money to the exchange's bank account.
*/
cmd_transfer_to_exchange ("create-reserve-tokens",
"EUR:10.02"),
/**
* Make a reserve exist, according to the previous transfer.
*/
cmd_exec_wirewatch ("wirewatch-1"),
TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-tokens",
"EUR:10.02",
payer_payto,
exchange_payto,
"create-reserve-tokens"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
"create-reserve-tokens",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
"create-reserve-tokens",
"EUR:5",
0,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_tokenfamilies ("create-tokenfamily",
merchant_url,
MHD_HTTP_NO_CONTENT,
"subscription-1",
"Subscription",
"A subscription.",
NULL,
GNUNET_TIME_timestamp_get (),
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_YEARS),
GNUNET_TIME_UNIT_MONTHS,
"subscription"),
TALER_TESTING_cmd_merchant_post_orders_choices ("create-order-with-choices",
cred.cfg,
merchant_url,
MHD_HTTP_OK,
"create-tokenfamily",
"5-choices",
GNUNET_TIME_UNIT_ZERO_TS,
GNUNET_TIME_UNIT_FOREVER_TS,
"EUR:5.0"),
TALER_TESTING_cmd_merchant_pay_order ("pay-order-with-choices",
merchant_url,
MHD_HTTP_OK,
"create-order-with-choices",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99",
NULL),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command commands[] = {
/* general setup */
TALER_TESTING_cmd_run_fakebank (
"run-fakebank",
cred.cfg,
"exchange-account-exchange"),
TALER_TESTING_cmd_system_start (
"start-taler",
config_file,
"-ema",
"-u", "exchange-account-exchange",
NULL),
TALER_TESTING_cmd_get_exchange (
"get-exchange",
cred.cfg,
NULL,
true,
true),
TALER_TESTING_cmd_batch (
"orders-id",
get_private_order_id),
TALER_TESTING_cmd_config (
"config",
merchant_url,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_instances (
"instances-empty",
merchant_url,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_instances (
"instance-create-default-setup",
merchant_url,
"default",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_account (
"instance-create-default-account",
merchant_url,
PAYTO_I1,
NULL, NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_post_instances (
"instance-create-i1",
merchant_url,
"i1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_instances (
"instances-get-i1",
merchant_url,
MHD_HTTP_OK,
"instance-create-i1",
"instance-create-default-setup",
NULL),
TALER_TESTING_cmd_merchant_get_instance (
"instances-get-i1",
merchant_url,
"i1",
MHD_HTTP_OK,
"instance-create-i1"),
TALER_TESTING_cmd_merchant_patch_instance (
"instance-patch-i1",
merchant_url,
"i1",
"bob-the-merchant",
json_pack ("{s:s}",
"street",
"bobstreet"),
json_pack ("{s:s}",
"street",
"bobjuryst"),
true,
GNUNET_TIME_UNIT_MINUTES,
GNUNET_TIME_UNIT_MINUTES,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_instance (
"instances-get-i1-2",
merchant_url,
"i1",
MHD_HTTP_OK,
"instance-patch-i1"),
TALER_TESTING_cmd_merchant_get_instance (
"instances-get-i2-nx",
merchant_url,
"i2",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_post_instances2 (
"instance-create-ACL",
merchant_url,
"i-acl",
"controlled instance",
json_pack ("{s:s}", "city",
"shopcity"),
json_pack ("{s:s}", "city",
"lawyercity"),
true,
GNUNET_TIME_UNIT_MINUTES,
GNUNET_TIME_UNIT_MINUTES,
// FIXME: change this back once
// we have a update auth test CMD
// RFC_8959_PREFIX "EXAMPLE",
NULL,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_instance (
"instance-patch-ACL",
merchant_url,
"i-acl",
"controlled instance",
json_pack ("{s:s}",
"street",
"bobstreet"),
json_pack ("{s:s}",
"street",
"bobjuryst"),
true,
GNUNET_TIME_UNIT_MINUTES,
GNUNET_TIME_UNIT_MINUTES,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_instances (
"instance-create-i2",
merchant_url,
"i2",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_instances (
"instance-create-i2-idem",
merchant_url,
"i2",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_delete_instance (
"instance-delete-i2",
merchant_url,
"i2",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_instance (
"instances-get-i2-post-deletion",
merchant_url,
"i2",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_purge_instance (
"instance-delete-then-purge-i2",
merchant_url,
"i2",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_purge_instance (
"instance-purge-i1",
merchant_url,
"i1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_delete_instance (
"instance-purge-then-delete-i1",
merchant_url,
"i1",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_purge_instance (
"instance-purge-i-acl-middle",
merchant_url,
"i-acl",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_purge_instance (
"instance-purge-default-middle",
merchant_url,
"default",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_instances (
"instance-create-default-after-purge",
merchant_url,
"default",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_account (
"instance-create-default-account-after-purge",
merchant_url,
PAYTO_I1,
NULL, NULL,
MHD_HTTP_OK),
TALER_TESTING_cmd_merchant_get_products (
"get-products-empty",
merchant_url,
MHD_HTTP_OK,
NULL),
TALER_TESTING_cmd_merchant_post_products (
"post-products-p1",
merchant_url,
"product-1",
"a product",
"EUR:1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_products (
"post-products-p1-idem",
merchant_url,
"product-1",
"a product",
"EUR:1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_post_products (
"post-products-p1-non-idem",
merchant_url,
"product-1",
"a different product",
"EUR:1",
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_merchant_get_products (
"get-products-p1",
merchant_url,
MHD_HTTP_OK,
"post-products-p1",
NULL),
TALER_TESTING_cmd_merchant_get_product (
"get-product-p1",
merchant_url,
"product-1",
MHD_HTTP_OK,
"post-products-p1"),
TALER_TESTING_cmd_merchant_post_products (
"post-products-p2",
merchant_url,
"product-2",
"a product",
"EUR:1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_patch_product (
"patch-products-p2",
merchant_url,
"product-2",
"another product",
json_pack ("{s:s}", "en", "text"),
"kg",
"EUR:1",
"data:image/jpeg;base64,RAWDATA",
json_array (),
40,
0,
json_pack ("{s:s}",
"street",
"pstreet"),
GNUNET_TIME_relative_to_timestamp (
GNUNET_TIME_UNIT_MINUTES),
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_get_product (
"get-product-p2",
merchant_url,
"product-2",
MHD_HTTP_OK,
"patch-products-p2"),
TALER_TESTING_cmd_merchant_get_product (
"get-product-nx",
merchant_url,
"product-nx",
MHD_HTTP_NOT_FOUND,
NULL),
TALER_TESTING_cmd_merchant_patch_product (
"patch-products-p3-nx",
merchant_url,
"product-3",
"nx updated product",
json_pack ("{s:s}", "en", "text"),
"kg",
"EUR:1",
"data:image/jpeg;base64,RAWDATA",
json_array (),
40,
0,
json_pack ("{s:s}",
"street",
"pstreet"),
GNUNET_TIME_relative_to_timestamp (
GNUNET_TIME_UNIT_MINUTES),
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_delete_product (
"get-products-empty",
merchant_url,
"p1",
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_delete_product (
"get-products-empty",
merchant_url,
"product-1",
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_lock_product (
"lock-product-p2",
merchant_url,
"product-2",
GNUNET_TIME_UNIT_MINUTES,
2,
MHD_HTTP_NO_CONTENT),
TALER_TESTING_cmd_merchant_lock_product (
"lock-product-nx",
merchant_url,
"product-nx",
GNUNET_TIME_UNIT_MINUTES,
2,
MHD_HTTP_NOT_FOUND),
TALER_TESTING_cmd_merchant_lock_product (
"lock-product-too-much",
merchant_url,
"product-2",
GNUNET_TIME_UNIT_MINUTES,
39,
MHD_HTTP_GONE),
TALER_TESTING_cmd_merchant_delete_product (
"delete-product-locked",
merchant_url,
"product-2",
MHD_HTTP_CONFLICT),
TALER_TESTING_cmd_batch ("pay",
pay),
TALER_TESTING_cmd_batch ("double-spending",
double_spending),
TALER_TESTING_cmd_batch ("pay-again",
pay_again),
TALER_TESTING_cmd_batch ("pay-abort",
pay_abort),
TALER_TESTING_cmd_batch ("refund",
refund),
TALER_TESTING_cmd_batch ("templates",
templates),
TALER_TESTING_cmd_batch ("webhooks",
webhooks),
TALER_TESTING_cmd_batch ("auth",
auth),
TALER_TESTING_cmd_batch ("repurchase",
repurchase),
TALER_TESTING_cmd_batch ("tokens",
tokens),
/**
* End the suite.
*/
TALER_TESTING_cmd_end ()
};
TALER_TESTING_run (is,
commands);
}
int
main (int argc,
char *const *argv)
{
{
char *cipher;
cipher = GNUNET_STRINGS_get_suffix_from_binary_name (argv[0]);
GNUNET_assert (NULL != cipher);
GNUNET_asprintf (&config_file,
"test_merchant_api-%s.conf",
cipher);
GNUNET_free (cipher);
}
payer_payto =
"payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME "?receiver-name="
USER_ACCOUNT_NAME;
exchange_payto =
"payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME "?receiver-name="
EXCHANGE_ACCOUNT_NAME;
merchant_payto =
"payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME "?receiver-name="
MERCHANT_ACCOUNT_NAME;
merchant_url = "http://localhost:8080/";
GNUNET_asprintf (&merchant_url_i1a,
"%sinstances/i1a/",
merchant_url);
return TALER_TESTING_main (argv,
"INFO",
config_file,
"exchange-account-exchange",
TALER_TESTING_BS_FAKEBANK,
&cred,
&run,
NULL);
}
/* end of test_merchant_api.c */