Adding instrumentation to locate the source of jankiness
[chromium-blink-merge.git] / chrome / browser / ui / autofill / autofill_dialog_controller_unittest.cc
blob3c11a9c68deb231047c2cd8eeaea47d75be1d919
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include <map>
6 #include <utility>
8 #include "base/basictypes.h"
9 #include "base/bind.h"
10 #include "base/bind_helpers.h"
11 #include "base/callback.h"
12 #include "base/command_line.h"
13 #include "base/guid.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/message_loop/message_loop.h"
16 #include "base/prefs/pref_service.h"
17 #include "base/run_loop.h"
18 #include "base/strings/string_number_conversions.h"
19 #include "base/strings/string_piece.h"
20 #include "base/strings/utf_string_conversions.h"
21 #include "base/tuple.h"
22 #include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
23 #include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h"
24 #include "chrome/browser/ui/autofill/autofill_dialog_view.h"
25 #include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h"
26 #include "chrome/browser/ui/autofill/mock_address_validator.h"
27 #include "chrome/browser/ui/autofill/mock_new_credit_card_bubble_controller.h"
28 #include "chrome/browser/ui/autofill/test_generated_credit_card_bubble_controller.h"
29 #include "chrome/browser/webdata/web_data_service_factory.h"
30 #include "chrome/common/chrome_switches.h"
31 #include "chrome/common/pref_names.h"
32 #include "chrome/common/render_messages.h"
33 #include "chrome/grit/generated_resources.h"
34 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
35 #include "chrome/test/base/scoped_testing_local_state.h"
36 #include "chrome/test/base/testing_browser_process.h"
37 #include "chrome/test/base/testing_profile.h"
38 #include "components/autofill/content/browser/risk/proto/fingerprint.pb.h"
39 #include "components/autofill/content/browser/wallet/full_wallet.h"
40 #include "components/autofill/content/browser/wallet/gaia_account.h"
41 #include "components/autofill/content/browser/wallet/instrument.h"
42 #include "components/autofill/content/browser/wallet/mock_wallet_client.h"
43 #include "components/autofill/content/browser/wallet/wallet_address.h"
44 #include "components/autofill/content/browser/wallet/wallet_service_url.h"
45 #include "components/autofill/content/browser/wallet/wallet_test_util.h"
46 #include "components/autofill/core/browser/autofill_metrics.h"
47 #include "components/autofill/core/browser/autofill_test_utils.h"
48 #include "components/autofill/core/browser/test_personal_data_manager.h"
49 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
50 #include "components/autofill/core/common/autofill_switches.h"
51 #include "components/autofill/core/common/form_data.h"
52 #include "components/user_prefs/user_prefs.h"
53 #include "content/public/browser/web_contents.h"
54 #include "content/public/test/mock_render_process_host.h"
55 #include "google_apis/gaia/google_service_auth_error.h"
56 #include "grit/components_scaled_resources.h"
57 #include "grit/components_strings.h"
58 #include "testing/gmock/include/gmock/gmock.h"
59 #include "testing/gtest/include/gtest/gtest.h"
60 #include "third_party/libaddressinput/chromium/chrome_address_validator.h"
61 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h"
62 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_problem.h"
63 #include "ui/base/l10n/l10n_util.h"
64 #include "ui/base/resource/resource_bundle.h"
66 #if defined(OS_WIN)
67 #include "ui/base/win/scoped_ole_initializer.h"
68 #endif
70 using base::ASCIIToUTF16;
71 using base::UTF8ToUTF16;
73 namespace autofill {
75 namespace {
77 using ::i18n::addressinput::FieldProblemMap;
78 using testing::AtLeast;
79 using testing::DoAll;
80 using testing::Return;
81 using testing::SetArgPointee;
82 using testing::_;
84 const char kSourceUrl[] = "http://localbike.shop";
85 const char kFakeEmail[] = "user@chromium.org";
86 const char kFakeFingerprintEncoded[] = "CgVaAwiACA==";
87 const char kEditedBillingAddress[] = "123 edited billing address";
88 const char* kFieldsFromPage[] =
89 { "email",
90 "cc-name",
91 "cc-number",
92 "cc-exp-month",
93 "cc-exp-year",
94 "cc-csc",
95 "billing name",
96 "billing address-line1",
97 "billing address-level2",
98 "billing address-level1",
99 "billing postal-code",
100 "billing country",
101 "billing tel",
102 "shipping name",
103 "shipping address-line1",
104 "shipping address-level2",
105 "shipping address-level1",
106 "shipping postal-code",
107 "shipping country",
108 "shipping tel",
110 const char kSettingsOrigin[] = "Chrome settings";
111 const char kTestCCNumberAmex[] = "376200000000002";
112 const char kTestCCNumberVisa[] = "4111111111111111";
113 const char kTestCCNumberMaster[] = "5555555555554444";
114 const char kTestCCNumberDiscover[] = "6011111111111117";
115 const char kTestCCNumberIncomplete[] = "4111111111";
116 // Credit card number fails Luhn check.
117 const char kTestCCNumberInvalid[] = "4111111111111112";
119 // Copies the initial values from |inputs| into |outputs|.
120 void CopyInitialValues(const DetailInputs& inputs, FieldValueMap* outputs) {
121 for (size_t i = 0; i < inputs.size(); ++i) {
122 const DetailInput& input = inputs[i];
123 (*outputs)[input.type] = input.initial_value;
127 scoped_ptr<wallet::WalletItems> CompleteAndValidWalletItems() {
128 scoped_ptr<wallet::WalletItems> items =
129 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
130 items->AddAccount(wallet::GetTestGaiaAccount());
131 items->AddInstrument(wallet::GetTestMaskedInstrument());
132 items->AddAddress(wallet::GetTestShippingAddress());
133 return items.Pass();
136 scoped_ptr<risk::Fingerprint> GetFakeFingerprint() {
137 scoped_ptr<risk::Fingerprint> fingerprint(new risk::Fingerprint());
138 // Add some data to the proto, else the encoded content is empty.
139 fingerprint->mutable_machine_characteristics()->mutable_screen_size()->
140 set_width(1024);
141 return fingerprint.Pass();
144 bool HasAnyError(const ValidityMessages& messages, ServerFieldType field) {
145 return !messages.GetMessageOrDefault(field).text.empty();
148 bool HasUnsureError(const ValidityMessages& messages, ServerFieldType field) {
149 const ValidityMessage& message = messages.GetMessageOrDefault(field);
150 return !message.text.empty() && !message.sure;
153 class TestAutofillDialogView : public AutofillDialogView {
154 public:
155 TestAutofillDialogView()
156 : updates_started_(0), save_details_locally_checked_(true) {}
157 virtual ~TestAutofillDialogView() {}
159 virtual void Show() override {}
160 virtual void Hide() override {}
162 virtual void UpdatesStarted() override {
163 updates_started_++;
166 virtual void UpdatesFinished() override {
167 updates_started_--;
168 EXPECT_GE(updates_started_, 0);
171 virtual void UpdateNotificationArea() override {
172 EXPECT_GE(updates_started_, 1);
175 virtual void UpdateAccountChooser() override {
176 EXPECT_GE(updates_started_, 1);
179 virtual void UpdateButtonStrip() override {
180 EXPECT_GE(updates_started_, 1);
183 virtual void UpdateOverlay() override {
184 EXPECT_GE(updates_started_, 1);
187 virtual void UpdateDetailArea() override {
188 EXPECT_GE(updates_started_, 1);
191 virtual void UpdateSection(DialogSection section) override {
192 section_updates_[section]++;
193 EXPECT_GE(updates_started_, 1);
196 virtual void UpdateErrorBubble() override {
197 EXPECT_GE(updates_started_, 1);
200 virtual void FillSection(DialogSection section,
201 ServerFieldType originating_type) override {}
202 virtual void GetUserInput(DialogSection section, FieldValueMap* output)
203 override {
204 *output = outputs_[section];
207 virtual base::string16 GetCvc() override { return base::string16(); }
209 virtual bool SaveDetailsLocally() override {
210 return save_details_locally_checked_;
213 virtual const content::NavigationController* ShowSignIn() override {
214 return NULL;
216 virtual void HideSignIn() override {}
218 MOCK_METHOD0(ModelChanged, void());
219 MOCK_METHOD0(UpdateForErrors, void());
221 virtual void OnSignInResize(const gfx::Size& pref_size) override {}
222 virtual void ValidateSection(DialogSection) override {}
224 void SetUserInput(DialogSection section, const FieldValueMap& map) {
225 outputs_[section] = map;
228 void CheckSaveDetailsLocallyCheckbox(bool checked) {
229 save_details_locally_checked_ = checked;
232 void ClearSectionUpdates() {
233 section_updates_.clear();
236 std::map<DialogSection, size_t> section_updates() const {
237 return section_updates_;
240 private:
241 std::map<DialogSection, FieldValueMap> outputs_;
242 std::map<DialogSection, size_t> section_updates_;
244 int updates_started_;
245 bool save_details_locally_checked_;
247 DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogView);
250 class TestAutofillDialogController
251 : public AutofillDialogControllerImpl,
252 public base::SupportsWeakPtr<TestAutofillDialogController> {
253 public:
254 TestAutofillDialogController(
255 content::WebContents* contents,
256 const FormData& form_structure,
257 const GURL& source_url,
258 const AutofillMetrics& metric_logger,
259 const AutofillClient::ResultCallback& callback,
260 MockNewCreditCardBubbleController* mock_new_card_bubble_controller)
261 : AutofillDialogControllerImpl(contents,
262 form_structure,
263 source_url,
264 callback),
265 metric_logger_(metric_logger),
266 mock_wallet_client_(
267 Profile::FromBrowserContext(contents->GetBrowserContext())
268 ->GetRequestContext(),
269 this,
270 source_url),
271 mock_new_card_bubble_controller_(mock_new_card_bubble_controller),
272 submit_button_delay_count_(0) {}
274 virtual ~TestAutofillDialogController() {}
276 virtual AutofillDialogView* CreateView() override {
277 return new testing::NiceMock<TestAutofillDialogView>();
280 void Init(content::BrowserContext* browser_context) {
281 test_manager_.Init(
282 WebDataServiceFactory::GetAutofillWebDataForProfile(
283 Profile::FromBrowserContext(browser_context),
284 Profile::EXPLICIT_ACCESS),
285 user_prefs::UserPrefs::Get(browser_context),
286 browser_context->IsOffTheRecord());
289 TestAutofillDialogView* GetView() {
290 return static_cast<TestAutofillDialogView*>(view());
293 TestPersonalDataManager* GetTestingManager() {
294 return &test_manager_;
297 MockAddressValidator* GetMockValidator() {
298 return &mock_validator_;
301 wallet::MockWalletClient* GetTestingWalletClient() {
302 return &mock_wallet_client_;
305 const GURL& open_tab_url() { return open_tab_url_; }
307 void SimulateSigninError() {
308 OnWalletSigninError();
311 // Skips past the 2 second wait between FinishSubmit and DoFinishSubmit.
312 void ForceFinishSubmit() {
313 DoFinishSubmit();
316 void SimulateSubmitButtonDelayBegin() {
317 AutofillDialogControllerImpl::SubmitButtonDelayBegin();
320 void SimulateSubmitButtonDelayEnd() {
321 AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting();
324 using AutofillDialogControllerImpl::
325 ClearLastWalletItemsFetchTimestampForTesting;
327 // Returns the number of times that the submit button was delayed.
328 int get_submit_button_delay_count() const {
329 return submit_button_delay_count_;
332 MOCK_METHOD0(LoadRiskFingerprintData, void());
333 using AutofillDialogControllerImpl::AccountChooserModelForTesting;
334 using AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData;
335 using AutofillDialogControllerImpl::IsEditingExistingData;
336 using AutofillDialogControllerImpl::IsManuallyEditingSection;
337 using AutofillDialogControllerImpl::IsPayingWithWallet;
338 using AutofillDialogControllerImpl::IsSubmitPausedOn;
339 using AutofillDialogControllerImpl::NOT_CHECKED;
340 using AutofillDialogControllerImpl::popup_input_type;
341 using AutofillDialogControllerImpl::SignedInState;
343 protected:
344 virtual PersonalDataManager* GetManager() const override {
345 return const_cast<TestAutofillDialogController*>(this)->
346 GetTestingManager();
349 virtual AddressValidator* GetValidator() override {
350 return &mock_validator_;
353 virtual wallet::WalletClient* GetWalletClient() override {
354 return &mock_wallet_client_;
357 virtual void OpenTabWithUrl(const GURL& url) override {
358 open_tab_url_ = url;
361 virtual void ShowNewCreditCardBubble(
362 scoped_ptr<CreditCard> new_card,
363 scoped_ptr<AutofillProfile> billing_profile) override {
364 mock_new_card_bubble_controller_->Show(new_card.Pass(),
365 billing_profile.Pass());
368 // AutofillDialogControllerImpl calls this method before showing the dialog
369 // window.
370 virtual void SubmitButtonDelayBegin() override {
371 // Do not delay enabling the submit button in testing.
372 submit_button_delay_count_++;
375 private:
376 // To specify our own metric logger.
377 virtual const AutofillMetrics& GetMetricLogger() const override {
378 return metric_logger_;
381 const AutofillMetrics& metric_logger_;
382 TestPersonalDataManager test_manager_;
383 testing::NiceMock<wallet::MockWalletClient> mock_wallet_client_;
385 // A mock validator object to prevent network requests and track when
386 // validation rules are loaded or validation attempts occur.
387 testing::NiceMock<MockAddressValidator> mock_validator_;
389 GURL open_tab_url_;
390 MockNewCreditCardBubbleController* mock_new_card_bubble_controller_;
392 // The number of times that the submit button was delayed.
393 int submit_button_delay_count_;
395 DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController);
398 class AutofillDialogControllerTest : public ChromeRenderViewHostTestHarness {
399 protected:
400 AutofillDialogControllerTest(): form_structure_(NULL) {}
402 // testing::Test implementation:
403 virtual void SetUp() override {
404 ChromeRenderViewHostTestHarness::SetUp();
405 Reset();
408 virtual void TearDown() override {
409 if (controller_)
410 controller_->ViewClosed();
411 ChromeRenderViewHostTestHarness::TearDown();
414 void Reset() {
415 if (controller_)
416 controller_->ViewClosed();
418 test_generated_bubble_controller_ =
419 new testing::NiceMock<TestGeneratedCreditCardBubbleController>(
420 web_contents());
421 ASSERT_TRUE(test_generated_bubble_controller_->IsInstalled());
423 mock_new_card_bubble_controller_.reset(
424 new MockNewCreditCardBubbleController);
426 profile()->GetPrefs()->ClearPref(::prefs::kAutofillDialogSaveData);
428 // We have to clear the old local state before creating a new one.
429 scoped_local_state_.reset();
430 scoped_local_state_.reset(new ScopedTestingLocalState(
431 TestingBrowserProcess::GetGlobal()));
433 SetUpControllerWithFormData(DefaultFormData());
436 FormData DefaultFormData() {
437 FormData form_data;
438 for (size_t i = 0; i < arraysize(kFieldsFromPage); ++i) {
439 FormFieldData field;
440 field.autocomplete_attribute = kFieldsFromPage[i];
441 form_data.fields.push_back(field);
443 return form_data;
446 // Creates a new controller for |form_data|.
447 void ResetControllerWithFormData(const FormData& form_data) {
448 if (controller_)
449 controller_->ViewClosed();
451 AutofillClient::ResultCallback callback =
452 base::Bind(&AutofillDialogControllerTest::FinishedCallback,
453 base::Unretained(this));
454 controller_ = (new testing::NiceMock<TestAutofillDialogController>(
455 web_contents(),
456 form_data,
457 GURL(kSourceUrl),
458 metric_logger_,
459 callback,
460 mock_new_card_bubble_controller_.get()))->AsWeakPtr();
461 controller_->Init(profile());
464 // Creates a new controller for |form_data| and sets up some initial wallet
465 // data for it.
466 void SetUpControllerWithFormData(const FormData& form_data) {
467 ResetControllerWithFormData(form_data);
468 controller()->Show();
469 if (controller() &&
470 !profile()->GetPrefs()->GetBoolean(
471 ::prefs::kAutofillDialogPayWithoutWallet)) {
472 EXPECT_CALL(*controller()->GetTestingWalletClient(),
473 GetWalletItems(_, _));
474 controller()->OnDidFetchWalletCookieValue(std::string());
475 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
479 // Fills the inputs in SECTION_CC with data.
480 void FillCreditCardInputs() {
481 FieldValueMap cc_outputs;
482 const DetailInputs& cc_inputs =
483 controller()->RequestedFieldsForSection(SECTION_CC);
484 for (size_t i = 0; i < cc_inputs.size(); ++i) {
485 cc_outputs[cc_inputs[i].type] = cc_inputs[i].type == CREDIT_CARD_NUMBER ?
486 ASCIIToUTF16(kTestCCNumberVisa) : ASCIIToUTF16("11");
488 controller()->GetView()->SetUserInput(SECTION_CC, cc_outputs);
491 // Fills the inputs in SECTION_CC_BILLING with valid data.
492 void FillCCBillingInputs() {
493 FieldValueMap outputs;
494 const DetailInputs& inputs =
495 controller()->RequestedFieldsForSection(SECTION_CC_BILLING);
496 AutofillProfile full_profile(test::GetVerifiedProfile());
497 CreditCard full_card(test::GetCreditCard());
498 for (size_t i = 0; i < inputs.size(); ++i) {
499 const ServerFieldType type = inputs[i].type;
500 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US");
502 if (outputs[type].empty())
503 outputs[type] = full_card.GetInfo(AutofillType(type), "en-US");
505 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
508 // Activates the 'Add new foo' option from the |section|'s suggestions
509 // dropdown and fills the |section|'s inputs with the data from the
510 // |data_model|. If |section| is SECTION_CC, also fills in '123' for the CVC.
511 void FillInputs(DialogSection section, const AutofillDataModel& data_model) {
512 // Select the 'Add new foo' option.
513 ui::MenuModel* model = GetMenuModelForSection(section);
514 if (model)
515 model->ActivatedAt(model->GetItemCount() - 2);
517 // Fill the inputs.
518 FieldValueMap outputs;
519 const DetailInputs& inputs =
520 controller()->RequestedFieldsForSection(section);
521 for (size_t i = 0; i < inputs.size(); ++i) {
522 ServerFieldType type = inputs[i].type;
523 base::string16 output;
524 if (type == CREDIT_CARD_VERIFICATION_CODE)
525 output = ASCIIToUTF16("123");
526 else
527 output = data_model.GetInfo(AutofillType(type), "en-US");
528 outputs[inputs[i].type] = output;
530 controller()->GetView()->SetUserInput(section, outputs);
533 std::vector<DialogNotification> NotificationsOfType(
534 DialogNotification::Type type) {
535 std::vector<DialogNotification> right_type;
536 const std::vector<DialogNotification>& notifications =
537 controller()->CurrentNotifications();
538 for (size_t i = 0; i < notifications.size(); ++i) {
539 if (notifications[i].type() == type)
540 right_type.push_back(notifications[i]);
542 return right_type;
545 void SwitchToAutofill() {
546 ui::MenuModel* model = controller_->MenuModelForAccountChooser();
547 model->ActivatedAt(model->GetItemCount() - 1);
550 void SwitchToWallet() {
551 controller_->MenuModelForAccountChooser()->ActivatedAt(0);
554 void SimulateSigninError() {
555 controller_->SimulateSigninError();
558 void UseBillingForShipping() {
559 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(0);
562 base::string16 ValidateCCNumber(DialogSection section,
563 const std::string& cc_number,
564 bool should_pass) {
565 FieldValueMap outputs;
566 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States");
567 outputs[CREDIT_CARD_NUMBER] = UTF8ToUTF16(cc_number);
568 ValidityMessages messages =
569 controller()->InputsAreValid(section, outputs);
570 EXPECT_EQ(should_pass, !messages.HasSureError(CREDIT_CARD_NUMBER));
571 return messages.GetMessageOrDefault(CREDIT_CARD_NUMBER).text;
574 void SubmitWithWalletItems(scoped_ptr<wallet::WalletItems> wallet_items) {
575 controller()->OnDidGetWalletItems(wallet_items.Pass());
576 AcceptAndLoadFakeFingerprint();
579 void AcceptAndLoadFakeFingerprint() {
580 controller()->OnAccept();
581 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass());
584 // Returns true if the given |section| contains a field of the given |type|.
585 bool SectionContainsField(DialogSection section, ServerFieldType type) {
586 const DetailInputs& inputs =
587 controller()->RequestedFieldsForSection(section);
588 for (DetailInputs::const_iterator it = inputs.begin(); it != inputs.end();
589 ++it) {
590 if (it->type == type)
591 return true;
593 return false;
596 SuggestionsMenuModel* GetMenuModelForSection(DialogSection section) {
597 ui::MenuModel* model = controller()->MenuModelForSection(section);
598 return static_cast<SuggestionsMenuModel*>(model);
601 void SubmitAndVerifyShippingAndBillingResults() {
602 // Test after setting use billing for shipping.
603 UseBillingForShipping();
605 controller()->OnAccept();
607 ASSERT_EQ(20U, form_structure()->field_count());
608 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
609 form_structure()->field(11)->Type().GetStorableType());
610 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(11)->Type().group());
611 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
612 form_structure()->field(18)->Type().GetStorableType());
613 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(18)->Type().group());
614 base::string16 billing_country = form_structure()->field(11)->value;
615 EXPECT_EQ(2U, billing_country.size());
616 base::string16 shipping_country = form_structure()->field(18)->value;
617 EXPECT_EQ(2U, shipping_country.size());
618 EXPECT_FALSE(billing_country.empty());
619 EXPECT_FALSE(shipping_country.empty());
620 EXPECT_EQ(billing_country, shipping_country);
622 EXPECT_EQ(CREDIT_CARD_NAME,
623 form_structure()->field(1)->Type().GetStorableType());
624 base::string16 cc_name = form_structure()->field(1)->value;
625 EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType());
626 EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group());
627 base::string16 billing_name = form_structure()->field(6)->value;
628 EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType());
629 EXPECT_EQ(NAME, form_structure()->field(13)->Type().group());
630 base::string16 shipping_name = form_structure()->field(13)->value;
632 EXPECT_FALSE(cc_name.empty());
633 EXPECT_FALSE(billing_name.empty());
634 EXPECT_FALSE(shipping_name.empty());
635 EXPECT_EQ(cc_name, billing_name);
636 EXPECT_EQ(cc_name, shipping_name);
639 TestAutofillDialogController* controller() { return controller_.get(); }
641 const FormStructure* form_structure() { return form_structure_; }
643 TestGeneratedCreditCardBubbleController* test_generated_bubble_controller() {
644 return test_generated_bubble_controller_;
647 const MockNewCreditCardBubbleController* mock_new_card_bubble_controller() {
648 return mock_new_card_bubble_controller_.get();
651 private:
652 void FinishedCallback(AutofillClient::RequestAutocompleteResult result,
653 const base::string16& debug_message,
654 const FormStructure* form_structure) {
655 form_structure_ = form_structure;
658 #if defined(OS_WIN)
659 // http://crbug.com/227221
660 ui::ScopedOleInitializer ole_initializer_;
661 #endif
663 // The controller owns itself.
664 base::WeakPtr<TestAutofillDialogController> controller_;
666 // Must outlive the controller.
667 AutofillMetrics metric_logger_;
669 // Returned when the dialog closes successfully.
670 const FormStructure* form_structure_;
672 // Used to monitor if the Autofill credit card bubble is shown. Owned by
673 // |web_contents()|.
674 TestGeneratedCreditCardBubbleController* test_generated_bubble_controller_;
676 // Used to record when new card bubbles would show. Created in |Reset()|.
677 scoped_ptr<MockNewCreditCardBubbleController>
678 mock_new_card_bubble_controller_;
680 scoped_ptr<ScopedTestingLocalState> scoped_local_state_;
683 } // namespace
685 TEST_F(AutofillDialogControllerTest, RefuseToShowWithNoAutocompleteAttributes) {
686 FormFieldData email_field;
687 email_field.name = ASCIIToUTF16("email");
688 FormFieldData cc_field;
689 cc_field.name = ASCIIToUTF16("cc");
690 FormFieldData billing_field;
691 billing_field.name = ASCIIToUTF16("billing name");
693 FormData form_data;
694 form_data.fields.push_back(email_field);
695 form_data.fields.push_back(cc_field);
696 form_data.fields.push_back(billing_field);
698 SetUpControllerWithFormData(form_data);
699 EXPECT_FALSE(controller());
702 TEST_F(AutofillDialogControllerTest, RefuseToShowWithNoCcField) {
703 FormFieldData shipping_tel;
704 shipping_tel.autocomplete_attribute = "shipping tel";
706 FormData form_data;
707 form_data.fields.push_back(shipping_tel);
709 SetUpControllerWithFormData(form_data);
710 EXPECT_FALSE(controller());
712 // Any cc- field will do.
713 FormFieldData cc_field;
714 cc_field.autocomplete_attribute = "cc-csc";
715 form_data.fields.push_back(cc_field);
717 SetUpControllerWithFormData(form_data);
718 EXPECT_TRUE(controller());
721 // Ensure the default ValidityMessage has the expected values.
722 TEST_F(AutofillDialogControllerTest, DefaultValidityMessage) {
723 ValidityMessages messages;
724 ValidityMessage message = messages.GetMessageOrDefault(UNKNOWN_TYPE);
725 EXPECT_FALSE(message.sure);
726 EXPECT_TRUE(message.text.empty());
729 // This test makes sure nothing falls over when fields are being validity-
730 // checked.
731 TEST_F(AutofillDialogControllerTest, ValidityCheck) {
732 for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
733 DialogSection section = static_cast<DialogSection>(i);
734 const DetailInputs& shipping_inputs =
735 controller()->RequestedFieldsForSection(section);
736 for (DetailInputs::const_iterator iter = shipping_inputs.begin();
737 iter != shipping_inputs.end(); ++iter) {
738 controller()->InputValidityMessage(section, iter->type, base::string16());
743 // Test for phone number validation.
744 TEST_F(AutofillDialogControllerTest, PhoneNumberValidation) {
745 // Construct FieldValueMap from existing data.
746 SwitchToAutofill();
748 for (size_t i = 0; i < 2; ++i) {
749 ServerFieldType phone = i == 0 ? PHONE_HOME_WHOLE_NUMBER :
750 PHONE_BILLING_WHOLE_NUMBER;
751 ServerFieldType address = i == 0 ? ADDRESS_HOME_COUNTRY :
752 ADDRESS_BILLING_COUNTRY;
753 DialogSection section = i == 0 ? SECTION_SHIPPING : SECTION_BILLING;
755 FieldValueMap outputs;
756 const DetailInputs& inputs =
757 controller()->RequestedFieldsForSection(section);
758 AutofillProfile full_profile(test::GetVerifiedProfile());
759 for (size_t i = 0; i < inputs.size(); ++i) {
760 const ServerFieldType type = inputs[i].type;
761 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US");
764 // Make sure country is United States.
765 outputs[address] = ASCIIToUTF16("United States");
767 // Existing data should have no errors.
768 ValidityMessages messages = controller()->InputsAreValid(section, outputs);
769 EXPECT_FALSE(HasAnyError(messages, phone));
771 // Input an empty phone number.
772 outputs[phone] = base::string16();
773 messages = controller()->InputsAreValid(section, outputs);
774 EXPECT_TRUE(HasUnsureError(messages, phone));
776 // Input an invalid phone number.
777 outputs[phone] = ASCIIToUTF16("ABC");
778 messages = controller()->InputsAreValid(section, outputs);
779 EXPECT_TRUE(messages.HasSureError(phone));
781 // Input a local phone number.
782 outputs[phone] = ASCIIToUTF16("2155546699");
783 messages = controller()->InputsAreValid(section, outputs);
784 EXPECT_FALSE(HasAnyError(messages, phone));
786 // Input an invalid local phone number.
787 outputs[phone] = ASCIIToUTF16("215554669");
788 messages = controller()->InputsAreValid(section, outputs);
789 EXPECT_TRUE(messages.HasSureError(phone));
791 // Input an international phone number.
792 outputs[phone] = ASCIIToUTF16("+33 892 70 12 39");
793 messages = controller()->InputsAreValid(section, outputs);
794 EXPECT_FALSE(HasAnyError(messages, phone));
796 // Input an invalid international phone number.
797 outputs[phone] = ASCIIToUTF16("+112333 892 70 12 39");
798 messages = controller()->InputsAreValid(section, outputs);
799 EXPECT_TRUE(messages.HasSureError(phone));
801 // Input a valid Canadian number.
802 outputs[phone] = ASCIIToUTF16("+1 506 887 1234");
803 messages = controller()->InputsAreValid(section, outputs);
804 EXPECT_FALSE(HasAnyError(messages, phone));
806 // Input a valid Canadian number without the country code.
807 outputs[phone] = ASCIIToUTF16("506 887 1234");
808 messages = controller()->InputsAreValid(section, outputs);
809 EXPECT_TRUE(HasAnyError(messages, phone));
811 // Input a valid Canadian toll-free number.
812 outputs[phone] = ASCIIToUTF16("310 1234");
813 messages = controller()->InputsAreValid(section, outputs);
814 EXPECT_TRUE(HasAnyError(messages, phone));
818 TEST_F(AutofillDialogControllerTest, ExpirationDateValidity) {
819 ui::ComboboxModel* exp_year_model =
820 controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR);
821 ui::ComboboxModel* exp_month_model =
822 controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH);
824 base::string16 default_year_value =
825 exp_year_model->GetItemAt(exp_year_model->GetDefaultIndex());
826 base::string16 default_month_value =
827 exp_month_model->GetItemAt(exp_month_model->GetDefaultIndex());
829 base::string16 other_year_value =
830 exp_year_model->GetItemAt(exp_year_model->GetItemCount() - 1);
831 base::string16 other_month_value =
832 exp_month_model->GetItemAt(exp_month_model->GetItemCount() - 1);
834 FieldValueMap outputs;
835 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States");
836 outputs[CREDIT_CARD_EXP_MONTH] = default_month_value;
837 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value;
839 // Expiration default values generate unsure validation errors (but not sure).
840 ValidityMessages messages = controller()->InputsAreValid(SECTION_CC_BILLING,
841 outputs);
842 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR));
843 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH));
845 // Expiration date with default month fails.
846 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = other_year_value;
847 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
848 EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR));
849 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH));
851 // Expiration date with default year fails.
852 outputs[CREDIT_CARD_EXP_MONTH] = other_month_value;
853 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value;
854 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
855 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR));
856 EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH));
859 TEST_F(AutofillDialogControllerTest, BillingNameValidation) {
860 // Construct FieldValueMap from AutofillProfile data.
861 SwitchToAutofill();
863 FieldValueMap outputs;
864 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States");
866 // Input an empty billing name.
867 outputs[NAME_BILLING_FULL] = base::string16();
868 ValidityMessages messages = controller()->InputsAreValid(SECTION_BILLING,
869 outputs);
870 EXPECT_TRUE(HasUnsureError(messages, NAME_BILLING_FULL));
872 // Input a non-empty billing name.
873 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob");
874 messages = controller()->InputsAreValid(SECTION_BILLING, outputs);
875 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL));
877 // Switch to Wallet which only considers names with with at least two names to
878 // be valid.
879 SwitchToWallet();
881 // Setup some wallet state.
882 scoped_ptr<wallet::WalletItems> wallet_items =
883 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
884 controller()->OnDidGetWalletItems(wallet_items.Pass());
886 // Input an empty billing name. Data source should not change this behavior.
887 outputs[NAME_BILLING_FULL] = base::string16();
888 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
889 EXPECT_TRUE(HasUnsureError(messages, NAME_BILLING_FULL));
891 // Input a one name billing name. Wallet does not currently support this.
892 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob");
893 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
894 EXPECT_TRUE(messages.HasSureError(NAME_BILLING_FULL));
896 // Input a two name billing name.
897 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob Barker");
898 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
899 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL));
901 // Input a more than two name billing name.
902 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("John Jacob Jingleheimer Schmidt"),
903 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
904 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL));
906 // Input a billing name with lots of crazy whitespace.
907 outputs[NAME_BILLING_FULL] =
908 ASCIIToUTF16(" \\n\\r John \\n Jacob Jingleheimer \\t Schmidt "),
909 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
910 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL));
913 TEST_F(AutofillDialogControllerTest, CreditCardNumberValidation) {
914 // Construct FieldValueMap from AutofillProfile data.
915 SwitchToAutofill();
917 // Should accept AMEX, Visa, Master and Discover.
918 ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true);
919 ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, true);
920 ValidateCCNumber(SECTION_CC, kTestCCNumberDiscover, true);
921 ValidateCCNumber(SECTION_CC, kTestCCNumberAmex, true);
922 ValidateCCNumber(SECTION_CC, kTestCCNumberIncomplete, false);
923 ValidateCCNumber(SECTION_CC, kTestCCNumberInvalid, false);
925 // Switch to Wallet which will not accept AMEX.
926 SwitchToWallet();
928 // Setup some wallet state on a merchant for which Wallet doesn't
929 // support AMEX.
930 controller()->OnDidGetWalletItems(
931 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED));
933 // Should accept Visa, Master and Discover, but not AMEX.
934 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberVisa, true);
935 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberMaster, true);
936 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberDiscover, true);
937 EXPECT_EQ(l10n_util::GetStringUTF16(
938 IDS_AUTOFILL_CREDIT_CARD_NOT_SUPPORTED_BY_WALLET_FOR_MERCHANT),
939 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberAmex, false));
940 EXPECT_EQ(
941 l10n_util::GetStringUTF16(
942 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER),
943 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberIncomplete, false));
944 EXPECT_EQ(
945 l10n_util::GetStringUTF16(
946 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER),
947 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberInvalid, false));
949 // Setup some wallet state on a merchant for which Wallet supports AMEX.
950 controller()->OnDidGetWalletItems(
951 wallet::GetTestWalletItems(wallet::AMEX_ALLOWED));
953 // Should accept Visa, Master, Discover, and AMEX.
954 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberVisa, true);
955 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberMaster, true);
956 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberDiscover, true);
957 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberAmex, true);
958 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberIncomplete, false);
959 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberInvalid, false);
962 TEST_F(AutofillDialogControllerTest, AutofillProfiles) {
963 SwitchToAutofill();
964 ui::MenuModel* shipping_model =
965 controller()->MenuModelForSection(SECTION_SHIPPING);
966 // Since the PersonalDataManager is empty, this should only have the
967 // "use billing", "add new" and "manage" menu items.
968 ASSERT_TRUE(shipping_model);
969 EXPECT_EQ(3, shipping_model->GetItemCount());
970 // On the other hand, the other models should be NULL when there's no
971 // suggestion.
972 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC));
973 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING));
975 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3);
977 // Empty profiles are ignored.
978 AutofillProfile empty_profile(base::GenerateGUID(), kSettingsOrigin);
979 empty_profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("John Doe"));
980 controller()->GetTestingManager()->AddTestingProfile(&empty_profile);
981 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING);
982 ASSERT_TRUE(shipping_model);
983 EXPECT_EQ(3, shipping_model->GetItemCount());
985 // An otherwise full but unverified profile should be ignored.
986 AutofillProfile full_profile(test::GetFullProfile());
987 full_profile.set_origin("https://www.example.com");
988 full_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16());
989 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
990 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING);
991 ASSERT_TRUE(shipping_model);
992 EXPECT_EQ(3, shipping_model->GetItemCount());
994 // A full, verified profile should be picked up.
995 AutofillProfile verified_profile(test::GetVerifiedProfile());
996 verified_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16());
997 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
998 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING);
999 ASSERT_TRUE(shipping_model);
1000 EXPECT_EQ(4, shipping_model->GetItemCount());
1003 // Checks that a valid profile is selected by default, but if invalid is
1004 // popped into edit mode.
1005 TEST_F(AutofillDialogControllerTest, AutofillProfilesPopInvalidIntoEdit) {
1006 SwitchToAutofill();
1007 SuggestionsMenuModel* shipping_model =
1008 GetMenuModelForSection(SECTION_SHIPPING);
1009 EXPECT_EQ(3, shipping_model->GetItemCount());
1010 // "Same as billing" is selected.
1011 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1012 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1014 AutofillProfile verified_profile(test::GetVerifiedProfile());
1015 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
1016 EXPECT_EQ(4, shipping_model->GetItemCount());
1017 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1018 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1020 // Now make up a problem and make sure the profile isn't in the list.
1021 Reset();
1022 SwitchToAutofill();
1023 FieldProblemMap problems;
1024 problems.insert(std::make_pair(::i18n::addressinput::POSTAL_CODE,
1025 ::i18n::addressinput::MISMATCHING_VALUE));
1026 EXPECT_CALL(*controller()->GetMockValidator(),
1027 ValidateAddress(CountryCodeMatcher("US"), _, _)).
1028 WillRepeatedly(DoAll(SetArgPointee<2>(problems),
1029 Return(AddressValidator::SUCCESS)));
1031 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
1032 shipping_model = GetMenuModelForSection(SECTION_SHIPPING);
1033 EXPECT_EQ(4, shipping_model->GetItemCount());
1034 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1035 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1038 // Makes sure suggestion profiles are re-validated when validation rules load.
1039 TEST_F(AutofillDialogControllerTest, AutofillProfilesRevalidateAfterRulesLoad) {
1040 SwitchToAutofill();
1041 SuggestionsMenuModel* shipping_model =
1042 GetMenuModelForSection(SECTION_SHIPPING);
1043 EXPECT_EQ(3, shipping_model->GetItemCount());
1044 // "Same as billing" is selected.
1045 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1046 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1047 AutofillProfile verified_profile(test::GetVerifiedProfile());
1048 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
1049 EXPECT_EQ(4, shipping_model->GetItemCount());
1050 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1051 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1053 FieldProblemMap problems;
1054 problems.insert(std::make_pair(::i18n::addressinput::POSTAL_CODE,
1055 ::i18n::addressinput::MISMATCHING_VALUE));
1056 EXPECT_CALL(*controller()->GetMockValidator(),
1057 ValidateAddress(CountryCodeMatcher("US"), _, _)).
1058 WillRepeatedly(DoAll(SetArgPointee<2>(problems),
1059 Return(AddressValidator::SUCCESS)));
1061 controller()->OnAddressValidationRulesLoaded("US", true);
1062 EXPECT_EQ(4, shipping_model->GetItemCount());
1063 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING));
1064 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1067 // Makes sure that the choice of which Autofill profile to use for each section
1068 // is sticky.
1069 TEST_F(AutofillDialogControllerTest, AutofillProfileDefaults) {
1070 SwitchToAutofill();
1071 AutofillProfile profile(test::GetVerifiedProfile());
1072 AutofillProfile profile2(test::GetVerifiedProfile2());
1073 controller()->GetTestingManager()->AddTestingProfile(&profile);
1074 controller()->GetTestingManager()->AddTestingProfile(&profile2);
1076 // Until a selection has been made, the default shipping suggestion is the
1077 // first one (after "use billing").
1078 SuggestionsMenuModel* shipping_model =
1079 GetMenuModelForSection(SECTION_SHIPPING);
1080 EXPECT_EQ(1, shipping_model->checked_item());
1082 for (int i = 2; i >= 0; --i) {
1083 shipping_model = GetMenuModelForSection(SECTION_SHIPPING);
1084 shipping_model->ExecuteCommand(i, 0);
1085 FillCreditCardInputs();
1086 controller()->OnAccept();
1088 Reset();
1089 controller()->GetTestingManager()->AddTestingProfile(&profile);
1090 controller()->GetTestingManager()->AddTestingProfile(&profile2);
1091 shipping_model = GetMenuModelForSection(SECTION_SHIPPING);
1092 EXPECT_EQ(i, shipping_model->checked_item());
1095 // Try again, but don't add the default profile to the PDM. The dialog
1096 // should fall back to the first profile.
1097 shipping_model->ExecuteCommand(2, 0);
1098 FillCreditCardInputs();
1099 controller()->OnAccept();
1100 Reset();
1101 controller()->GetTestingManager()->AddTestingProfile(&profile);
1102 shipping_model = GetMenuModelForSection(SECTION_SHIPPING);
1103 EXPECT_EQ(1, shipping_model->checked_item());
1106 // Makes sure that a newly added Autofill profile becomes set as the default
1107 // choice for the next run.
1108 TEST_F(AutofillDialogControllerTest, NewAutofillProfileIsDefault) {
1109 SwitchToAutofill();
1111 AutofillProfile profile(test::GetVerifiedProfile());
1112 CreditCard credit_card(test::GetVerifiedCreditCard());
1113 controller()->GetTestingManager()->AddTestingProfile(&profile);
1114 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1116 // Until a selection has been made, the default suggestion is the first one.
1117 // For the shipping section, this follows the "use billing" suggestion.
1118 EXPECT_EQ(0, GetMenuModelForSection(SECTION_CC)->checked_item());
1119 EXPECT_EQ(1, GetMenuModelForSection(SECTION_SHIPPING)->checked_item());
1121 // Fill in the shipping and credit card sections with new data.
1122 AutofillProfile new_profile(test::GetVerifiedProfile2());
1123 CreditCard new_credit_card(test::GetVerifiedCreditCard2());
1124 FillInputs(SECTION_SHIPPING, new_profile);
1125 FillInputs(SECTION_CC, new_credit_card);
1126 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true);
1127 controller()->OnAccept();
1129 // Update the |new_profile| and |new_credit_card|'s guids to the saved ones.
1130 new_profile.set_guid(
1131 controller()->GetTestingManager()->imported_profile().guid());
1132 new_credit_card.set_guid(
1133 controller()->GetTestingManager()->imported_credit_card().guid());
1135 // Reload the dialog. The newly added address and credit card should now be
1136 // set as the defaults.
1137 Reset();
1138 controller()->GetTestingManager()->AddTestingProfile(&profile);
1139 controller()->GetTestingManager()->AddTestingProfile(&new_profile);
1140 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1141 controller()->GetTestingManager()->AddTestingCreditCard(&new_credit_card);
1143 // Until a selection has been made, the default suggestion is the first one.
1144 // For the shipping section, this follows the "use billing" suggestion.
1145 EXPECT_EQ(1, GetMenuModelForSection(SECTION_CC)->checked_item());
1146 EXPECT_EQ(2, GetMenuModelForSection(SECTION_SHIPPING)->checked_item());
1149 TEST_F(AutofillDialogControllerTest, AutofillProfileVariants) {
1150 SwitchToAutofill();
1151 EXPECT_CALL(*controller()->GetView(), ModelChanged());
1152 ui::MenuModel* shipping_model =
1153 controller()->MenuModelForSection(SECTION_SHIPPING);
1154 ASSERT_TRUE(!!shipping_model);
1155 EXPECT_EQ(3, shipping_model->GetItemCount());
1157 // Set up some variant data.
1158 AutofillProfile full_profile(test::GetVerifiedProfile());
1159 std::vector<base::string16> names;
1160 names.push_back(ASCIIToUTF16("John Doe"));
1161 names.push_back(ASCIIToUTF16("Jane Doe"));
1162 full_profile.SetRawMultiInfo(NAME_FULL, names);
1163 std::vector<base::string16> emails;
1164 emails.push_back(ASCIIToUTF16(kFakeEmail));
1165 emails.push_back(ASCIIToUTF16("admin@example.com"));
1166 full_profile.SetRawMultiInfo(EMAIL_ADDRESS, emails);
1168 // Non-default variants are ignored by the dialog.
1169 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1170 EXPECT_EQ(4, shipping_model->GetItemCount());
1173 TEST_F(AutofillDialogControllerTest, SuggestValidEmail) {
1174 SwitchToAutofill();
1175 AutofillProfile profile(test::GetVerifiedProfile());
1176 const base::string16 kValidEmail = ASCIIToUTF16(kFakeEmail);
1177 profile.SetRawInfo(EMAIL_ADDRESS, kValidEmail);
1178 controller()->GetTestingManager()->AddTestingProfile(&profile);
1180 // "add", "manage", and 1 suggestion.
1181 EXPECT_EQ(
1182 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount());
1183 // "add", "manage", 1 suggestion, and "same as billing".
1184 EXPECT_EQ(
1185 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
1188 TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidEmail) {
1189 SwitchToAutofill();
1190 AutofillProfile profile(test::GetVerifiedProfile());
1191 profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(".!#$%&'*+/=?^_`-@-.."));
1192 controller()->GetTestingManager()->AddTestingProfile(&profile);
1194 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING));
1195 // "add", "manage", 1 suggestion, and "same as billing".
1196 EXPECT_EQ(
1197 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
1200 TEST_F(AutofillDialogControllerTest, SuggestValidAddress) {
1201 SwitchToAutofill();
1202 AutofillProfile full_profile(test::GetVerifiedProfile());
1203 full_profile.set_origin(kSettingsOrigin);
1204 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1205 // "add", "manage", and 1 suggestion.
1206 EXPECT_EQ(
1207 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount());
1210 TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidAddress) {
1211 SwitchToAutofill();
1212 AutofillProfile full_profile(test::GetVerifiedProfile());
1213 full_profile.set_origin(kSettingsOrigin);
1214 full_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("C"));
1215 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1218 TEST_F(AutofillDialogControllerTest, DoNotSuggestIncompleteAddress) {
1219 SwitchToAutofill();
1220 AutofillProfile profile(test::GetVerifiedProfile());
1221 profile.SetRawInfo(ADDRESS_HOME_STATE, base::string16());
1222 controller()->GetTestingManager()->AddTestingProfile(&profile);
1224 // Same as shipping, manage, add new.
1225 EXPECT_EQ(3,
1226 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
1227 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING));
1230 TEST_F(AutofillDialogControllerTest, DoSuggestShippingAddressWithoutEmail) {
1231 SwitchToAutofill();
1232 AutofillProfile profile(test::GetVerifiedProfile());
1233 profile.SetRawInfo(EMAIL_ADDRESS, base::string16());
1234 controller()->GetTestingManager()->AddTestingProfile(&profile);
1236 // Same as shipping, manage, add new, profile with missing email.
1237 EXPECT_EQ(4,
1238 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
1239 // Billing addresses require email.
1240 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING));
1243 TEST_F(AutofillDialogControllerTest, AutofillCreditCards) {
1244 SwitchToAutofill();
1245 // Since the PersonalDataManager is empty, this should only have the
1246 // default menu items.
1247 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC));
1249 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3);
1251 // Empty cards are ignored.
1252 CreditCard empty_card(base::GenerateGUID(), kSettingsOrigin);
1253 empty_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("John Doe"));
1254 controller()->GetTestingManager()->AddTestingCreditCard(&empty_card);
1255 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC));
1257 // An otherwise full but unverified card should be ignored.
1258 CreditCard full_card(test::GetCreditCard());
1259 full_card.set_origin("https://www.example.com");
1260 controller()->GetTestingManager()->AddTestingCreditCard(&full_card);
1261 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC));
1263 // A full, verified card should be picked up.
1264 CreditCard verified_card(test::GetCreditCard());
1265 verified_card.set_origin(kSettingsOrigin);
1266 controller()->GetTestingManager()->AddTestingCreditCard(&verified_card);
1267 ui::MenuModel* credit_card_model =
1268 controller()->MenuModelForSection(SECTION_CC);
1269 ASSERT_TRUE(credit_card_model);
1270 EXPECT_EQ(3, credit_card_model->GetItemCount());
1273 // Test selecting a shipping address different from billing as address.
1274 TEST_F(AutofillDialogControllerTest, DontUseBillingAsShipping) {
1275 SwitchToAutofill();
1276 AutofillProfile full_profile(test::GetVerifiedProfile());
1277 AutofillProfile full_profile2(test::GetVerifiedProfile2());
1278 CreditCard credit_card(test::GetVerifiedCreditCard());
1279 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1280 controller()->GetTestingManager()->AddTestingProfile(&full_profile2);
1281 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1282 ui::MenuModel* shipping_model =
1283 controller()->MenuModelForSection(SECTION_SHIPPING);
1284 shipping_model->ActivatedAt(2);
1286 controller()->OnAccept();
1287 ASSERT_EQ(20U, form_structure()->field_count());
1288 EXPECT_EQ(ADDRESS_HOME_STATE,
1289 form_structure()->field(9)->Type().GetStorableType());
1290 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group());
1291 EXPECT_EQ(ADDRESS_HOME_STATE,
1292 form_structure()->field(16)->Type().GetStorableType());
1293 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group());
1294 base::string16 billing_state = form_structure()->field(9)->value;
1295 base::string16 shipping_state = form_structure()->field(16)->value;
1296 EXPECT_FALSE(billing_state.empty());
1297 EXPECT_FALSE(shipping_state.empty());
1298 EXPECT_NE(billing_state, shipping_state);
1300 EXPECT_EQ(CREDIT_CARD_NAME,
1301 form_structure()->field(1)->Type().GetStorableType());
1302 base::string16 cc_name = form_structure()->field(1)->value;
1303 EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType());
1304 EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group());
1305 base::string16 billing_name = form_structure()->field(6)->value;
1306 EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType());
1307 EXPECT_EQ(NAME, form_structure()->field(13)->Type().group());
1308 base::string16 shipping_name = form_structure()->field(13)->value;
1310 EXPECT_FALSE(cc_name.empty());
1311 EXPECT_FALSE(billing_name.empty());
1312 EXPECT_FALSE(shipping_name.empty());
1313 // Billing name should always be the same as cardholder name.
1314 EXPECT_EQ(cc_name, billing_name);
1315 EXPECT_NE(cc_name, shipping_name);
1318 // Test selecting UseBillingForShipping.
1319 TEST_F(AutofillDialogControllerTest, UseBillingAsShipping) {
1320 SwitchToAutofill();
1322 AutofillProfile full_profile(test::GetVerifiedProfile());
1323 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1325 AutofillProfile full_profile2(test::GetVerifiedProfile2());
1326 controller()->GetTestingManager()->AddTestingProfile(&full_profile2);
1328 CreditCard credit_card(test::GetVerifiedCreditCard());
1329 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1331 ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC));
1332 ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1334 SubmitAndVerifyShippingAndBillingResults();
1337 TEST_F(AutofillDialogControllerTest, UseBillingAsShippingManualInput) {
1338 SwitchToAutofill();
1340 ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC));
1341 ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING));
1343 CreditCard credit_card(test::GetVerifiedCreditCard());
1344 FillInputs(SECTION_CC, credit_card);
1346 AutofillProfile full_profile(test::GetVerifiedProfile());
1347 FillInputs(SECTION_BILLING, full_profile);
1349 SubmitAndVerifyShippingAndBillingResults();
1352 // Tests that shipping and billing telephone fields are supported, and filled
1353 // in by their respective profiles. http://crbug.com/244515
1354 TEST_F(AutofillDialogControllerTest, BillingVsShippingPhoneNumber) {
1355 FormFieldData shipping_tel;
1356 shipping_tel.autocomplete_attribute = "shipping tel";
1357 FormFieldData billing_tel;
1358 billing_tel.autocomplete_attribute = "billing tel";
1359 FormFieldData cc_field;
1360 cc_field.autocomplete_attribute = "cc-csc";
1362 FormData form_data;
1363 form_data.fields.push_back(shipping_tel);
1364 form_data.fields.push_back(billing_tel);
1365 form_data.fields.push_back(cc_field);
1366 SetUpControllerWithFormData(form_data);
1368 SwitchToAutofill();
1370 // The profile that will be chosen for the shipping section.
1371 AutofillProfile shipping_profile(test::GetVerifiedProfile());
1372 // The profile that will be chosen for the billing section.
1373 AutofillProfile billing_profile(test::GetVerifiedProfile2());
1374 CreditCard credit_card(test::GetVerifiedCreditCard());
1375 controller()->GetTestingManager()->AddTestingProfile(&shipping_profile);
1376 controller()->GetTestingManager()->AddTestingProfile(&billing_profile);
1377 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1378 ui::MenuModel* billing_model =
1379 controller()->MenuModelForSection(SECTION_BILLING);
1380 billing_model->ActivatedAt(1);
1382 controller()->OnAccept();
1383 ASSERT_EQ(3U, form_structure()->field_count());
1384 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
1385 form_structure()->field(0)->Type().GetStorableType());
1386 EXPECT_EQ(PHONE_HOME, form_structure()->field(0)->Type().group());
1387 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER,
1388 form_structure()->field(1)->Type().GetStorableType());
1389 EXPECT_EQ(PHONE_BILLING, form_structure()->field(1)->Type().group());
1390 EXPECT_EQ(shipping_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER),
1391 form_structure()->field(0)->value);
1392 EXPECT_EQ(billing_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER),
1393 form_structure()->field(1)->value);
1394 EXPECT_NE(form_structure()->field(1)->value,
1395 form_structure()->field(0)->value);
1398 // Similar to the above, but tests that street-address (i.e. all lines of the
1399 // street address) is successfully filled for both shipping and billing
1400 // sections.
1401 TEST_F(AutofillDialogControllerTest, BillingVsShippingStreetAddress) {
1402 FormFieldData shipping_address;
1403 shipping_address.autocomplete_attribute = "shipping street-address";
1404 FormFieldData billing_address;
1405 billing_address.autocomplete_attribute = "billing street-address";
1406 FormFieldData shipping_address_textarea;
1407 shipping_address_textarea.autocomplete_attribute = "shipping street-address";
1408 shipping_address_textarea.form_control_type = "textarea";
1409 FormFieldData billing_address_textarea;
1410 billing_address_textarea.autocomplete_attribute = "billing street-address";
1411 billing_address_textarea.form_control_type = "textarea";
1412 FormFieldData cc_field;
1413 cc_field.autocomplete_attribute = "cc-csc";
1415 FormData form_data;
1416 form_data.fields.push_back(shipping_address);
1417 form_data.fields.push_back(billing_address);
1418 form_data.fields.push_back(shipping_address_textarea);
1419 form_data.fields.push_back(billing_address_textarea);
1420 form_data.fields.push_back(cc_field);
1421 SetUpControllerWithFormData(form_data);
1423 SwitchToAutofill();
1425 // The profile that will be chosen for the shipping section.
1426 AutofillProfile shipping_profile(test::GetVerifiedProfile());
1427 // The profile that will be chosen for the billing section.
1428 AutofillProfile billing_profile(test::GetVerifiedProfile2());
1429 CreditCard credit_card(test::GetVerifiedCreditCard());
1430 controller()->GetTestingManager()->AddTestingProfile(&shipping_profile);
1431 controller()->GetTestingManager()->AddTestingProfile(&billing_profile);
1432 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1433 ui::MenuModel* billing_model =
1434 controller()->MenuModelForSection(SECTION_BILLING);
1435 billing_model->ActivatedAt(1);
1437 controller()->OnAccept();
1438 ASSERT_EQ(5U, form_structure()->field_count());
1439 EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS,
1440 form_structure()->field(0)->Type().GetStorableType());
1441 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(0)->Type().group());
1442 EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS,
1443 form_structure()->field(1)->Type().GetStorableType());
1444 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(1)->Type().group());
1445 // Inexact matching; single-line inputs get the address data concatenated but
1446 // separated by commas.
1447 EXPECT_TRUE(StartsWith(form_structure()->field(0)->value,
1448 shipping_profile.GetRawInfo(ADDRESS_HOME_LINE1),
1449 true));
1450 EXPECT_TRUE(EndsWith(form_structure()->field(0)->value,
1451 shipping_profile.GetRawInfo(ADDRESS_HOME_LINE2),
1452 true));
1453 EXPECT_TRUE(StartsWith(form_structure()->field(1)->value,
1454 billing_profile.GetRawInfo(ADDRESS_HOME_LINE1),
1455 true));
1456 EXPECT_TRUE(EndsWith(form_structure()->field(1)->value,
1457 billing_profile.GetRawInfo(ADDRESS_HOME_LINE2),
1458 true));
1459 // The textareas should be an exact match.
1460 EXPECT_EQ(shipping_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS),
1461 form_structure()->field(2)->value);
1462 EXPECT_EQ(billing_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS),
1463 form_structure()->field(3)->value);
1465 EXPECT_NE(form_structure()->field(1)->value,
1466 form_structure()->field(0)->value);
1467 EXPECT_NE(form_structure()->field(3)->value,
1468 form_structure()->field(2)->value);
1471 // Test asking for different pieces of the name.
1472 TEST_F(AutofillDialogControllerTest, NamePieces) {
1473 const char* const attributes[] = {
1474 "shipping name",
1475 "billing name",
1476 "billing given-name",
1477 "billing family-name",
1478 "billing additional-name",
1479 "cc-csc"
1482 FormData form_data;
1483 for (size_t i = 0; i < arraysize(attributes); ++i) {
1484 FormFieldData field;
1485 field.autocomplete_attribute.assign(attributes[i]);
1486 form_data.fields.push_back(field);
1489 SetUpControllerWithFormData(form_data);
1490 SwitchToAutofill();
1492 // Billing.
1493 AutofillProfile test_profile(test::GetVerifiedProfile());
1494 test_profile.SetInfo(AutofillType(NAME_FULL),
1495 ASCIIToUTF16("Fabian Jackson von Nacho"),
1496 "en-US");
1497 controller()->GetTestingManager()->AddTestingProfile(&test_profile);
1499 // Credit card.
1500 CreditCard credit_card(test::GetVerifiedCreditCard());
1501 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1503 // Make shipping name different from billing.
1504 AutofillProfile test_profile2(test::GetVerifiedProfile2());
1505 test_profile2.SetInfo(AutofillType(NAME_FULL),
1506 ASCIIToUTF16("Don Ford"),
1507 "en-US");
1508 controller()->GetTestingManager()->AddTestingProfile(&test_profile2);
1509 ui::MenuModel* shipping_model =
1510 controller()->MenuModelForSection(SECTION_SHIPPING);
1511 shipping_model->ActivatedAt(2);
1513 controller()->OnAccept();
1515 EXPECT_EQ(NAME_FULL, form_structure()->field(0)->Type().GetStorableType());
1516 EXPECT_EQ(ASCIIToUTF16("Don Ford"),
1517 form_structure()->field(0)->value);
1519 EXPECT_EQ(NAME_FULL, form_structure()->field(1)->Type().GetStorableType());
1520 EXPECT_EQ(ASCIIToUTF16("Fabian Jackson von Nacho"),
1521 form_structure()->field(1)->value);
1523 EXPECT_EQ(NAME_FIRST, form_structure()->field(2)->Type().GetStorableType());
1524 EXPECT_EQ(ASCIIToUTF16("Fabian"),
1525 form_structure()->field(2)->value);
1527 EXPECT_EQ(NAME_LAST, form_structure()->field(3)->Type().GetStorableType());
1528 EXPECT_EQ(ASCIIToUTF16("von Nacho"),
1529 form_structure()->field(3)->value);
1531 EXPECT_EQ(NAME_MIDDLE, form_structure()->field(4)->Type().GetStorableType());
1532 EXPECT_EQ(ASCIIToUTF16("Jackson"),
1533 form_structure()->field(4)->value);
1536 TEST_F(AutofillDialogControllerTest, AcceptLegalDocuments) {
1537 for (size_t i = 0; i < 2; ++i) {
1538 SCOPED_TRACE(testing::Message() << "Case " << i);
1540 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1541 AcceptLegalDocuments(_, _));
1542 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_));
1543 EXPECT_CALL(*controller(), LoadRiskFingerprintData());
1545 EXPECT_TRUE(controller()->LegalDocumentLinks().empty());
1546 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
1547 EXPECT_TRUE(controller()->LegalDocumentLinks().empty());
1549 scoped_ptr<wallet::WalletItems> wallet_items =
1550 CompleteAndValidWalletItems();
1551 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
1552 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
1553 controller()->OnDidGetWalletItems(wallet_items.Pass());
1554 EXPECT_FALSE(controller()->LegalDocumentLinks().empty());
1556 controller()->OnAccept();
1557 controller()->OnDidAcceptLegalDocuments();
1558 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass());
1560 // Now try it all over again with the location disclosure already accepted.
1561 // Nothing should change.
1562 Reset();
1563 base::ListValue preexisting_list;
1564 preexisting_list.AppendString(kFakeEmail);
1565 g_browser_process->local_state()->Set(
1566 ::prefs::kAutofillDialogWalletLocationAcceptance,
1567 preexisting_list);
1571 TEST_F(AutofillDialogControllerTest, RejectLegalDocuments) {
1572 for (size_t i = 0; i < 2; ++i) {
1573 SCOPED_TRACE(testing::Message() << "Case " << i);
1575 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1576 AcceptLegalDocuments(_, _)).Times(0);
1578 scoped_ptr<wallet::WalletItems> wallet_items =
1579 CompleteAndValidWalletItems();
1580 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
1581 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
1582 controller()->OnDidGetWalletItems(wallet_items.Pass());
1583 EXPECT_FALSE(controller()->LegalDocumentLinks().empty());
1585 controller()->OnCancel();
1587 // Now try it all over again with the location disclosure already accepted.
1588 // Nothing should change.
1589 Reset();
1590 base::ListValue preexisting_list;
1591 preexisting_list.AppendString(kFakeEmail);
1592 g_browser_process->local_state()->Set(
1593 ::prefs::kAutofillDialogWalletLocationAcceptance,
1594 preexisting_list);
1598 TEST_F(AutofillDialogControllerTest, AcceptLocationDisclosure) {
1599 // Check that accepting the dialog registers the user's name in the list
1600 // of users who have accepted the geolocation terms.
1601 EXPECT_TRUE(g_browser_process->local_state()->GetList(
1602 ::prefs::kAutofillDialogWalletLocationAcceptance)->empty());
1604 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
1605 EXPECT_FALSE(controller()->LegalDocumentsText().empty());
1606 EXPECT_TRUE(controller()->LegalDocumentLinks().empty());
1607 controller()->OnAccept();
1609 const base::ListValue* list = g_browser_process->local_state()->GetList(
1610 ::prefs::kAutofillDialogWalletLocationAcceptance);
1611 ASSERT_EQ(1U, list->GetSize());
1612 std::string accepted_username;
1613 EXPECT_TRUE(list->GetString(0, &accepted_username));
1614 EXPECT_EQ(kFakeEmail, accepted_username);
1616 // Now check it still works if that list starts off with some other username
1617 // in it.
1618 Reset();
1619 list = g_browser_process->local_state()->GetList(
1620 ::prefs::kAutofillDialogWalletLocationAcceptance);
1621 ASSERT_TRUE(list->empty());
1623 std::string kOtherUsername("spouse@example.com");
1624 base::ListValue preexisting_list;
1625 preexisting_list.AppendString(kOtherUsername);
1626 g_browser_process->local_state()->Set(
1627 ::prefs::kAutofillDialogWalletLocationAcceptance,
1628 preexisting_list);
1630 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
1631 EXPECT_FALSE(controller()->LegalDocumentsText().empty());
1632 EXPECT_TRUE(controller()->LegalDocumentLinks().empty());
1633 controller()->OnAccept();
1635 list = g_browser_process->local_state()->GetList(
1636 ::prefs::kAutofillDialogWalletLocationAcceptance);
1637 ASSERT_EQ(2U, list->GetSize());
1638 EXPECT_NE(list->end(), list->Find(base::StringValue(kFakeEmail)));
1639 EXPECT_NE(list->end(), list->Find(base::StringValue(kOtherUsername)));
1641 // Now check the list doesn't change if the user cancels out of the dialog.
1642 Reset();
1643 list = g_browser_process->local_state()->GetList(
1644 ::prefs::kAutofillDialogWalletLocationAcceptance);
1645 ASSERT_TRUE(list->empty());
1647 g_browser_process->local_state()->Set(
1648 ::prefs::kAutofillDialogWalletLocationAcceptance,
1649 preexisting_list);
1651 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
1652 EXPECT_FALSE(controller()->LegalDocumentsText().empty());
1653 EXPECT_TRUE(controller()->LegalDocumentLinks().empty());
1654 controller()->OnCancel();
1656 list = g_browser_process->local_state()->GetList(
1657 ::prefs::kAutofillDialogWalletLocationAcceptance);
1658 ASSERT_EQ(1U, list->GetSize());
1659 EXPECT_NE(list->end(), list->Find(base::StringValue(kOtherUsername)));
1660 EXPECT_EQ(list->end(), list->Find(base::StringValue(kFakeEmail)));
1663 TEST_F(AutofillDialogControllerTest, LegalDocumentOverflow) {
1664 for (size_t number_of_docs = 2; number_of_docs < 11; ++number_of_docs) {
1665 scoped_ptr<wallet::WalletItems> wallet_items =
1666 CompleteAndValidWalletItems();
1667 for (size_t i = 0; i < number_of_docs; ++i)
1668 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
1670 Reset();
1671 controller()->OnDidGetWalletItems(wallet_items.Pass());
1673 // The dialog is only equipped to handle 2-6 legal documents. More than
1674 // 6 errors out.
1675 if (number_of_docs <= 6U) {
1676 EXPECT_FALSE(controller()->LegalDocumentsText().empty());
1677 } else {
1678 EXPECT_TRUE(controller()->LegalDocumentsText().empty());
1679 EXPECT_EQ(1U, NotificationsOfType(
1680 DialogNotification::WALLET_ERROR).size());
1684 controller()->OnCancel();
1687 // Makes sure the default object IDs are respected.
1688 TEST_F(AutofillDialogControllerTest, WalletDefaultItems) {
1689 scoped_ptr<wallet::WalletItems> wallet_items =
1690 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1691 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1692 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1693 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
1694 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1696 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
1697 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
1698 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
1699 wallet_items->AddAddress(wallet::GetTestShippingAddress());
1700 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
1702 controller()->OnDidGetWalletItems(wallet_items.Pass());
1703 // "add", "manage", and 4 suggestions.
1704 EXPECT_EQ(6,
1705 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount());
1706 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)->
1707 IsItemCheckedAt(2));
1708 ASSERT_FALSE(controller()->IsEditingExistingData(SECTION_CC_BILLING));
1709 // "use billing", "add", "manage", and 5 suggestions.
1710 EXPECT_EQ(8,
1711 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
1712 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_SHIPPING)->
1713 IsItemCheckedAt(4));
1714 ASSERT_FALSE(controller()->IsEditingExistingData(SECTION_SHIPPING));
1717 // Tests that invalid and AMEX default instruments are ignored.
1718 TEST_F(AutofillDialogControllerTest, SelectInstrument) {
1719 scoped_ptr<wallet::WalletItems> wallet_items =
1720 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1721 // Tests if default instrument is invalid, then, the first valid instrument is
1722 // selected instead of the default instrument.
1723 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1724 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1725 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid());
1726 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1728 controller()->OnDidGetWalletItems(wallet_items.Pass());
1729 // 4 suggestions and "add", "manage".
1730 EXPECT_EQ(6,
1731 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount());
1732 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)->
1733 IsItemCheckedAt(0));
1735 // Tests if default instrument is AMEX but Wallet doesn't support
1736 // AMEX on this merchant, then the first valid instrument is
1737 // selected instead of the default instrument.
1738 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1739 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1740 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1741 wallet_items->AddInstrument(
1742 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_DISALLOWED));
1743 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1745 controller()->OnDidGetWalletItems(wallet_items.Pass());
1746 // 4 suggestions and "add", "manage".
1747 EXPECT_EQ(6,
1748 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount());
1749 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)->
1750 IsItemCheckedAt(0));
1752 // Tests if default instrument is AMEX and it is allowed on this merchant,
1753 // then it is selected.
1754 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_ALLOWED);
1755 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1756 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1757 wallet_items->AddInstrument(
1758 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_ALLOWED));
1759 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
1761 controller()->OnDidGetWalletItems(wallet_items.Pass());
1762 // 4 suggestions and "add", "manage".
1763 EXPECT_EQ(6,
1764 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount());
1765 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)->
1766 IsItemCheckedAt(2));
1768 // Tests if only have AMEX and invalid instrument, then "add" is selected.
1769 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1770 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid());
1771 wallet_items->AddInstrument(
1772 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_DISALLOWED));
1774 controller()->OnDidGetWalletItems(wallet_items.Pass());
1775 // 2 suggestions and "add", "manage".
1776 EXPECT_EQ(4,
1777 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount());
1778 // "add"
1779 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)->
1780 IsItemCheckedAt(2));
1783 TEST_F(AutofillDialogControllerTest, SaveAddress) {
1784 EXPECT_CALL(*controller()->GetView(), ModelChanged());
1785 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1786 SaveToWalletMock(testing::IsNull(),
1787 testing::NotNull(),
1788 testing::IsNull(),
1789 testing::IsNull()));
1791 scoped_ptr<wallet::WalletItems> wallet_items =
1792 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1793 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
1794 controller()->OnDidGetWalletItems(wallet_items.Pass());
1795 // If there is no shipping address in wallet, it will default to
1796 // "same-as-billing" instead of "add-new-item". "same-as-billing" is covered
1797 // by the following tests. The penultimate item in the menu is "add-new-item".
1798 ui::MenuModel* shipping_model =
1799 controller()->MenuModelForSection(SECTION_SHIPPING);
1800 shipping_model->ActivatedAt(shipping_model->GetItemCount() - 2);
1802 AutofillProfile test_profile(test::GetVerifiedProfile());
1803 FillInputs(SECTION_SHIPPING, test_profile);
1805 AcceptAndLoadFakeFingerprint();
1808 TEST_F(AutofillDialogControllerTest, SaveInstrument) {
1809 EXPECT_CALL(*controller()->GetView(), ModelChanged());
1810 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1811 SaveToWalletMock(testing::NotNull(),
1812 testing::IsNull(),
1813 testing::IsNull(),
1814 testing::IsNull()));
1816 FillCCBillingInputs();
1817 scoped_ptr<wallet::WalletItems> wallet_items =
1818 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1819 wallet_items->AddAddress(wallet::GetTestShippingAddress());
1820 SubmitWithWalletItems(wallet_items.Pass());
1823 TEST_F(AutofillDialogControllerTest, SaveInstrumentWithInvalidInstruments) {
1824 EXPECT_CALL(*controller()->GetView(), ModelChanged());
1825 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1826 SaveToWalletMock(testing::NotNull(),
1827 testing::IsNull(),
1828 testing::IsNull(),
1829 testing::IsNull()));
1831 FillCCBillingInputs();
1832 scoped_ptr<wallet::WalletItems> wallet_items =
1833 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1834 wallet_items->AddAddress(wallet::GetTestShippingAddress());
1835 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid());
1836 SubmitWithWalletItems(wallet_items.Pass());
1839 TEST_F(AutofillDialogControllerTest, SaveInstrumentAndAddress) {
1840 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1841 SaveToWalletMock(testing::NotNull(),
1842 testing::NotNull(),
1843 testing::IsNull(),
1844 testing::IsNull()));
1846 FillCCBillingInputs();
1847 scoped_ptr<wallet::WalletItems> wallet_items =
1848 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1849 SubmitWithWalletItems(wallet_items.Pass());
1852 MATCHER(IsUpdatingExistingData, "updating existing Wallet data") {
1853 return !arg->object_id().empty();
1856 MATCHER(UsesLocalBillingAddress, "uses the local billing address") {
1857 return arg->street_address()[0] == ASCIIToUTF16(kEditedBillingAddress);
1860 // Tests that when using billing address for shipping, and there is no exact
1861 // matched shipping address, then a shipping address should be added.
1862 TEST_F(AutofillDialogControllerTest, BillingForShipping) {
1863 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1864 SaveToWalletMock(testing::IsNull(),
1865 testing::NotNull(),
1866 testing::IsNull(),
1867 testing::IsNull()));
1869 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
1870 // Select "Same as billing" in the address menu.
1871 UseBillingForShipping();
1873 AcceptAndLoadFakeFingerprint();
1876 // Tests that when using billing address for shipping, and there is an exact
1877 // matched shipping address, then a shipping address should not be added.
1878 TEST_F(AutofillDialogControllerTest, BillingForShippingHasMatch) {
1879 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1880 SaveToWalletMock(_, _, _, _)).Times(0);
1882 scoped_ptr<wallet::WalletItems> wallet_items =
1883 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1884 scoped_ptr<wallet::WalletItems::MaskedInstrument> instrument =
1885 wallet::GetTestMaskedInstrument();
1886 // Copy billing address as shipping address, and assign an id to it.
1887 scoped_ptr<wallet::Address> shipping_address(
1888 new wallet::Address(instrument->address()));
1889 shipping_address->set_object_id("shipping_address_id");
1890 wallet_items->AddAddress(shipping_address.Pass());
1891 wallet_items->AddInstrument(instrument.Pass());
1892 wallet_items->AddAddress(wallet::GetTestShippingAddress());
1894 controller()->OnDidGetWalletItems(wallet_items.Pass());
1895 // Select "Same as billing" in the address menu.
1896 UseBillingForShipping();
1898 AcceptAndLoadFakeFingerprint();
1901 // Test that the local view contents is used when saving a new instrument and
1902 // the user has selected "Same as billing".
1903 TEST_F(AutofillDialogControllerTest, SaveInstrumentSameAsBilling) {
1904 scoped_ptr<wallet::WalletItems> wallet_items =
1905 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1906 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
1907 controller()->OnDidGetWalletItems(wallet_items.Pass());
1909 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC_BILLING);
1910 model->ActivatedAt(model->GetItemCount() - 2);
1912 FieldValueMap outputs;
1913 const DetailInputs& inputs =
1914 controller()->RequestedFieldsForSection(SECTION_CC_BILLING);
1915 AutofillProfile full_profile(test::GetVerifiedProfile());
1916 CreditCard full_card(test::GetCreditCard());
1917 for (size_t i = 0; i < inputs.size(); ++i) {
1918 const ServerFieldType type = inputs[i].type;
1919 if (type == ADDRESS_BILLING_STREET_ADDRESS)
1920 outputs[type] = ASCIIToUTF16(kEditedBillingAddress);
1921 else
1922 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US");
1924 if (outputs[type].empty())
1925 outputs[type] = full_card.GetInfo(AutofillType(type), "en-US");
1927 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
1929 controller()->OnAccept();
1931 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1932 SaveToWalletMock(testing::NotNull(),
1933 UsesLocalBillingAddress(),
1934 testing::IsNull(),
1935 testing::IsNull()));
1936 AcceptAndLoadFakeFingerprint();
1939 TEST_F(AutofillDialogControllerTest, CancelNoSave) {
1940 EXPECT_CALL(*controller()->GetTestingWalletClient(),
1941 SaveToWalletMock(_, _, _, _)).Times(0);
1943 EXPECT_CALL(*controller()->GetView(), ModelChanged());
1945 controller()->OnDidGetWalletItems(
1946 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED));
1947 controller()->OnCancel();
1950 // Checks that clicking the Manage menu item opens a new tab with a different
1951 // URL for Wallet and Autofill.
1952 TEST_F(AutofillDialogControllerTest, ManageItem) {
1953 AutofillProfile full_profile(test::GetVerifiedProfile());
1954 full_profile.set_origin(kSettingsOrigin);
1955 full_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16());
1956 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1957 SwitchToAutofill();
1959 SuggestionsMenuModel* shipping = GetMenuModelForSection(SECTION_SHIPPING);
1960 shipping->ExecuteCommand(shipping->GetItemCount() - 1, 0);
1961 GURL autofill_manage_url = controller()->open_tab_url();
1962 EXPECT_EQ("chrome", autofill_manage_url.scheme());
1964 SwitchToWallet();
1965 scoped_ptr<wallet::WalletItems> wallet_items =
1966 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
1967 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
1968 controller()->OnDidGetWalletItems(wallet_items.Pass());
1970 controller()->SuggestionItemSelected(shipping, shipping->GetItemCount() - 1);
1971 GURL wallet_manage_addresses_url = controller()->open_tab_url();
1972 EXPECT_EQ("https", wallet_manage_addresses_url.scheme());
1974 SuggestionsMenuModel* billing = GetMenuModelForSection(SECTION_CC_BILLING);
1975 controller()->SuggestionItemSelected(billing, billing->GetItemCount() - 1);
1976 GURL wallet_manage_instruments_url = controller()->open_tab_url();
1977 EXPECT_EQ("https", wallet_manage_instruments_url.scheme());
1979 EXPECT_NE(autofill_manage_url, wallet_manage_instruments_url);
1980 EXPECT_NE(wallet_manage_instruments_url, wallet_manage_addresses_url);
1983 // Tests that adding an autofill profile and then submitting works.
1984 TEST_F(AutofillDialogControllerTest, AddAutofillProfile) {
1985 SwitchToAutofill();
1986 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(2);
1988 AutofillProfile full_profile(test::GetVerifiedProfile());
1989 CreditCard credit_card(test::GetVerifiedCreditCard());
1990 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
1991 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
1993 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING);
1994 // Activate the "Add billing address" menu item.
1995 model->ActivatedAt(model->GetItemCount() - 2);
1997 // Fill in the inputs from the profile.
1998 FieldValueMap outputs;
1999 const DetailInputs& inputs =
2000 controller()->RequestedFieldsForSection(SECTION_BILLING);
2001 AutofillProfile full_profile2(test::GetVerifiedProfile2());
2002 for (size_t i = 0; i < inputs.size(); ++i) {
2003 const ServerFieldType type = inputs[i].type;
2004 outputs[type] = full_profile2.GetInfo(AutofillType(type), "en-US");
2006 controller()->GetView()->SetUserInput(SECTION_BILLING, outputs);
2008 controller()->OnAccept();
2009 const AutofillProfile& added_profile =
2010 controller()->GetTestingManager()->imported_profile();
2012 const DetailInputs& shipping_inputs =
2013 controller()->RequestedFieldsForSection(SECTION_SHIPPING);
2014 for (size_t i = 0; i < shipping_inputs.size(); ++i) {
2015 const ServerFieldType type = shipping_inputs[i].type;
2016 EXPECT_EQ(full_profile2.GetInfo(AutofillType(type), "en-US"),
2017 added_profile.GetInfo(AutofillType(type), "en-US"));
2021 TEST_F(AutofillDialogControllerTest, VerifyCvv) {
2022 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_));
2023 EXPECT_CALL(*controller()->GetTestingWalletClient(),
2024 AuthenticateInstrument(_, _));
2026 SubmitWithWalletItems(CompleteAndValidWalletItems());
2028 EXPECT_TRUE(NotificationsOfType(DialogNotification::REQUIRED_ACTION).empty());
2029 EXPECT_TRUE(controller()->SectionIsActive(SECTION_SHIPPING));
2030 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING));
2031 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2032 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2034 SuggestionState suggestion_state =
2035 controller()->SuggestionStateForSection(SECTION_CC_BILLING);
2036 EXPECT_TRUE(suggestion_state.extra_text.empty());
2038 controller()->OnDidGetFullWallet(
2039 wallet::GetTestFullWalletWithRequiredActions(
2040 std::vector<wallet::RequiredAction>(1, wallet::VERIFY_CVV)));
2041 ASSERT_TRUE(controller()->IsSubmitPausedOn(wallet::VERIFY_CVV));
2043 EXPECT_FALSE(
2044 NotificationsOfType(DialogNotification::REQUIRED_ACTION).empty());
2045 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING));
2046 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING));
2048 suggestion_state =
2049 controller()->SuggestionStateForSection(SECTION_CC_BILLING);
2050 EXPECT_FALSE(suggestion_state.extra_text.empty());
2051 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING));
2053 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2054 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2056 controller()->OnAccept();
2058 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty());
2061 TEST_F(AutofillDialogControllerTest, ErrorDuringSubmit) {
2062 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_));
2064 SubmitWithWalletItems(CompleteAndValidWalletItems());
2066 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2067 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2069 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR);
2071 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2072 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2075 TEST_F(AutofillDialogControllerTest, ErrorDuringVerifyCvv) {
2076 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_));
2078 SubmitWithWalletItems(CompleteAndValidWalletItems());
2079 controller()->OnDidGetFullWallet(
2080 wallet::GetTestFullWalletWithRequiredActions(
2081 std::vector<wallet::RequiredAction>(1, wallet::VERIFY_CVV)));
2083 ASSERT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2084 ASSERT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2086 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR);
2088 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2089 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL));
2092 // Simulates receiving an INVALID_FORM_FIELD required action while processing a
2093 // |WalletClientDelegate::OnDid{Save,Update}*()| call. This can happen if Online
2094 // Wallet's server validation differs from Chrome's local validation.
2095 TEST_F(AutofillDialogControllerTest, WalletServerSideValidation) {
2096 scoped_ptr<wallet::WalletItems> wallet_items =
2097 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2098 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2099 controller()->OnDidGetWalletItems(wallet_items.Pass());
2100 controller()->OnAccept();
2102 std::vector<wallet::RequiredAction> required_actions;
2103 required_actions.push_back(wallet::INVALID_FORM_FIELD);
2105 std::vector<wallet::FormFieldError> form_errors;
2106 form_errors.push_back(
2107 wallet::FormFieldError(wallet::FormFieldError::INVALID_POSTAL_CODE,
2108 wallet::FormFieldError::SHIPPING_ADDRESS));
2110 EXPECT_CALL(*controller()->GetView(), UpdateForErrors());
2111 controller()->OnDidSaveToWallet(std::string(),
2112 std::string(),
2113 required_actions,
2114 form_errors);
2117 // Simulates receiving unrecoverable Wallet server validation errors.
2118 TEST_F(AutofillDialogControllerTest, WalletServerSideValidationUnrecoverable) {
2119 scoped_ptr<wallet::WalletItems> wallet_items =
2120 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2121 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2122 controller()->OnDidGetWalletItems(wallet_items.Pass());
2123 controller()->OnAccept();
2125 std::vector<wallet::RequiredAction> required_actions;
2126 required_actions.push_back(wallet::INVALID_FORM_FIELD);
2128 std::vector<wallet::FormFieldError> form_errors;
2129 form_errors.push_back(
2130 wallet::FormFieldError(wallet::FormFieldError::UNKNOWN_ERROR,
2131 wallet::FormFieldError::UNKNOWN_LOCATION));
2133 controller()->OnDidSaveToWallet(std::string(),
2134 std::string(),
2135 required_actions,
2136 form_errors);
2138 EXPECT_EQ(1U, NotificationsOfType(
2139 DialogNotification::REQUIRED_ACTION).size());
2142 // Test Wallet banners are show in the right situations. These banners promote
2143 // saving details into Wallet (i.e. "[x] Save details to Wallet").
2144 TEST_F(AutofillDialogControllerTest, WalletBanners) {
2145 // Simulate non-signed-in case.
2146 SetUpControllerWithFormData(DefaultFormData());
2147 GoogleServiceAuthError error(GoogleServiceAuthError::NONE);
2148 controller()->OnPassiveSigninFailure(error);
2149 EXPECT_EQ(0U, NotificationsOfType(
2150 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2152 // Sign in a user with a completed account.
2153 SetUpControllerWithFormData(DefaultFormData());
2154 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2156 // Full account; should show "Details from Wallet" message.
2157 EXPECT_EQ(1U, NotificationsOfType(
2158 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2159 SwitchToAutofill();
2160 EXPECT_EQ(1U, NotificationsOfType(
2161 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2163 // Start over and sign in a user with an incomplete account.
2164 SetUpControllerWithFormData(DefaultFormData());
2165 scoped_ptr<wallet::WalletItems> wallet_items =
2166 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2167 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2168 controller()->OnDidGetWalletItems(wallet_items.Pass());
2170 // Partial account.
2171 EXPECT_EQ(1U, NotificationsOfType(
2172 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2174 SwitchToAutofill();
2175 EXPECT_EQ(1U, NotificationsOfType(
2176 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2178 // A Wallet error should kill any Wallet promos.
2179 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR);
2181 EXPECT_EQ(1U, NotificationsOfType(
2182 DialogNotification::WALLET_ERROR).size());
2183 EXPECT_EQ(0U, NotificationsOfType(
2184 DialogNotification::WALLET_USAGE_CONFIRMATION).size());
2187 TEST_F(AutofillDialogControllerTest, ViewCancelDoesntSetPref) {
2188 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath(
2189 ::prefs::kAutofillDialogPayWithoutWallet));
2191 SwitchToAutofill();
2193 controller()->OnCancel();
2194 controller()->ViewClosed();
2196 EXPECT_FALSE(profile()->GetPrefs()->HasPrefPath(
2197 ::prefs::kAutofillDialogPayWithoutWallet));
2200 TEST_F(AutofillDialogControllerTest, SubmitWithSigninErrorDoesntSetPref) {
2201 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath(
2202 ::prefs::kAutofillDialogPayWithoutWallet));
2204 SimulateSigninError();
2205 FillCreditCardInputs();
2206 controller()->OnAccept();
2208 EXPECT_FALSE(profile()->GetPrefs()->HasPrefPath(
2209 ::prefs::kAutofillDialogPayWithoutWallet));
2212 // Tests that there's an overlay shown while waiting for full wallet items.
2213 TEST_F(AutofillDialogControllerTest, WalletFirstRun) {
2214 EXPECT_TRUE(controller()->GetDialogOverlay().image.IsEmpty());
2216 SubmitWithWalletItems(CompleteAndValidWalletItems());
2217 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty());
2219 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
2220 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty());
2221 EXPECT_FALSE(form_structure());
2223 // Don't make the test wait for 2 seconds.
2224 controller()->ForceFinishSubmit();
2225 EXPECT_TRUE(form_structure());
2228 TEST_F(AutofillDialogControllerTest, ViewSubmitSetsPref) {
2229 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath(
2230 ::prefs::kAutofillDialogPayWithoutWallet));
2232 SwitchToAutofill();
2233 FillCreditCardInputs();
2234 controller()->OnAccept();
2236 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath(
2237 ::prefs::kAutofillDialogPayWithoutWallet));
2238 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
2239 ::prefs::kAutofillDialogPayWithoutWallet));
2241 // Try again with a signin error (just leaves the pref alone).
2242 SetUpControllerWithFormData(DefaultFormData());
2244 // Setting up the controller again should not change the pref.
2245 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath(
2246 ::prefs::kAutofillDialogPayWithoutWallet));
2247 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
2248 ::prefs::kAutofillDialogPayWithoutWallet));
2250 SimulateSigninError();
2251 FillCreditCardInputs();
2252 controller()->OnAccept();
2253 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath(
2254 ::prefs::kAutofillDialogPayWithoutWallet));
2255 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
2256 ::prefs::kAutofillDialogPayWithoutWallet));
2258 // Successfully choosing wallet does set the pref.
2259 // Note that OnDidGetWalletItems sets the account chooser to wallet mode.
2260 SetUpControllerWithFormData(DefaultFormData());
2262 controller()->OnDidFetchWalletCookieValue(std::string());
2263 scoped_ptr<wallet::WalletItems> wallet_items =
2264 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2265 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2266 controller()->OnDidGetWalletItems(wallet_items.Pass());
2267 controller()->OnAccept();
2268 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
2269 controller()->ForceFinishSubmit();
2271 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath(
2272 ::prefs::kAutofillDialogPayWithoutWallet));
2273 EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(
2274 ::prefs::kAutofillDialogPayWithoutWallet));
2277 TEST_F(AutofillDialogControllerTest, HideWalletEmail) {
2278 SwitchToAutofill();
2280 // Email field should be showing when using Autofill.
2281 EXPECT_TRUE(controller()->SectionIsActive(SECTION_BILLING));
2282 EXPECT_FALSE(controller()->SectionIsActive(SECTION_CC_BILLING));
2283 EXPECT_TRUE(SectionContainsField(SECTION_BILLING, EMAIL_ADDRESS));
2285 SwitchToWallet();
2287 // Reset the wallet state.
2288 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>());
2290 // Setup some wallet state, submit, and get a full wallet to end the flow.
2291 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems();
2293 // Filling |form_structure()| depends on the current username and wallet items
2294 // being fetched. Until both of these have occurred, the user should not be
2295 // able to click Submit if using Wallet. The username fetch happened earlier.
2296 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2297 controller()->OnDidGetWalletItems(wallet_items.Pass());
2298 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2300 // Email field should be absent when using Wallet.
2301 EXPECT_FALSE(controller()->SectionIsActive(SECTION_BILLING));
2302 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING));
2303 EXPECT_FALSE(SectionContainsField(SECTION_CC_BILLING, EMAIL_ADDRESS));
2305 controller()->OnAccept();
2306 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
2307 controller()->ForceFinishSubmit();
2309 ASSERT_TRUE(form_structure());
2310 size_t i = 0;
2311 for (; i < form_structure()->field_count(); ++i) {
2312 if (form_structure()->field(i)->Type().GetStorableType() == EMAIL_ADDRESS) {
2313 EXPECT_EQ(ASCIIToUTF16(kFakeEmail), form_structure()->field(i)->value);
2314 break;
2317 EXPECT_LT(i, form_structure()->field_count());
2320 // Test if autofill types of returned form structure are correct for billing
2321 // entries.
2322 TEST_F(AutofillDialogControllerTest, AutofillTypes) {
2323 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2324 controller()->OnAccept();
2325 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
2326 controller()->ForceFinishSubmit();
2327 ASSERT_TRUE(form_structure());
2328 ASSERT_EQ(20U, form_structure()->field_count());
2329 EXPECT_EQ(EMAIL_ADDRESS,
2330 form_structure()->field(0)->Type().GetStorableType());
2331 EXPECT_EQ(CREDIT_CARD_NUMBER,
2332 form_structure()->field(2)->Type().GetStorableType());
2333 EXPECT_EQ(ADDRESS_HOME_STATE,
2334 form_structure()->field(9)->Type().GetStorableType());
2335 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group());
2336 EXPECT_EQ(ADDRESS_HOME_STATE,
2337 form_structure()->field(16)->Type().GetStorableType());
2338 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group());
2341 TEST_F(AutofillDialogControllerTest, SaveDetailsInChrome) {
2342 SwitchToAutofill();
2343 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(4);
2345 AutofillProfile full_profile(test::GetVerifiedProfile());
2346 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
2348 CreditCard card(test::GetVerifiedCreditCard());
2349 controller()->GetTestingManager()->AddTestingCreditCard(&card);
2350 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome());
2352 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(0);
2353 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome());
2355 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1);
2356 EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome());
2358 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false);
2359 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome());
2361 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, true);
2362 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1);
2363 EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome());
2365 profile()->ForceIncognito(true);
2366 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome());
2369 TEST_F(AutofillDialogControllerTest, DisabledAutofill) {
2370 SwitchToAutofill();
2371 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kAutofillEnabled));
2373 AutofillProfile verified_profile(test::GetVerifiedProfile());
2374 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
2376 CreditCard credit_card(test::GetVerifiedCreditCard());
2377 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card);
2379 // Verify suggestions menus should be showing when Autofill is enabled.
2380 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC));
2381 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_BILLING));
2382 EXPECT_EQ(
2383 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
2385 EXPECT_CALL(*controller()->GetView(), ModelChanged());
2386 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false);
2388 // Verify billing and credit card suggestions menus are hidden when Autofill
2389 // is disabled.
2390 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC));
2391 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING));
2392 // And that the shipping suggestions menu has less selections.
2393 EXPECT_EQ(
2394 2, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
2396 // Additionally, editing fields should not show Autofill popups.
2397 ASSERT_NO_FATAL_FAILURE(controller()->UserEditedOrActivatedInput(
2398 SECTION_BILLING,
2399 NAME_BILLING_FULL,
2400 gfx::NativeView(),
2401 gfx::Rect(),
2402 verified_profile.GetInfo(AutofillType(NAME_FULL), "en-US").substr(0, 1),
2403 true));
2404 EXPECT_EQ(UNKNOWN_TYPE, controller()->popup_input_type());
2407 // Tests that user is prompted when using instrument with minimal address.
2408 TEST_F(AutofillDialogControllerTest, UpgradeMinimalAddress) {
2409 // A minimal address being selected should trigger error validation in the
2410 // view. Called once for each incomplete suggestion.
2411 EXPECT_CALL(*controller()->GetView(), UpdateForErrors());
2413 scoped_ptr<wallet::WalletItems> wallet_items =
2414 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2415 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentWithIdAndAddress(
2416 "id", wallet::GetTestMinimalAddress()));
2417 scoped_ptr<wallet::Address> address(wallet::GetTestShippingAddress());
2418 address->set_is_complete_address(false);
2419 wallet_items->AddAddress(address.Pass());
2420 controller()->OnDidGetWalletItems(wallet_items.Pass());
2422 // Assert that dialog's SECTION_CC_BILLING section is in edit mode.
2423 ASSERT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING));
2424 // Shipping section should be in edit mode because of
2425 // is_minimal_shipping_address.
2426 ASSERT_TRUE(controller()->IsEditingExistingData(SECTION_SHIPPING));
2429 TEST_F(AutofillDialogControllerTest, RiskNeverLoadsWithPendingLegalDocuments) {
2430 EXPECT_CALL(*controller(), LoadRiskFingerprintData()).Times(0);
2432 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems();
2433 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
2434 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
2435 controller()->OnDidGetWalletItems(wallet_items.Pass());
2436 controller()->OnAccept();
2439 TEST_F(AutofillDialogControllerTest, RiskLoadsAfterAcceptingLegalDocuments) {
2440 EXPECT_CALL(*controller(), LoadRiskFingerprintData()).Times(0);
2442 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems();
2443 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
2444 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument());
2445 controller()->OnDidGetWalletItems(wallet_items.Pass());
2447 testing::Mock::VerifyAndClear(controller());
2448 EXPECT_CALL(*controller(), LoadRiskFingerprintData());
2450 controller()->OnAccept();
2452 // Simulate a risk load and verify |GetRiskData()| matches the encoded value.
2453 controller()->OnDidAcceptLegalDocuments();
2454 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass());
2455 EXPECT_EQ(kFakeFingerprintEncoded, controller()->GetRiskData());
2458 TEST_F(AutofillDialogControllerTest, NoManageMenuItemForNewWalletUsers) {
2459 // Make sure the menu model item is created for a returning Wallet user.
2460 scoped_ptr<wallet::WalletItems> wallet_items =
2461 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2462 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2463 wallet_items->AddAddress(wallet::GetTestShippingAddress());
2464 controller()->OnDidGetWalletItems(wallet_items.Pass());
2466 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING));
2467 // "Same as billing", "123 address", "Add address...", and "Manage addresses".
2468 EXPECT_EQ(
2469 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
2471 // Make sure the menu model item is not created for new Wallet users.
2472 base::DictionaryValue dict;
2473 scoped_ptr<base::ListValue> required_actions(new base::ListValue);
2474 required_actions->AppendString("setup_wallet");
2475 dict.Set("required_action", required_actions.release());
2476 controller()->OnDidGetWalletItems(
2477 wallet::WalletItems::CreateWalletItems(dict).Pass());
2479 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING));
2480 // "Same as billing" and "Add address...".
2481 EXPECT_EQ(
2482 2, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
2485 TEST_F(AutofillDialogControllerTest, ShippingSectionCanBeHidden) {
2486 FormFieldData email_field;
2487 email_field.autocomplete_attribute = "email";
2488 FormFieldData cc_field;
2489 cc_field.autocomplete_attribute = "cc-number";
2490 FormFieldData billing_field;
2491 billing_field.autocomplete_attribute = "billing address-level1";
2493 FormData form_data;
2494 form_data.fields.push_back(email_field);
2495 form_data.fields.push_back(cc_field);
2496 form_data.fields.push_back(billing_field);
2498 AutofillProfile full_profile(test::GetVerifiedProfile());
2499 controller()->GetTestingManager()->AddTestingProfile(&full_profile);
2500 SetUpControllerWithFormData(form_data);
2502 SwitchToAutofill();
2504 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING));
2506 FillCreditCardInputs();
2507 controller()->OnAccept();
2508 EXPECT_TRUE(form_structure());
2511 TEST_F(AutofillDialogControllerTest, ShippingSectionCanBeHiddenForWallet) {
2512 FormFieldData email_field;
2513 email_field.autocomplete_attribute = "email";
2514 FormFieldData cc_field;
2515 cc_field.autocomplete_attribute = "cc-number";
2516 FormFieldData billing_field;
2517 billing_field.autocomplete_attribute = "billing address-level1";
2519 FormData form_data;
2520 form_data.fields.push_back(email_field);
2521 form_data.fields.push_back(cc_field);
2522 form_data.fields.push_back(billing_field);
2524 SetUpControllerWithFormData(form_data);
2525 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING));
2526 EXPECT_FALSE(controller()->IsShippingAddressRequired());
2528 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_));
2529 scoped_ptr<wallet::WalletItems> wallet_items =
2530 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2531 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2532 SubmitWithWalletItems(wallet_items.Pass());
2533 controller()->OnDidGetFullWallet(wallet::GetTestFullWalletInstrumentOnly());
2534 controller()->ForceFinishSubmit();
2535 EXPECT_TRUE(form_structure());
2538 TEST_F(AutofillDialogControllerTest, NotProdNotification) {
2539 // To make IsPayingWithWallet() true.
2540 controller()->OnDidGetWalletItems(
2541 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED));
2543 CommandLine* command_line = CommandLine::ForCurrentProcess();
2544 ASSERT_EQ(
2546 command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox));
2548 command_line->AppendSwitchASCII(switches::kWalletServiceUseSandbox, "1");
2549 EXPECT_EQ(1U,
2550 NotificationsOfType(DialogNotification::DEVELOPER_WARNING).size());
2553 TEST_F(AutofillDialogControllerTest, NoNotProdNotification) {
2554 // To make IsPayingWithWallet() true.
2555 controller()->OnDidGetWalletItems(
2556 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED));
2558 CommandLine* command_line = CommandLine::ForCurrentProcess();
2559 ASSERT_EQ(
2561 command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox));
2563 command_line->AppendSwitchASCII(switches::kWalletServiceUseSandbox, "0");
2564 EXPECT_EQ(0U,
2565 NotificationsOfType(DialogNotification::DEVELOPER_WARNING).size());
2568 // Ensure Wallet instruments marked expired by the server are shown as invalid.
2569 TEST_F(AutofillDialogControllerTest, WalletExpiredCard) {
2570 scoped_ptr<wallet::WalletItems> wallet_items =
2571 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2572 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentExpired());
2573 controller()->OnDidGetWalletItems(wallet_items.Pass());
2575 EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING));
2577 const DetailInputs& inputs =
2578 controller()->RequestedFieldsForSection(SECTION_CC_BILLING);
2579 FieldValueMap outputs;
2580 CopyInitialValues(inputs, &outputs);
2582 // The local inputs are invalid because the server said so. They'll
2583 // stay invalid until they differ from the remotely fetched model.
2584 ValidityMessages messages = controller()->InputsAreValid(SECTION_CC_BILLING,
2585 outputs);
2586 EXPECT_TRUE(messages.HasSureError(CREDIT_CARD_EXP_MONTH));
2587 EXPECT_TRUE(messages.HasSureError(CREDIT_CARD_EXP_4_DIGIT_YEAR));
2589 // Make the local input year differ from the instrument.
2590 CopyInitialValues(inputs, &outputs);
2591 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = ASCIIToUTF16("3002");
2592 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
2593 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_MONTH));
2594 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR));
2596 // Make the local input month differ from the instrument.
2597 CopyInitialValues(inputs, &outputs);
2598 outputs[CREDIT_CARD_EXP_MONTH] = ASCIIToUTF16("06");
2599 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs);
2600 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_MONTH));
2601 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR));
2604 TEST_F(AutofillDialogControllerTest, ChooseAnotherInstrumentOrAddress) {
2605 SubmitWithWalletItems(CompleteAndValidWalletItems());
2607 EXPECT_EQ(0U, NotificationsOfType(
2608 DialogNotification::REQUIRED_ACTION).size());
2609 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
2610 controller()->OnDidGetFullWallet(
2611 wallet::GetTestFullWalletWithRequiredActions(
2612 std::vector<wallet::RequiredAction>(
2613 1, wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS)));
2614 EXPECT_EQ(1U, NotificationsOfType(
2615 DialogNotification::REQUIRED_ACTION).size());
2616 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2618 controller()->OnAccept();
2619 EXPECT_EQ(0U, NotificationsOfType(
2620 DialogNotification::REQUIRED_ACTION).size());
2623 TEST_F(AutofillDialogControllerTest, NewCardBubbleShown) {
2624 SwitchToAutofill();
2625 FillCreditCardInputs();
2626 controller()->OnAccept();
2627 controller()->ViewClosed();
2629 EXPECT_EQ(1, mock_new_card_bubble_controller()->bubbles_shown());
2630 EXPECT_EQ(0, test_generated_bubble_controller()->bubbles_shown());
2633 TEST_F(AutofillDialogControllerTest, GeneratedCardBubbleShown) {
2634 SubmitWithWalletItems(CompleteAndValidWalletItems());
2635 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
2636 controller()->ForceFinishSubmit();
2637 controller()->ViewClosed();
2639 EXPECT_EQ(0, mock_new_card_bubble_controller()->bubbles_shown());
2640 EXPECT_EQ(1, test_generated_bubble_controller()->bubbles_shown());
2643 // Verify that new Wallet data is fetched when the user switches away from the
2644 // tab hosting the Autofill dialog and back. Also verify that the user's
2645 // selection is preserved across this re-fetch.
2646 TEST_F(AutofillDialogControllerTest, ReloadWalletItemsOnActivation) {
2647 // Initialize some Wallet data.
2648 scoped_ptr<wallet::WalletItems> wallet_items =
2649 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2650 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2651 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
2652 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
2653 wallet_items->AddAddress(wallet::GetTestShippingAddress());
2654 controller()->OnDidGetWalletItems(wallet_items.Pass());
2656 // Initially, the default entries should be selected.
2657 ui::MenuModel* cc_billing_model =
2658 controller()->MenuModelForSection(SECTION_CC_BILLING);
2659 ui::MenuModel* shipping_model =
2660 controller()->MenuModelForSection(SECTION_SHIPPING);
2661 // "add", "manage", and 2 suggestions.
2662 ASSERT_EQ(4, cc_billing_model->GetItemCount());
2663 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(0));
2664 // "use billing", "add", "manage", and 2 suggestions.
2665 ASSERT_EQ(5, shipping_model->GetItemCount());
2666 EXPECT_TRUE(shipping_model->IsItemCheckedAt(2));
2668 // Select entries other than the defaults.
2669 cc_billing_model->ActivatedAt(1);
2670 shipping_model->ActivatedAt(1);
2671 // 2 suggestions, "add", and "manage".
2672 ASSERT_EQ(4, cc_billing_model->GetItemCount());
2673 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(1));
2674 // "use billing", 2 suggestions, "add", "manage".
2675 ASSERT_EQ(5, shipping_model->GetItemCount());
2676 EXPECT_TRUE(shipping_model-> IsItemCheckedAt(1));
2678 // Simulate switching away from the tab and back. This should issue a request
2679 // for wallet items.
2680 controller()->ClearLastWalletItemsFetchTimestampForTesting();
2681 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
2682 controller()->TabActivated();
2684 // Simulate a response that includes different items.
2685 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2686 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentExpired());
2687 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2688 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
2689 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
2690 controller()->OnDidGetWalletItems(wallet_items.Pass());
2692 // The previously selected entries should still be selected.
2693 // 3 suggestions, "add", and "manage".
2694 ASSERT_EQ(5, cc_billing_model->GetItemCount());
2695 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(2));
2696 // "use billing", 1 suggestion, "add", and "manage".
2697 ASSERT_EQ(4, shipping_model->GetItemCount());
2698 EXPECT_TRUE(shipping_model->IsItemCheckedAt(1));
2701 // Verify that if the default values change when re-fetching Wallet data, these
2702 // new default values are selected in the dialog.
2703 TEST_F(AutofillDialogControllerTest,
2704 ReloadWalletItemsOnActivationWithNewDefaults) {
2705 // Initialize some Wallet data.
2706 scoped_ptr<wallet::WalletItems> wallet_items =
2707 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2708 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument());
2709 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument());
2710 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
2711 wallet_items->AddAddress(wallet::GetTestShippingAddress());
2712 controller()->OnDidGetWalletItems(wallet_items.Pass());
2714 // Initially, the default entries should be selected.
2715 ui::MenuModel* cc_billing_model =
2716 controller()->MenuModelForSection(SECTION_CC_BILLING);
2717 ui::MenuModel* shipping_model =
2718 controller()->MenuModelForSection(SECTION_SHIPPING);
2719 // 2 suggestions, "add", and "manage".
2720 ASSERT_EQ(4, cc_billing_model->GetItemCount());
2721 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(0));
2722 // "use billing", 2 suggestions, "add", and "manage".
2723 ASSERT_EQ(5, shipping_model->GetItemCount());
2724 EXPECT_TRUE(shipping_model->IsItemCheckedAt(2));
2726 // Simulate switching away from the tab and back. This should issue a request
2727 // for wallet items.
2728 controller()->ClearLastWalletItemsFetchTimestampForTesting();
2729 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
2730 controller()->TabActivated();
2732 // Simulate a response that includes different default values.
2733 wallet_items =
2734 wallet::GetTestWalletItemsWithDefaultIds("new_default_instrument_id",
2735 "new_default_address_id",
2736 wallet::AMEX_DISALLOWED);
2737 scoped_ptr<wallet::Address> other_address = wallet::GetTestShippingAddress();
2738 other_address->set_object_id("other_address_id");
2739 scoped_ptr<wallet::Address> new_default_address =
2740 wallet::GetTestNonDefaultShippingAddress();
2741 new_default_address->set_object_id("new_default_address_id");
2743 wallet_items->AddInstrument(
2744 wallet::GetTestMaskedInstrumentWithId("other_instrument_id"));
2745 wallet_items->AddInstrument(
2746 wallet::GetTestMaskedInstrumentWithId("new_default_instrument_id"));
2747 wallet_items->AddAddress(new_default_address.Pass());
2748 wallet_items->AddAddress(other_address.Pass());
2749 controller()->OnDidGetWalletItems(wallet_items.Pass());
2751 // The new default entries should be selected.
2752 // 2 suggestions, "add", and "manage".
2753 ASSERT_EQ(4, cc_billing_model->GetItemCount());
2754 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(1));
2755 // "use billing", 2 suggestions, "add", and "manage".
2756 ASSERT_EQ(5, shipping_model->GetItemCount());
2757 EXPECT_TRUE(shipping_model->IsItemCheckedAt(1));
2760 TEST_F(AutofillDialogControllerTest, ReloadWithEmptyWalletItems) {
2761 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2762 controller()->MenuModelForSection(SECTION_CC_BILLING)->ActivatedAt(1);
2763 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
2765 controller()->ClearLastWalletItemsFetchTimestampForTesting();
2766 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
2767 controller()->TabActivated();
2769 controller()->OnDidGetWalletItems(
2770 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED));
2772 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING));
2773 EXPECT_EQ(
2774 3, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount());
2777 TEST_F(AutofillDialogControllerTest, SaveInChromeByDefault) {
2778 EXPECT_TRUE(controller()->ShouldSaveInChrome());
2779 SwitchToAutofill();
2780 FillCreditCardInputs();
2781 controller()->OnAccept();
2782 EXPECT_TRUE(controller()->ShouldSaveInChrome());
2785 TEST_F(AutofillDialogControllerTest,
2786 SaveInChromePreferenceNotRememberedOnCancel) {
2787 EXPECT_TRUE(controller()->ShouldSaveInChrome());
2788 SwitchToAutofill();
2789 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false);
2790 controller()->OnCancel();
2791 EXPECT_TRUE(controller()->ShouldSaveInChrome());
2794 TEST_F(AutofillDialogControllerTest,
2795 SaveInChromePreferenceRememberedOnSuccess) {
2796 EXPECT_TRUE(controller()->ShouldSaveInChrome());
2797 SwitchToAutofill();
2798 FillCreditCardInputs();
2799 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false);
2800 controller()->OnAccept();
2801 EXPECT_FALSE(controller()->ShouldSaveInChrome());
2804 TEST_F(AutofillDialogControllerTest,
2805 SubmitButtonIsDisabled_SpinnerFinishesBeforeDelay) {
2806 // Reset Wallet state.
2807 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>());
2809 EXPECT_EQ(1, controller()->get_submit_button_delay_count());
2811 // Begin the submit button delay.
2812 controller()->SimulateSubmitButtonDelayBegin();
2814 EXPECT_TRUE(controller()->ShouldShowSpinner());
2815 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2817 // Stop the spinner.
2818 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2820 EXPECT_FALSE(controller()->ShouldShowSpinner());
2821 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2823 // End the submit button delay.
2824 controller()->SimulateSubmitButtonDelayEnd();
2826 EXPECT_FALSE(controller()->ShouldShowSpinner());
2827 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2830 TEST_F(AutofillDialogControllerTest,
2831 SubmitButtonIsDisabled_SpinnerFinishesAfterDelay) {
2832 // Reset Wallet state.
2833 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>());
2835 EXPECT_EQ(1, controller()->get_submit_button_delay_count());
2837 // Begin the submit button delay.
2838 controller()->SimulateSubmitButtonDelayBegin();
2840 EXPECT_TRUE(controller()->ShouldShowSpinner());
2841 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2843 // End the submit button delay.
2844 controller()->SimulateSubmitButtonDelayEnd();
2846 EXPECT_TRUE(controller()->ShouldShowSpinner());
2847 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2849 // Stop the spinner.
2850 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
2852 EXPECT_FALSE(controller()->ShouldShowSpinner());
2853 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2856 TEST_F(AutofillDialogControllerTest, SubmitButtonIsDisabled_NoSpinner) {
2857 SwitchToAutofill();
2859 EXPECT_EQ(1, controller()->get_submit_button_delay_count());
2861 // Begin the submit button delay.
2862 controller()->SimulateSubmitButtonDelayBegin();
2864 EXPECT_FALSE(controller()->ShouldShowSpinner());
2865 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2867 // End the submit button delay.
2868 controller()->SimulateSubmitButtonDelayEnd();
2870 EXPECT_FALSE(controller()->ShouldShowSpinner());
2871 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK));
2874 TEST_F(AutofillDialogControllerTest, IconsForFields_NoCreditCard) {
2875 FieldValueMap values;
2876 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail);
2877 FieldIconMap icons = controller()->IconsForFields(values);
2878 EXPECT_TRUE(icons.empty());
2881 TEST_F(AutofillDialogControllerTest, IconsForFields_CreditCardNumberOnly) {
2882 FieldValueMap values;
2883 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail);
2884 values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa);
2885 FieldIconMap icons = controller()->IconsForFields(values);
2886 EXPECT_EQ(1UL, icons.size());
2887 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER));
2890 TEST_F(AutofillDialogControllerTest, IconsForFields_CvcOnly) {
2891 FieldValueMap values;
2892 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail);
2893 values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123");
2894 FieldIconMap icons = controller()->IconsForFields(values);
2895 EXPECT_EQ(1UL, icons.size());
2896 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE));
2899 TEST_F(AutofillDialogControllerTest, IconsForFields_BothCreditCardAndCvc) {
2900 FieldValueMap values;
2901 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail);
2902 values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa);
2903 values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123");
2904 FieldIconMap icons = controller()->IconsForFields(values);
2905 EXPECT_EQ(2UL, icons.size());
2906 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE));
2907 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER));
2910 TEST_F(AutofillDialogControllerTest, FieldControlsIcons) {
2911 EXPECT_TRUE(controller()->FieldControlsIcons(CREDIT_CARD_NUMBER));
2912 EXPECT_FALSE(controller()->FieldControlsIcons(CREDIT_CARD_VERIFICATION_CODE));
2913 EXPECT_FALSE(controller()->FieldControlsIcons(EMAIL_ADDRESS));
2916 TEST_F(AutofillDialogControllerTest, SaveCreditCardIncludesName_NoBilling) {
2917 SwitchToAutofill();
2919 CreditCard test_credit_card(test::GetVerifiedCreditCard());
2920 FillInputs(SECTION_CC, test_credit_card);
2922 AutofillProfile test_profile(test::GetVerifiedProfile());
2923 FillInputs(SECTION_BILLING, test_profile);
2925 UseBillingForShipping();
2927 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true);
2928 controller()->OnAccept();
2930 TestPersonalDataManager* test_pdm = controller()->GetTestingManager();
2931 const CreditCard& imported_card = test_pdm->imported_credit_card();
2932 EXPECT_EQ(test_profile.GetInfo(AutofillType(NAME_FULL), "en-US"),
2933 imported_card.GetRawInfo(CREDIT_CARD_NAME));
2936 TEST_F(AutofillDialogControllerTest, SaveCreditCardIncludesName_WithBilling) {
2937 SwitchToAutofill();
2939 TestPersonalDataManager* test_pdm = controller()->GetTestingManager();
2940 AutofillProfile test_profile(test::GetVerifiedProfile());
2942 EXPECT_CALL(*controller()->GetView(), ModelChanged());
2943 test_pdm->AddTestingProfile(&test_profile);
2944 ASSERT_TRUE(controller()->MenuModelForSection(SECTION_BILLING));
2946 CreditCard test_credit_card(test::GetVerifiedCreditCard());
2947 FillInputs(SECTION_CC, test_credit_card);
2949 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true);
2950 controller()->OnAccept();
2952 const CreditCard& imported_card = test_pdm->imported_credit_card();
2953 EXPECT_EQ(test_profile.GetInfo(AutofillType(NAME_FULL), "en-US"),
2954 imported_card.GetRawInfo(CREDIT_CARD_NAME));
2956 controller()->ViewClosed();
2959 TEST_F(AutofillDialogControllerTest, InputEditability) {
2960 // Empty wallet items: all fields are editable.
2961 scoped_ptr<wallet::WalletItems> items =
2962 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2963 controller()->OnDidGetWalletItems(items.Pass());
2965 DialogSection sections[] = { SECTION_CC_BILLING, SECTION_SHIPPING };
2966 for (size_t i = 0; i < arraysize(sections); ++i) {
2967 const DetailInputs& inputs =
2968 controller()->RequestedFieldsForSection(sections[i]);
2969 for (size_t j = 0; j < inputs.size(); ++j) {
2970 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i]));
2974 // Expired instrument: CC number + CVV are not editable.
2975 items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
2976 scoped_ptr<wallet::WalletItems::MaskedInstrument> expired_instrument =
2977 wallet::GetTestMaskedInstrumentExpired();
2978 items->AddInstrument(expired_instrument.Pass());
2979 controller()->OnDidGetWalletItems(items.Pass());
2980 EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING));
2982 const DetailInputs& inputs =
2983 controller()->RequestedFieldsForSection(SECTION_CC_BILLING);
2984 FieldValueMap outputs;
2985 CopyInitialValues(inputs, &outputs);
2986 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
2988 for (size_t i = 0; i < arraysize(sections); ++i) {
2989 const DetailInputs& inputs =
2990 controller()->RequestedFieldsForSection(sections[i]);
2991 for (size_t j = 0; j < inputs.size(); ++j) {
2992 if (inputs[j].type == CREDIT_CARD_NUMBER ||
2993 inputs[j].type == CREDIT_CARD_VERIFICATION_CODE) {
2994 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i]));
2995 } else {
2996 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i]));
3001 // User changes the billing address; same story.
3002 outputs[ADDRESS_BILLING_ZIP] = ASCIIToUTF16("77025");
3003 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
3004 for (size_t i = 0; i < arraysize(sections); ++i) {
3005 const DetailInputs& inputs =
3006 controller()->RequestedFieldsForSection(sections[i]);
3007 for (size_t j = 0; j < inputs.size(); ++j) {
3008 if (inputs[j].type == CREDIT_CARD_NUMBER ||
3009 inputs[j].type == CREDIT_CARD_VERIFICATION_CODE) {
3010 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i]));
3011 } else {
3012 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i]));
3017 // User changes a detail of the CC itself (expiration date), CVV is now
3018 // editable (and mandatory).
3019 outputs[CREDIT_CARD_EXP_MONTH] = ASCIIToUTF16("06");
3020 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
3021 for (size_t i = 0; i < arraysize(sections); ++i) {
3022 const DetailInputs& inputs =
3023 controller()->RequestedFieldsForSection(sections[i]);
3024 for (size_t j = 0; j < inputs.size(); ++j) {
3025 if (inputs[j].type == CREDIT_CARD_NUMBER)
3026 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i]));
3027 else
3028 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i]));
3033 // When the default country is something besides US, wallet is not selected
3034 // and the account chooser shouldn't be visible.
3035 TEST_F(AutofillDialogControllerTest, HideWalletInOtherCountries) {
3036 // Addresses from different countries.
3037 AutofillProfile us_profile(base::GenerateGUID(), kSettingsOrigin),
3038 es_profile(base::GenerateGUID(), kSettingsOrigin),
3039 es_profile2(base::GenerateGUID(), kSettingsOrigin);
3040 us_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
3041 es_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("ES"));
3042 es_profile2.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("ES"));
3044 // If US is indicated (via timezone), show Wallet.
3045 ResetControllerWithFormData(DefaultFormData());
3046 controller()->GetTestingManager()->set_timezone_country_code("US");
3047 controller()->Show();
3048 EXPECT_TRUE(
3049 controller()->AccountChooserModelForTesting()->WalletIsSelected());
3050 controller()->OnDidFetchWalletCookieValue(std::string());
3051 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3052 EXPECT_TRUE(controller()->ShouldShowAccountChooser());
3053 EXPECT_TRUE(
3054 controller()->AccountChooserModelForTesting()->WalletIsSelected());
3056 // If US is not indicated, don't show Wallet.
3057 ResetControllerWithFormData(DefaultFormData());
3058 controller()->GetTestingManager()->set_timezone_country_code("ES");
3059 controller()->Show();
3060 controller()->OnDidFetchWalletCookieValue(std::string());
3061 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3062 EXPECT_FALSE(controller()->ShouldShowAccountChooser());
3064 // If US is indicated (via a profile), show Wallet.
3065 ResetControllerWithFormData(DefaultFormData());
3066 controller()->GetTestingManager()->set_timezone_country_code("ES");
3067 controller()->GetTestingManager()->AddTestingProfile(&us_profile);
3068 controller()->Show();
3069 controller()->OnDidFetchWalletCookieValue(std::string());
3070 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3071 EXPECT_TRUE(controller()->ShouldShowAccountChooser());
3072 EXPECT_TRUE(
3073 controller()->AccountChooserModelForTesting()->WalletIsSelected());
3075 // Make sure the profile doesn't just override the timezone.
3076 ResetControllerWithFormData(DefaultFormData());
3077 controller()->GetTestingManager()->set_timezone_country_code("US");
3078 controller()->GetTestingManager()->AddTestingProfile(&es_profile);
3079 controller()->Show();
3080 controller()->OnDidFetchWalletCookieValue(std::string());
3081 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3082 EXPECT_TRUE(controller()->ShouldShowAccountChooser());
3083 EXPECT_TRUE(
3084 controller()->AccountChooserModelForTesting()->WalletIsSelected());
3086 // Only takes one US address to enable Wallet.
3087 ResetControllerWithFormData(DefaultFormData());
3088 controller()->GetTestingManager()->set_timezone_country_code("FR");
3089 controller()->GetTestingManager()->AddTestingProfile(&es_profile);
3090 controller()->GetTestingManager()->AddTestingProfile(&es_profile2);
3091 controller()->GetTestingManager()->AddTestingProfile(&us_profile);
3092 controller()->Show();
3093 controller()->OnDidFetchWalletCookieValue(std::string());
3094 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3095 EXPECT_TRUE(controller()->ShouldShowAccountChooser());
3096 EXPECT_TRUE(
3097 controller()->AccountChooserModelForTesting()->WalletIsSelected());
3100 TEST_F(AutofillDialogControllerTest, DontGetWalletTillNecessary) {
3101 // When starting on local data mode, the dialog will provide a "Use Google
3102 // Wallet" link.
3103 profile()->GetPrefs()->SetBoolean(
3104 ::prefs::kAutofillDialogPayWithoutWallet, true);
3105 ResetControllerWithFormData(DefaultFormData());
3106 controller()->Show();
3107 base::string16 use_wallet_text = controller()->SignInLinkText();
3108 EXPECT_EQ(TestAutofillDialogController::NOT_CHECKED,
3109 controller()->SignedInState());
3111 // When clicked, this link will ask for wallet items. If there's a signin
3112 // failure, the link will switch to "Sign in to use Google Wallet".
3113 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
3114 controller()->SignInLinkClicked();
3115 EXPECT_NE(TestAutofillDialogController::NOT_CHECKED,
3116 controller()->SignedInState());
3117 controller()->OnDidFetchWalletCookieValue(std::string());
3118 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems());
3119 controller()->OnPassiveSigninFailure(GoogleServiceAuthError(
3120 GoogleServiceAuthError::CONNECTION_FAILED));
3121 EXPECT_NE(use_wallet_text, controller()->SignInLinkText());
3124 TEST_F(AutofillDialogControllerTest, MultiAccountSwitch) {
3125 std::vector<std::string> users;
3126 users.push_back("user_1@example.com");
3127 users.push_back("user_2@example.com");
3128 controller()->OnDidGetWalletItems(
3129 wallet::GetTestWalletItemsWithUsers(users, 0));
3131 // Items should be: Account 1, account 2, add account, disable wallet.
3132 EXPECT_EQ(4, controller()->MenuModelForAccountChooser()->GetItemCount());
3133 EXPECT_EQ(0U, controller()->GetTestingWalletClient()->user_index());
3135 // GetWalletItems should be called when the user switches accounts.
3136 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems(_, _));
3137 controller()->MenuModelForAccountChooser()->ActivatedAt(1);
3138 // The wallet client should be updated to the new user index.
3139 EXPECT_EQ(1U, controller()->GetTestingWalletClient()->user_index());
3142 TEST_F(AutofillDialogControllerTest, PassiveAuthFailure) {
3143 controller()->OnDidGetWalletItems(
3144 wallet::GetTestWalletItemsWithRequiredAction(
3145 wallet::PASSIVE_GAIA_AUTH));
3146 EXPECT_TRUE(controller()->ShouldShowSpinner());
3147 controller()->OnPassiveSigninFailure(GoogleServiceAuthError(
3148 GoogleServiceAuthError::NONE));
3149 EXPECT_FALSE(controller()->ShouldShowSpinner());
3152 TEST_F(AutofillDialogControllerTest, WalletShippingSameAsBilling) {
3153 // Assert initial state.
3154 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath(
3155 ::prefs::kAutofillDialogWalletShippingSameAsBilling));
3157 // Verify that false pref defaults to wallet defaults.
3158 scoped_ptr<wallet::WalletItems> wallet_items =
3159 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
3160 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
3161 wallet_items->AddAddress(wallet::GetTestShippingAddress());
3162 controller()->OnDidGetWalletItems(wallet_items.Pass());
3163 ASSERT_FALSE(profile()->GetPrefs()->GetBoolean(
3164 ::prefs::kAutofillDialogWalletShippingSameAsBilling));
3165 EXPECT_EQ(2, GetMenuModelForSection(SECTION_SHIPPING)->checked_item());
3167 // Set "Same as Billing" for the shipping address and verify it sets the pref
3168 // and selects the appropriate menu item.
3169 UseBillingForShipping();
3170 ASSERT_EQ(0, GetMenuModelForSection(SECTION_SHIPPING)->checked_item());
3171 controller()->ForceFinishSubmit();
3172 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean(
3173 ::prefs::kAutofillDialogWalletShippingSameAsBilling));
3175 // Getting new wallet info shouldn't disrupt the preference and menu should be
3176 // set accordingly.
3177 Reset();
3178 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
3179 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress());
3180 wallet_items->AddAddress(wallet::GetTestShippingAddress());
3181 controller()->OnDidGetWalletItems(wallet_items.Pass());
3182 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
3183 ::prefs::kAutofillDialogWalletShippingSameAsBilling));
3184 EXPECT_EQ(0, GetMenuModelForSection(SECTION_SHIPPING)->checked_item());
3186 // Choose a different address and ensure pref gets set to false.
3187 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
3188 controller()->ForceFinishSubmit();
3189 EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(
3190 ::prefs::kAutofillDialogWalletShippingSameAsBilling));
3193 // Verifies that a call to the IconsForFields() method before the card type is
3194 // known returns a placeholder image that is at least as large as the icons for
3195 // all of the supported major credit card issuers.
3196 TEST_F(AutofillDialogControllerTest, IconReservedForCreditCardField) {
3197 FieldValueMap inputs;
3198 inputs[CREDIT_CARD_NUMBER] = base::string16();
3200 FieldIconMap icons = controller()->IconsForFields(inputs);
3201 EXPECT_EQ(1U, icons.size());
3203 ASSERT_EQ(1U, icons.count(CREDIT_CARD_NUMBER));
3204 gfx::Image placeholder_icon = icons[CREDIT_CARD_NUMBER];
3206 // Verify that the placeholder icon is at least as large as the icons for the
3207 // supported credit card issuers.
3208 const int kSupportedCardIdrs[] = {
3209 IDR_AUTOFILL_CC_AMEX,
3210 IDR_AUTOFILL_CC_DINERS,
3211 IDR_AUTOFILL_CC_DISCOVER,
3212 IDR_AUTOFILL_CC_GENERIC,
3213 IDR_AUTOFILL_CC_JCB,
3214 IDR_AUTOFILL_CC_MASTERCARD,
3215 IDR_AUTOFILL_CC_VISA,
3217 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
3218 for (size_t i = 0; i < arraysize(kSupportedCardIdrs); ++i) {
3219 SCOPED_TRACE(base::IntToString(i));
3220 gfx::Image supported_card_icon = rb.GetImageNamed(kSupportedCardIdrs[i]);
3221 EXPECT_GE(placeholder_icon.Width(), supported_card_icon.Width());
3222 EXPECT_GE(placeholder_icon.Height(), supported_card_icon.Height());
3226 TEST_F(AutofillDialogControllerTest, CountryChangeUpdatesSection) {
3227 TestAutofillDialogView* view = controller()->GetView();
3228 view->ClearSectionUpdates();
3230 controller()->UserEditedOrActivatedInput(SECTION_SHIPPING,
3231 ADDRESS_HOME_COUNTRY,
3232 gfx::NativeView(),
3233 gfx::Rect(),
3234 ASCIIToUTF16("Belarus"),
3235 true);
3236 std::map<DialogSection, size_t> updates = view->section_updates();
3237 EXPECT_EQ(1U, updates[SECTION_SHIPPING]);
3238 EXPECT_EQ(1U, updates.size());
3240 view->ClearSectionUpdates();
3242 controller()->UserEditedOrActivatedInput(SECTION_CC_BILLING,
3243 ADDRESS_BILLING_COUNTRY,
3244 gfx::NativeView(),
3245 gfx::Rect(),
3246 ASCIIToUTF16("France"),
3247 true);
3248 updates = view->section_updates();
3249 EXPECT_EQ(1U, updates[SECTION_CC_BILLING]);
3250 EXPECT_EQ(1U, updates.size());
3252 SwitchToAutofill();
3253 view->ClearSectionUpdates();
3255 controller()->UserEditedOrActivatedInput(SECTION_BILLING,
3256 ADDRESS_BILLING_COUNTRY,
3257 gfx::NativeView(),
3258 gfx::Rect(),
3259 ASCIIToUTF16("Italy"),
3260 true);
3261 updates = view->section_updates();
3262 EXPECT_EQ(1U, updates[SECTION_BILLING]);
3263 EXPECT_EQ(1U, updates.size());
3266 TEST_F(AutofillDialogControllerTest, CorrectCountryFromInputs) {
3267 EXPECT_CALL(*controller()->GetMockValidator(),
3268 ValidateAddress(CountryCodeMatcher("DE"), _, _));
3270 FieldValueMap billing_inputs;
3271 billing_inputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("Germany");
3272 controller()->InputsAreValid(SECTION_BILLING, billing_inputs);
3274 EXPECT_CALL(*controller()->GetMockValidator(),
3275 ValidateAddress(CountryCodeMatcher("FR"), _, _));
3277 FieldValueMap shipping_inputs;
3278 shipping_inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("France");
3279 controller()->InputsAreValid(SECTION_SHIPPING, shipping_inputs);
3282 TEST_F(AutofillDialogControllerTest, ValidationRulesLoadedOnCountryChange) {
3283 ResetControllerWithFormData(DefaultFormData());
3284 EXPECT_CALL(*controller()->GetMockValidator(),
3285 LoadRules("US")).Times(AtLeast(1));
3286 controller()->Show();
3288 EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("FR"));
3289 controller()->UserEditedOrActivatedInput(SECTION_BILLING,
3290 ADDRESS_BILLING_COUNTRY,
3291 gfx::NativeView(),
3292 gfx::Rect(),
3293 ASCIIToUTF16("France"),
3294 true);
3297 TEST_F(AutofillDialogControllerTest, UsValidationRulesLoadedForJpOnlyProfile) {
3298 ResetControllerWithFormData(DefaultFormData());
3299 AutofillProfile jp_profile(base::GenerateGUID(), kSettingsOrigin);
3300 jp_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("JP"));
3301 controller()->GetTestingManager()->AddTestingProfile(&jp_profile);
3302 EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("US"));
3303 EXPECT_CALL(*controller()->GetMockValidator(),
3304 LoadRules("JP")).Times(AtLeast(1));
3305 controller()->Show();
3308 TEST_F(AutofillDialogControllerTest, InvalidWhenRulesNotReady) {
3309 // Select "Add new shipping address...".
3310 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1);
3312 // If the rules haven't loaded yet, validation errors should show on submit.
3313 EXPECT_CALL(*controller()->GetMockValidator(),
3314 ValidateAddress(CountryCodeMatcher("US"), _, _)).
3315 WillRepeatedly(Return(AddressValidator::RULES_NOT_READY));
3317 FieldValueMap inputs;
3318 inputs[ADDRESS_HOME_ZIP] = ASCIIToUTF16("1234");
3319 inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("United States");
3321 ValidityMessages messages =
3322 controller()->InputsAreValid(SECTION_SHIPPING, inputs);
3323 EXPECT_FALSE(messages.GetMessageOrDefault(ADDRESS_HOME_ZIP).text.empty());
3324 EXPECT_FALSE(messages.HasSureError(ADDRESS_HOME_ZIP));
3325 // Country should never show an error message as it's always valid.
3326 EXPECT_TRUE(messages.GetMessageOrDefault(ADDRESS_HOME_COUNTRY).text.empty());
3329 TEST_F(AutofillDialogControllerTest, ValidButUnverifiedWhenRulesFail) {
3330 SwitchToAutofill();
3332 // Add suggestions so the credit card and billing sections aren't showing
3333 // their manual inputs (to isolate to just shipping).
3334 AutofillProfile verified_profile(test::GetVerifiedProfile());
3335 controller()->GetTestingManager()->AddTestingProfile(&verified_profile);
3336 CreditCard verified_card(test::GetVerifiedCreditCard());
3337 controller()->GetTestingManager()->AddTestingCreditCard(&verified_card);
3339 // Select "Add new shipping address...".
3340 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2);
3342 // If the rules are unavailable, validation errors should not show.
3343 EXPECT_CALL(*controller()->GetMockValidator(),
3344 ValidateAddress(CountryCodeMatcher("US"), _, _)).
3345 WillRepeatedly(Return(AddressValidator::RULES_UNAVAILABLE));
3347 FieldValueMap outputs;
3348 AutofillProfile full_profile(test::GetFullProfile());
3349 const DetailInputs& inputs =
3350 controller()->RequestedFieldsForSection(SECTION_SHIPPING);
3351 for (size_t i = 0; i < inputs.size(); ++i) {
3352 const ServerFieldType type = inputs[i].type;
3353 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US");
3355 controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs);
3356 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true);
3357 controller()->OnAccept();
3359 // Profiles saved while rules are unavailable shouldn't be verified.
3360 const AutofillProfile& imported_profile =
3361 controller()->GetTestingManager()->imported_profile();
3362 ASSERT_EQ(imported_profile.GetInfo(AutofillType(NAME_FULL), "en-US"),
3363 full_profile.GetInfo(AutofillType(NAME_FULL), "en-US"));
3364 EXPECT_EQ(imported_profile.origin(), GURL(kSourceUrl).GetOrigin().spec());
3365 EXPECT_FALSE(imported_profile.IsVerified());
3368 TEST_F(AutofillDialogControllerTest, LimitedCountryChoices) {
3369 ui::ComboboxModel* shipping_country_model =
3370 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY);
3371 const int default_number_of_countries =
3372 shipping_country_model->GetItemCount();
3373 // We show a lot of countries by default, but the exact number doesn't matter.
3374 EXPECT_GT(default_number_of_countries, 50);
3376 // Create a form data that simulates:
3377 // <select autocomplete="billing country">
3378 // <option value="AU">Down Under</option>
3379 // <option value="">fR</option> <!-- Case doesn't matter -->
3380 // <option value="GRMNY">Germany</option>
3381 // </select>
3382 // Only country codes are respected, whether they're in value or the option's
3383 // text content. Thus the first two options should be recognized.
3384 FormData form_data;
3385 FormFieldData field;
3386 field.autocomplete_attribute = "billing country";
3387 field.option_contents.push_back(ASCIIToUTF16("Down Under"));
3388 field.option_values.push_back(ASCIIToUTF16("AU"));
3389 field.option_contents.push_back(ASCIIToUTF16("Fr"));
3390 field.option_values.push_back(ASCIIToUTF16(""));
3391 field.option_contents.push_back(ASCIIToUTF16("Germany"));
3392 field.option_values.push_back(ASCIIToUTF16("GRMNY"));
3394 FormFieldData cc_field;
3395 cc_field.autocomplete_attribute = "cc-csc";
3397 form_data.fields.push_back(field);
3398 form_data.fields.push_back(cc_field);
3399 ResetControllerWithFormData(form_data);
3400 controller()->Show();
3402 // Shipping model shouldn't have changed.
3403 shipping_country_model =
3404 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY);
3405 EXPECT_EQ(default_number_of_countries,
3406 shipping_country_model->GetItemCount());
3407 // Billing model now only has two items.
3408 ui::ComboboxModel* billing_country_model =
3409 controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY);
3410 ASSERT_EQ(2, billing_country_model->GetItemCount());
3411 EXPECT_EQ(billing_country_model->GetItemAt(0), ASCIIToUTF16("Australia"));
3412 EXPECT_EQ(billing_country_model->GetItemAt(1), ASCIIToUTF16("France"));
3414 // Make sure it also applies to profile suggestions.
3415 AutofillProfile us_profile(test::GetVerifiedProfile());
3416 us_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
3417 controller()->GetTestingManager()->AddTestingProfile(&us_profile);
3418 // Don't show a suggestion if the only one that exists is disabled.
3419 EXPECT_FALSE(
3420 controller()->SuggestionStateForSection(SECTION_BILLING).visible);
3422 // Add a profile with an acceptable country; suggestion should be shown.
3423 ResetControllerWithFormData(form_data);
3424 controller()->Show();
3425 AutofillProfile au_profile(test::GetVerifiedProfile2());
3426 au_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("AU"));
3427 controller()->GetTestingManager()->AddTestingProfile(&us_profile);
3428 controller()->GetTestingManager()->AddTestingProfile(&au_profile);
3429 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING);
3430 ASSERT_TRUE(model);
3431 EXPECT_EQ(4, model->GetItemCount());
3432 EXPECT_FALSE(model->IsEnabledAt(0));
3433 EXPECT_TRUE(model->IsEnabledAt(1));
3435 // Add <input type="text" autocomplete="billing country"></input>
3436 // This should open up selection of all countries again.
3437 FormFieldData field2;
3438 field2.autocomplete_attribute = "billing country";
3439 form_data.fields.push_back(field2);
3440 ResetControllerWithFormData(form_data);
3441 controller()->Show();
3443 billing_country_model =
3444 controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY);
3445 EXPECT_EQ(default_number_of_countries,
3446 billing_country_model->GetItemCount());
3449 TEST_F(AutofillDialogControllerTest, WalletUnsupportedCountries) {
3450 // Create a form data that simulates:
3451 // <select autocomplete="billing country">
3452 // <option value="IQ">Iraq</option>
3453 // <option value="MX">Mexico</option>
3454 // </select>
3455 // i.e. contains a mix of supported and unsupported countries.
3456 FormData form_data;
3457 FormFieldData field;
3458 field.autocomplete_attribute = "shipping country";
3459 field.option_contents.push_back(ASCIIToUTF16("Iraq"));
3460 field.option_values.push_back(ASCIIToUTF16("IQ"));
3461 field.option_contents.push_back(ASCIIToUTF16("Mexico"));
3462 field.option_values.push_back(ASCIIToUTF16("MX"));
3464 FormFieldData cc_field;
3465 cc_field.autocomplete_attribute = "cc-csc";
3467 form_data.fields.push_back(field);
3468 form_data.fields.push_back(cc_field);
3469 ResetControllerWithFormData(form_data);
3470 controller()->Show();
3472 ui::ComboboxModel* shipping_country_model =
3473 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY);
3474 ASSERT_EQ(2, shipping_country_model->GetItemCount());
3475 EXPECT_EQ(shipping_country_model->GetItemAt(0), ASCIIToUTF16("Iraq"));
3476 EXPECT_EQ(shipping_country_model->GetItemAt(1), ASCIIToUTF16("Mexico"));
3478 // Switch to Wallet, add limitations.
3479 SetUpControllerWithFormData(form_data);
3480 SwitchToWallet();
3481 scoped_ptr<wallet::WalletItems> wallet_items =
3482 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
3483 wallet_items->AddAllowedShippingCountry("MX");
3484 wallet_items->AddAllowedShippingCountry("GB");
3485 controller()->OnDidGetWalletItems(wallet_items.Pass());
3487 // Only the intersection is available.
3488 EXPECT_TRUE(controller()->IsPayingWithWallet());
3489 shipping_country_model =
3490 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY);
3491 ASSERT_EQ(1, shipping_country_model->GetItemCount());
3492 EXPECT_EQ(shipping_country_model->GetItemAt(0), ASCIIToUTF16("Mexico"));
3494 // Empty intersection; Wallet's automatically disabled.
3495 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED);
3496 wallet_items->AddAllowedShippingCountry("CA");
3497 wallet_items->AddAllowedShippingCountry("GB");
3498 controller()->OnDidGetWalletItems(wallet_items.Pass());
3499 EXPECT_FALSE(controller()->IsPayingWithWallet());
3501 // Since it's disabled, we revert to accepting all the countries.
3502 shipping_country_model =
3503 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY);
3504 ASSERT_EQ(2, shipping_country_model->GetItemCount());
3505 EXPECT_EQ(shipping_country_model->GetItemAt(0), ASCIIToUTF16("Iraq"));
3506 EXPECT_EQ(shipping_country_model->GetItemAt(1), ASCIIToUTF16("Mexico"));
3509 // http://crbug.com/388018
3510 TEST_F(AutofillDialogControllerTest, NoCountryChoices) {
3511 // Create a form data that simulates:
3512 // <select autocomplete="billing country">
3513 // <option value="ATL">Atlantis</option>
3514 // <option value="ELD">Eldorado</option>
3515 // </select>
3516 // i.e. contains a list of no valid countries.
3517 FormData form_data;
3518 FormFieldData field;
3519 field.autocomplete_attribute = "billing country";
3520 field.option_contents.push_back(ASCIIToUTF16("Atlantis"));
3521 field.option_values.push_back(ASCIIToUTF16("ATL"));
3522 field.option_contents.push_back(ASCIIToUTF16("Eldorado"));
3523 field.option_values.push_back(ASCIIToUTF16("ELD"));
3525 FormFieldData cc_field;
3526 cc_field.autocomplete_attribute = "cc-csc";
3528 form_data.fields.push_back(field);
3529 form_data.fields.push_back(cc_field);
3530 ResetControllerWithFormData(form_data);
3531 controller()->Show();
3533 // Controller aborts and self destructs.
3534 EXPECT_EQ(0, controller());
3537 TEST_F(AutofillDialogControllerTest, LimitedCcChoices) {
3538 SwitchToAutofill();
3539 // Typically, MC and Visa are both valid.
3540 ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, true);
3541 ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true);
3543 FormData form_data;
3544 FormFieldData field;
3545 field.autocomplete_attribute = "billing cc-type";
3546 field.option_contents.push_back(ASCIIToUTF16("Visa"));
3547 field.option_values.push_back(ASCIIToUTF16("V"));
3548 field.option_contents.push_back(ASCIIToUTF16("American Express"));
3549 field.option_values.push_back(ASCIIToUTF16("AX"));
3550 form_data.fields.push_back(field);
3551 ResetControllerWithFormData(form_data);
3552 controller()->Show();
3554 // MC is not valid because it's missing from FormData.
3555 EXPECT_EQ(l10n_util::GetStringUTF16(
3556 IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_MASTERCARD),
3557 ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, false));
3558 ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true);
3560 CreditCard visa_card(test::GetVerifiedCreditCard());
3561 CreditCard amex_card(test::GetVerifiedCreditCard2());
3563 CreditCard master_card(base::GenerateGUID(), "chrome settings");
3564 test::SetCreditCardInfo(
3565 &master_card, "Mr Foo", "5105105105105100", "07", "2099");
3567 controller()->GetTestingManager()->AddTestingCreditCard(&visa_card);
3568 controller()->GetTestingManager()->AddTestingCreditCard(&amex_card);
3569 controller()->GetTestingManager()->AddTestingCreditCard(&master_card);
3571 // The stored MC is disabled in the dropdown.
3572 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC);
3573 ASSERT_TRUE(model);
3574 ASSERT_EQ(5, model->GetItemCount());
3575 EXPECT_TRUE(model->IsEnabledAt(0));
3576 EXPECT_TRUE(model->IsEnabledAt(1));
3577 EXPECT_FALSE(model->IsEnabledAt(2));
3578 EXPECT_TRUE(model->IsEnabledAt(3));
3579 EXPECT_TRUE(model->IsEnabledAt(4));
3581 // No MC; Wallet is disabled.
3582 SetUpControllerWithFormData(form_data);
3583 EXPECT_FALSE(controller()->IsPayingWithWallet());
3585 // In Autofill mode, Discover is disallowed because it's not in FormData.
3586 ValidateCCNumber(SECTION_CC, kTestCCNumberDiscover, false);
3588 field.option_contents.push_back(ASCIIToUTF16("Mastercard"));
3589 field.option_values.push_back(ASCIIToUTF16("Mastercard"));
3590 form_data.fields[0] = field;
3592 // Add MC to FormData; Wallet is enabled.
3593 SetUpControllerWithFormData(form_data);
3594 EXPECT_TRUE(controller()->IsPayingWithWallet());
3595 // Even though Discover isn't in FormData, it's allowed because Wallet always
3596 // generates a MC Virtual card.
3597 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberDiscover, true);
3600 TEST_F(AutofillDialogControllerTest, SuggestCountrylessProfiles) {
3601 SwitchToAutofill();
3603 FieldValueMap outputs;
3604 outputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("US");
3605 controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs);
3607 AutofillProfile profile(test::GetVerifiedProfile());
3608 profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("The Man Without a Country"));
3609 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::string16());
3610 controller()->GetTestingManager()->AddTestingProfile(&profile);
3612 controller()->UserEditedOrActivatedInput(
3613 SECTION_SHIPPING,
3614 NAME_FULL,
3615 gfx::NativeView(),
3616 gfx::Rect(),
3617 profile.GetRawInfo(NAME_FULL).substr(0, 1),
3618 true);
3619 EXPECT_EQ(NAME_FULL, controller()->popup_input_type());
3622 TEST_F(AutofillDialogControllerTest, SwitchFromWalletWithFirstName) {
3623 controller()->MenuModelForSection(SECTION_CC_BILLING)->ActivatedAt(2);
3625 FieldValueMap outputs;
3626 outputs[NAME_FULL] = ASCIIToUTF16("madonna");
3627 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs);
3629 ASSERT_NO_FATAL_FAILURE(SwitchToAutofill());
3632 // Regression test for http://crbug.com/382777
3633 TEST_F(AutofillDialogControllerTest, WalletBillingCountry) {
3634 FormFieldData cc_field;
3635 cc_field.autocomplete_attribute = "cc-number";
3636 FormFieldData billing_country, billing_country_name, shipping_country,
3637 shipping_country_name;
3638 billing_country.autocomplete_attribute = "billing country";
3639 billing_country_name.autocomplete_attribute = "billing country-name";
3640 shipping_country.autocomplete_attribute = "shipping country";
3641 shipping_country_name.autocomplete_attribute = "shipping country-name";
3643 FormData form_data;
3644 form_data.fields.push_back(cc_field);
3645 form_data.fields.push_back(billing_country);
3646 form_data.fields.push_back(billing_country_name);
3647 form_data.fields.push_back(shipping_country);
3648 form_data.fields.push_back(shipping_country_name);
3650 SetUpControllerWithFormData(form_data);
3651 AcceptAndLoadFakeFingerprint();
3652 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet());
3653 controller()->ForceFinishSubmit();
3655 ASSERT_EQ(5U, form_structure()->field_count());
3656 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
3657 form_structure()->field(1)->Type().GetStorableType());
3658 EXPECT_EQ(ASCIIToUTF16("US"), form_structure()->field(1)->value);
3659 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
3660 form_structure()->field(2)->Type().GetStorableType());
3661 EXPECT_EQ(ASCIIToUTF16("United States"), form_structure()->field(2)->value);
3662 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
3663 form_structure()->field(3)->Type().GetStorableType());
3664 EXPECT_EQ(ASCIIToUTF16("US"), form_structure()->field(3)->value);
3665 EXPECT_EQ(ADDRESS_HOME_COUNTRY,
3666 form_structure()->field(4)->Type().GetStorableType());
3667 EXPECT_EQ(ASCIIToUTF16("United States"), form_structure()->field(4)->value);
3670 } // namespace autofill