1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "chrome/test/payments/payment_request_platform_browsertest_base.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace payments {
namespace {
struct TestCase {
TestCase(const std::string& init_test_code,
const std::string& expected_output)
: init_test_code(init_test_code), expected_output(expected_output) {}
~TestCase() = default;
const std::string init_test_code;
const std::string expected_output;
};
class PaymentHandlerChangePaymentMethodTest
: public PaymentRequestPlatformBrowserTestBase,
public testing::WithParamInterface<TestCase> {};
IN_PROC_BROWSER_TEST_P(PaymentHandlerChangePaymentMethodTest, Test) {
NavigateTo("a.com", "/change_payment_method.html");
std::string method_name;
InstallPaymentApp("a.com", "/change_payment_method_app.js", &method_name);
ASSERT_TRUE(
content::ExecJs(GetActiveWebContents(), GetParam().init_test_code));
std::string actual_output =
content::EvalJs(GetActiveWebContents(),
"outputChangePaymentMethodReturnValue(request);")
.ExtractString();
// The test expectations are hard-coded, but the embedded test server changes
// its port number in every test, e.g., https://a.com:34548.
ASSERT_EQ(ClearPortNumber(actual_output), GetParam().expected_output)
<< "When executing " << GetParam().init_test_code;
}
INSTANTIATE_TEST_SUITE_P(
All,
PaymentHandlerChangePaymentMethodTest,
testing::Values(
// If the merchant does not have a "paymentmethodchange" event handler,
// then calling PaymentRequestEvent.changePaymentMethod() in the payment
// handler will return null.
TestCase("initTestNoHandler();",
"PaymentRequest.show(): changePaymentMethod() returned: null"),
// If the merchant responds to the "paymentmethodchange" event with a
// rejected promise, then PaymentRequest.show() gets rejected.
TestCase("initTestReject()",
"PaymentRequest.show() rejected with: Error for test"),
// If the merchant throws an "Error" in its "paymentmethodchange" event
// handler, then PaymentRequest.show() gets rejected.
TestCase("initTestThrow()",
"PaymentRequest.show() rejected with: Error: Error for test"),
// If the merchant responds to a "paymentmethodchange" event with
// updated details, including modifiers for multiple payment method
// names, then the invoked payment handler receives the updated details,
// except the modifiers for non-matching payment method names.
TestCase(
"initTestDetails()",
"PaymentRequest.show(): changePaymentMethod() returned: "
"{\"error\":\"Error for test\","
"\"modifiers\":[{\"data\":{\"soup\":\"potato\"},"
"\"supportedMethods\":\"https://a.com\","
"\"total\":{\"amount\":{\"currency\":\"EUR\",\"value\":\"0.03\"},"
"\"label\":\"\",\"pending\":false}}],"
"\"paymentMethodErrors\":{\"country\":\"Unsupported country\"},"
"\"total\":{\"currency\":\"GBP\",\"value\":\"0.02\"}}")));
} // namespace
} // namespace payments
|