blob: 9ba97887a447a525f3a21ec15b92eea4475860c0 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/ui/views/payments/payment_request_browsertest_base.h"
#include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test.h"
namespace payments {
class PaymentRequestRetryTest : public PaymentRequestBrowserTestBase {
protected:
PaymentRequestRetryTest() {
feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard);
}
private:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(PaymentRequestRetryTest,
DoNotAllowPaymentInstrumentChange) {
NavigateTo("/payment_request_retry_with_payer_errors.html");
autofill::AutofillProfile contact = autofill::test::GetFullProfile();
AddAutofillProfile(contact);
// Add two credit cards and record usage for the Visa card to ensure that it
// gets preselected.
autofill::CreditCard visa_card = autofill::test::GetCreditCard();
visa_card.set_billing_address_id(contact.guid());
visa_card.RecordAndLogUse();
AddCreditCard(visa_card);
autofill::CreditCard amex_card = autofill::test::GetCreditCard2();
amex_card.set_billing_address_id(contact.guid());
AddCreditCard(amex_card);
// Confirm that there are two payment apps available.
InvokePaymentRequestUI();
PaymentRequest* request = GetPaymentRequests().front();
EXPECT_EQ(2U, request->state()->available_apps().size());
// Enter a valid CVC format for the Visa card.
PayWithCreditCard(u"123");
// Confirm that only one payment app is available for retry().
RetryPaymentRequest(
"{"
" payer: {"
" email: 'EMAIL ERROR',"
" name: 'NAME ERROR',"
" phone: 'PHONE ERROR'"
" }"
"}",
DialogEvent::CONTACT_INFO_EDITOR_OPENED, dialog_view());
EXPECT_EQ(1U, request->state()->available_apps().size());
}
IN_PROC_BROWSER_TEST_F(PaymentRequestRetryTest, DisableAddCardDuringRetry) {
NavigateTo("/payment_request_retry_with_payer_errors.html");
autofill::AutofillProfile contact = autofill::test::GetFullProfile();
AddAutofillProfile(contact);
autofill::CreditCard visa_card = autofill::test::GetCreditCard();
visa_card.set_billing_address_id(contact.guid());
AddCreditCard(visa_card);
// Confirm that "Add card" button is enabled in payment list view.
InvokePaymentRequestUI();
OpenPaymentMethodScreen();
views::View* add_card_button = dialog_view()->GetViewByID(
static_cast<int>(DialogViewID::PAYMENT_METHOD_ADD_CARD_BUTTON));
EXPECT_TRUE(add_card_button);
EXPECT_TRUE(add_card_button->GetEnabled());
ClickOnBackArrow();
// Enter a valid CVC format for the Visa card.
PayWithCreditCard(u"123");
// Confirm that "Add card" button does not exist in payment list view.
RetryPaymentRequest(
"{"
" payer: {"
" email: 'EMAIL ERROR',"
" name: 'NAME ERROR',"
" phone: 'PHONE ERROR'"
" }"
"}",
DialogEvent::CONTACT_INFO_EDITOR_OPENED, dialog_view());
OpenPaymentMethodScreen();
add_card_button = dialog_view()->GetViewByID(
static_cast<int>(DialogViewID::PAYMENT_METHOD_ADD_CARD_BUTTON));
EXPECT_EQ(nullptr, add_card_button);
}
// The tests in this class correspond to the tests of the same name in
// PaymentRequestRetryTest, with basic-card disabled.
// Parameterized tests are not used because the test setup for both tests are
// too different.
class PaymentRequestRetryBasicCardDisabledTest
: public PaymentRequestBrowserTestBase {
protected:
PaymentRequestRetryBasicCardDisabledTest() {
feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard);
}
private:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(PaymentRequestRetryBasicCardDisabledTest,
DoNotAllowPaymentInstrumentChange) {
// Installs two apps so that the Payment Request UI will be shown.
std::string a_method_name;
InstallPaymentApp("a.com", "payment_request_success_responder.js",
&a_method_name);
std::string b_method_name;
InstallPaymentApp("b.com", "payment_request_success_responder.js",
&b_method_name);
NavigateTo("/payment_request_retry_with_payer_errors.html");
autofill::AutofillProfile contact = autofill::test::GetFullProfile();
AddAutofillProfile(contact);
// Confirm that there are two payment apps available.
InvokePaymentRequestUIWithJs(
content::JsReplace("buyWithMethods([{supportedMethods:$1}"
", {supportedMethods:$2}]);",
a_method_name, b_method_name));
PaymentRequest* request = GetPaymentRequests().front();
EXPECT_EQ(2U, request->state()->available_apps().size());
// Click on pay.
EXPECT_TRUE(IsPayButtonEnabled());
ResetEventWaiterForSequence({DialogEvent::PROCESSING_SPINNER_SHOWN});
ClickOnDialogViewAndWait(DialogViewID::PAY_BUTTON, dialog_view());
// Wait for the response to settle.
ASSERT_TRUE(
content::ExecJs(GetActiveWebContents(), "processShowResponse();"));
// Confirm that only one payment app is available for retry().
ResetEventWaiterForSequence({DialogEvent::PROCESSING_SPINNER_HIDDEN,
DialogEvent::SPEC_DONE_UPDATING,
DialogEvent::PROCESSING_SPINNER_HIDDEN,
DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION,
DialogEvent::CONTACT_INFO_EDITOR_OPENED});
ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(),
"retry({"
" payer: {"
" email: 'EMAIL ERROR',"
" name: 'NAME ERROR',"
" phone: 'PHONE ERROR'"
" }"
"});"));
WaitForObservedEvent();
EXPECT_EQ(1U, request->state()->available_apps().size());
}
} // namespace payments