blob: b04a901b17af0dc209c144e0aa533464e7ea8b62 [file] [log] [blame]
// Copyright 2019 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.
#import "ios/web_view/internal/autofill/cwv_credit_card_saver_internal.h"
#import <UIKit/UIKit.h>
#include <memory>
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#import "base/test/ios/wait_util.h"
#include "components/autofill/core/browser/autofill_client.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/payments/legal_message_line.h"
#include "components/autofill/core/browser/payments/test_legal_message_line.h"
#include "ios/web/public/test/web_task_environment.h"
#import "ios/web_view/internal/autofill/cwv_credit_card_internal.h"
#include "ios/web_view/test/test_with_locale_and_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using base::test::ios::kWaitForActionTimeout;
using base::test::ios::WaitUntilConditionOrTimeout;
namespace ios_web_view {
class CWVCreditCardSaverTest : public TestWithLocaleAndResources {
protected:
CWVCreditCardSaverTest() {}
web::WebTaskEnvironment task_environment_;
};
// Tests CWVCreditCardSaver properly initializes.
TEST_F(CWVCreditCardSaverTest, Initialization) {
autofill::CreditCard credit_card = autofill::test::GetCreditCard();
autofill::AutofillClient::SaveCreditCardOptions options;
autofill::LegalMessageLines legal_message_lines = {
autofill::TestLegalMessageLine("Test line 1",
{autofill::LegalMessageLine::Link(
5, 9, "http://www.chromium.org/")})};
autofill::AutofillClient::UploadSaveCardPromptCallback callback;
CWVCreditCardSaver* credit_card_saver =
[[CWVCreditCardSaver alloc] initWithCreditCard:credit_card
saveOptions:options
legalMessageLines:legal_message_lines
savePromptCallback:std::move(callback)];
EXPECT_EQ(credit_card, *credit_card_saver.creditCard.internalCard);
ASSERT_EQ(1U, credit_card_saver.legalMessages.count);
NSAttributedString* legal_message =
credit_card_saver.legalMessages.firstObject;
EXPECT_NSEQ(@"Test line 1", legal_message.string);
NSRange range;
id link = [legal_message attribute:NSLinkAttributeName
atIndex:5
effectiveRange:&range];
EXPECT_NSEQ([NSURL URLWithString:@"http://www.chromium.org/"], link);
EXPECT_TRUE(NSEqualRanges(NSMakeRange(5, 4), range));
}
// Tests when user ignores credit card save.
TEST_F(CWVCreditCardSaverTest, Ignore) {
autofill::CreditCard credit_card = autofill::test::GetCreditCard();
autofill::AutofillClient::SaveCreditCardOptions options;
BOOL callback_called = NO;
autofill::AutofillClient::UploadSaveCardPromptCallback callback =
base::BindLambdaForTesting(
[&](autofill::AutofillClient::SaveCardOfferUserDecision decision,
const autofill::AutofillClient::UserProvidedCardDetails&
user_provided_card_details) {
callback_called = YES;
EXPECT_EQ(autofill::AutofillClient::IGNORED, decision);
});
CWVCreditCardSaver* credit_card_saver =
[[CWVCreditCardSaver alloc] initWithCreditCard:credit_card
saveOptions:options
legalMessageLines:{}
savePromptCallback:std::move(callback)];
// Force -[CWVCreditCardSaver dealloc].
credit_card_saver = nil;
EXPECT_TRUE(callback_called);
}
// Tests when user declines a save.
TEST_F(CWVCreditCardSaverTest, Decline) {
autofill::CreditCard credit_card = autofill::test::GetCreditCard();
autofill::AutofillClient::SaveCreditCardOptions options;
autofill::AutofillClient::LocalSaveCardPromptCallback local_callback;
BOOL callback_called = NO;
autofill::AutofillClient::UploadSaveCardPromptCallback callback =
base::BindLambdaForTesting(
[&](autofill::AutofillClient::SaveCardOfferUserDecision decision,
const autofill::AutofillClient::UserProvidedCardDetails&
user_provided_card_details) {
callback_called = YES;
EXPECT_EQ(autofill::AutofillClient::DECLINED, decision);
});
CWVCreditCardSaver* credit_card_saver =
[[CWVCreditCardSaver alloc] initWithCreditCard:credit_card
saveOptions:options
legalMessageLines:{}
savePromptCallback:std::move(callback)];
[credit_card_saver decline];
EXPECT_TRUE(callback_called);
}
// Tests when user accepts a save.
TEST_F(CWVCreditCardSaverTest, Accept) {
autofill::CreditCard credit_card = autofill::test::GetCreditCard();
autofill::AutofillClient::SaveCreditCardOptions options;
BOOL callback_called = NO;
autofill::AutofillClient::UploadSaveCardPromptCallback callback =
base::BindLambdaForTesting(
[&](autofill::AutofillClient::SaveCardOfferUserDecision decision,
const autofill::AutofillClient::UserProvidedCardDetails&
user_provided_card_details) {
callback_called = YES;
EXPECT_EQ(autofill::AutofillClient::ACCEPTED, decision);
EXPECT_EQ(u"John Doe", user_provided_card_details.cardholder_name);
EXPECT_EQ(u"08", user_provided_card_details.expiration_date_month);
EXPECT_EQ(u"2021", user_provided_card_details.expiration_date_year);
});
CWVCreditCardSaver* credit_card_saver =
[[CWVCreditCardSaver alloc] initWithCreditCard:credit_card
saveOptions:options
legalMessageLines:{}
savePromptCallback:std::move(callback)];
BOOL risk_data_used = NO;
[credit_card_saver loadRiskData:base::BindLambdaForTesting(
[&](const std::string& risk_data) {
EXPECT_EQ(risk_data, "dummy-risk-data");
risk_data_used = YES;
})];
__block BOOL completion_called = NO;
[credit_card_saver acceptWithCardHolderFullName:@"John Doe"
expirationMonth:@"08"
expirationYear:@"2021"
riskData:@"dummy-risk-data"
completionHandler:^(BOOL cardSaved) {
EXPECT_TRUE(cardSaved);
completion_called = YES;
}];
[credit_card_saver handleCreditCardUploadCompleted:YES];
EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForActionTimeout, ^bool {
base::RunLoop().RunUntilIdle();
return completion_called;
}));
EXPECT_TRUE(risk_data_used);
EXPECT_TRUE(callback_called);
}
} // namespace ios_web_view