blob: fca1cf2644690292a0878d8b75e4735ac73bcc13 [file] [log] [blame]
// 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"
namespace payments {
namespace {
class PaymentHandlerEnableDelegationsTest
: public PaymentRequestPlatformBrowserTestBase {
public:
PaymentHandlerEnableDelegationsTest() = default;
PaymentHandlerEnableDelegationsTest(
const PaymentHandlerEnableDelegationsTest&) = delete;
PaymentHandlerEnableDelegationsTest& operator=(
const PaymentHandlerEnableDelegationsTest&) = delete;
~PaymentHandlerEnableDelegationsTest() override = default;
void SetUpOnMainThread() override {
PaymentRequestPlatformBrowserTestBase::SetUpOnMainThread();
NavigateTo("a.com", "/payment_handler.html");
}
};
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest,
InvalidDelegations) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
std::string expected =
"TypeError: Failed to execute 'enableDelegations' on 'PaymentManager': "
"The provided value 'invalid_delegation' is not a valid enum value of "
"type PaymentDelegation.";
EXPECT_EQ(expected,
content::EvalJs(GetActiveWebContents(),
"enableDelegations(['invalid_delegation'])"));
}
// Since the payment handler can provide shipping and there is only one app, the
// browser skips the payment sheet and goes straight to payment processing.
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest,
ShippingDelegation) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
EXPECT_EQ("success",
content::EvalJs(GetActiveWebContents(),
"enableDelegations(['shippingAddress'])"));
EXPECT_EQ("success",
content::EvalJs(
GetActiveWebContents(),
content::JsReplace(
"paymentRequestWithOptions({requestShipping: true}, $1)",
method_name)));
}
// Since the payment handler can provide the contact information and there is
// only one app, the browser should skip the payment sheet and go straight to
// payment processing.
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest, ContactDelegation) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
EXPECT_EQ(
"success",
content::EvalJs(
GetActiveWebContents(),
"enableDelegations(['payerName', 'payerEmail', 'payerPhone'])"));
EXPECT_EQ("success",
content::EvalJs(
GetActiveWebContents(),
content::JsReplace(
"paymentRequestWithOptions({requestPayerName: true, "
"requestPayerEmail: true, requestPayerPhone: true}, $1)",
method_name)));
}
// Since the payment handler can provide the shipping address and contact
// information and there is only one app, the browser should skip the payment
// sheet and go straight to payment processing.
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest, AllDelegations) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
EXPECT_EQ("success",
content::EvalJs(GetActiveWebContents(),
"enableDelegations(['shippingAddress', "
"'payerName', 'payerEmail', 'payerPhone'])"));
EXPECT_EQ(
"success",
content::EvalJs(
GetActiveWebContents(),
content::JsReplace("paymentRequestWithOptions({requestShipping: "
"true, requestPayerName: true, requestPayerEmail: "
"true, requestPayerPhone: true}, $1)",
method_name)));
}
// Shipping section must exist in payment sheet since shipping address is
// requested and won't be provided by the selected payment handler.
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest,
PartialDelegation_ShippingNotSupported) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
EXPECT_EQ(
"success",
content::EvalJs(
GetActiveWebContents(),
"enableDelegations(['payerName', 'payerEmail', 'payerPhone'])"));
ResetEventWaiterForSingleEvent(TestEvent::kAppListReady);
ASSERT_TRUE(content::ExecJs(
GetActiveWebContents(),
content::JsReplace(
"paymentRequestWithOptions({requestShipping: true, requestPayerName: "
"true, requestPayerEmail: true, requestPayerPhone: true}, $1)",
method_name),
/*options=*/content::EXECUTE_SCRIPT_NO_RESOLVE_PROMISES));
WaitForObservedEvent();
ASSERT_TRUE(test_controller()->is_shipping_section_visible().has_value());
EXPECT_TRUE(test_controller()->is_shipping_section_visible().value());
ASSERT_TRUE(test_controller()->is_contact_section_visible().has_value());
EXPECT_FALSE(test_controller()->is_contact_section_visible().value());
}
// Contact section must exist in payment sheet since payer's name and email are
// requested and won't be provided by the selected payment handler.
IN_PROC_BROWSER_TEST_F(PaymentHandlerEnableDelegationsTest,
PartialDelegation_ContactInfoNotSupported) {
std::string method_name;
InstallPaymentApp("a.com", "/payment_handler_sw.js", &method_name);
EXPECT_EQ("success",
content::EvalJs(GetActiveWebContents(),
"enableDelegations(['shippingAddress'])"));
ResetEventWaiterForSingleEvent(TestEvent::kAppListReady);
ASSERT_TRUE(content::ExecJs(
GetActiveWebContents(),
content::JsReplace(
"paymentRequestWithOptions({requestShipping: true, requestPayerName: "
"true, requestPayerEmail: true}, $1)",
method_name),
/*options=*/content::EXECUTE_SCRIPT_NO_RESOLVE_PROMISES));
WaitForObservedEvent();
ASSERT_TRUE(test_controller()->is_shipping_section_visible().has_value());
EXPECT_FALSE(test_controller()->is_shipping_section_visible().value());
ASSERT_TRUE(test_controller()->is_contact_section_visible().has_value());
EXPECT_TRUE(test_controller()->is_contact_section_visible().value());
}
} // namespace
} // namespace payments