| // Copyright 2013 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/prefs/pref_service.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/ui/autofill/account_chooser_model.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/autofill/core/browser/autofill_metrics.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace autofill { |
| |
| namespace { |
| |
| class TestAccountChooserModel : public AccountChooserModel { |
| public: |
| TestAccountChooserModel(AccountChooserModelDelegate* delegate, |
| Profile* profile, |
| bool disable_wallet, |
| const AutofillMetrics& metric_logger) |
| : AccountChooserModel(delegate, profile, disable_wallet, metric_logger) {} |
| virtual ~TestAccountChooserModel() {} |
| |
| using AccountChooserModel::kWalletAccountsStartId; |
| using AccountChooserModel::kWalletAddAccountId; |
| using AccountChooserModel::kAutofillItemId; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TestAccountChooserModel); |
| }; |
| |
| class MockAccountChooserModelDelegate : public AccountChooserModelDelegate { |
| public: |
| MockAccountChooserModelDelegate() {} |
| virtual ~MockAccountChooserModelDelegate() {} |
| |
| MOCK_METHOD0(AccountChooserWillShow, void()); |
| MOCK_METHOD0(AccountChoiceChanged, void()); |
| MOCK_METHOD0(AddAccount, void()); |
| MOCK_METHOD0(UpdateAccountChooserView, void()); |
| }; |
| |
| class AccountChooserModelTest : public testing::Test { |
| public: |
| AccountChooserModelTest() |
| : model_(&delegate_, &profile_, false, metric_logger_) {} |
| virtual ~AccountChooserModelTest() {} |
| |
| TestingProfile* profile() { return &profile_; } |
| MockAccountChooserModelDelegate* delegate() { return &delegate_; } |
| TestAccountChooserModel* model() { return &model_; } |
| const AutofillMetrics& metric_logger() { return metric_logger_; } |
| |
| private: |
| TestingProfile profile_; |
| testing::NiceMock<MockAccountChooserModelDelegate> delegate_; |
| TestAccountChooserModel model_; |
| AutofillMetrics metric_logger_; |
| }; |
| |
| } // namespace |
| |
| TEST_F(AccountChooserModelTest, ObeysPref) { |
| // When "Pay without wallet" is false, use Wallet by default. |
| { |
| profile()->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, false); |
| TestAccountChooserModel model(delegate(), |
| profile(), |
| false, |
| metric_logger()); |
| EXPECT_TRUE(model.WalletIsSelected()); |
| } |
| // When the user chose to "Pay without wallet", use Autofill. |
| { |
| profile()->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, true); |
| TestAccountChooserModel model(delegate(), |
| profile(), |
| false, |
| metric_logger()); |
| EXPECT_FALSE(model.WalletIsSelected()); |
| } |
| // When the |disable_wallet| argument is true, use Autofill regardless |
| // of the pref. |
| { |
| profile()->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, false); |
| TestAccountChooserModel model(delegate(), profile(), true, metric_logger()); |
| EXPECT_FALSE(model.WalletIsSelected()); |
| } |
| // In incognito, use local data regardless of the pref. |
| { |
| TestingProfile::Builder builder; |
| builder.SetIncognito(); |
| scoped_ptr<TestingProfile> incognito = builder.Build(); |
| incognito->SetOriginalProfile(profile()); |
| profile()->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, false); |
| incognito->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, false); |
| |
| TestAccountChooserModel model(delegate(), |
| incognito.get(), |
| false, |
| metric_logger()); |
| EXPECT_FALSE(model.WalletIsSelected()); |
| } |
| } |
| |
| TEST_F(AccountChooserModelTest, IgnoresPrefChanges) { |
| ASSERT_FALSE(profile()->GetPrefs()->GetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet)); |
| EXPECT_TRUE(model()->WalletIsSelected()); |
| |
| // Check that nothing changes while this dialog is running if a pref changes |
| // (this could cause subtle bugs or annoyances if a user closes another |
| // running dialog). |
| profile()->GetPrefs()->SetBoolean( |
| ::prefs::kAutofillDialogPayWithoutWallet, true); |
| EXPECT_TRUE(model()->WalletIsSelected()); |
| } |
| |
| TEST_F(AccountChooserModelTest, HandlesError) { |
| EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(1); |
| EXPECT_CALL(*delegate(), UpdateAccountChooserView()).Times(1); |
| |
| ASSERT_TRUE(model()->WalletIsSelected()); |
| ASSERT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| |
| model()->SetHadWalletError(); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| EXPECT_FALSE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| } |
| |
| TEST_F(AccountChooserModelTest, HandlesSigninError) { |
| EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(1); |
| EXPECT_CALL(*delegate(), UpdateAccountChooserView()).Times(2); |
| |
| // 0. "Unknown" wallet account, we don't know if the user is signed-in yet. |
| ASSERT_TRUE(model()->WalletIsSelected()); |
| ASSERT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| ASSERT_TRUE(model()->WalletIsSelected()); |
| ASSERT_FALSE(model()->HasAccountsToChoose()); |
| ASSERT_EQ(3, model()->GetItemCount()); |
| EXPECT_EQ(base::string16(), model()->GetActiveWalletAccountName()); |
| |
| // 1. "Known" wallet account (e.g. after active/passive/automatic sign-in). |
| // Calls UpdateAccountChooserView. |
| std::vector<std::string> accounts; |
| accounts.push_back("john.doe@gmail.com"); |
| model()->SetWalletAccounts(accounts, 0U); |
| ASSERT_TRUE(model()->WalletIsSelected()); |
| ASSERT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| ASSERT_TRUE(model()->WalletIsSelected()); |
| ASSERT_TRUE(model()->HasAccountsToChoose()); |
| EXPECT_EQ(3, model()->GetItemCount()); |
| EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName()); |
| |
| // 2. Sign-in failure. |
| // Autofill data should be selected and be the only valid choice. |
| // Calls UpdateAccountChooserView. |
| // Calls AccountChoiceChanged. |
| model()->SetHadWalletSigninError(); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| EXPECT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| EXPECT_FALSE(model()->HasAccountsToChoose()); |
| EXPECT_EQ(2, model()->GetItemCount()); |
| EXPECT_EQ(base::string16(), model()->GetActiveWalletAccountName()); |
| } |
| |
| TEST_F(AccountChooserModelTest, RespectsUserChoice) { |
| EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(2); |
| |
| model()->ExecuteCommand(TestAccountChooserModel::kAutofillItemId, 0); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| |
| EXPECT_CALL(*delegate(), AddAccount()); |
| model()->ExecuteCommand(TestAccountChooserModel::kWalletAddAccountId, 0); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| |
| model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId, 0); |
| EXPECT_TRUE(model()->WalletIsSelected()); |
| } |
| |
| TEST_F(AccountChooserModelTest, HandlesMultipleAccounts) { |
| EXPECT_FALSE(model()->HasAccountsToChoose()); |
| |
| std::vector<std::string> accounts; |
| accounts.push_back("john.doe@gmail.com"); |
| accounts.push_back("jane.smith@gmail.com"); |
| model()->SetWalletAccounts(accounts, 0U); |
| EXPECT_TRUE(model()->HasAccountsToChoose()); |
| EXPECT_TRUE(model()->WalletIsSelected()); |
| ASSERT_EQ(4, model()->GetItemCount()); |
| EXPECT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId)); |
| EXPECT_TRUE(model()->IsCommandIdEnabled( |
| TestAccountChooserModel::kWalletAccountsStartId + 1)); |
| EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName()); |
| model()->SetWalletAccounts(accounts, 1U); |
| EXPECT_EQ(ASCIIToUTF16(accounts[1]), model()->GetActiveWalletAccountName()); |
| |
| model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId, 0); |
| EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName()); |
| model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId + 1, |
| 0); |
| EXPECT_EQ(ASCIIToUTF16(accounts[1]), model()->GetActiveWalletAccountName()); |
| |
| // Setting the wallet accounts forces the switch to wallet. |
| model()->ExecuteCommand(TestAccountChooserModel::kAutofillItemId, 0); |
| EXPECT_FALSE(model()->WalletIsSelected()); |
| model()->SetWalletAccounts(accounts, 1U); |
| EXPECT_TRUE(model()->WalletIsSelected()); |
| } |
| |
| } // namespace autofill |