1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/autofill/account_chooser_model.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_metrics.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestAccountChooserModel : public AccountChooserModel {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestAccountChooserModel(AccountChooserModelDelegate* delegate,
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                          Profile* profile,
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          bool disable_wallet,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const AutofillMetrics& metric_logger)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : AccountChooserModel(delegate, profile, disable_wallet, metric_logger) {}
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TestAccountChooserModel() {}
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  using AccountChooserModel::kWalletAccountsStartId;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  using AccountChooserModel::kWalletAddAccountId;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  using AccountChooserModel::kAutofillItemId;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestAccountChooserModel);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockAccountChooserModelDelegate : public AccountChooserModelDelegate {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockAccountChooserModelDelegate() {}
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~MockAccountChooserModelDelegate() {}
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD0(AccountChoiceChanged, void());
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MOCK_METHOD0(AddAccount, void());
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MOCK_METHOD0(UpdateAccountChooserView, void());
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AccountChooserModelTest : public testing::Test {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AccountChooserModelTest()
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : model_(&delegate_, &profile_, false, metric_logger_) {}
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~AccountChooserModelTest() {}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  TestingProfile* profile() { return &profile_; }
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockAccountChooserModelDelegate* delegate() { return &delegate_; }
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestAccountChooserModel* model() { return &model_; }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const AutofillMetrics& metric_logger() { return metric_logger_; }
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestingProfile profile_;
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  testing::NiceMock<MockAccountChooserModelDelegate> delegate_;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestAccountChooserModel model_;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics metric_logger_;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AccountChooserModelTest, ObeysPref) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When "Pay without wallet" is false, use Wallet by default.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    profile()->GetPrefs()->SetBoolean(
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet, false);
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestAccountChooserModel model(delegate(),
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  profile(),
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  false,
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  metric_logger());
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(model.WalletIsSelected());
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When the user chose to "Pay without wallet", use Autofill.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    profile()->GetPrefs()->SetBoolean(
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet, true);
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestAccountChooserModel model(delegate(),
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  profile(),
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  false,
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  metric_logger());
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(model.WalletIsSelected());
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // When the |disable_wallet| argument is true, use Autofill regardless
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // of the pref.
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    profile()->GetPrefs()->SetBoolean(
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet, false);
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestAccountChooserModel model(delegate(), profile(), true, metric_logger());
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_FALSE(model.WalletIsSelected());
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // In incognito, use local data regardless of the pref.
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  {
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    TestingProfile::Builder builder;
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    builder.SetIncognito();
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<TestingProfile> incognito = builder.Build();
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    incognito->SetOriginalProfile(profile());
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    profile()->GetPrefs()->SetBoolean(
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet, false);
1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    incognito->GetPrefs()->SetBoolean(
1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet, false);
1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestAccountChooserModel model(delegate(),
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  incognito.get(),
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  false,
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  metric_logger());
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(model.WalletIsSelected());
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AccountChooserModelTest, IgnoresPrefChanges) {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(profile()->GetPrefs()->GetBoolean(
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ::prefs::kAutofillDialogPayWithoutWallet));
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(model()->WalletIsSelected());
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that nothing changes while this dialog is running if a pref changes
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // (this could cause subtle bugs or annoyances if a user closes another
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // running dialog).
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile()->GetPrefs()->SetBoolean(
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ::prefs::kAutofillDialogPayWithoutWallet, true);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(model()->WalletIsSelected());
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AccountChooserModelTest, HandlesError) {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(1);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*delegate(), UpdateAccountChooserView()).Times(1);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->WalletIsSelected());
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->IsCommandIdEnabled(
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  model()->SetHadWalletError();
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(model()->IsCommandIdEnabled(
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AccountChooserModelTest, HandlesSigninError) {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(1);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*delegate(), UpdateAccountChooserView()).Times(2);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // 0. "Unknown" wallet account, we don't know if the user is signed-in yet.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->WalletIsSelected());
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->IsCommandIdEnabled(
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(model()->WalletIsSelected());
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(model()->HasAccountsToChoose());
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3, model()->GetItemCount());
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), model()->GetActiveWalletAccountName());
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // 1. "Known" wallet account (e.g. after active/passive/automatic sign-in).
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calls UpdateAccountChooserView.
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> accounts;
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  accounts.push_back("john.doe@gmail.com");
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->SetWalletAccounts(accounts, 0U);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->WalletIsSelected());
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->IsCommandIdEnabled(
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(model()->WalletIsSelected());
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(model()->HasAccountsToChoose());
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, model()->GetItemCount());
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName());
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // 2. Sign-in failure.
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Autofill data should be selected and be the only valid choice.
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calls UpdateAccountChooserView.
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calls AccountChoiceChanged.
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  model()->SetHadWalletSigninError();
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(model()->IsCommandIdEnabled(
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(model()->HasAccountsToChoose());
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, model()->GetItemCount());
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), model()->GetActiveWalletAccountName());
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AccountChooserModelTest, RespectsUserChoice) {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*delegate(), AccountChoiceChanged()).Times(2);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kAutofillItemId, 0);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*delegate(), AddAccount());
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kWalletAddAccountId, 0);
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId, 0);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(model()->WalletIsSelected());
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(AccountChooserModelTest, HandlesMultipleAccounts) {
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(model()->HasAccountsToChoose());
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> accounts;
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  accounts.push_back("john.doe@gmail.com");
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  accounts.push_back("jane.smith@gmail.com");
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->SetWalletAccounts(accounts, 0U);
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(model()->HasAccountsToChoose());
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(model()->WalletIsSelected());
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(4, model()->GetItemCount());
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(model()->IsCommandIdEnabled(
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId));
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(model()->IsCommandIdEnabled(
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TestAccountChooserModel::kWalletAccountsStartId + 1));
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName());
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->SetWalletAccounts(accounts, 1U);
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(accounts[1]), model()->GetActiveWalletAccountName());
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId, 0);
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(accounts[0]), model()->GetActiveWalletAccountName());
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kWalletAccountsStartId + 1,
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          0);
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(accounts[1]), model()->GetActiveWalletAccountName());
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Setting the wallet accounts forces the switch to wallet.
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->ExecuteCommand(TestAccountChooserModel::kAutofillItemId, 0);
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(model()->WalletIsSelected());
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  model()->SetWalletAccounts(accounts, 1U);
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(model()->WalletIsSelected());
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
228