autofill_dialog_controller_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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. 4 5#include <map> 6 7#include "base/bind.h" 8#include "base/bind_helpers.h" 9#include "base/callback.h" 10#include "base/command_line.h" 11#include "base/guid.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/message_loop/message_loop.h" 14#include "base/prefs/pref_service.h" 15#include "base/run_loop.h" 16#include "base/strings/string_number_conversions.h" 17#include "base/strings/string_piece.h" 18#include "base/strings/utf_string_conversions.h" 19#include "base/tuple.h" 20#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" 21#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" 22#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 23#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" 24#include "chrome/browser/ui/autofill/mock_address_validator.h" 25#include "chrome/browser/ui/autofill/mock_new_credit_card_bubble_controller.h" 26#include "chrome/browser/ui/autofill/test_generated_credit_card_bubble_controller.h" 27#include "chrome/browser/webdata/web_data_service_factory.h" 28#include "chrome/common/chrome_switches.h" 29#include "chrome/common/pref_names.h" 30#include "chrome/common/render_messages.h" 31#include "chrome/test/base/chrome_render_view_host_test_harness.h" 32#include "chrome/test/base/scoped_testing_local_state.h" 33#include "chrome/test/base/testing_browser_process.h" 34#include "chrome/test/base/testing_profile.h" 35#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" 36#include "components/autofill/content/browser/wallet/full_wallet.h" 37#include "components/autofill/content/browser/wallet/gaia_account.h" 38#include "components/autofill/content/browser/wallet/instrument.h" 39#include "components/autofill/content/browser/wallet/mock_wallet_client.h" 40#include "components/autofill/content/browser/wallet/wallet_address.h" 41#include "components/autofill/content/browser/wallet/wallet_service_url.h" 42#include "components/autofill/content/browser/wallet/wallet_test_util.h" 43#include "components/autofill/core/browser/autofill_metrics.h" 44#include "components/autofill/core/browser/autofill_test_utils.h" 45#include "components/autofill/core/browser/test_personal_data_manager.h" 46#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" 47#include "components/autofill/core/common/autofill_switches.h" 48#include "components/autofill/core/common/form_data.h" 49#include "components/user_prefs/user_prefs.h" 50#include "content/public/browser/web_contents.h" 51#include "content/public/test/mock_render_process_host.h" 52#include "google_apis/gaia/google_service_auth_error.h" 53#include "grit/component_scaled_resources.h" 54#include "grit/generated_resources.h" 55#include "testing/gmock/include/gmock/gmock.h" 56#include "testing/gtest/include/gtest/gtest.h" 57#include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/address_data.h" 58#include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/address_validator.h" 59#include "ui/base/resource/resource_bundle.h" 60 61#if defined(OS_WIN) 62#include "ui/base/win/scoped_ole_initializer.h" 63#endif 64 65using base::ASCIIToUTF16; 66using base::UTF8ToUTF16; 67 68namespace autofill { 69 70namespace { 71 72using ::i18n::addressinput::AddressData; 73using ::i18n::addressinput::AddressProblemFilter; 74using ::i18n::addressinput::AddressProblem; 75using ::i18n::addressinput::AddressProblems; 76using ::i18n::addressinput::AddressValidator; 77using testing::AtLeast; 78using testing::DoAll; 79using testing::Return; 80using testing::SetArgPointee; 81using testing::_; 82 83const char kSourceUrl[] = "http://localbike.shop"; 84const char kFakeEmail[] = "user@chromium.org"; 85const char kFakeFingerprintEncoded[] = "CgVaAwiACA=="; 86const char kEditedBillingAddress[] = "123 edited billing address"; 87const char* kFieldsFromPage[] = 88 { "email", 89 "cc-name", 90 "cc-number", 91 "cc-exp-month", 92 "cc-exp-year", 93 "cc-csc", 94 "billing name", 95 "billing address-line1", 96 "billing locality", 97 "billing region", 98 "billing postal-code", 99 "billing country", 100 "billing tel", 101 "shipping name", 102 "shipping address-line1", 103 "shipping locality", 104 "shipping region", 105 "shipping postal-code", 106 "shipping country", 107 "shipping tel", 108 }; 109const char kSettingsOrigin[] = "Chrome settings"; 110const char kTestCCNumberAmex[] = "376200000000002"; 111const char kTestCCNumberVisa[] = "4111111111111111"; 112const char kTestCCNumberMaster[] = "5555555555554444"; 113const char kTestCCNumberDiscover[] = "6011111111111117"; 114const char kTestCCNumberIncomplete[] = "4111111111"; 115// Credit card number fails Luhn check. 116const char kTestCCNumberInvalid[] = "4111111111111112"; 117 118// Copies the initial values from |inputs| into |outputs|. 119void CopyInitialValues(const DetailInputs& inputs, FieldValueMap* outputs) { 120 for (size_t i = 0; i < inputs.size(); ++i) { 121 const DetailInput& input = inputs[i]; 122 (*outputs)[input.type] = input.initial_value; 123 } 124} 125 126scoped_ptr<wallet::WalletItems> CompleteAndValidWalletItems() { 127 scoped_ptr<wallet::WalletItems> items = 128 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 129 items->AddAccount(wallet::GetTestGaiaAccount()); 130 items->AddInstrument(wallet::GetTestMaskedInstrument()); 131 items->AddAddress(wallet::GetTestShippingAddress()); 132 return items.Pass(); 133} 134 135scoped_ptr<risk::Fingerprint> GetFakeFingerprint() { 136 scoped_ptr<risk::Fingerprint> fingerprint(new risk::Fingerprint()); 137 // Add some data to the proto, else the encoded content is empty. 138 fingerprint->mutable_machine_characteristics()->mutable_screen_size()-> 139 set_width(1024); 140 return fingerprint.Pass(); 141} 142 143bool HasAnyError(const ValidityMessages& messages, ServerFieldType field) { 144 return !messages.GetMessageOrDefault(field).text.empty(); 145} 146 147bool HasUnsureError(const ValidityMessages& messages, ServerFieldType field) { 148 const ValidityMessage& message = messages.GetMessageOrDefault(field); 149 return !message.text.empty() && !message.sure; 150} 151 152class TestAutofillDialogView : public AutofillDialogView { 153 public: 154 TestAutofillDialogView() 155 : updates_started_(0), save_details_locally_checked_(true) {} 156 virtual ~TestAutofillDialogView() {} 157 158 virtual void Show() OVERRIDE {} 159 virtual void Hide() OVERRIDE {} 160 161 virtual void UpdatesStarted() OVERRIDE { 162 updates_started_++; 163 } 164 165 virtual void UpdatesFinished() OVERRIDE { 166 updates_started_--; 167 EXPECT_GE(updates_started_, 0); 168 } 169 170 virtual void UpdateNotificationArea() OVERRIDE { 171 EXPECT_GE(updates_started_, 1); 172 } 173 174 virtual void UpdateAccountChooser() OVERRIDE { 175 EXPECT_GE(updates_started_, 1); 176 } 177 178 virtual void UpdateButtonStrip() OVERRIDE { 179 EXPECT_GE(updates_started_, 1); 180 } 181 182 virtual void UpdateOverlay() OVERRIDE { 183 EXPECT_GE(updates_started_, 1); 184 } 185 186 virtual void UpdateDetailArea() OVERRIDE { 187 EXPECT_GE(updates_started_, 1); 188 } 189 190 virtual void UpdateSection(DialogSection section) OVERRIDE { 191 section_updates_[section]++; 192 EXPECT_GE(updates_started_, 1); 193 } 194 195 virtual void UpdateErrorBubble() OVERRIDE { 196 EXPECT_GE(updates_started_, 1); 197 } 198 199 virtual void FillSection(DialogSection section, 200 ServerFieldType originating_type) OVERRIDE {} 201 virtual void GetUserInput(DialogSection section, FieldValueMap* output) 202 OVERRIDE { 203 *output = outputs_[section]; 204 } 205 206 virtual base::string16 GetCvc() OVERRIDE { return base::string16(); } 207 virtual bool HitTestInput(ServerFieldType type, 208 const gfx::Point& screen_point) OVERRIDE { 209 return false; 210 } 211 212 virtual bool SaveDetailsLocally() OVERRIDE { 213 return save_details_locally_checked_; 214 } 215 216 virtual const content::NavigationController* ShowSignIn() OVERRIDE { 217 return NULL; 218 } 219 virtual void HideSignIn() OVERRIDE {} 220 221 MOCK_METHOD0(ModelChanged, void()); 222 MOCK_METHOD0(UpdateForErrors, void()); 223 224 virtual void OnSignInResize(const gfx::Size& pref_size) OVERRIDE {} 225 virtual void ValidateSection(DialogSection) OVERRIDE {} 226 227 void SetUserInput(DialogSection section, const FieldValueMap& map) { 228 outputs_[section] = map; 229 } 230 231 void CheckSaveDetailsLocallyCheckbox(bool checked) { 232 save_details_locally_checked_ = checked; 233 } 234 235 void ClearSectionUpdates() { 236 section_updates_.clear(); 237 } 238 239 std::map<DialogSection, size_t> section_updates() const { 240 return section_updates_; 241 } 242 243 private: 244 std::map<DialogSection, FieldValueMap> outputs_; 245 std::map<DialogSection, size_t> section_updates_; 246 247 int updates_started_; 248 bool save_details_locally_checked_; 249 250 DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogView); 251}; 252 253class TestAutofillDialogController 254 : public AutofillDialogControllerImpl, 255 public base::SupportsWeakPtr<TestAutofillDialogController> { 256 public: 257 TestAutofillDialogController( 258 content::WebContents* contents, 259 const FormData& form_structure, 260 const GURL& source_url, 261 const AutofillMetrics& metric_logger, 262 const base::Callback<void(const FormStructure*)>& callback, 263 MockNewCreditCardBubbleController* mock_new_card_bubble_controller) 264 : AutofillDialogControllerImpl(contents, 265 form_structure, 266 source_url, 267 callback), 268 metric_logger_(metric_logger), 269 mock_wallet_client_( 270 Profile::FromBrowserContext(contents->GetBrowserContext())-> 271 GetRequestContext(), this, source_url), 272 mock_new_card_bubble_controller_(mock_new_card_bubble_controller), 273 submit_button_delay_count_(0) {} 274 275 virtual ~TestAutofillDialogController() {} 276 277 virtual AutofillDialogView* CreateView() OVERRIDE { 278 return new testing::NiceMock<TestAutofillDialogView>(); 279 } 280 281 void Init(content::BrowserContext* browser_context) { 282 test_manager_.Init( 283 WebDataServiceFactory::GetAutofillWebDataForProfile( 284 Profile::FromBrowserContext(browser_context), 285 Profile::EXPLICIT_ACCESS), 286 user_prefs::UserPrefs::Get(browser_context), 287 browser_context->IsOffTheRecord()); 288 } 289 290 TestAutofillDialogView* GetView() { 291 return static_cast<TestAutofillDialogView*>(view()); 292 } 293 294 TestPersonalDataManager* GetTestingManager() { 295 return &test_manager_; 296 } 297 298 MockAddressValidator* GetMockValidator() { 299 return &mock_validator_; 300 } 301 302 wallet::MockWalletClient* GetTestingWalletClient() { 303 return &mock_wallet_client_; 304 } 305 306 const GURL& open_tab_url() { return open_tab_url_; } 307 308 void SimulateSigninError() { 309 OnWalletSigninError(); 310 } 311 312 // Skips past the 2 second wait between FinishSubmit and DoFinishSubmit. 313 void ForceFinishSubmit() { 314 DoFinishSubmit(); 315 } 316 317 void SimulateSubmitButtonDelayBegin() { 318 AutofillDialogControllerImpl::SubmitButtonDelayBegin(); 319 } 320 321 void SimulateSubmitButtonDelayEnd() { 322 AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting(); 323 } 324 325 using AutofillDialogControllerImpl:: 326 ClearLastWalletItemsFetchTimestampForTesting; 327 328 // Returns the number of times that the submit button was delayed. 329 int get_submit_button_delay_count() const { 330 return submit_button_delay_count_; 331 } 332 333 MOCK_METHOD0(LoadRiskFingerprintData, void()); 334 using AutofillDialogControllerImpl::AccountChooserModelForTesting; 335 using AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData; 336 using AutofillDialogControllerImpl::IsEditingExistingData; 337 using AutofillDialogControllerImpl::IsManuallyEditingSection; 338 using AutofillDialogControllerImpl::IsPayingWithWallet; 339 using AutofillDialogControllerImpl::IsSubmitPausedOn; 340 using AutofillDialogControllerImpl::NOT_CHECKED; 341 using AutofillDialogControllerImpl::popup_input_type; 342 using AutofillDialogControllerImpl::SignedInState; 343 344 protected: 345 virtual PersonalDataManager* GetManager() const OVERRIDE { 346 return const_cast<TestAutofillDialogController*>(this)-> 347 GetTestingManager(); 348 } 349 350 virtual AddressValidator* GetValidator() OVERRIDE { 351 return &mock_validator_; 352 } 353 354 virtual wallet::WalletClient* GetWalletClient() OVERRIDE { 355 return &mock_wallet_client_; 356 } 357 358 virtual void OpenTabWithUrl(const GURL& url) OVERRIDE { 359 open_tab_url_ = url; 360 } 361 362 virtual void ShowNewCreditCardBubble( 363 scoped_ptr<CreditCard> new_card, 364 scoped_ptr<AutofillProfile> billing_profile) OVERRIDE { 365 mock_new_card_bubble_controller_->Show(new_card.Pass(), 366 billing_profile.Pass()); 367 } 368 369 // AutofillDialogControllerImpl calls this method before showing the dialog 370 // window. 371 virtual void SubmitButtonDelayBegin() OVERRIDE { 372 // Do not delay enabling the submit button in testing. 373 submit_button_delay_count_++; 374 } 375 376 private: 377 // To specify our own metric logger. 378 virtual const AutofillMetrics& GetMetricLogger() const OVERRIDE { 379 return metric_logger_; 380 } 381 382 const AutofillMetrics& metric_logger_; 383 TestPersonalDataManager test_manager_; 384 testing::NiceMock<wallet::MockWalletClient> mock_wallet_client_; 385 386 // A mock validator object to prevent network requests and track when 387 // validation rules are loaded or validation attempts occur. 388 testing::NiceMock<MockAddressValidator> mock_validator_; 389 390 GURL open_tab_url_; 391 MockNewCreditCardBubbleController* mock_new_card_bubble_controller_; 392 393 // The number of times that the submit button was delayed. 394 int submit_button_delay_count_; 395 396 DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController); 397}; 398 399class AutofillDialogControllerTest : public ChromeRenderViewHostTestHarness { 400 protected: 401 AutofillDialogControllerTest(): form_structure_(NULL) {} 402 403 // testing::Test implementation: 404 virtual void SetUp() OVERRIDE { 405 ChromeRenderViewHostTestHarness::SetUp(); 406 Reset(); 407 } 408 409 virtual void TearDown() OVERRIDE { 410 if (controller_) 411 controller_->ViewClosed(); 412 ChromeRenderViewHostTestHarness::TearDown(); 413 } 414 415 void Reset() { 416 if (controller_) 417 controller_->ViewClosed(); 418 419 test_generated_bubble_controller_ = 420 new testing::NiceMock<TestGeneratedCreditCardBubbleController>( 421 web_contents()); 422 ASSERT_TRUE(test_generated_bubble_controller_->IsInstalled()); 423 424 mock_new_card_bubble_controller_.reset( 425 new MockNewCreditCardBubbleController); 426 427 profile()->GetPrefs()->ClearPref(::prefs::kAutofillDialogSaveData); 428 429 // We have to clear the old local state before creating a new one. 430 scoped_local_state_.reset(); 431 scoped_local_state_.reset(new ScopedTestingLocalState( 432 TestingBrowserProcess::GetGlobal())); 433 434 SetUpControllerWithFormData(DefaultFormData()); 435 } 436 437 FormData DefaultFormData() { 438 FormData form_data; 439 for (size_t i = 0; i < arraysize(kFieldsFromPage); ++i) { 440 FormFieldData field; 441 field.autocomplete_attribute = kFieldsFromPage[i]; 442 form_data.fields.push_back(field); 443 } 444 return form_data; 445 } 446 447 // Creates a new controller for |form_data|. 448 void ResetControllerWithFormData(const FormData& form_data) { 449 if (controller_) 450 controller_->ViewClosed(); 451 452 base::Callback<void(const FormStructure*)> callback = 453 base::Bind(&AutofillDialogControllerTest::FinishedCallback, 454 base::Unretained(this)); 455 controller_ = (new testing::NiceMock<TestAutofillDialogController>( 456 web_contents(), 457 form_data, 458 GURL(kSourceUrl), 459 metric_logger_, 460 callback, 461 mock_new_card_bubble_controller_.get()))->AsWeakPtr(); 462 controller_->Init(profile()); 463 } 464 465 // Creates a new controller for |form_data| and sets up some initial wallet 466 // data for it. 467 void SetUpControllerWithFormData(const FormData& form_data) { 468 ResetControllerWithFormData(form_data); 469 controller()->Show(); 470 if (!profile()->GetPrefs()->GetBoolean( 471 ::prefs::kAutofillDialogPayWithoutWallet)) { 472 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 473 controller()->OnDidFetchWalletCookieValue(std::string()); 474 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 475 } 476 } 477 478 // Fills the inputs in SECTION_CC with data. 479 void FillCreditCardInputs() { 480 FieldValueMap cc_outputs; 481 const DetailInputs& cc_inputs = 482 controller()->RequestedFieldsForSection(SECTION_CC); 483 for (size_t i = 0; i < cc_inputs.size(); ++i) { 484 cc_outputs[cc_inputs[i].type] = cc_inputs[i].type == CREDIT_CARD_NUMBER ? 485 ASCIIToUTF16(kTestCCNumberVisa) : ASCIIToUTF16("11"); 486 } 487 controller()->GetView()->SetUserInput(SECTION_CC, cc_outputs); 488 } 489 490 // Fills the inputs in SECTION_CC_BILLING with valid data. 491 void FillCCBillingInputs() { 492 FieldValueMap outputs; 493 const DetailInputs& inputs = 494 controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 495 AutofillProfile full_profile(test::GetVerifiedProfile()); 496 CreditCard full_card(test::GetCreditCard()); 497 for (size_t i = 0; i < inputs.size(); ++i) { 498 const ServerFieldType type = inputs[i].type; 499 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); 500 501 if (outputs[type].empty()) 502 outputs[type] = full_card.GetInfo(AutofillType(type), "en-US"); 503 } 504 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs); 505 } 506 507 // Activates the 'Add new foo' option from the |section|'s suggestions 508 // dropdown and fills the |section|'s inputs with the data from the 509 // |data_model|. If |section| is SECTION_CC, also fills in '123' for the CVC. 510 void FillInputs(DialogSection section, const AutofillDataModel& data_model) { 511 // Select the 'Add new foo' option. 512 ui::MenuModel* model = GetMenuModelForSection(section); 513 if (model) 514 model->ActivatedAt(model->GetItemCount() - 2); 515 516 // Fill the inputs. 517 FieldValueMap outputs; 518 const DetailInputs& inputs = 519 controller()->RequestedFieldsForSection(section); 520 for (size_t i = 0; i < inputs.size(); ++i) { 521 ServerFieldType type = inputs[i].type; 522 base::string16 output; 523 if (type == CREDIT_CARD_VERIFICATION_CODE) 524 output = ASCIIToUTF16("123"); 525 else 526 output = data_model.GetInfo(AutofillType(type), "en-US"); 527 outputs[inputs[i].type] = output; 528 } 529 controller()->GetView()->SetUserInput(section, outputs); 530 } 531 532 std::vector<DialogNotification> NotificationsOfType( 533 DialogNotification::Type type) { 534 std::vector<DialogNotification> right_type; 535 const std::vector<DialogNotification>& notifications = 536 controller()->CurrentNotifications(); 537 for (size_t i = 0; i < notifications.size(); ++i) { 538 if (notifications[i].type() == type) 539 right_type.push_back(notifications[i]); 540 } 541 return right_type; 542 } 543 544 void SwitchToAutofill() { 545 ui::MenuModel* model = controller_->MenuModelForAccountChooser(); 546 model->ActivatedAt(model->GetItemCount() - 1); 547 } 548 549 void SwitchToWallet() { 550 controller_->MenuModelForAccountChooser()->ActivatedAt(0); 551 } 552 553 void SimulateSigninError() { 554 controller_->SimulateSigninError(); 555 } 556 557 void UseBillingForShipping() { 558 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(0); 559 } 560 561 void ValidateCCNumber(DialogSection section, 562 const std::string& cc_number, 563 bool should_pass) { 564 FieldValueMap outputs; 565 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States"); 566 outputs[CREDIT_CARD_NUMBER] = UTF8ToUTF16(cc_number); 567 ValidityMessages messages = 568 controller()->InputsAreValid(section, outputs); 569 EXPECT_EQ(should_pass, !messages.HasSureError(CREDIT_CARD_NUMBER)); 570 } 571 572 void SubmitWithWalletItems(scoped_ptr<wallet::WalletItems> wallet_items) { 573 controller()->OnDidGetWalletItems(wallet_items.Pass()); 574 AcceptAndLoadFakeFingerprint(); 575 } 576 577 void AcceptAndLoadFakeFingerprint() { 578 controller()->OnAccept(); 579 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass()); 580 } 581 582 // Returns true if the given |section| contains a field of the given |type|. 583 bool SectionContainsField(DialogSection section, ServerFieldType type) { 584 const DetailInputs& inputs = 585 controller()->RequestedFieldsForSection(section); 586 for (DetailInputs::const_iterator it = inputs.begin(); it != inputs.end(); 587 ++it) { 588 if (it->type == type) 589 return true; 590 } 591 return false; 592 } 593 594 SuggestionsMenuModel* GetMenuModelForSection(DialogSection section) { 595 ui::MenuModel* model = controller()->MenuModelForSection(section); 596 return static_cast<SuggestionsMenuModel*>(model); 597 } 598 599 void SubmitAndVerifyShippingAndBillingResults() { 600 // Test after setting use billing for shipping. 601 UseBillingForShipping(); 602 603 controller()->OnAccept(); 604 605 ASSERT_EQ(20U, form_structure()->field_count()); 606 EXPECT_EQ(ADDRESS_HOME_COUNTRY, 607 form_structure()->field(11)->Type().GetStorableType()); 608 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(11)->Type().group()); 609 EXPECT_EQ(ADDRESS_HOME_COUNTRY, 610 form_structure()->field(18)->Type().GetStorableType()); 611 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(18)->Type().group()); 612 base::string16 billing_country = form_structure()->field(11)->value; 613 EXPECT_EQ(2U, billing_country.size()); 614 base::string16 shipping_country = form_structure()->field(18)->value; 615 EXPECT_EQ(2U, shipping_country.size()); 616 EXPECT_FALSE(billing_country.empty()); 617 EXPECT_FALSE(shipping_country.empty()); 618 EXPECT_EQ(billing_country, shipping_country); 619 620 EXPECT_EQ(CREDIT_CARD_NAME, 621 form_structure()->field(1)->Type().GetStorableType()); 622 base::string16 cc_name = form_structure()->field(1)->value; 623 EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType()); 624 EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group()); 625 base::string16 billing_name = form_structure()->field(6)->value; 626 EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType()); 627 EXPECT_EQ(NAME, form_structure()->field(13)->Type().group()); 628 base::string16 shipping_name = form_structure()->field(13)->value; 629 630 EXPECT_FALSE(cc_name.empty()); 631 EXPECT_FALSE(billing_name.empty()); 632 EXPECT_FALSE(shipping_name.empty()); 633 EXPECT_EQ(cc_name, billing_name); 634 EXPECT_EQ(cc_name, shipping_name); 635 } 636 637 TestAutofillDialogController* controller() { return controller_.get(); } 638 639 const FormStructure* form_structure() { return form_structure_; } 640 641 TestGeneratedCreditCardBubbleController* test_generated_bubble_controller() { 642 return test_generated_bubble_controller_; 643 } 644 645 const MockNewCreditCardBubbleController* mock_new_card_bubble_controller() { 646 return mock_new_card_bubble_controller_.get(); 647 } 648 649 private: 650 void FinishedCallback(const FormStructure* form_structure) { 651 form_structure_ = form_structure; 652 } 653 654#if defined(OS_WIN) 655 // http://crbug.com/227221 656 ui::ScopedOleInitializer ole_initializer_; 657#endif 658 659 // The controller owns itself. 660 base::WeakPtr<TestAutofillDialogController> controller_; 661 662 // Must outlive the controller. 663 AutofillMetrics metric_logger_; 664 665 // Returned when the dialog closes successfully. 666 const FormStructure* form_structure_; 667 668 // Used to monitor if the Autofill credit card bubble is shown. Owned by 669 // |web_contents()|. 670 TestGeneratedCreditCardBubbleController* test_generated_bubble_controller_; 671 672 // Used to record when new card bubbles would show. Created in |Reset()|. 673 scoped_ptr<MockNewCreditCardBubbleController> 674 mock_new_card_bubble_controller_; 675 676 scoped_ptr<ScopedTestingLocalState> scoped_local_state_; 677}; 678 679} // namespace 680 681// Ensure the default ValidityMessage has the expected values. 682TEST_F(AutofillDialogControllerTest, DefaultValidityMessage) { 683 ValidityMessages messages; 684 ValidityMessage message = messages.GetMessageOrDefault(UNKNOWN_TYPE); 685 EXPECT_FALSE(message.sure); 686 EXPECT_TRUE(message.text.empty()); 687} 688 689// This test makes sure nothing falls over when fields are being validity- 690// checked. 691TEST_F(AutofillDialogControllerTest, ValidityCheck) { 692 for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 693 DialogSection section = static_cast<DialogSection>(i); 694 const DetailInputs& shipping_inputs = 695 controller()->RequestedFieldsForSection(section); 696 for (DetailInputs::const_iterator iter = shipping_inputs.begin(); 697 iter != shipping_inputs.end(); ++iter) { 698 controller()->InputValidityMessage(section, iter->type, base::string16()); 699 } 700 } 701} 702 703// Test for phone number validation. 704TEST_F(AutofillDialogControllerTest, PhoneNumberValidation) { 705 // Construct FieldValueMap from existing data. 706 SwitchToAutofill(); 707 708 for (size_t i = 0; i < 2; ++i) { 709 ServerFieldType phone = i == 0 ? PHONE_HOME_WHOLE_NUMBER : 710 PHONE_BILLING_WHOLE_NUMBER; 711 ServerFieldType address = i == 0 ? ADDRESS_HOME_COUNTRY : 712 ADDRESS_BILLING_COUNTRY; 713 DialogSection section = i == 0 ? SECTION_SHIPPING : SECTION_BILLING; 714 715 FieldValueMap outputs; 716 const DetailInputs& inputs = 717 controller()->RequestedFieldsForSection(section); 718 AutofillProfile full_profile(test::GetVerifiedProfile()); 719 for (size_t i = 0; i < inputs.size(); ++i) { 720 const ServerFieldType type = inputs[i].type; 721 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); 722 } 723 724 // Make sure country is United States. 725 outputs[address] = ASCIIToUTF16("United States"); 726 727 // Existing data should have no errors. 728 ValidityMessages messages = controller()->InputsAreValid(section, outputs); 729 EXPECT_FALSE(HasAnyError(messages, phone)); 730 731 // Input an empty phone number. 732 outputs[phone] = base::string16(); 733 messages = controller()->InputsAreValid(section, outputs); 734 EXPECT_TRUE(HasUnsureError(messages, phone)); 735 736 // Input an invalid phone number. 737 outputs[phone] = ASCIIToUTF16("ABC"); 738 messages = controller()->InputsAreValid(section, outputs); 739 EXPECT_TRUE(messages.HasSureError(phone)); 740 741 // Input a local phone number. 742 outputs[phone] = ASCIIToUTF16("2155546699"); 743 messages = controller()->InputsAreValid(section, outputs); 744 EXPECT_FALSE(HasAnyError(messages, phone)); 745 746 // Input an invalid local phone number. 747 outputs[phone] = ASCIIToUTF16("215554669"); 748 messages = controller()->InputsAreValid(section, outputs); 749 EXPECT_TRUE(messages.HasSureError(phone)); 750 751 // Input an international phone number. 752 outputs[phone] = ASCIIToUTF16("+33 892 70 12 39"); 753 messages = controller()->InputsAreValid(section, outputs); 754 EXPECT_FALSE(HasAnyError(messages, phone)); 755 756 // Input an invalid international phone number. 757 outputs[phone] = ASCIIToUTF16("+112333 892 70 12 39"); 758 messages = controller()->InputsAreValid(section, outputs); 759 EXPECT_TRUE(messages.HasSureError(phone)); 760 761 // Input a valid Canadian number. 762 outputs[phone] = ASCIIToUTF16("+1 506 887 1234"); 763 messages = controller()->InputsAreValid(section, outputs); 764 EXPECT_FALSE(HasAnyError(messages, phone)); 765 766 // Input a valid Canadian number without the country code. 767 outputs[phone] = ASCIIToUTF16("506 887 1234"); 768 messages = controller()->InputsAreValid(section, outputs); 769 EXPECT_TRUE(HasAnyError(messages, phone)); 770 771 // Input a valid Canadian toll-free number. 772 outputs[phone] = ASCIIToUTF16("310 1234"); 773 messages = controller()->InputsAreValid(section, outputs); 774 EXPECT_TRUE(HasAnyError(messages, phone)); 775 } 776} 777 778TEST_F(AutofillDialogControllerTest, ExpirationDateValidity) { 779 ui::ComboboxModel* exp_year_model = 780 controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR); 781 ui::ComboboxModel* exp_month_model = 782 controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH); 783 784 base::string16 default_year_value = 785 exp_year_model->GetItemAt(exp_year_model->GetDefaultIndex()); 786 base::string16 default_month_value = 787 exp_month_model->GetItemAt(exp_month_model->GetDefaultIndex()); 788 789 base::string16 other_year_value = 790 exp_year_model->GetItemAt(exp_year_model->GetItemCount() - 1); 791 base::string16 other_month_value = 792 exp_month_model->GetItemAt(exp_month_model->GetItemCount() - 1); 793 794 FieldValueMap outputs; 795 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States"); 796 outputs[CREDIT_CARD_EXP_MONTH] = default_month_value; 797 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value; 798 799 // Expiration default values generate unsure validation errors (but not sure). 800 ValidityMessages messages = controller()->InputsAreValid(SECTION_CC_BILLING, 801 outputs); 802 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); 803 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); 804 805 // Expiration date with default month fails. 806 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = other_year_value; 807 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 808 EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); 809 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); 810 811 // Expiration date with default year fails. 812 outputs[CREDIT_CARD_EXP_MONTH] = other_month_value; 813 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value; 814 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 815 EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); 816 EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); 817} 818 819TEST_F(AutofillDialogControllerTest, BillingNameValidation) { 820 // Construct FieldValueMap from AutofillProfile data. 821 SwitchToAutofill(); 822 823 FieldValueMap outputs; 824 outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States"); 825 826 // Input an empty billing name. 827 outputs[NAME_BILLING_FULL] = base::string16(); 828 ValidityMessages messages = controller()->InputsAreValid(SECTION_BILLING, 829 outputs); 830 EXPECT_TRUE(HasUnsureError(messages, NAME_BILLING_FULL)); 831 832 // Input a non-empty billing name. 833 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob"); 834 messages = controller()->InputsAreValid(SECTION_BILLING, outputs); 835 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL)); 836 837 // Switch to Wallet which only considers names with with at least two names to 838 // be valid. 839 SwitchToWallet(); 840 841 // Setup some wallet state. 842 scoped_ptr<wallet::WalletItems> wallet_items = 843 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 844 controller()->OnDidGetWalletItems(wallet_items.Pass()); 845 846 // Input an empty billing name. Data source should not change this behavior. 847 outputs[NAME_BILLING_FULL] = base::string16(); 848 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 849 EXPECT_TRUE(HasUnsureError(messages, NAME_BILLING_FULL)); 850 851 // Input a one name billing name. Wallet does not currently support this. 852 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob"); 853 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 854 EXPECT_TRUE(messages.HasSureError(NAME_BILLING_FULL)); 855 856 // Input a two name billing name. 857 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob Barker"); 858 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 859 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL)); 860 861 // Input a more than two name billing name. 862 outputs[NAME_BILLING_FULL] = ASCIIToUTF16("John Jacob Jingleheimer Schmidt"), 863 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 864 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL)); 865 866 // Input a billing name with lots of crazy whitespace. 867 outputs[NAME_BILLING_FULL] = 868 ASCIIToUTF16(" \\n\\r John \\n Jacob Jingleheimer \\t Schmidt "), 869 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 870 EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL)); 871} 872 873TEST_F(AutofillDialogControllerTest, CreditCardNumberValidation) { 874 // Construct FieldValueMap from AutofillProfile data. 875 SwitchToAutofill(); 876 877 // Should accept AMEX, Visa, Master and Discover. 878 ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true); 879 ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, true); 880 ValidateCCNumber(SECTION_CC, kTestCCNumberDiscover, true); 881 ValidateCCNumber(SECTION_CC, kTestCCNumberAmex, true); 882 ValidateCCNumber(SECTION_CC, kTestCCNumberIncomplete, false); 883 ValidateCCNumber(SECTION_CC, kTestCCNumberInvalid, false); 884 885 // Switch to Wallet which will not accept AMEX. 886 SwitchToWallet(); 887 888 // Setup some wallet state on a merchant for which Wallet doesn't 889 // support AMEX. 890 controller()->OnDidGetWalletItems( 891 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED)); 892 893 // Should accept Visa, Master and Discover, but not AMEX. 894 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberVisa, true); 895 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberMaster, true); 896 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberDiscover, true); 897 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberAmex, false); 898 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberIncomplete, false); 899 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberInvalid, false); 900 901 // Setup some wallet state on a merchant for which Wallet supports AMEX. 902 controller()->OnDidGetWalletItems( 903 wallet::GetTestWalletItems(wallet::AMEX_ALLOWED)); 904 905 // Should accept Visa, Master, Discover, and AMEX. 906 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberVisa, true); 907 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberMaster, true); 908 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberDiscover, true); 909 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberAmex, true); 910 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberIncomplete, false); 911 ValidateCCNumber(SECTION_CC_BILLING, kTestCCNumberInvalid, false); 912} 913 914TEST_F(AutofillDialogControllerTest, AutofillProfiles) { 915 SwitchToAutofill(); 916 ui::MenuModel* shipping_model = 917 controller()->MenuModelForSection(SECTION_SHIPPING); 918 // Since the PersonalDataManager is empty, this should only have the 919 // "use billing", "add new" and "manage" menu items. 920 ASSERT_TRUE(shipping_model); 921 EXPECT_EQ(3, shipping_model->GetItemCount()); 922 // On the other hand, the other models should be NULL when there's no 923 // suggestion. 924 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); 925 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING)); 926 927 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3); 928 929 // Empty profiles are ignored. 930 AutofillProfile empty_profile(base::GenerateGUID(), kSettingsOrigin); 931 empty_profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("John Doe")); 932 controller()->GetTestingManager()->AddTestingProfile(&empty_profile); 933 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); 934 ASSERT_TRUE(shipping_model); 935 EXPECT_EQ(3, shipping_model->GetItemCount()); 936 937 // An otherwise full but unverified profile should be ignored. 938 AutofillProfile full_profile(test::GetFullProfile()); 939 full_profile.set_origin("https://www.example.com"); 940 full_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); 941 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 942 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); 943 ASSERT_TRUE(shipping_model); 944 EXPECT_EQ(3, shipping_model->GetItemCount()); 945 946 // A full, verified profile should be picked up. 947 AutofillProfile verified_profile(test::GetVerifiedProfile()); 948 verified_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); 949 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 950 shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); 951 ASSERT_TRUE(shipping_model); 952 EXPECT_EQ(4, shipping_model->GetItemCount()); 953} 954 955// Checks that a valid profile is selected by default, but if invalid is 956// popped into edit mode. 957TEST_F(AutofillDialogControllerTest, AutofillProfilesPopInvalidIntoEdit) { 958 SwitchToAutofill(); 959 SuggestionsMenuModel* shipping_model = 960 GetMenuModelForSection(SECTION_SHIPPING); 961 EXPECT_EQ(3, shipping_model->GetItemCount()); 962 // "Same as billing" is selected. 963 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 964 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 965 966 AutofillProfile verified_profile(test::GetVerifiedProfile()); 967 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 968 EXPECT_EQ(4, shipping_model->GetItemCount()); 969 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 970 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 971 972 // Now make up a problem and make sure the profile isn't in the list. 973 Reset(); 974 SwitchToAutofill(); 975 AddressProblems problems; 976 problems.push_back( 977 AddressProblem(::i18n::addressinput::POSTAL_CODE, 978 AddressProblem::MISMATCHING_VALUE, 979 IDS_LEARN_MORE)); 980 EXPECT_CALL(*controller()->GetMockValidator(), 981 ValidateAddress(CountryCodeMatcher("US"), _, _)). 982 WillRepeatedly(DoAll(SetArgPointee<2>(problems), 983 Return(AddressValidator::SUCCESS))); 984 985 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 986 shipping_model = GetMenuModelForSection(SECTION_SHIPPING); 987 EXPECT_EQ(4, shipping_model->GetItemCount()); 988 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 989 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 990} 991 992// Makes sure suggestion profiles are re-validated when validation rules load. 993TEST_F(AutofillDialogControllerTest, AutofillProfilesRevalidateAfterRulesLoad) { 994 SwitchToAutofill(); 995 SuggestionsMenuModel* shipping_model = 996 GetMenuModelForSection(SECTION_SHIPPING); 997 EXPECT_EQ(3, shipping_model->GetItemCount()); 998 // "Same as billing" is selected. 999 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 1000 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 1001 AutofillProfile verified_profile(test::GetVerifiedProfile()); 1002 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 1003 EXPECT_EQ(4, shipping_model->GetItemCount()); 1004 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 1005 EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 1006 1007 AddressProblems problems; 1008 problems.push_back( 1009 AddressProblem(::i18n::addressinput::POSTAL_CODE, 1010 AddressProblem::MISMATCHING_VALUE, 1011 IDS_LEARN_MORE)); 1012 EXPECT_CALL(*controller()->GetMockValidator(), 1013 ValidateAddress(CountryCodeMatcher("US"), _, _)). 1014 WillRepeatedly(DoAll(SetArgPointee<2>(problems), 1015 Return(AddressValidator::SUCCESS))); 1016 1017 controller()->OnAddressValidationRulesLoaded("US", true); 1018 EXPECT_EQ(4, shipping_model->GetItemCount()); 1019 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 1020 EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 1021} 1022 1023// Makes sure that the choice of which Autofill profile to use for each section 1024// is sticky. 1025TEST_F(AutofillDialogControllerTest, AutofillProfileDefaults) { 1026 SwitchToAutofill(); 1027 AutofillProfile profile(test::GetVerifiedProfile()); 1028 AutofillProfile profile2(test::GetVerifiedProfile2()); 1029 controller()->GetTestingManager()->AddTestingProfile(&profile); 1030 controller()->GetTestingManager()->AddTestingProfile(&profile2); 1031 1032 // Until a selection has been made, the default shipping suggestion is the 1033 // first one (after "use billing"). 1034 SuggestionsMenuModel* shipping_model = 1035 GetMenuModelForSection(SECTION_SHIPPING); 1036 EXPECT_EQ(1, shipping_model->checked_item()); 1037 1038 for (int i = 2; i >= 0; --i) { 1039 shipping_model = GetMenuModelForSection(SECTION_SHIPPING); 1040 shipping_model->ExecuteCommand(i, 0); 1041 FillCreditCardInputs(); 1042 controller()->OnAccept(); 1043 1044 Reset(); 1045 controller()->GetTestingManager()->AddTestingProfile(&profile); 1046 controller()->GetTestingManager()->AddTestingProfile(&profile2); 1047 shipping_model = GetMenuModelForSection(SECTION_SHIPPING); 1048 EXPECT_EQ(i, shipping_model->checked_item()); 1049 } 1050 1051 // Try again, but don't add the default profile to the PDM. The dialog 1052 // should fall back to the first profile. 1053 shipping_model->ExecuteCommand(2, 0); 1054 FillCreditCardInputs(); 1055 controller()->OnAccept(); 1056 Reset(); 1057 controller()->GetTestingManager()->AddTestingProfile(&profile); 1058 shipping_model = GetMenuModelForSection(SECTION_SHIPPING); 1059 EXPECT_EQ(1, shipping_model->checked_item()); 1060} 1061 1062// Makes sure that a newly added Autofill profile becomes set as the default 1063// choice for the next run. 1064TEST_F(AutofillDialogControllerTest, NewAutofillProfileIsDefault) { 1065 SwitchToAutofill(); 1066 1067 AutofillProfile profile(test::GetVerifiedProfile()); 1068 CreditCard credit_card(test::GetVerifiedCreditCard()); 1069 controller()->GetTestingManager()->AddTestingProfile(&profile); 1070 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1071 1072 // Until a selection has been made, the default suggestion is the first one. 1073 // For the shipping section, this follows the "use billing" suggestion. 1074 EXPECT_EQ(0, GetMenuModelForSection(SECTION_CC)->checked_item()); 1075 EXPECT_EQ(1, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); 1076 1077 // Fill in the shipping and credit card sections with new data. 1078 AutofillProfile new_profile(test::GetVerifiedProfile2()); 1079 CreditCard new_credit_card(test::GetVerifiedCreditCard2()); 1080 FillInputs(SECTION_SHIPPING, new_profile); 1081 FillInputs(SECTION_CC, new_credit_card); 1082 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); 1083 controller()->OnAccept(); 1084 1085 // Update the |new_profile| and |new_credit_card|'s guids to the saved ones. 1086 new_profile.set_guid( 1087 controller()->GetTestingManager()->imported_profile().guid()); 1088 new_credit_card.set_guid( 1089 controller()->GetTestingManager()->imported_credit_card().guid()); 1090 1091 // Reload the dialog. The newly added address and credit card should now be 1092 // set as the defaults. 1093 Reset(); 1094 controller()->GetTestingManager()->AddTestingProfile(&profile); 1095 controller()->GetTestingManager()->AddTestingProfile(&new_profile); 1096 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1097 controller()->GetTestingManager()->AddTestingCreditCard(&new_credit_card); 1098 1099 // Until a selection has been made, the default suggestion is the first one. 1100 // For the shipping section, this follows the "use billing" suggestion. 1101 EXPECT_EQ(1, GetMenuModelForSection(SECTION_CC)->checked_item()); 1102 EXPECT_EQ(2, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); 1103} 1104 1105TEST_F(AutofillDialogControllerTest, AutofillProfileVariants) { 1106 SwitchToAutofill(); 1107 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 1108 ui::MenuModel* shipping_model = 1109 controller()->MenuModelForSection(SECTION_SHIPPING); 1110 ASSERT_TRUE(!!shipping_model); 1111 EXPECT_EQ(3, shipping_model->GetItemCount()); 1112 1113 // Set up some variant data. 1114 AutofillProfile full_profile(test::GetVerifiedProfile()); 1115 std::vector<base::string16> names; 1116 names.push_back(ASCIIToUTF16("John Doe")); 1117 names.push_back(ASCIIToUTF16("Jane Doe")); 1118 full_profile.SetRawMultiInfo(NAME_FULL, names); 1119 std::vector<base::string16> emails; 1120 emails.push_back(ASCIIToUTF16(kFakeEmail)); 1121 emails.push_back(ASCIIToUTF16("admin@example.com")); 1122 full_profile.SetRawMultiInfo(EMAIL_ADDRESS, emails); 1123 1124 // Non-default variants are ignored by the dialog. 1125 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1126 EXPECT_EQ(4, shipping_model->GetItemCount()); 1127} 1128 1129TEST_F(AutofillDialogControllerTest, SuggestValidEmail) { 1130 SwitchToAutofill(); 1131 AutofillProfile profile(test::GetVerifiedProfile()); 1132 const base::string16 kValidEmail = ASCIIToUTF16(kFakeEmail); 1133 profile.SetRawInfo(EMAIL_ADDRESS, kValidEmail); 1134 controller()->GetTestingManager()->AddTestingProfile(&profile); 1135 1136 // "add", "manage", and 1 suggestion. 1137 EXPECT_EQ( 1138 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount()); 1139 // "add", "manage", 1 suggestion, and "same as billing". 1140 EXPECT_EQ( 1141 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 1142} 1143 1144TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidEmail) { 1145 SwitchToAutofill(); 1146 AutofillProfile profile(test::GetVerifiedProfile()); 1147 profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(".!#$%&'*+/=?^_`-@-..")); 1148 controller()->GetTestingManager()->AddTestingProfile(&profile); 1149 1150 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); 1151 // "add", "manage", 1 suggestion, and "same as billing". 1152 EXPECT_EQ( 1153 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 1154} 1155 1156TEST_F(AutofillDialogControllerTest, SuggestValidAddress) { 1157 SwitchToAutofill(); 1158 AutofillProfile full_profile(test::GetVerifiedProfile()); 1159 full_profile.set_origin(kSettingsOrigin); 1160 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1161 // "add", "manage", and 1 suggestion. 1162 EXPECT_EQ( 1163 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount()); 1164} 1165 1166TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidAddress) { 1167 SwitchToAutofill(); 1168 AutofillProfile full_profile(test::GetVerifiedProfile()); 1169 full_profile.set_origin(kSettingsOrigin); 1170 full_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("C")); 1171 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1172} 1173 1174TEST_F(AutofillDialogControllerTest, DoNotSuggestIncompleteAddress) { 1175 SwitchToAutofill(); 1176 AutofillProfile profile(test::GetVerifiedProfile()); 1177 profile.SetRawInfo(ADDRESS_HOME_STATE, base::string16()); 1178 controller()->GetTestingManager()->AddTestingProfile(&profile); 1179 1180 // Same as shipping, manage, add new. 1181 EXPECT_EQ(3, 1182 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 1183 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); 1184} 1185 1186TEST_F(AutofillDialogControllerTest, DoSuggestShippingAddressWithoutEmail) { 1187 SwitchToAutofill(); 1188 AutofillProfile profile(test::GetVerifiedProfile()); 1189 profile.SetRawInfo(EMAIL_ADDRESS, base::string16()); 1190 controller()->GetTestingManager()->AddTestingProfile(&profile); 1191 1192 // Same as shipping, manage, add new, profile with missing email. 1193 EXPECT_EQ(4, 1194 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 1195 // Billing addresses require email. 1196 EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); 1197} 1198 1199TEST_F(AutofillDialogControllerTest, AutofillCreditCards) { 1200 SwitchToAutofill(); 1201 // Since the PersonalDataManager is empty, this should only have the 1202 // default menu items. 1203 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); 1204 1205 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3); 1206 1207 // Empty cards are ignored. 1208 CreditCard empty_card(base::GenerateGUID(), kSettingsOrigin); 1209 empty_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("John Doe")); 1210 controller()->GetTestingManager()->AddTestingCreditCard(&empty_card); 1211 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); 1212 1213 // An otherwise full but unverified card should be ignored. 1214 CreditCard full_card(test::GetCreditCard()); 1215 full_card.set_origin("https://www.example.com"); 1216 controller()->GetTestingManager()->AddTestingCreditCard(&full_card); 1217 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); 1218 1219 // A full, verified card should be picked up. 1220 CreditCard verified_card(test::GetCreditCard()); 1221 verified_card.set_origin(kSettingsOrigin); 1222 controller()->GetTestingManager()->AddTestingCreditCard(&verified_card); 1223 ui::MenuModel* credit_card_model = 1224 controller()->MenuModelForSection(SECTION_CC); 1225 ASSERT_TRUE(credit_card_model); 1226 EXPECT_EQ(3, credit_card_model->GetItemCount()); 1227} 1228 1229// Test selecting a shipping address different from billing as address. 1230TEST_F(AutofillDialogControllerTest, DontUseBillingAsShipping) { 1231 SwitchToAutofill(); 1232 AutofillProfile full_profile(test::GetVerifiedProfile()); 1233 AutofillProfile full_profile2(test::GetVerifiedProfile2()); 1234 CreditCard credit_card(test::GetVerifiedCreditCard()); 1235 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1236 controller()->GetTestingManager()->AddTestingProfile(&full_profile2); 1237 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1238 ui::MenuModel* shipping_model = 1239 controller()->MenuModelForSection(SECTION_SHIPPING); 1240 shipping_model->ActivatedAt(2); 1241 1242 controller()->OnAccept(); 1243 ASSERT_EQ(20U, form_structure()->field_count()); 1244 EXPECT_EQ(ADDRESS_HOME_STATE, 1245 form_structure()->field(9)->Type().GetStorableType()); 1246 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group()); 1247 EXPECT_EQ(ADDRESS_HOME_STATE, 1248 form_structure()->field(16)->Type().GetStorableType()); 1249 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group()); 1250 base::string16 billing_state = form_structure()->field(9)->value; 1251 base::string16 shipping_state = form_structure()->field(16)->value; 1252 EXPECT_FALSE(billing_state.empty()); 1253 EXPECT_FALSE(shipping_state.empty()); 1254 EXPECT_NE(billing_state, shipping_state); 1255 1256 EXPECT_EQ(CREDIT_CARD_NAME, 1257 form_structure()->field(1)->Type().GetStorableType()); 1258 base::string16 cc_name = form_structure()->field(1)->value; 1259 EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType()); 1260 EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group()); 1261 base::string16 billing_name = form_structure()->field(6)->value; 1262 EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType()); 1263 EXPECT_EQ(NAME, form_structure()->field(13)->Type().group()); 1264 base::string16 shipping_name = form_structure()->field(13)->value; 1265 1266 EXPECT_FALSE(cc_name.empty()); 1267 EXPECT_FALSE(billing_name.empty()); 1268 EXPECT_FALSE(shipping_name.empty()); 1269 // Billing name should always be the same as cardholder name. 1270 EXPECT_EQ(cc_name, billing_name); 1271 EXPECT_NE(cc_name, shipping_name); 1272} 1273 1274// Test selecting UseBillingForShipping. 1275TEST_F(AutofillDialogControllerTest, UseBillingAsShipping) { 1276 SwitchToAutofill(); 1277 1278 AutofillProfile full_profile(test::GetVerifiedProfile()); 1279 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1280 1281 AutofillProfile full_profile2(test::GetVerifiedProfile2()); 1282 controller()->GetTestingManager()->AddTestingProfile(&full_profile2); 1283 1284 CreditCard credit_card(test::GetVerifiedCreditCard()); 1285 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1286 1287 ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC)); 1288 ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 1289 1290 SubmitAndVerifyShippingAndBillingResults(); 1291} 1292 1293TEST_F(AutofillDialogControllerTest, UseBillingAsShippingManualInput) { 1294 SwitchToAutofill(); 1295 1296 ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC)); 1297 ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 1298 1299 CreditCard credit_card(test::GetVerifiedCreditCard()); 1300 FillInputs(SECTION_CC, credit_card); 1301 1302 AutofillProfile full_profile(test::GetVerifiedProfile()); 1303 FillInputs(SECTION_BILLING, full_profile); 1304 1305 SubmitAndVerifyShippingAndBillingResults(); 1306} 1307 1308// Tests that shipping and billing telephone fields are supported, and filled 1309// in by their respective profiles. http://crbug.com/244515 1310TEST_F(AutofillDialogControllerTest, BillingVsShippingPhoneNumber) { 1311 FormFieldData shipping_tel; 1312 shipping_tel.autocomplete_attribute = "shipping tel"; 1313 FormFieldData billing_tel; 1314 billing_tel.autocomplete_attribute = "billing tel"; 1315 1316 FormData form_data; 1317 form_data.fields.push_back(shipping_tel); 1318 form_data.fields.push_back(billing_tel); 1319 SetUpControllerWithFormData(form_data); 1320 1321 SwitchToAutofill(); 1322 1323 // The profile that will be chosen for the shipping section. 1324 AutofillProfile shipping_profile(test::GetVerifiedProfile()); 1325 // The profile that will be chosen for the billing section. 1326 AutofillProfile billing_profile(test::GetVerifiedProfile2()); 1327 CreditCard credit_card(test::GetVerifiedCreditCard()); 1328 controller()->GetTestingManager()->AddTestingProfile(&shipping_profile); 1329 controller()->GetTestingManager()->AddTestingProfile(&billing_profile); 1330 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1331 ui::MenuModel* billing_model = 1332 controller()->MenuModelForSection(SECTION_BILLING); 1333 billing_model->ActivatedAt(1); 1334 1335 controller()->OnAccept(); 1336 ASSERT_EQ(2U, form_structure()->field_count()); 1337 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, 1338 form_structure()->field(0)->Type().GetStorableType()); 1339 EXPECT_EQ(PHONE_HOME, form_structure()->field(0)->Type().group()); 1340 EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, 1341 form_structure()->field(1)->Type().GetStorableType()); 1342 EXPECT_EQ(PHONE_BILLING, form_structure()->field(1)->Type().group()); 1343 EXPECT_EQ(shipping_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER), 1344 form_structure()->field(0)->value); 1345 EXPECT_EQ(billing_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER), 1346 form_structure()->field(1)->value); 1347 EXPECT_NE(form_structure()->field(1)->value, 1348 form_structure()->field(0)->value); 1349} 1350 1351// Similar to the above, but tests that street-address (i.e. all lines of the 1352// street address) is successfully filled for both shipping and billing 1353// sections. 1354TEST_F(AutofillDialogControllerTest, BillingVsShippingStreetAddress) { 1355 FormFieldData shipping_address; 1356 shipping_address.autocomplete_attribute = "shipping street-address"; 1357 FormFieldData billing_address; 1358 billing_address.autocomplete_attribute = "billing street-address"; 1359 FormFieldData shipping_address_textarea; 1360 shipping_address_textarea.autocomplete_attribute = "shipping street-address"; 1361 shipping_address_textarea.form_control_type = "textarea"; 1362 FormFieldData billing_address_textarea; 1363 billing_address_textarea.autocomplete_attribute = "billing street-address"; 1364 billing_address_textarea.form_control_type = "textarea"; 1365 1366 FormData form_data; 1367 form_data.fields.push_back(shipping_address); 1368 form_data.fields.push_back(billing_address); 1369 form_data.fields.push_back(shipping_address_textarea); 1370 form_data.fields.push_back(billing_address_textarea); 1371 SetUpControllerWithFormData(form_data); 1372 1373 SwitchToAutofill(); 1374 1375 // The profile that will be chosen for the shipping section. 1376 AutofillProfile shipping_profile(test::GetVerifiedProfile()); 1377 // The profile that will be chosen for the billing section. 1378 AutofillProfile billing_profile(test::GetVerifiedProfile2()); 1379 CreditCard credit_card(test::GetVerifiedCreditCard()); 1380 controller()->GetTestingManager()->AddTestingProfile(&shipping_profile); 1381 controller()->GetTestingManager()->AddTestingProfile(&billing_profile); 1382 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1383 ui::MenuModel* billing_model = 1384 controller()->MenuModelForSection(SECTION_BILLING); 1385 billing_model->ActivatedAt(1); 1386 1387 controller()->OnAccept(); 1388 ASSERT_EQ(4U, form_structure()->field_count()); 1389 EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS, 1390 form_structure()->field(0)->Type().GetStorableType()); 1391 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(0)->Type().group()); 1392 EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS, 1393 form_structure()->field(1)->Type().GetStorableType()); 1394 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(1)->Type().group()); 1395 // Inexact matching; single-line inputs get the address data concatenated but 1396 // separated by commas. 1397 EXPECT_TRUE(StartsWith(form_structure()->field(0)->value, 1398 shipping_profile.GetRawInfo(ADDRESS_HOME_LINE1), 1399 true)); 1400 EXPECT_TRUE(EndsWith(form_structure()->field(0)->value, 1401 shipping_profile.GetRawInfo(ADDRESS_HOME_LINE2), 1402 true)); 1403 EXPECT_TRUE(StartsWith(form_structure()->field(1)->value, 1404 billing_profile.GetRawInfo(ADDRESS_HOME_LINE1), 1405 true)); 1406 EXPECT_TRUE(EndsWith(form_structure()->field(1)->value, 1407 billing_profile.GetRawInfo(ADDRESS_HOME_LINE2), 1408 true)); 1409 // The textareas should be an exact match. 1410 EXPECT_EQ(shipping_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS), 1411 form_structure()->field(2)->value); 1412 EXPECT_EQ(billing_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS), 1413 form_structure()->field(3)->value); 1414 1415 EXPECT_NE(form_structure()->field(1)->value, 1416 form_structure()->field(0)->value); 1417 EXPECT_NE(form_structure()->field(3)->value, 1418 form_structure()->field(2)->value); 1419} 1420 1421TEST_F(AutofillDialogControllerTest, AcceptLegalDocuments) { 1422 for (size_t i = 0; i < 2; ++i) { 1423 SCOPED_TRACE(testing::Message() << "Case " << i); 1424 1425 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1426 AcceptLegalDocuments(_, _)); 1427 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_)); 1428 EXPECT_CALL(*controller(), LoadRiskFingerprintData()); 1429 1430 EXPECT_TRUE(controller()->LegalDocumentLinks().empty()); 1431 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 1432 EXPECT_TRUE(controller()->LegalDocumentLinks().empty()); 1433 1434 scoped_ptr<wallet::WalletItems> wallet_items = 1435 CompleteAndValidWalletItems(); 1436 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 1437 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 1438 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1439 EXPECT_FALSE(controller()->LegalDocumentLinks().empty()); 1440 1441 controller()->OnAccept(); 1442 controller()->OnDidAcceptLegalDocuments(); 1443 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass()); 1444 1445 // Now try it all over again with the location disclosure already accepted. 1446 // Nothing should change. 1447 Reset(); 1448 base::ListValue preexisting_list; 1449 preexisting_list.AppendString(kFakeEmail); 1450 g_browser_process->local_state()->Set( 1451 ::prefs::kAutofillDialogWalletLocationAcceptance, 1452 preexisting_list); 1453 } 1454} 1455 1456TEST_F(AutofillDialogControllerTest, RejectLegalDocuments) { 1457 for (size_t i = 0; i < 2; ++i) { 1458 SCOPED_TRACE(testing::Message() << "Case " << i); 1459 1460 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1461 AcceptLegalDocuments(_, _)).Times(0); 1462 1463 scoped_ptr<wallet::WalletItems> wallet_items = 1464 CompleteAndValidWalletItems(); 1465 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 1466 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 1467 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1468 EXPECT_FALSE(controller()->LegalDocumentLinks().empty()); 1469 1470 controller()->OnCancel(); 1471 1472 // Now try it all over again with the location disclosure already accepted. 1473 // Nothing should change. 1474 Reset(); 1475 base::ListValue preexisting_list; 1476 preexisting_list.AppendString(kFakeEmail); 1477 g_browser_process->local_state()->Set( 1478 ::prefs::kAutofillDialogWalletLocationAcceptance, 1479 preexisting_list); 1480 } 1481} 1482 1483TEST_F(AutofillDialogControllerTest, AcceptLocationDisclosure) { 1484 // Check that accepting the dialog registers the user's name in the list 1485 // of users who have accepted the geolocation terms. 1486 EXPECT_TRUE(g_browser_process->local_state()->GetList( 1487 ::prefs::kAutofillDialogWalletLocationAcceptance)->empty()); 1488 1489 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 1490 EXPECT_FALSE(controller()->LegalDocumentsText().empty()); 1491 EXPECT_TRUE(controller()->LegalDocumentLinks().empty()); 1492 controller()->OnAccept(); 1493 1494 const base::ListValue* list = g_browser_process->local_state()->GetList( 1495 ::prefs::kAutofillDialogWalletLocationAcceptance); 1496 ASSERT_EQ(1U, list->GetSize()); 1497 std::string accepted_username; 1498 EXPECT_TRUE(list->GetString(0, &accepted_username)); 1499 EXPECT_EQ(kFakeEmail, accepted_username); 1500 1501 // Now check it still works if that list starts off with some other username 1502 // in it. 1503 Reset(); 1504 list = g_browser_process->local_state()->GetList( 1505 ::prefs::kAutofillDialogWalletLocationAcceptance); 1506 ASSERT_TRUE(list->empty()); 1507 1508 std::string kOtherUsername("spouse@example.com"); 1509 base::ListValue preexisting_list; 1510 preexisting_list.AppendString(kOtherUsername); 1511 g_browser_process->local_state()->Set( 1512 ::prefs::kAutofillDialogWalletLocationAcceptance, 1513 preexisting_list); 1514 1515 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 1516 EXPECT_FALSE(controller()->LegalDocumentsText().empty()); 1517 EXPECT_TRUE(controller()->LegalDocumentLinks().empty()); 1518 controller()->OnAccept(); 1519 1520 list = g_browser_process->local_state()->GetList( 1521 ::prefs::kAutofillDialogWalletLocationAcceptance); 1522 ASSERT_EQ(2U, list->GetSize()); 1523 EXPECT_NE(list->end(), list->Find(base::StringValue(kFakeEmail))); 1524 EXPECT_NE(list->end(), list->Find(base::StringValue(kOtherUsername))); 1525 1526 // Now check the list doesn't change if the user cancels out of the dialog. 1527 Reset(); 1528 list = g_browser_process->local_state()->GetList( 1529 ::prefs::kAutofillDialogWalletLocationAcceptance); 1530 ASSERT_TRUE(list->empty()); 1531 1532 g_browser_process->local_state()->Set( 1533 ::prefs::kAutofillDialogWalletLocationAcceptance, 1534 preexisting_list); 1535 1536 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 1537 EXPECT_FALSE(controller()->LegalDocumentsText().empty()); 1538 EXPECT_TRUE(controller()->LegalDocumentLinks().empty()); 1539 controller()->OnCancel(); 1540 1541 list = g_browser_process->local_state()->GetList( 1542 ::prefs::kAutofillDialogWalletLocationAcceptance); 1543 ASSERT_EQ(1U, list->GetSize()); 1544 EXPECT_NE(list->end(), list->Find(base::StringValue(kOtherUsername))); 1545 EXPECT_EQ(list->end(), list->Find(base::StringValue(kFakeEmail))); 1546} 1547 1548TEST_F(AutofillDialogControllerTest, LegalDocumentOverflow) { 1549 for (size_t number_of_docs = 2; number_of_docs < 11; ++number_of_docs) { 1550 scoped_ptr<wallet::WalletItems> wallet_items = 1551 CompleteAndValidWalletItems(); 1552 for (size_t i = 0; i < number_of_docs; ++i) 1553 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 1554 1555 Reset(); 1556 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1557 1558 // The dialog is only equipped to handle 2-6 legal documents. More than 1559 // 6 errors out. 1560 if (number_of_docs <= 6U) { 1561 EXPECT_FALSE(controller()->LegalDocumentsText().empty()); 1562 } else { 1563 EXPECT_TRUE(controller()->LegalDocumentsText().empty()); 1564 EXPECT_EQ(1U, NotificationsOfType( 1565 DialogNotification::WALLET_ERROR).size()); 1566 } 1567 } 1568 1569 controller()->OnCancel(); 1570} 1571 1572// Makes sure the default object IDs are respected. 1573TEST_F(AutofillDialogControllerTest, WalletDefaultItems) { 1574 scoped_ptr<wallet::WalletItems> wallet_items = 1575 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1576 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1577 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1578 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 1579 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1580 1581 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 1582 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 1583 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 1584 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 1585 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 1586 1587 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1588 // "add", "manage", and 4 suggestions. 1589 EXPECT_EQ(6, 1590 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount()); 1591 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)-> 1592 IsItemCheckedAt(2)); 1593 ASSERT_FALSE(controller()->IsEditingExistingData(SECTION_CC_BILLING)); 1594 // "use billing", "add", "manage", and 5 suggestions. 1595 EXPECT_EQ(8, 1596 controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 1597 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_SHIPPING)-> 1598 IsItemCheckedAt(4)); 1599 ASSERT_FALSE(controller()->IsEditingExistingData(SECTION_SHIPPING)); 1600} 1601 1602// Tests that invalid and AMEX default instruments are ignored. 1603TEST_F(AutofillDialogControllerTest, SelectInstrument) { 1604 scoped_ptr<wallet::WalletItems> wallet_items = 1605 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1606 // Tests if default instrument is invalid, then, the first valid instrument is 1607 // selected instead of the default instrument. 1608 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1609 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1610 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid()); 1611 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1612 1613 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1614 // 4 suggestions and "add", "manage". 1615 EXPECT_EQ(6, 1616 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount()); 1617 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)-> 1618 IsItemCheckedAt(0)); 1619 1620 // Tests if default instrument is AMEX but Wallet doesn't support 1621 // AMEX on this merchant, then the first valid instrument is 1622 // selected instead of the default instrument. 1623 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1624 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1625 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1626 wallet_items->AddInstrument( 1627 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_DISALLOWED)); 1628 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1629 1630 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1631 // 4 suggestions and "add", "manage". 1632 EXPECT_EQ(6, 1633 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount()); 1634 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)-> 1635 IsItemCheckedAt(0)); 1636 1637 // Tests if default instrument is AMEX and it is allowed on this merchant, 1638 // then it is selected. 1639 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_ALLOWED); 1640 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1641 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1642 wallet_items->AddInstrument( 1643 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_ALLOWED)); 1644 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 1645 1646 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1647 // 4 suggestions and "add", "manage". 1648 EXPECT_EQ(6, 1649 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount()); 1650 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)-> 1651 IsItemCheckedAt(2)); 1652 1653 // Tests if only have AMEX and invalid instrument, then "add" is selected. 1654 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1655 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid()); 1656 wallet_items->AddInstrument( 1657 wallet::GetTestMaskedInstrumentAmex(wallet::AMEX_DISALLOWED)); 1658 1659 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1660 // 2 suggestions and "add", "manage". 1661 EXPECT_EQ(4, 1662 controller()->MenuModelForSection(SECTION_CC_BILLING)->GetItemCount()); 1663 // "add" 1664 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)-> 1665 IsItemCheckedAt(2)); 1666} 1667 1668TEST_F(AutofillDialogControllerTest, SaveAddress) { 1669 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 1670 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1671 SaveToWalletMock(testing::IsNull(), 1672 testing::NotNull(), 1673 testing::IsNull(), 1674 testing::IsNull())); 1675 1676 scoped_ptr<wallet::WalletItems> wallet_items = 1677 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1678 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 1679 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1680 // If there is no shipping address in wallet, it will default to 1681 // "same-as-billing" instead of "add-new-item". "same-as-billing" is covered 1682 // by the following tests. The penultimate item in the menu is "add-new-item". 1683 ui::MenuModel* shipping_model = 1684 controller()->MenuModelForSection(SECTION_SHIPPING); 1685 shipping_model->ActivatedAt(shipping_model->GetItemCount() - 2); 1686 1687 AutofillProfile test_profile(test::GetVerifiedProfile()); 1688 FillInputs(SECTION_SHIPPING, test_profile); 1689 1690 AcceptAndLoadFakeFingerprint(); 1691} 1692 1693TEST_F(AutofillDialogControllerTest, SaveInstrument) { 1694 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 1695 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1696 SaveToWalletMock(testing::NotNull(), 1697 testing::IsNull(), 1698 testing::IsNull(), 1699 testing::IsNull())); 1700 1701 FillCCBillingInputs(); 1702 scoped_ptr<wallet::WalletItems> wallet_items = 1703 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1704 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 1705 SubmitWithWalletItems(wallet_items.Pass()); 1706} 1707 1708TEST_F(AutofillDialogControllerTest, SaveInstrumentWithInvalidInstruments) { 1709 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 1710 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1711 SaveToWalletMock(testing::NotNull(), 1712 testing::IsNull(), 1713 testing::IsNull(), 1714 testing::IsNull())); 1715 1716 FillCCBillingInputs(); 1717 scoped_ptr<wallet::WalletItems> wallet_items = 1718 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1719 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 1720 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentInvalid()); 1721 SubmitWithWalletItems(wallet_items.Pass()); 1722} 1723 1724TEST_F(AutofillDialogControllerTest, SaveInstrumentAndAddress) { 1725 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1726 SaveToWalletMock(testing::NotNull(), 1727 testing::NotNull(), 1728 testing::IsNull(), 1729 testing::IsNull())); 1730 1731 FillCCBillingInputs(); 1732 scoped_ptr<wallet::WalletItems> wallet_items = 1733 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1734 SubmitWithWalletItems(wallet_items.Pass()); 1735} 1736 1737MATCHER(IsUpdatingExistingData, "updating existing Wallet data") { 1738 return !arg->object_id().empty(); 1739} 1740 1741MATCHER(UsesLocalBillingAddress, "uses the local billing address") { 1742 return arg->street_address()[0] == ASCIIToUTF16(kEditedBillingAddress); 1743} 1744 1745// Tests that when using billing address for shipping, and there is no exact 1746// matched shipping address, then a shipping address should be added. 1747TEST_F(AutofillDialogControllerTest, BillingForShipping) { 1748 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1749 SaveToWalletMock(testing::IsNull(), 1750 testing::NotNull(), 1751 testing::IsNull(), 1752 testing::IsNull())); 1753 1754 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 1755 // Select "Same as billing" in the address menu. 1756 UseBillingForShipping(); 1757 1758 AcceptAndLoadFakeFingerprint(); 1759} 1760 1761// Tests that when using billing address for shipping, and there is an exact 1762// matched shipping address, then a shipping address should not be added. 1763TEST_F(AutofillDialogControllerTest, BillingForShippingHasMatch) { 1764 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1765 SaveToWalletMock(_, _, _, _)).Times(0); 1766 1767 scoped_ptr<wallet::WalletItems> wallet_items = 1768 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1769 scoped_ptr<wallet::WalletItems::MaskedInstrument> instrument = 1770 wallet::GetTestMaskedInstrument(); 1771 // Copy billing address as shipping address, and assign an id to it. 1772 scoped_ptr<wallet::Address> shipping_address( 1773 new wallet::Address(instrument->address())); 1774 shipping_address->set_object_id("shipping_address_id"); 1775 wallet_items->AddAddress(shipping_address.Pass()); 1776 wallet_items->AddInstrument(instrument.Pass()); 1777 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 1778 1779 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1780 // Select "Same as billing" in the address menu. 1781 UseBillingForShipping(); 1782 1783 AcceptAndLoadFakeFingerprint(); 1784} 1785 1786// Test that the local view contents is used when saving a new instrument and 1787// the user has selected "Same as billing". 1788TEST_F(AutofillDialogControllerTest, SaveInstrumentSameAsBilling) { 1789 scoped_ptr<wallet::WalletItems> wallet_items = 1790 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1791 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 1792 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1793 1794 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC_BILLING); 1795 model->ActivatedAt(model->GetItemCount() - 2); 1796 1797 FieldValueMap outputs; 1798 const DetailInputs& inputs = 1799 controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 1800 AutofillProfile full_profile(test::GetVerifiedProfile()); 1801 CreditCard full_card(test::GetCreditCard()); 1802 for (size_t i = 0; i < inputs.size(); ++i) { 1803 const ServerFieldType type = inputs[i].type; 1804#if defined(OS_MACOSX) 1805 if (type == ADDRESS_BILLING_LINE1) 1806#else 1807 if (type == ADDRESS_BILLING_STREET_ADDRESS) 1808#endif 1809 outputs[type] = ASCIIToUTF16(kEditedBillingAddress); 1810 else 1811 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); 1812 1813 if (outputs[type].empty()) 1814 outputs[type] = full_card.GetInfo(AutofillType(type), "en-US"); 1815 } 1816 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs); 1817 1818 controller()->OnAccept(); 1819 1820 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1821 SaveToWalletMock(testing::NotNull(), 1822 UsesLocalBillingAddress(), 1823 testing::IsNull(), 1824 testing::IsNull())); 1825 AcceptAndLoadFakeFingerprint(); 1826} 1827 1828TEST_F(AutofillDialogControllerTest, CancelNoSave) { 1829 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1830 SaveToWalletMock(_, _, _, _)).Times(0); 1831 1832 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 1833 1834 controller()->OnDidGetWalletItems( 1835 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED)); 1836 controller()->OnCancel(); 1837} 1838 1839// Checks that clicking the Manage menu item opens a new tab with a different 1840// URL for Wallet and Autofill. 1841TEST_F(AutofillDialogControllerTest, ManageItem) { 1842 AutofillProfile full_profile(test::GetVerifiedProfile()); 1843 full_profile.set_origin(kSettingsOrigin); 1844 full_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); 1845 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1846 SwitchToAutofill(); 1847 1848 SuggestionsMenuModel* shipping = GetMenuModelForSection(SECTION_SHIPPING); 1849 shipping->ExecuteCommand(shipping->GetItemCount() - 1, 0); 1850 GURL autofill_manage_url = controller()->open_tab_url(); 1851 EXPECT_EQ("chrome", autofill_manage_url.scheme()); 1852 1853 SwitchToWallet(); 1854 scoped_ptr<wallet::WalletItems> wallet_items = 1855 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1856 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 1857 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1858 1859 controller()->SuggestionItemSelected(shipping, shipping->GetItemCount() - 1); 1860 GURL wallet_manage_addresses_url = controller()->open_tab_url(); 1861 EXPECT_EQ("https", wallet_manage_addresses_url.scheme()); 1862 1863 SuggestionsMenuModel* billing = GetMenuModelForSection(SECTION_CC_BILLING); 1864 controller()->SuggestionItemSelected(billing, billing->GetItemCount() - 1); 1865 GURL wallet_manage_instruments_url = controller()->open_tab_url(); 1866 EXPECT_EQ("https", wallet_manage_instruments_url.scheme()); 1867 1868 EXPECT_NE(autofill_manage_url, wallet_manage_instruments_url); 1869 EXPECT_NE(wallet_manage_instruments_url, wallet_manage_addresses_url); 1870} 1871 1872// Tests that adding an autofill profile and then submitting works. 1873TEST_F(AutofillDialogControllerTest, AddAutofillProfile) { 1874 SwitchToAutofill(); 1875 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(2); 1876 1877 AutofillProfile full_profile(test::GetVerifiedProfile()); 1878 CreditCard credit_card(test::GetVerifiedCreditCard()); 1879 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 1880 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 1881 1882 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING); 1883 // Activate the "Add billing address" menu item. 1884 model->ActivatedAt(model->GetItemCount() - 2); 1885 1886 // Fill in the inputs from the profile. 1887 FieldValueMap outputs; 1888 const DetailInputs& inputs = 1889 controller()->RequestedFieldsForSection(SECTION_BILLING); 1890 AutofillProfile full_profile2(test::GetVerifiedProfile2()); 1891 for (size_t i = 0; i < inputs.size(); ++i) { 1892 const ServerFieldType type = inputs[i].type; 1893 outputs[type] = full_profile2.GetInfo(AutofillType(type), "en-US"); 1894 } 1895 controller()->GetView()->SetUserInput(SECTION_BILLING, outputs); 1896 1897 controller()->OnAccept(); 1898 const AutofillProfile& added_profile = 1899 controller()->GetTestingManager()->imported_profile(); 1900 1901 const DetailInputs& shipping_inputs = 1902 controller()->RequestedFieldsForSection(SECTION_SHIPPING); 1903 for (size_t i = 0; i < shipping_inputs.size(); ++i) { 1904 const ServerFieldType type = shipping_inputs[i].type; 1905 EXPECT_EQ(full_profile2.GetInfo(AutofillType(type), "en-US"), 1906 added_profile.GetInfo(AutofillType(type), "en-US")); 1907 } 1908} 1909 1910TEST_F(AutofillDialogControllerTest, VerifyCvv) { 1911 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_)); 1912 EXPECT_CALL(*controller()->GetTestingWalletClient(), 1913 AuthenticateInstrument(_, _)); 1914 1915 SubmitWithWalletItems(CompleteAndValidWalletItems()); 1916 1917 EXPECT_TRUE(NotificationsOfType(DialogNotification::REQUIRED_ACTION).empty()); 1918 EXPECT_TRUE(controller()->SectionIsActive(SECTION_SHIPPING)); 1919 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING)); 1920 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1921 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1922 1923 SuggestionState suggestion_state = 1924 controller()->SuggestionStateForSection(SECTION_CC_BILLING); 1925 EXPECT_TRUE(suggestion_state.extra_text.empty()); 1926 1927 controller()->OnDidGetFullWallet( 1928 wallet::GetTestFullWalletWithRequiredActions( 1929 std::vector<wallet::RequiredAction>(1, wallet::VERIFY_CVV))); 1930 ASSERT_TRUE(controller()->IsSubmitPausedOn(wallet::VERIFY_CVV)); 1931 1932 EXPECT_FALSE( 1933 NotificationsOfType(DialogNotification::REQUIRED_ACTION).empty()); 1934 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING)); 1935 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING)); 1936 1937 suggestion_state = 1938 controller()->SuggestionStateForSection(SECTION_CC_BILLING); 1939 EXPECT_FALSE(suggestion_state.extra_text.empty()); 1940 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING)); 1941 1942 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1943 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1944 1945 controller()->OnAccept(); 1946 1947 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty()); 1948} 1949 1950TEST_F(AutofillDialogControllerTest, ErrorDuringSubmit) { 1951 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_)); 1952 1953 SubmitWithWalletItems(CompleteAndValidWalletItems()); 1954 1955 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1956 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1957 1958 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR); 1959 1960 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1961 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1962} 1963 1964TEST_F(AutofillDialogControllerTest, ErrorDuringVerifyCvv) { 1965 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_)); 1966 1967 SubmitWithWalletItems(CompleteAndValidWalletItems()); 1968 controller()->OnDidGetFullWallet( 1969 wallet::GetTestFullWalletWithRequiredActions( 1970 std::vector<wallet::RequiredAction>(1, wallet::VERIFY_CVV))); 1971 1972 ASSERT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1973 ASSERT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1974 1975 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR); 1976 1977 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 1978 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_CANCEL)); 1979} 1980 1981// Simulates receiving an INVALID_FORM_FIELD required action while processing a 1982// |WalletClientDelegate::OnDid{Save,Update}*()| call. This can happen if Online 1983// Wallet's server validation differs from Chrome's local validation. 1984TEST_F(AutofillDialogControllerTest, WalletServerSideValidation) { 1985 scoped_ptr<wallet::WalletItems> wallet_items = 1986 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 1987 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 1988 controller()->OnDidGetWalletItems(wallet_items.Pass()); 1989 controller()->OnAccept(); 1990 1991 std::vector<wallet::RequiredAction> required_actions; 1992 required_actions.push_back(wallet::INVALID_FORM_FIELD); 1993 1994 std::vector<wallet::FormFieldError> form_errors; 1995 form_errors.push_back( 1996 wallet::FormFieldError(wallet::FormFieldError::INVALID_POSTAL_CODE, 1997 wallet::FormFieldError::SHIPPING_ADDRESS)); 1998 1999 EXPECT_CALL(*controller()->GetView(), UpdateForErrors()); 2000 controller()->OnDidSaveToWallet(std::string(), 2001 std::string(), 2002 required_actions, 2003 form_errors); 2004} 2005 2006// Simulates receiving unrecoverable Wallet server validation errors. 2007TEST_F(AutofillDialogControllerTest, WalletServerSideValidationUnrecoverable) { 2008 scoped_ptr<wallet::WalletItems> wallet_items = 2009 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2010 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2011 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2012 controller()->OnAccept(); 2013 2014 std::vector<wallet::RequiredAction> required_actions; 2015 required_actions.push_back(wallet::INVALID_FORM_FIELD); 2016 2017 std::vector<wallet::FormFieldError> form_errors; 2018 form_errors.push_back( 2019 wallet::FormFieldError(wallet::FormFieldError::UNKNOWN_ERROR, 2020 wallet::FormFieldError::UNKNOWN_LOCATION)); 2021 2022 controller()->OnDidSaveToWallet(std::string(), 2023 std::string(), 2024 required_actions, 2025 form_errors); 2026 2027 EXPECT_EQ(1U, NotificationsOfType( 2028 DialogNotification::REQUIRED_ACTION).size()); 2029} 2030 2031// Test Wallet banners are show in the right situations. These banners promote 2032// saving details into Wallet (i.e. "[x] Save details to Wallet"). 2033TEST_F(AutofillDialogControllerTest, WalletBanners) { 2034 // Simulate non-signed-in case. 2035 SetUpControllerWithFormData(DefaultFormData()); 2036 GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 2037 controller()->OnPassiveSigninFailure(error); 2038 EXPECT_EQ(0U, NotificationsOfType( 2039 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2040 2041 // Sign in a user with a completed account. 2042 SetUpControllerWithFormData(DefaultFormData()); 2043 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2044 2045 // Full account; should show "Details from Wallet" message. 2046 EXPECT_EQ(1U, NotificationsOfType( 2047 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2048 SwitchToAutofill(); 2049 EXPECT_EQ(1U, NotificationsOfType( 2050 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2051 2052 // Start over and sign in a user with an incomplete account. 2053 SetUpControllerWithFormData(DefaultFormData()); 2054 scoped_ptr<wallet::WalletItems> wallet_items = 2055 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2056 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2057 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2058 2059 // Partial account. 2060 EXPECT_EQ(1U, NotificationsOfType( 2061 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2062 2063 SwitchToAutofill(); 2064 EXPECT_EQ(1U, NotificationsOfType( 2065 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2066 2067 // A Wallet error should kill any Wallet promos. 2068 controller()->OnWalletError(wallet::WalletClient::UNKNOWN_ERROR); 2069 2070 EXPECT_EQ(1U, NotificationsOfType( 2071 DialogNotification::WALLET_ERROR).size()); 2072 EXPECT_EQ(0U, NotificationsOfType( 2073 DialogNotification::WALLET_USAGE_CONFIRMATION).size()); 2074} 2075 2076TEST_F(AutofillDialogControllerTest, ViewCancelDoesntSetPref) { 2077 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath( 2078 ::prefs::kAutofillDialogPayWithoutWallet)); 2079 2080 SwitchToAutofill(); 2081 2082 controller()->OnCancel(); 2083 controller()->ViewClosed(); 2084 2085 EXPECT_FALSE(profile()->GetPrefs()->HasPrefPath( 2086 ::prefs::kAutofillDialogPayWithoutWallet)); 2087} 2088 2089TEST_F(AutofillDialogControllerTest, SubmitWithSigninErrorDoesntSetPref) { 2090 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath( 2091 ::prefs::kAutofillDialogPayWithoutWallet)); 2092 2093 SimulateSigninError(); 2094 FillCreditCardInputs(); 2095 controller()->OnAccept(); 2096 2097 EXPECT_FALSE(profile()->GetPrefs()->HasPrefPath( 2098 ::prefs::kAutofillDialogPayWithoutWallet)); 2099} 2100 2101// Tests that there's an overlay shown while waiting for full wallet items. 2102TEST_F(AutofillDialogControllerTest, WalletFirstRun) { 2103 EXPECT_TRUE(controller()->GetDialogOverlay().image.IsEmpty()); 2104 2105 SubmitWithWalletItems(CompleteAndValidWalletItems()); 2106 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty()); 2107 2108 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet()); 2109 EXPECT_FALSE(controller()->GetDialogOverlay().image.IsEmpty()); 2110 EXPECT_FALSE(form_structure()); 2111 2112 // Don't make the test wait for 2 seconds. 2113 controller()->ForceFinishSubmit(); 2114 EXPECT_TRUE(form_structure()); 2115} 2116 2117TEST_F(AutofillDialogControllerTest, ViewSubmitSetsPref) { 2118 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath( 2119 ::prefs::kAutofillDialogPayWithoutWallet)); 2120 2121 SwitchToAutofill(); 2122 FillCreditCardInputs(); 2123 controller()->OnAccept(); 2124 2125 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath( 2126 ::prefs::kAutofillDialogPayWithoutWallet)); 2127 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean( 2128 ::prefs::kAutofillDialogPayWithoutWallet)); 2129 2130 // Try again with a signin error (just leaves the pref alone). 2131 SetUpControllerWithFormData(DefaultFormData()); 2132 2133 // Setting up the controller again should not change the pref. 2134 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath( 2135 ::prefs::kAutofillDialogPayWithoutWallet)); 2136 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean( 2137 ::prefs::kAutofillDialogPayWithoutWallet)); 2138 2139 SimulateSigninError(); 2140 FillCreditCardInputs(); 2141 controller()->OnAccept(); 2142 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath( 2143 ::prefs::kAutofillDialogPayWithoutWallet)); 2144 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean( 2145 ::prefs::kAutofillDialogPayWithoutWallet)); 2146 2147 // Successfully choosing wallet does set the pref. 2148 // Note that OnDidGetWalletItems sets the account chooser to wallet mode. 2149 SetUpControllerWithFormData(DefaultFormData()); 2150 2151 controller()->OnDidFetchWalletCookieValue(std::string()); 2152 scoped_ptr<wallet::WalletItems> wallet_items = 2153 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2154 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2155 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2156 controller()->OnAccept(); 2157 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet()); 2158 controller()->ForceFinishSubmit(); 2159 2160 EXPECT_TRUE(profile()->GetPrefs()->HasPrefPath( 2161 ::prefs::kAutofillDialogPayWithoutWallet)); 2162 EXPECT_FALSE(profile()->GetPrefs()->GetBoolean( 2163 ::prefs::kAutofillDialogPayWithoutWallet)); 2164} 2165 2166TEST_F(AutofillDialogControllerTest, HideWalletEmail) { 2167 SwitchToAutofill(); 2168 2169 // Email field should be showing when using Autofill. 2170 EXPECT_TRUE(controller()->SectionIsActive(SECTION_BILLING)); 2171 EXPECT_FALSE(controller()->SectionIsActive(SECTION_CC_BILLING)); 2172 EXPECT_TRUE(SectionContainsField(SECTION_BILLING, EMAIL_ADDRESS)); 2173 2174 SwitchToWallet(); 2175 2176 // Reset the wallet state. 2177 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>()); 2178 2179 // Setup some wallet state, submit, and get a full wallet to end the flow. 2180 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems(); 2181 2182 // Filling |form_structure()| depends on the current username and wallet items 2183 // being fetched. Until both of these have occurred, the user should not be 2184 // able to click Submit if using Wallet. The username fetch happened earlier. 2185 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2186 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2187 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2188 2189 // Email field should be absent when using Wallet. 2190 EXPECT_FALSE(controller()->SectionIsActive(SECTION_BILLING)); 2191 EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING)); 2192 EXPECT_FALSE(SectionContainsField(SECTION_CC_BILLING, EMAIL_ADDRESS)); 2193 2194 controller()->OnAccept(); 2195 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet()); 2196 controller()->ForceFinishSubmit(); 2197 2198 ASSERT_TRUE(form_structure()); 2199 size_t i = 0; 2200 for (; i < form_structure()->field_count(); ++i) { 2201 if (form_structure()->field(i)->Type().GetStorableType() == EMAIL_ADDRESS) { 2202 EXPECT_EQ(ASCIIToUTF16(kFakeEmail), form_structure()->field(i)->value); 2203 break; 2204 } 2205 } 2206 EXPECT_LT(i, form_structure()->field_count()); 2207} 2208 2209// Test if autofill types of returned form structure are correct for billing 2210// entries. 2211TEST_F(AutofillDialogControllerTest, AutofillTypes) { 2212 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2213 controller()->OnAccept(); 2214 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet()); 2215 controller()->ForceFinishSubmit(); 2216 ASSERT_TRUE(form_structure()); 2217 ASSERT_EQ(20U, form_structure()->field_count()); 2218 EXPECT_EQ(EMAIL_ADDRESS, 2219 form_structure()->field(0)->Type().GetStorableType()); 2220 EXPECT_EQ(CREDIT_CARD_NUMBER, 2221 form_structure()->field(2)->Type().GetStorableType()); 2222 EXPECT_EQ(ADDRESS_HOME_STATE, 2223 form_structure()->field(9)->Type().GetStorableType()); 2224 EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group()); 2225 EXPECT_EQ(ADDRESS_HOME_STATE, 2226 form_structure()->field(16)->Type().GetStorableType()); 2227 EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group()); 2228} 2229 2230TEST_F(AutofillDialogControllerTest, SaveDetailsInChrome) { 2231 SwitchToAutofill(); 2232 EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(4); 2233 2234 AutofillProfile full_profile(test::GetVerifiedProfile()); 2235 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 2236 2237 CreditCard card(test::GetVerifiedCreditCard()); 2238 controller()->GetTestingManager()->AddTestingCreditCard(&card); 2239 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); 2240 2241 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(0); 2242 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); 2243 2244 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1); 2245 EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome()); 2246 2247 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false); 2248 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); 2249 2250 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, true); 2251 controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1); 2252 EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome()); 2253 2254 profile()->ForceIncognito(true); 2255 EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); 2256} 2257 2258TEST_F(AutofillDialogControllerTest, DisabledAutofill) { 2259 SwitchToAutofill(); 2260 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kAutofillEnabled)); 2261 2262 AutofillProfile verified_profile(test::GetVerifiedProfile()); 2263 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 2264 2265 CreditCard credit_card(test::GetVerifiedCreditCard()); 2266 controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 2267 2268 // Verify suggestions menus should be showing when Autofill is enabled. 2269 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC)); 2270 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_BILLING)); 2271 EXPECT_EQ( 2272 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 2273 2274 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 2275 profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false); 2276 2277 // Verify billing and credit card suggestions menus are hidden when Autofill 2278 // is disabled. 2279 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); 2280 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING)); 2281 // And that the shipping suggestions menu has less selections. 2282 EXPECT_EQ( 2283 2, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 2284 2285 // Additionally, editing fields should not show Autofill popups. 2286 ASSERT_NO_FATAL_FAILURE(controller()->UserEditedOrActivatedInput( 2287 SECTION_BILLING, 2288 NAME_BILLING_FULL, 2289 gfx::NativeView(), 2290 gfx::Rect(), 2291 verified_profile.GetRawInfo(NAME_FULL).substr(0, 1), 2292 true)); 2293 EXPECT_EQ(UNKNOWN_TYPE, controller()->popup_input_type()); 2294} 2295 2296// Tests that user is prompted when using instrument with minimal address. 2297TEST_F(AutofillDialogControllerTest, UpgradeMinimalAddress) { 2298 // A minimal address being selected should trigger error validation in the 2299 // view. Called once for each incomplete suggestion. 2300 EXPECT_CALL(*controller()->GetView(), UpdateForErrors()); 2301 2302 scoped_ptr<wallet::WalletItems> wallet_items = 2303 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2304 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentWithIdAndAddress( 2305 "id", wallet::GetTestMinimalAddress())); 2306 scoped_ptr<wallet::Address> address(wallet::GetTestShippingAddress()); 2307 address->set_is_complete_address(false); 2308 wallet_items->AddAddress(address.Pass()); 2309 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2310 2311 // Assert that dialog's SECTION_CC_BILLING section is in edit mode. 2312 ASSERT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING)); 2313 // Shipping section should be in edit mode because of 2314 // is_minimal_shipping_address. 2315 ASSERT_TRUE(controller()->IsEditingExistingData(SECTION_SHIPPING)); 2316} 2317 2318TEST_F(AutofillDialogControllerTest, RiskNeverLoadsWithPendingLegalDocuments) { 2319 EXPECT_CALL(*controller(), LoadRiskFingerprintData()).Times(0); 2320 2321 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems(); 2322 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 2323 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 2324 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2325 controller()->OnAccept(); 2326} 2327 2328TEST_F(AutofillDialogControllerTest, RiskLoadsAfterAcceptingLegalDocuments) { 2329 EXPECT_CALL(*controller(), LoadRiskFingerprintData()).Times(0); 2330 2331 scoped_ptr<wallet::WalletItems> wallet_items = CompleteAndValidWalletItems(); 2332 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 2333 wallet_items->AddLegalDocument(wallet::GetTestLegalDocument()); 2334 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2335 2336 testing::Mock::VerifyAndClear(controller()); 2337 EXPECT_CALL(*controller(), LoadRiskFingerprintData()); 2338 2339 controller()->OnAccept(); 2340 2341 // Simulate a risk load and verify |GetRiskData()| matches the encoded value. 2342 controller()->OnDidAcceptLegalDocuments(); 2343 controller()->OnDidLoadRiskFingerprintData(GetFakeFingerprint().Pass()); 2344 EXPECT_EQ(kFakeFingerprintEncoded, controller()->GetRiskData()); 2345} 2346 2347TEST_F(AutofillDialogControllerTest, NoManageMenuItemForNewWalletUsers) { 2348 // Make sure the menu model item is created for a returning Wallet user. 2349 scoped_ptr<wallet::WalletItems> wallet_items = 2350 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2351 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2352 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 2353 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2354 2355 EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC_BILLING)); 2356 // "Same as billing", "123 address", "Add address...", and "Manage addresses". 2357 EXPECT_EQ( 2358 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 2359 2360 // Make sure the menu model item is not created for new Wallet users. 2361 base::DictionaryValue dict; 2362 scoped_ptr<base::ListValue> required_actions(new base::ListValue); 2363 required_actions->AppendString("setup_wallet"); 2364 dict.Set("required_action", required_actions.release()); 2365 controller()->OnDidGetWalletItems( 2366 wallet::WalletItems::CreateWalletItems(dict).Pass()); 2367 2368 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING)); 2369 // "Same as billing" and "Add address...". 2370 EXPECT_EQ( 2371 2, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 2372} 2373 2374TEST_F(AutofillDialogControllerTest, ShippingSectionCanBeHidden) { 2375 FormFieldData email_field; 2376 email_field.autocomplete_attribute = "email"; 2377 FormFieldData cc_field; 2378 cc_field.autocomplete_attribute = "cc-number"; 2379 FormFieldData billing_field; 2380 billing_field.autocomplete_attribute = "billing region"; 2381 2382 FormData form_data; 2383 form_data.fields.push_back(email_field); 2384 form_data.fields.push_back(cc_field); 2385 form_data.fields.push_back(billing_field); 2386 2387 AutofillProfile full_profile(test::GetVerifiedProfile()); 2388 controller()->GetTestingManager()->AddTestingProfile(&full_profile); 2389 SetUpControllerWithFormData(form_data); 2390 2391 SwitchToAutofill(); 2392 2393 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING)); 2394 2395 FillCreditCardInputs(); 2396 controller()->OnAccept(); 2397 EXPECT_TRUE(form_structure()); 2398} 2399 2400TEST_F(AutofillDialogControllerTest, ShippingSectionCanBeHiddenForWallet) { 2401 FormFieldData email_field; 2402 email_field.autocomplete_attribute = "email"; 2403 FormFieldData cc_field; 2404 cc_field.autocomplete_attribute = "cc-number"; 2405 FormFieldData billing_field; 2406 billing_field.autocomplete_attribute = "billing region"; 2407 2408 FormData form_data; 2409 form_data.fields.push_back(email_field); 2410 form_data.fields.push_back(cc_field); 2411 form_data.fields.push_back(billing_field); 2412 2413 SetUpControllerWithFormData(form_data); 2414 EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING)); 2415 EXPECT_FALSE(controller()->IsShippingAddressRequired()); 2416 2417 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetFullWallet(_)); 2418 scoped_ptr<wallet::WalletItems> wallet_items = 2419 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2420 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2421 SubmitWithWalletItems(wallet_items.Pass()); 2422 controller()->OnDidGetFullWallet(wallet::GetTestFullWalletInstrumentOnly()); 2423 controller()->ForceFinishSubmit(); 2424 EXPECT_TRUE(form_structure()); 2425} 2426 2427TEST_F(AutofillDialogControllerTest, NotProdNotification) { 2428 // To make IsPayingWithWallet() true. 2429 controller()->OnDidGetWalletItems( 2430 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED)); 2431 2432 CommandLine* command_line = CommandLine::ForCurrentProcess(); 2433 ASSERT_EQ( 2434 "", 2435 command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox)); 2436 2437 command_line->AppendSwitchASCII(switches::kWalletServiceUseSandbox, "1"); 2438 EXPECT_EQ(1U, 2439 NotificationsOfType(DialogNotification::DEVELOPER_WARNING).size()); 2440} 2441 2442TEST_F(AutofillDialogControllerTest, NoNotProdNotification) { 2443 // To make IsPayingWithWallet() true. 2444 controller()->OnDidGetWalletItems( 2445 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED)); 2446 2447 CommandLine* command_line = CommandLine::ForCurrentProcess(); 2448 ASSERT_EQ( 2449 "", 2450 command_line->GetSwitchValueASCII(switches::kWalletServiceUseSandbox)); 2451 2452 command_line->AppendSwitchASCII(switches::kWalletServiceUseSandbox, "0"); 2453 EXPECT_EQ(0U, 2454 NotificationsOfType(DialogNotification::DEVELOPER_WARNING).size()); 2455} 2456 2457// Ensure Wallet instruments marked expired by the server are shown as invalid. 2458TEST_F(AutofillDialogControllerTest, WalletExpiredCard) { 2459 scoped_ptr<wallet::WalletItems> wallet_items = 2460 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2461 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentExpired()); 2462 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2463 2464 EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING)); 2465 2466 const DetailInputs& inputs = 2467 controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 2468 FieldValueMap outputs; 2469 CopyInitialValues(inputs, &outputs); 2470 2471 // The local inputs are invalid because the server said so. They'll 2472 // stay invalid until they differ from the remotely fetched model. 2473 ValidityMessages messages = controller()->InputsAreValid(SECTION_CC_BILLING, 2474 outputs); 2475 EXPECT_TRUE(messages.HasSureError(CREDIT_CARD_EXP_MONTH)); 2476 EXPECT_TRUE(messages.HasSureError(CREDIT_CARD_EXP_4_DIGIT_YEAR)); 2477 2478 // Make the local input year differ from the instrument. 2479 CopyInitialValues(inputs, &outputs); 2480 outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = ASCIIToUTF16("3002"); 2481 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 2482 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_MONTH)); 2483 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); 2484 2485 // Make the local input month differ from the instrument. 2486 CopyInitialValues(inputs, &outputs); 2487 outputs[CREDIT_CARD_EXP_MONTH] = ASCIIToUTF16("06"); 2488 messages = controller()->InputsAreValid(SECTION_CC_BILLING, outputs); 2489 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_MONTH)); 2490 EXPECT_FALSE(HasAnyError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); 2491} 2492 2493TEST_F(AutofillDialogControllerTest, ChooseAnotherInstrumentOrAddress) { 2494 SubmitWithWalletItems(CompleteAndValidWalletItems()); 2495 2496 EXPECT_EQ(0U, NotificationsOfType( 2497 DialogNotification::REQUIRED_ACTION).size()); 2498 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 2499 controller()->OnDidGetFullWallet( 2500 wallet::GetTestFullWalletWithRequiredActions( 2501 std::vector<wallet::RequiredAction>( 2502 1, wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS))); 2503 EXPECT_EQ(1U, NotificationsOfType( 2504 DialogNotification::REQUIRED_ACTION).size()); 2505 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2506 2507 controller()->OnAccept(); 2508 EXPECT_EQ(0U, NotificationsOfType( 2509 DialogNotification::REQUIRED_ACTION).size()); 2510} 2511 2512TEST_F(AutofillDialogControllerTest, NewCardBubbleShown) { 2513 SwitchToAutofill(); 2514 FillCreditCardInputs(); 2515 controller()->OnAccept(); 2516 controller()->ViewClosed(); 2517 2518 EXPECT_EQ(1, mock_new_card_bubble_controller()->bubbles_shown()); 2519 EXPECT_EQ(0, test_generated_bubble_controller()->bubbles_shown()); 2520} 2521 2522TEST_F(AutofillDialogControllerTest, GeneratedCardBubbleShown) { 2523 SubmitWithWalletItems(CompleteAndValidWalletItems()); 2524 controller()->OnDidGetFullWallet(wallet::GetTestFullWallet()); 2525 controller()->ForceFinishSubmit(); 2526 controller()->ViewClosed(); 2527 2528 EXPECT_EQ(0, mock_new_card_bubble_controller()->bubbles_shown()); 2529 EXPECT_EQ(1, test_generated_bubble_controller()->bubbles_shown()); 2530} 2531 2532// Verify that new Wallet data is fetched when the user switches away from the 2533// tab hosting the Autofill dialog and back. Also verify that the user's 2534// selection is preserved across this re-fetch. 2535TEST_F(AutofillDialogControllerTest, ReloadWalletItemsOnActivation) { 2536 // Initialize some Wallet data. 2537 scoped_ptr<wallet::WalletItems> wallet_items = 2538 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2539 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2540 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 2541 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 2542 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 2543 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2544 2545 // Initially, the default entries should be selected. 2546 ui::MenuModel* cc_billing_model = 2547 controller()->MenuModelForSection(SECTION_CC_BILLING); 2548 ui::MenuModel* shipping_model = 2549 controller()->MenuModelForSection(SECTION_SHIPPING); 2550 // "add", "manage", and 2 suggestions. 2551 ASSERT_EQ(4, cc_billing_model->GetItemCount()); 2552 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(0)); 2553 // "use billing", "add", "manage", and 2 suggestions. 2554 ASSERT_EQ(5, shipping_model->GetItemCount()); 2555 EXPECT_TRUE(shipping_model->IsItemCheckedAt(2)); 2556 2557 // Select entries other than the defaults. 2558 cc_billing_model->ActivatedAt(1); 2559 shipping_model->ActivatedAt(1); 2560 // 2 suggestions, "add", and "manage". 2561 ASSERT_EQ(4, cc_billing_model->GetItemCount()); 2562 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(1)); 2563 // "use billing", 2 suggestions, "add", "manage". 2564 ASSERT_EQ(5, shipping_model->GetItemCount()); 2565 EXPECT_TRUE(shipping_model-> IsItemCheckedAt(1)); 2566 2567 // Simulate switching away from the tab and back. This should issue a request 2568 // for wallet items. 2569 controller()->ClearLastWalletItemsFetchTimestampForTesting(); 2570 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 2571 controller()->TabActivated(); 2572 2573 // Simulate a response that includes different items. 2574 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2575 wallet_items->AddInstrument(wallet::GetTestMaskedInstrumentExpired()); 2576 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2577 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 2578 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 2579 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2580 2581 // The previously selected entries should still be selected. 2582 // 3 suggestions, "add", and "manage". 2583 ASSERT_EQ(5, cc_billing_model->GetItemCount()); 2584 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(2)); 2585 // "use billing", 1 suggestion, "add", and "manage". 2586 ASSERT_EQ(4, shipping_model->GetItemCount()); 2587 EXPECT_TRUE(shipping_model->IsItemCheckedAt(1)); 2588} 2589 2590// Verify that if the default values change when re-fetching Wallet data, these 2591// new default values are selected in the dialog. 2592TEST_F(AutofillDialogControllerTest, 2593 ReloadWalletItemsOnActivationWithNewDefaults) { 2594 // Initialize some Wallet data. 2595 scoped_ptr<wallet::WalletItems> wallet_items = 2596 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2597 wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 2598 wallet_items->AddInstrument(wallet::GetTestNonDefaultMaskedInstrument()); 2599 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 2600 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 2601 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2602 2603 // Initially, the default entries should be selected. 2604 ui::MenuModel* cc_billing_model = 2605 controller()->MenuModelForSection(SECTION_CC_BILLING); 2606 ui::MenuModel* shipping_model = 2607 controller()->MenuModelForSection(SECTION_SHIPPING); 2608 // 2 suggestions, "add", and "manage". 2609 ASSERT_EQ(4, cc_billing_model->GetItemCount()); 2610 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(0)); 2611 // "use billing", 2 suggestions, "add", and "manage". 2612 ASSERT_EQ(5, shipping_model->GetItemCount()); 2613 EXPECT_TRUE(shipping_model->IsItemCheckedAt(2)); 2614 2615 // Simulate switching away from the tab and back. This should issue a request 2616 // for wallet items. 2617 controller()->ClearLastWalletItemsFetchTimestampForTesting(); 2618 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 2619 controller()->TabActivated(); 2620 2621 // Simulate a response that includes different default values. 2622 wallet_items = 2623 wallet::GetTestWalletItemsWithDefaultIds("new_default_instrument_id", 2624 "new_default_address_id", 2625 wallet::AMEX_DISALLOWED); 2626 scoped_ptr<wallet::Address> other_address = wallet::GetTestShippingAddress(); 2627 other_address->set_object_id("other_address_id"); 2628 scoped_ptr<wallet::Address> new_default_address = 2629 wallet::GetTestNonDefaultShippingAddress(); 2630 new_default_address->set_object_id("new_default_address_id"); 2631 2632 wallet_items->AddInstrument( 2633 wallet::GetTestMaskedInstrumentWithId("other_instrument_id")); 2634 wallet_items->AddInstrument( 2635 wallet::GetTestMaskedInstrumentWithId("new_default_instrument_id")); 2636 wallet_items->AddAddress(new_default_address.Pass()); 2637 wallet_items->AddAddress(other_address.Pass()); 2638 controller()->OnDidGetWalletItems(wallet_items.Pass()); 2639 2640 // The new default entries should be selected. 2641 // 2 suggestions, "add", and "manage". 2642 ASSERT_EQ(4, cc_billing_model->GetItemCount()); 2643 EXPECT_TRUE(cc_billing_model->IsItemCheckedAt(1)); 2644 // "use billing", 2 suggestions, "add", and "manage". 2645 ASSERT_EQ(5, shipping_model->GetItemCount()); 2646 EXPECT_TRUE(shipping_model->IsItemCheckedAt(1)); 2647} 2648 2649TEST_F(AutofillDialogControllerTest, ReloadWithEmptyWalletItems) { 2650 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2651 controller()->MenuModelForSection(SECTION_CC_BILLING)->ActivatedAt(1); 2652 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1); 2653 2654 controller()->ClearLastWalletItemsFetchTimestampForTesting(); 2655 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 2656 controller()->TabActivated(); 2657 2658 controller()->OnDidGetWalletItems( 2659 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED)); 2660 2661 EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC_BILLING)); 2662 EXPECT_EQ( 2663 3, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); 2664} 2665 2666TEST_F(AutofillDialogControllerTest, SaveInChromeByDefault) { 2667 EXPECT_TRUE(controller()->ShouldSaveInChrome()); 2668 SwitchToAutofill(); 2669 FillCreditCardInputs(); 2670 controller()->OnAccept(); 2671 EXPECT_TRUE(controller()->ShouldSaveInChrome()); 2672} 2673 2674TEST_F(AutofillDialogControllerTest, 2675 SaveInChromePreferenceNotRememberedOnCancel) { 2676 EXPECT_TRUE(controller()->ShouldSaveInChrome()); 2677 SwitchToAutofill(); 2678 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false); 2679 controller()->OnCancel(); 2680 EXPECT_TRUE(controller()->ShouldSaveInChrome()); 2681} 2682 2683TEST_F(AutofillDialogControllerTest, 2684 SaveInChromePreferenceRememberedOnSuccess) { 2685 EXPECT_TRUE(controller()->ShouldSaveInChrome()); 2686 SwitchToAutofill(); 2687 FillCreditCardInputs(); 2688 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false); 2689 controller()->OnAccept(); 2690 EXPECT_FALSE(controller()->ShouldSaveInChrome()); 2691} 2692 2693TEST_F(AutofillDialogControllerTest, 2694 SubmitButtonIsDisabled_SpinnerFinishesBeforeDelay) { 2695 // Reset Wallet state. 2696 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>()); 2697 2698 EXPECT_EQ(1, controller()->get_submit_button_delay_count()); 2699 2700 // Begin the submit button delay. 2701 controller()->SimulateSubmitButtonDelayBegin(); 2702 2703 EXPECT_TRUE(controller()->ShouldShowSpinner()); 2704 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2705 2706 // Stop the spinner. 2707 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2708 2709 EXPECT_FALSE(controller()->ShouldShowSpinner()); 2710 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2711 2712 // End the submit button delay. 2713 controller()->SimulateSubmitButtonDelayEnd(); 2714 2715 EXPECT_FALSE(controller()->ShouldShowSpinner()); 2716 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2717} 2718 2719TEST_F(AutofillDialogControllerTest, 2720 SubmitButtonIsDisabled_SpinnerFinishesAfterDelay) { 2721 // Reset Wallet state. 2722 controller()->OnDidGetWalletItems(scoped_ptr<wallet::WalletItems>()); 2723 2724 EXPECT_EQ(1, controller()->get_submit_button_delay_count()); 2725 2726 // Begin the submit button delay. 2727 controller()->SimulateSubmitButtonDelayBegin(); 2728 2729 EXPECT_TRUE(controller()->ShouldShowSpinner()); 2730 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2731 2732 // End the submit button delay. 2733 controller()->SimulateSubmitButtonDelayEnd(); 2734 2735 EXPECT_TRUE(controller()->ShouldShowSpinner()); 2736 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2737 2738 // Stop the spinner. 2739 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2740 2741 EXPECT_FALSE(controller()->ShouldShowSpinner()); 2742 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2743} 2744 2745TEST_F(AutofillDialogControllerTest, SubmitButtonIsDisabled_NoSpinner) { 2746 SwitchToAutofill(); 2747 2748 EXPECT_EQ(1, controller()->get_submit_button_delay_count()); 2749 2750 // Begin the submit button delay. 2751 controller()->SimulateSubmitButtonDelayBegin(); 2752 2753 EXPECT_FALSE(controller()->ShouldShowSpinner()); 2754 EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2755 2756 // End the submit button delay. 2757 controller()->SimulateSubmitButtonDelayEnd(); 2758 2759 EXPECT_FALSE(controller()->ShouldShowSpinner()); 2760 EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); 2761} 2762 2763TEST_F(AutofillDialogControllerTest, IconsForFields_NoCreditCard) { 2764 FieldValueMap values; 2765 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); 2766 FieldIconMap icons = controller()->IconsForFields(values); 2767 EXPECT_TRUE(icons.empty()); 2768} 2769 2770TEST_F(AutofillDialogControllerTest, IconsForFields_CreditCardNumberOnly) { 2771 FieldValueMap values; 2772 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); 2773 values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa); 2774 FieldIconMap icons = controller()->IconsForFields(values); 2775 EXPECT_EQ(1UL, icons.size()); 2776 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER)); 2777} 2778 2779TEST_F(AutofillDialogControllerTest, IconsForFields_CvcOnly) { 2780 FieldValueMap values; 2781 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); 2782 values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123"); 2783 FieldIconMap icons = controller()->IconsForFields(values); 2784 EXPECT_EQ(1UL, icons.size()); 2785 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE)); 2786} 2787 2788TEST_F(AutofillDialogControllerTest, IconsForFields_BothCreditCardAndCvc) { 2789 FieldValueMap values; 2790 values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); 2791 values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa); 2792 values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123"); 2793 FieldIconMap icons = controller()->IconsForFields(values); 2794 EXPECT_EQ(2UL, icons.size()); 2795 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE)); 2796 EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER)); 2797} 2798 2799TEST_F(AutofillDialogControllerTest, FieldControlsIcons) { 2800 EXPECT_TRUE(controller()->FieldControlsIcons(CREDIT_CARD_NUMBER)); 2801 EXPECT_FALSE(controller()->FieldControlsIcons(CREDIT_CARD_VERIFICATION_CODE)); 2802 EXPECT_FALSE(controller()->FieldControlsIcons(EMAIL_ADDRESS)); 2803} 2804 2805TEST_F(AutofillDialogControllerTest, SaveCreditCardIncludesName_NoBilling) { 2806 SwitchToAutofill(); 2807 2808 CreditCard test_credit_card(test::GetVerifiedCreditCard()); 2809 FillInputs(SECTION_CC, test_credit_card); 2810 2811 AutofillProfile test_profile(test::GetVerifiedProfile()); 2812 FillInputs(SECTION_BILLING, test_profile); 2813 2814 UseBillingForShipping(); 2815 2816 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); 2817 controller()->OnAccept(); 2818 2819 TestPersonalDataManager* test_pdm = controller()->GetTestingManager(); 2820 const CreditCard& imported_card = test_pdm->imported_credit_card(); 2821 EXPECT_EQ(test_profile.GetRawInfo(NAME_FULL), 2822 imported_card.GetRawInfo(CREDIT_CARD_NAME)); 2823} 2824 2825TEST_F(AutofillDialogControllerTest, SaveCreditCardIncludesName_WithBilling) { 2826 SwitchToAutofill(); 2827 2828 TestPersonalDataManager* test_pdm = controller()->GetTestingManager(); 2829 AutofillProfile test_profile(test::GetVerifiedProfile()); 2830 2831 EXPECT_CALL(*controller()->GetView(), ModelChanged()); 2832 test_pdm->AddTestingProfile(&test_profile); 2833 ASSERT_TRUE(controller()->MenuModelForSection(SECTION_BILLING)); 2834 2835 CreditCard test_credit_card(test::GetVerifiedCreditCard()); 2836 FillInputs(SECTION_CC, test_credit_card); 2837 2838 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); 2839 controller()->OnAccept(); 2840 2841 const CreditCard& imported_card = test_pdm->imported_credit_card(); 2842 EXPECT_EQ(test_profile.GetRawInfo(NAME_FULL), 2843 imported_card.GetRawInfo(CREDIT_CARD_NAME)); 2844 2845 controller()->ViewClosed(); 2846} 2847 2848TEST_F(AutofillDialogControllerTest, InputEditability) { 2849 // Empty wallet items: all fields are editable. 2850 scoped_ptr<wallet::WalletItems> items = 2851 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2852 controller()->OnDidGetWalletItems(items.Pass()); 2853 2854 DialogSection sections[] = { SECTION_CC_BILLING, SECTION_SHIPPING }; 2855 for (size_t i = 0; i < arraysize(sections); ++i) { 2856 const DetailInputs& inputs = 2857 controller()->RequestedFieldsForSection(sections[i]); 2858 for (size_t j = 0; j < inputs.size(); ++j) { 2859 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i])); 2860 } 2861 } 2862 2863 // Expired instrument: CC number + CVV are not editable. 2864 items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 2865 scoped_ptr<wallet::WalletItems::MaskedInstrument> expired_instrument = 2866 wallet::GetTestMaskedInstrumentExpired(); 2867 items->AddInstrument(expired_instrument.Pass()); 2868 controller()->OnDidGetWalletItems(items.Pass()); 2869 EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC_BILLING)); 2870 2871 const DetailInputs& inputs = 2872 controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 2873 FieldValueMap outputs; 2874 CopyInitialValues(inputs, &outputs); 2875 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs); 2876 2877 for (size_t i = 0; i < arraysize(sections); ++i) { 2878 const DetailInputs& inputs = 2879 controller()->RequestedFieldsForSection(sections[i]); 2880 for (size_t j = 0; j < inputs.size(); ++j) { 2881 if (inputs[j].type == CREDIT_CARD_NUMBER || 2882 inputs[j].type == CREDIT_CARD_VERIFICATION_CODE) { 2883 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i])); 2884 } else { 2885 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i])); 2886 } 2887 } 2888 } 2889 2890 // User changes the billing address; same story. 2891 outputs[ADDRESS_BILLING_ZIP] = ASCIIToUTF16("77025"); 2892 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs); 2893 for (size_t i = 0; i < arraysize(sections); ++i) { 2894 const DetailInputs& inputs = 2895 controller()->RequestedFieldsForSection(sections[i]); 2896 for (size_t j = 0; j < inputs.size(); ++j) { 2897 if (inputs[j].type == CREDIT_CARD_NUMBER || 2898 inputs[j].type == CREDIT_CARD_VERIFICATION_CODE) { 2899 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i])); 2900 } else { 2901 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i])); 2902 } 2903 } 2904 } 2905 2906 // User changes a detail of the CC itself (expiration date), CVV is now 2907 // editable (and mandatory). 2908 outputs[CREDIT_CARD_EXP_MONTH] = ASCIIToUTF16("06"); 2909 controller()->GetView()->SetUserInput(SECTION_CC_BILLING, outputs); 2910 for (size_t i = 0; i < arraysize(sections); ++i) { 2911 const DetailInputs& inputs = 2912 controller()->RequestedFieldsForSection(sections[i]); 2913 for (size_t j = 0; j < inputs.size(); ++j) { 2914 if (inputs[j].type == CREDIT_CARD_NUMBER) 2915 EXPECT_FALSE(controller()->InputIsEditable(inputs[j], sections[i])); 2916 else 2917 EXPECT_TRUE(controller()->InputIsEditable(inputs[j], sections[i])); 2918 } 2919 } 2920} 2921 2922// When the default country is something besides US, wallet is not selected 2923// and the account chooser shouldn't be visible. 2924TEST_F(AutofillDialogControllerTest, HideWalletInOtherCountries) { 2925 // Addresses from different countries. 2926 AutofillProfile us_profile(base::GenerateGUID(), kSettingsOrigin), 2927 es_profile(base::GenerateGUID(), kSettingsOrigin), 2928 es_profile2(base::GenerateGUID(), kSettingsOrigin); 2929 us_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US")); 2930 es_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("ES")); 2931 es_profile2.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("ES")); 2932 2933 // If US is indicated (via timezone), show Wallet. 2934 ResetControllerWithFormData(DefaultFormData()); 2935 controller()->GetTestingManager()->set_timezone_country_code("US"); 2936 controller()->Show(); 2937 EXPECT_TRUE( 2938 controller()->AccountChooserModelForTesting()->WalletIsSelected()); 2939 controller()->OnDidFetchWalletCookieValue(std::string()); 2940 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2941 EXPECT_TRUE(controller()->ShouldShowAccountChooser()); 2942 EXPECT_TRUE( 2943 controller()->AccountChooserModelForTesting()->WalletIsSelected()); 2944 2945 // If US is not indicated, don't show Wallet. 2946 ResetControllerWithFormData(DefaultFormData()); 2947 controller()->GetTestingManager()->set_timezone_country_code("ES"); 2948 controller()->Show(); 2949 controller()->OnDidFetchWalletCookieValue(std::string()); 2950 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2951 EXPECT_FALSE(controller()->ShouldShowAccountChooser()); 2952 2953 // If US is indicated (via a profile), show Wallet. 2954 ResetControllerWithFormData(DefaultFormData()); 2955 controller()->GetTestingManager()->set_timezone_country_code("ES"); 2956 controller()->GetTestingManager()->AddTestingProfile(&us_profile); 2957 controller()->Show(); 2958 controller()->OnDidFetchWalletCookieValue(std::string()); 2959 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2960 EXPECT_TRUE(controller()->ShouldShowAccountChooser()); 2961 EXPECT_TRUE( 2962 controller()->AccountChooserModelForTesting()->WalletIsSelected()); 2963 2964 // Make sure the profile doesn't just override the timezone. 2965 ResetControllerWithFormData(DefaultFormData()); 2966 controller()->GetTestingManager()->set_timezone_country_code("US"); 2967 controller()->GetTestingManager()->AddTestingProfile(&es_profile); 2968 controller()->Show(); 2969 controller()->OnDidFetchWalletCookieValue(std::string()); 2970 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2971 EXPECT_TRUE(controller()->ShouldShowAccountChooser()); 2972 EXPECT_TRUE( 2973 controller()->AccountChooserModelForTesting()->WalletIsSelected()); 2974 2975 // Only takes one US address to enable Wallet. 2976 ResetControllerWithFormData(DefaultFormData()); 2977 controller()->GetTestingManager()->set_timezone_country_code("FR"); 2978 controller()->GetTestingManager()->AddTestingProfile(&es_profile); 2979 controller()->GetTestingManager()->AddTestingProfile(&es_profile2); 2980 controller()->GetTestingManager()->AddTestingProfile(&us_profile); 2981 controller()->Show(); 2982 controller()->OnDidFetchWalletCookieValue(std::string()); 2983 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 2984 EXPECT_TRUE(controller()->ShouldShowAccountChooser()); 2985 EXPECT_TRUE( 2986 controller()->AccountChooserModelForTesting()->WalletIsSelected()); 2987} 2988 2989TEST_F(AutofillDialogControllerTest, DontGetWalletTillNecessary) { 2990 // When starting on local data mode, the dialog will provide a "Use Google 2991 // Wallet" link. 2992 profile()->GetPrefs()->SetBoolean( 2993 ::prefs::kAutofillDialogPayWithoutWallet, true); 2994 ResetControllerWithFormData(DefaultFormData()); 2995 controller()->Show(); 2996 base::string16 use_wallet_text = controller()->SignInLinkText(); 2997 EXPECT_EQ(TestAutofillDialogController::NOT_CHECKED, 2998 controller()->SignedInState()); 2999 3000 // When clicked, this link will ask for wallet items. If there's a signin 3001 // failure, the link will switch to "Sign in to use Google Wallet". 3002 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 3003 controller()->SignInLinkClicked(); 3004 EXPECT_NE(TestAutofillDialogController::NOT_CHECKED, 3005 controller()->SignedInState()); 3006 controller()->OnDidFetchWalletCookieValue(std::string()); 3007 controller()->OnDidGetWalletItems(CompleteAndValidWalletItems()); 3008 controller()->OnPassiveSigninFailure(GoogleServiceAuthError( 3009 GoogleServiceAuthError::CONNECTION_FAILED)); 3010 EXPECT_NE(use_wallet_text, controller()->SignInLinkText()); 3011} 3012 3013TEST_F(AutofillDialogControllerTest, MultiAccountSwitch) { 3014 std::vector<std::string> users; 3015 users.push_back("user_1@example.com"); 3016 users.push_back("user_2@example.com"); 3017 controller()->OnDidGetWalletItems( 3018 wallet::GetTestWalletItemsWithUsers(users, 0)); 3019 3020 // Items should be: Account 1, account 2, add account, disable wallet. 3021 EXPECT_EQ(4, controller()->MenuModelForAccountChooser()->GetItemCount()); 3022 EXPECT_EQ(0U, controller()->GetTestingWalletClient()->user_index()); 3023 3024 // GetWalletItems should be called when the user switches accounts. 3025 EXPECT_CALL(*controller()->GetTestingWalletClient(), GetWalletItems()); 3026 controller()->MenuModelForAccountChooser()->ActivatedAt(1); 3027 // The wallet client should be updated to the new user index. 3028 EXPECT_EQ(1U, controller()->GetTestingWalletClient()->user_index()); 3029} 3030 3031TEST_F(AutofillDialogControllerTest, PassiveAuthFailure) { 3032 controller()->OnDidGetWalletItems( 3033 wallet::GetTestWalletItemsWithRequiredAction( 3034 wallet::PASSIVE_GAIA_AUTH)); 3035 EXPECT_TRUE(controller()->ShouldShowSpinner()); 3036 controller()->OnPassiveSigninFailure(GoogleServiceAuthError( 3037 GoogleServiceAuthError::NONE)); 3038 EXPECT_FALSE(controller()->ShouldShowSpinner()); 3039} 3040 3041TEST_F(AutofillDialogControllerTest, WalletShippingSameAsBilling) { 3042 // Assert initial state. 3043 ASSERT_FALSE(profile()->GetPrefs()->HasPrefPath( 3044 ::prefs::kAutofillDialogWalletShippingSameAsBilling)); 3045 3046 // Verify that false pref defaults to wallet defaults. 3047 scoped_ptr<wallet::WalletItems> wallet_items = 3048 wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 3049 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 3050 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 3051 controller()->OnDidGetWalletItems(wallet_items.Pass()); 3052 ASSERT_FALSE(profile()->GetPrefs()->GetBoolean( 3053 ::prefs::kAutofillDialogWalletShippingSameAsBilling)); 3054 EXPECT_EQ(2, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); 3055 3056 // Set "Same as Billing" for the shipping address and verify it sets the pref 3057 // and selects the appropriate menu item. 3058 UseBillingForShipping(); 3059 ASSERT_EQ(0, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); 3060 controller()->ForceFinishSubmit(); 3061 ASSERT_TRUE(profile()->GetPrefs()->GetBoolean( 3062 ::prefs::kAutofillDialogWalletShippingSameAsBilling)); 3063 3064 // Getting new wallet info shouldn't disrupt the preference and menu should be 3065 // set accordingly. 3066 Reset(); 3067 wallet_items = wallet::GetTestWalletItems(wallet::AMEX_DISALLOWED); 3068 wallet_items->AddAddress(wallet::GetTestNonDefaultShippingAddress()); 3069 wallet_items->AddAddress(wallet::GetTestShippingAddress()); 3070 controller()->OnDidGetWalletItems(wallet_items.Pass()); 3071 EXPECT_TRUE(profile()->GetPrefs()->GetBoolean( 3072 ::prefs::kAutofillDialogWalletShippingSameAsBilling)); 3073 EXPECT_EQ(0, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); 3074 3075 // Choose a different address and ensure pref gets set to false. 3076 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1); 3077 controller()->ForceFinishSubmit(); 3078 EXPECT_FALSE(profile()->GetPrefs()->GetBoolean( 3079 ::prefs::kAutofillDialogWalletShippingSameAsBilling)); 3080} 3081 3082// Verifies that a call to the IconsForFields() method before the card type is 3083// known returns a placeholder image that is at least as large as the icons for 3084// all of the supported major credit card issuers. 3085TEST_F(AutofillDialogControllerTest, IconReservedForCreditCardField) { 3086 FieldValueMap inputs; 3087 inputs[CREDIT_CARD_NUMBER] = base::string16(); 3088 3089 FieldIconMap icons = controller()->IconsForFields(inputs); 3090 EXPECT_EQ(1U, icons.size()); 3091 3092 ASSERT_EQ(1U, icons.count(CREDIT_CARD_NUMBER)); 3093 gfx::Image placeholder_icon = icons[CREDIT_CARD_NUMBER]; 3094 3095 // Verify that the placeholder icon is at least as large as the icons for the 3096 // supported credit card issuers. 3097 const int kSupportedCardIdrs[] = { 3098 IDR_AUTOFILL_CC_AMEX, 3099 IDR_AUTOFILL_CC_DINERS, 3100 IDR_AUTOFILL_CC_DISCOVER, 3101 IDR_AUTOFILL_CC_GENERIC, 3102 IDR_AUTOFILL_CC_JCB, 3103 IDR_AUTOFILL_CC_MASTERCARD, 3104 IDR_AUTOFILL_CC_VISA, 3105 }; 3106 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 3107 for (size_t i = 0; i < arraysize(kSupportedCardIdrs); ++i) { 3108 SCOPED_TRACE(base::IntToString(i)); 3109 gfx::Image supported_card_icon = rb.GetImageNamed(kSupportedCardIdrs[i]); 3110 EXPECT_GE(placeholder_icon.Width(), supported_card_icon.Width()); 3111 EXPECT_GE(placeholder_icon.Height(), supported_card_icon.Height()); 3112 } 3113} 3114 3115TEST_F(AutofillDialogControllerTest, NoPartiallySupportedCountriesSuggested) { 3116 SwitchToAutofill(); 3117 3118 std::string partially_supported_country = "KR"; 3119 ASSERT_FALSE(i18ninput::CountryIsFullySupported(partially_supported_country)); 3120 ASSERT_FALSE(controller()->MenuModelForSection(SECTION_BILLING)); 3121 3122 AutofillProfile verified_profile(test::GetVerifiedProfile()); 3123 verified_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, 3124 ASCIIToUTF16(partially_supported_country)); 3125 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 3126 3127 EXPECT_FALSE( 3128 controller()->SuggestionStateForSection(SECTION_BILLING).visible); 3129} 3130 3131TEST_F(AutofillDialogControllerTest, CountryChangeUpdatesSection) { 3132 TestAutofillDialogView* view = controller()->GetView(); 3133 view->ClearSectionUpdates(); 3134 3135 controller()->UserEditedOrActivatedInput(SECTION_SHIPPING, 3136 ADDRESS_HOME_COUNTRY, 3137 gfx::NativeView(), 3138 gfx::Rect(), 3139 ASCIIToUTF16("Belarus"), 3140 true); 3141 std::map<DialogSection, size_t> updates = view->section_updates(); 3142 EXPECT_EQ(1U, updates[SECTION_SHIPPING]); 3143 EXPECT_EQ(1U, updates.size()); 3144 3145 view->ClearSectionUpdates(); 3146 3147 controller()->UserEditedOrActivatedInput(SECTION_CC_BILLING, 3148 ADDRESS_BILLING_COUNTRY, 3149 gfx::NativeView(), 3150 gfx::Rect(), 3151 ASCIIToUTF16("France"), 3152 true); 3153 updates = view->section_updates(); 3154 EXPECT_EQ(1U, updates[SECTION_CC_BILLING]); 3155 EXPECT_EQ(1U, updates.size()); 3156 3157 SwitchToAutofill(); 3158 view->ClearSectionUpdates(); 3159 3160 controller()->UserEditedOrActivatedInput(SECTION_BILLING, 3161 ADDRESS_BILLING_COUNTRY, 3162 gfx::NativeView(), 3163 gfx::Rect(), 3164 ASCIIToUTF16("Italy"), 3165 true); 3166 updates = view->section_updates(); 3167 EXPECT_EQ(1U, updates[SECTION_BILLING]); 3168 EXPECT_EQ(1U, updates.size()); 3169} 3170 3171TEST_F(AutofillDialogControllerTest, CorrectCountryFromInputs) { 3172 EXPECT_CALL(*controller()->GetMockValidator(), 3173 ValidateAddress(CountryCodeMatcher("DE"), _, _)); 3174 3175 FieldValueMap billing_inputs; 3176 billing_inputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("Germany"); 3177 controller()->InputsAreValid(SECTION_BILLING, billing_inputs); 3178 3179 EXPECT_CALL(*controller()->GetMockValidator(), 3180 ValidateAddress(CountryCodeMatcher("FR"), _, _)); 3181 3182 FieldValueMap shipping_inputs; 3183 shipping_inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("France"); 3184 controller()->InputsAreValid(SECTION_SHIPPING, shipping_inputs); 3185} 3186 3187TEST_F(AutofillDialogControllerTest, ValidationRulesLoadedOnCountryChange) { 3188 ResetControllerWithFormData(DefaultFormData()); 3189 EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("US")); 3190 controller()->Show(); 3191 3192 EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("FR")); 3193 controller()->UserEditedOrActivatedInput(SECTION_CC_BILLING, 3194 ADDRESS_BILLING_COUNTRY, 3195 gfx::NativeView(), 3196 gfx::Rect(), 3197 ASCIIToUTF16("France"), 3198 true); 3199} 3200 3201TEST_F(AutofillDialogControllerTest, InvalidWhenRulesNotReady) { 3202 // Select "Add new shipping address...". 3203 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1); 3204 3205 // If the rules haven't loaded yet, validation errors should show on submit. 3206 EXPECT_CALL(*controller()->GetMockValidator(), 3207 ValidateAddress(CountryCodeMatcher("US"), _, _)). 3208 WillRepeatedly(Return(AddressValidator::RULES_NOT_READY)); 3209 3210 FieldValueMap inputs; 3211 inputs[ADDRESS_HOME_ZIP] = ASCIIToUTF16("1234"); 3212 inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("United States"); 3213 3214 ValidityMessages messages = 3215 controller()->InputsAreValid(SECTION_SHIPPING, inputs); 3216 EXPECT_FALSE(messages.GetMessageOrDefault(ADDRESS_HOME_ZIP).text.empty()); 3217 EXPECT_FALSE(messages.HasSureError(ADDRESS_HOME_ZIP)); 3218 // Country should never show an error message as it's always valid. 3219 EXPECT_TRUE(messages.GetMessageOrDefault(ADDRESS_HOME_COUNTRY).text.empty()); 3220} 3221 3222TEST_F(AutofillDialogControllerTest, ValidButUnverifiedWhenRulesFail) { 3223 SwitchToAutofill(); 3224 3225 // Add suggestions so the credit card and billing sections aren't showing 3226 // their manual inputs (to isolate to just shipping). 3227 AutofillProfile verified_profile(test::GetVerifiedProfile()); 3228 controller()->GetTestingManager()->AddTestingProfile(&verified_profile); 3229 CreditCard verified_card(test::GetVerifiedCreditCard()); 3230 controller()->GetTestingManager()->AddTestingCreditCard(&verified_card); 3231 3232 // Select "Add new shipping address...". 3233 controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2); 3234 3235 // If the rules are unavailable, validation errors should not show. 3236 EXPECT_CALL(*controller()->GetMockValidator(), 3237 ValidateAddress(CountryCodeMatcher("US"), _, _)). 3238 WillRepeatedly(Return(AddressValidator::RULES_UNAVAILABLE)); 3239 3240 FieldValueMap outputs; 3241 AutofillProfile full_profile(test::GetFullProfile()); 3242 const DetailInputs& inputs = 3243 controller()->RequestedFieldsForSection(SECTION_SHIPPING); 3244 for (size_t i = 0; i < inputs.size(); ++i) { 3245 const ServerFieldType type = inputs[i].type; 3246 outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); 3247 } 3248 controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs); 3249 controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); 3250 controller()->OnAccept(); 3251 3252 // Profiles saved while rules are unavailable shouldn't be verified. 3253 const AutofillProfile& imported_profile = 3254 controller()->GetTestingManager()->imported_profile(); 3255 ASSERT_EQ(imported_profile.GetRawInfo(NAME_FULL), 3256 full_profile.GetRawInfo(NAME_FULL)); 3257 EXPECT_EQ(imported_profile.origin(), GURL(kSourceUrl).GetOrigin().spec()); 3258 EXPECT_FALSE(imported_profile.IsVerified()); 3259} 3260 3261TEST_F(AutofillDialogControllerTest, LimitedCountryChoices) { 3262 ui::ComboboxModel* shipping_country_model = 3263 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY); 3264 const int default_number_of_countries = 3265 shipping_country_model->GetItemCount(); 3266 // We show a lot of countries by default, but the exact number doesn't matter. 3267 EXPECT_GT(default_number_of_countries, 50); 3268 3269 // Create a form data that simulates: 3270 // <select autocomplete="billing country"> 3271 // <option value="AU">Down Under</option> 3272 // <option value="">fR</option> <!-- Case doesn't matter --> 3273 // <option value="GRMNY">Germany</option> 3274 // </select> 3275 // Only country codes are respected, whether they're in value or the option's 3276 // text content. Thus the first two options should be recognized. 3277 FormData form_data; 3278 FormFieldData field; 3279 field.autocomplete_attribute = "billing country"; 3280 field.option_contents.push_back(ASCIIToUTF16("Down Under")); 3281 field.option_values.push_back(ASCIIToUTF16("AU")); 3282 field.option_contents.push_back(ASCIIToUTF16("Fr")); 3283 field.option_values.push_back(ASCIIToUTF16("")); 3284 field.option_contents.push_back(ASCIIToUTF16("Germany")); 3285 field.option_values.push_back(ASCIIToUTF16("GRMNY")); 3286 form_data.fields.push_back(field); 3287 ResetControllerWithFormData(form_data); 3288 controller()->Show(); 3289 3290 // Shipping model shouldn't have changed. 3291 shipping_country_model = 3292 controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY); 3293 EXPECT_EQ(default_number_of_countries, 3294 shipping_country_model->GetItemCount()); 3295 // Billing model now only has two items. 3296 ui::ComboboxModel* billing_country_model = 3297 controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY); 3298 ASSERT_EQ(2, billing_country_model->GetItemCount()); 3299 EXPECT_EQ(billing_country_model->GetItemAt(0), ASCIIToUTF16("Australia")); 3300 EXPECT_EQ(billing_country_model->GetItemAt(1), ASCIIToUTF16("France")); 3301 3302 // Make sure it also applies to profile suggestions. 3303 AutofillProfile us_profile(test::GetVerifiedProfile()); 3304 us_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US")); 3305 controller()->GetTestingManager()->AddTestingProfile(&us_profile); 3306 // Don't show a suggestion if the only one that exists is disabled. 3307 EXPECT_FALSE( 3308 controller()->SuggestionStateForSection(SECTION_BILLING).visible); 3309 3310 // Add a profile with an acceptable country; suggestion should be shown. 3311 ResetControllerWithFormData(form_data); 3312 controller()->Show(); 3313 AutofillProfile au_profile(test::GetVerifiedProfile2()); 3314 au_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("AU")); 3315 controller()->GetTestingManager()->AddTestingProfile(&us_profile); 3316 controller()->GetTestingManager()->AddTestingProfile(&au_profile); 3317 ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING); 3318 ASSERT_TRUE(model); 3319 EXPECT_EQ(4, model->GetItemCount()); 3320 EXPECT_FALSE(model->IsEnabledAt(0)); 3321 EXPECT_TRUE(model->IsEnabledAt(1)); 3322 3323 // Add <input type="text" autocomplete="billing country"></input> 3324 // This should open up selection of all countries again. 3325 FormFieldData field2; 3326 field2.autocomplete_attribute = "billing country"; 3327 form_data.fields.push_back(field2); 3328 ResetControllerWithFormData(form_data); 3329 controller()->Show(); 3330 3331 billing_country_model = 3332 controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY); 3333 EXPECT_EQ(default_number_of_countries, 3334 billing_country_model->GetItemCount()); 3335} 3336 3337TEST_F(AutofillDialogControllerTest, CountriesWithDependentLocalityHidden) { 3338 ui::ComboboxModel* model = 3339 controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY); 3340 for (int i = 0; i < model->GetItemCount(); ++i) { 3341 EXPECT_NE(base::ASCIIToUTF16("China"), model->GetItemAt(i)); 3342 EXPECT_NE(base::ASCIIToUTF16("South Korea"), model->GetItemAt(i)); 3343 } 3344 3345 model = controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY); 3346 for (int i = 0; i < model->GetItemCount(); ++i) { 3347 EXPECT_NE(base::ASCIIToUTF16("China"), model->GetItemAt(i)); 3348 EXPECT_NE(base::ASCIIToUTF16("South Korea"), model->GetItemAt(i)); 3349 } 3350} 3351 3352TEST_F(AutofillDialogControllerTest, DontSuggestHiddenCountries) { 3353 SwitchToAutofill(); 3354 3355 FieldValueMap outputs; 3356 outputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("US"); 3357 controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs); 3358 3359 AutofillProfile cn_profile(test::GetVerifiedProfile()); 3360 cn_profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("Chinese User")); 3361 cn_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("CN")); 3362 controller()->GetTestingManager()->AddTestingProfile(&cn_profile); 3363 3364 controller()->UserEditedOrActivatedInput( 3365 SECTION_SHIPPING, 3366 NAME_FULL, 3367 gfx::NativeView(), 3368 gfx::Rect(), 3369 cn_profile.GetRawInfo(NAME_FULL).substr(0, 1), 3370 true); 3371 EXPECT_EQ(UNKNOWN_TYPE, controller()->popup_input_type()); 3372 3373 AutofillProfile us_profile(test::GetVerifiedProfile()); 3374 us_profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("American User")); 3375 ASSERT_NE(cn_profile.GetRawInfo(NAME_FULL)[0], 3376 us_profile.GetRawInfo(NAME_FULL)[0]); 3377 controller()->GetTestingManager()->AddTestingProfile(&us_profile); 3378 3379 controller()->UserEditedOrActivatedInput( 3380 SECTION_SHIPPING, 3381 NAME_FULL, 3382 gfx::NativeView(), 3383 gfx::Rect(), 3384 us_profile.GetRawInfo(NAME_FULL).substr(0, 1), 3385 true); 3386 EXPECT_EQ(NAME_FULL, controller()->popup_input_type()); 3387} 3388 3389TEST_F(AutofillDialogControllerTest, SuggestCountrylessProfiles) { 3390 SwitchToAutofill(); 3391 3392 FieldValueMap outputs; 3393 outputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("US"); 3394 controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs); 3395 3396 AutofillProfile profile(test::GetVerifiedProfile()); 3397 profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("The Man Without a Country")); 3398 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::string16()); 3399 controller()->GetTestingManager()->AddTestingProfile(&profile); 3400 3401 controller()->UserEditedOrActivatedInput( 3402 SECTION_SHIPPING, 3403 NAME_FULL, 3404 gfx::NativeView(), 3405 gfx::Rect(), 3406 profile.GetRawInfo(NAME_FULL).substr(0, 1), 3407 true); 3408 EXPECT_EQ(NAME_FULL, controller()->popup_input_type()); 3409} 3410 3411} // namespace autofill 3412