summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcello Stanisci <stanisci.m@gmail.com>2018-05-22 10:02:00 +0200
committerMarcello Stanisci <stanisci.m@gmail.com>2018-05-22 10:02:00 +0200
commit16d26b2b4c34ff3a8227f37845b3433af9b78e33 (patch)
tree70f1741d34b4b7cf1a90d46aa3c2edd463e1762a
parentd194cdb5bb0dbde9daeec75895520269a3ab3c00 (diff)
downloadmerchant-16d26b2b4c34ff3a8227f37845b3433af9b78e33.tar.gz
merchant-16d26b2b4c34ff3a8227f37845b3433af9b78e33.tar.bz2
merchant-16d26b2b4c34ff3a8227f37845b3433af9b78e33.zip
Refund corner case.
Trying to pick up a refund from a regularly paid contract that was never refund-increased in the first place.
-rw-r--r--src/include/taler_merchant_testing_lib.h11
-rw-r--r--src/lib/test_merchant_api_new.c102
-rw-r--r--src/lib/testing_api_cmd_refund.c59
3 files changed, 155 insertions, 17 deletions
diff --git a/src/include/taler_merchant_testing_lib.h b/src/include/taler_merchant_testing_lib.h
index 97e03d91..357a2237 100644
--- a/src/include/taler_merchant_testing_lib.h
+++ b/src/include/taler_merchant_testing_lib.h
@@ -222,6 +222,17 @@ TALER_TESTING_cmd_refund_lookup
const char *order_id,
unsigned int http_code);
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_refund_lookup_with_amount
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ const char *increase_reference,
+ const char *pay_reference,
+ const char *order_id,
+ unsigned int http_code,
+ const char *refund_amount);
+
/**
* FIXME
diff --git a/src/lib/test_merchant_api_new.c b/src/lib/test_merchant_api_new.c
index 83e565b9..6d5ed024 100644
--- a/src/lib/test_merchant_api_new.c
+++ b/src/lib/test_merchant_api_new.c
@@ -305,13 +305,14 @@ run (void *cls,
10, // start
10), // nrows
- TALER_TESTING_cmd_fakebank_transfer ("create-reserve-2",
- "EUR:1",
- fakebank_url,
- USER_ACCOUNT_NO, EXCHANGE_ACCOUNT_NO,
- "user62",
- "pass62",
- EXCHANGE_URL),
+ TALER_TESTING_cmd_fakebank_transfer
+ ("create-reserve-2",
+ "EUR:1",
+ fakebank_url,
+ USER_ACCOUNT_NO, EXCHANGE_ACCOUNT_NO,
+ "user62",
+ "pass62",
+ EXCHANGE_URL),
TALER_TESTING_cmd_fakebank_transfer_with_ref
("create-reserve-2b",
@@ -465,6 +466,7 @@ run (void *cls,
"EUR:0.01",
MHD_HTTP_OK),
+ /* Ordinary refund. */
TALER_TESTING_cmd_refund_lookup ("refund-lookup-1",
merchant_url,
is->ctx,
@@ -473,7 +475,7 @@ run (void *cls,
"1",
MHD_HTTP_OK),
- /* Trying to pick up a non existent refund. */
+ /* Trying to pick up refund from non existent proposal. */
TALER_TESTING_cmd_refund_lookup ("refund-lookup-non-existent",
merchant_url,
is->ctx,
@@ -506,6 +508,7 @@ run (void *cls,
\"value\":\"{EUR:5}\"} ] }",
NULL),
+ /* Try to increase a non paid proposal. */
TALER_TESTING_cmd_refund_increase
("refund-increase-unpaid-proposal",
merchant_url,
@@ -516,6 +519,7 @@ run (void *cls,
"EUR:0.01",
MHD_HTTP_BAD_REQUEST),
+ /* Try to increase a non existent proposal. */
TALER_TESTING_cmd_refund_increase
("refund-increase-unpaid-proposal",
merchant_url,
@@ -526,6 +530,88 @@ run (void *cls,
"EUR:0.01",
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_transfer
+ ("check_bank_transfer-unincreased-refund",
+ EXCHANGE_URL,
+ "EUR:5.01",
+ USER_ACCOUNT_NO,
+ EXCHANGE_ACCOUNT_NO),
+
+ TALER_TESTING_cmd_withdraw_amount
+ ("withdraw-coin-unincreased-refund",
+ is->exchange,
+ "create-reserve-unincreased-refund",
+ "EUR:5",
+ MHD_HTTP_OK),
+
+ TALER_TESTING_cmd_proposal
+ ("create-proposal-unincreased-refund",
+ merchant_url,
+ is->ctx,
+ MHD_HTTP_OK,
+ "{\"max_fee\":\
+ {\"currency\":\"EUR\",\
+ \"value\":0,\
+ \"fraction\":50000000},\
+ \"order_id\":\"unincreased-proposal\",\
+ \"refund_deadline\":\"\\/Date(0)\\/\",\
+ \"pay_deadline\":\"\\/Date(99999999999)\\/\",\
+ \"amount\":\
+ {\"currency\":\"EUR\",\
+ \"value\":5,\
+ \"fraction\":0},\
+ \"summary\": \"merchant-lib testcase\",\
+ \"fulfillment_url\": \"https://example.com/\",\
+ \"products\": [ {\"description\":\"ice cream\",\
+ \"value\":\"{EUR:5}\"} ] }",
+ NULL),
+
+ TALER_TESTING_cmd_pay ("pay-unincreased-proposal",
+ merchant_url,
+ is->ctx,
+ MHD_HTTP_OK,
+ "create-proposal-unincreased-refund",
+ "withdraw-coin-unincreased-refund",
+ "EUR:5",
+ "EUR:4.99",
+ "EUR:0.01"),
+
+ CMD_EXEC_AGGREGATOR ("run-aggregator-unincreased-refund"),
+
+ TALER_TESTING_cmd_check_bank_transfer
+ ("check_bank_transfer-unincreased-refund",
+ EXCHANGE_URL,
+ "EUR:4.98",
+ EXCHANGE_ACCOUNT_NO,
+ MERCHANT_ACCOUNT_NO),
+
+ /* Actually try to pick up the refund from the
+ * "unincreased proposal". */
+ TALER_TESTING_cmd_refund_lookup_with_amount
+ ("refund-lookup-unincreased",
+ merchant_url,
+ is->ctx,
+ NULL,
+ "pay-unincreased-proposal",
+ "unincreased-proposal",
+ MHD_HTTP_OK,
+ /* If a lookup is attempted on an unincreased proposal,
+ * the backend will simply respond with a empty refunded
+ * coin "set", but the HTTP response code is 200 OK. */
+ "EUR:0"),
+
/* Test tipping. */
TALER_TESTING_cmd_fakebank_transfer_with_instance
("create-reserve-tip-1",
diff --git a/src/lib/testing_api_cmd_refund.c b/src/lib/testing_api_cmd_refund.c
index 7dc5683c..d008f657 100644
--- a/src/lib/testing_api_cmd_refund.c
+++ b/src/lib/testing_api_cmd_refund.c
@@ -68,6 +68,8 @@ struct RefundLookupState
unsigned int http_code;
struct TALER_TESTING_Interpreter *is;
+
+ const char *refund_amount;
};
@@ -314,30 +316,40 @@ refund_lookup_cb (void *cls,
GNUNET_free (coin_reference_dup);
- if (NULL ==
+ if (NULL !=
(increase_cmd = TALER_TESTING_interpreter_lookup_command
(rls->is, rls->increase_reference)))
- TALER_TESTING_FAIL (rls->is);
+ {
+ if (GNUNET_OK != TALER_TESTING_get_trait_amount
+ (increase_cmd, 0, &refund_amount))
+ TALER_TESTING_FAIL (rls->is);
- if (GNUNET_OK != TALER_TESTING_get_trait_amount
- (increase_cmd, 0, &refund_amount))
- TALER_TESTING_FAIL (rls->is);
+ if (GNUNET_OK != TALER_string_to_amount
+ (refund_amount, &ra))
+ TALER_TESTING_FAIL (rls->is);
+ }
+ else
+ {
+ GNUNET_assert (NULL != rls->refund_amount);
- if (GNUNET_OK != TALER_string_to_amount (refund_amount,
- &ra))
- TALER_TESTING_FAIL (rls->is);
+ if (GNUNET_OK != TALER_string_to_amount
+ (rls->refund_amount, &ra))
+ TALER_TESTING_FAIL (rls->is);
+ }
GNUNET_CONTAINER_multihashmap_iterate (map,
&hashmap_free,
NULL);
GNUNET_CONTAINER_multihashmap_destroy (map);
+ /* Check that what the backend claims to have been refunded
+ * actually matches _our_ refund expectation. */
if (0 != TALER_amount_cmp (&acc,
&ra))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Incomplete refund: expected '%s', got '%s'\n",
- refund_amount,
+ TALER_amount_to_string (&ra),
TALER_amount_to_string (&acc));
TALER_TESTING_interpreter_fail (rls->is);
return;
@@ -465,6 +477,35 @@ TALER_TESTING_cmd_refund_lookup
return cmd;
}
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_refund_lookup_with_amount
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ const char *increase_reference,
+ const char *pay_reference,
+ const char *order_id,
+ unsigned int http_code,
+ const char *refund_amount)
+{
+ struct RefundLookupState *rls;
+ struct TALER_TESTING_Command cmd;
+
+ rls = GNUNET_new (struct RefundLookupState);
+ rls->merchant_url = merchant_url;
+ rls->ctx = ctx;
+ rls->order_id = order_id;
+ rls->pay_reference = pay_reference;
+ rls->increase_reference = increase_reference;
+ rls->http_code = http_code;
+ rls->refund_amount = refund_amount;
+
+ cmd.cls = rls;
+ cmd.label = label;
+ cmd.run = &refund_lookup_run;
+ cmd.cleanup = &refund_lookup_cleanup;
+ return cmd;
+}
/* end of testing_api_cmd_refund.c */