Index: chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc |
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc |
deleted file mode 100644 |
index dadef1e4a031349c416ffdadbf3a4977fb4cc1d7..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_unittest.cc |
+++ /dev/null |
@@ -1,1771 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <stddef.h> |
- |
-#include <map> |
-#include <memory> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/command_line.h" |
-#include "base/guid.h" |
-#include "base/macros.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_piece.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "build/build_config.h" |
-#include "chrome/browser/signin/account_tracker_service_factory.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_view.h" |
-#include "chrome/browser/ui/autofill/mock_address_validator.h" |
-#include "chrome/browser/web_data_service_factory.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
-#include "chrome/test/base/scoped_testing_local_state.h" |
-#include "chrome/test/base/testing_browser_process.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" |
-#include "components/autofill/core/browser/autofill_metrics.h" |
-#include "components/autofill/core/browser/autofill_test_utils.h" |
-#include "components/autofill/core/browser/country_names.h" |
-#include "components/autofill/core/browser/test_personal_data_manager.h" |
-#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
-#include "components/autofill/core/common/autofill_constants.h" |
-#include "components/autofill/core/common/autofill_pref_names.h" |
-#include "components/autofill/core/common/autofill_switches.h" |
-#include "components/autofill/core/common/form_data.h" |
-#include "components/bookmarks/common/bookmark_pref_names.h" |
-#include "components/prefs/pref_service.h" |
-#include "components/signin/core/browser/account_tracker_service.h" |
-#include "components/signin/core/browser/signin_manager.h" |
-#include "components/user_prefs/user_prefs.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/test/mock_render_process_host.h" |
-#include "google_apis/gaia/google_service_auth_error.h" |
-#include "grit/components_scaled_resources.h" |
-#include "grit/components_strings.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/libaddressinput/chromium/chrome_address_validator.h" |
-#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h" |
-#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_problem.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
- |
-#if defined(OS_WIN) |
-#include "ui/base/win/scoped_ole_initializer.h" |
-#endif |
- |
-using base::ASCIIToUTF16; |
-using base::UTF8ToUTF16; |
- |
-namespace autofill { |
- |
-namespace { |
- |
-using ::i18n::addressinput::FieldProblemMap; |
-using testing::AtLeast; |
-using testing::DoAll; |
-using testing::Return; |
-using testing::SetArgPointee; |
-using testing::_; |
- |
-const char kSourceUrl[] = "http://localbike.shop"; |
-const char kFakeEmail[] = "user@chromium.org"; |
-const char* kFieldsFromPage[] = |
- { "email", |
- "cc-name", |
- "cc-number", |
- "cc-exp-month", |
- "cc-exp-year", |
- "cc-csc", |
- "billing name", |
- "billing address-line1", |
- "billing address-level2", |
- "billing address-level1", |
- "billing postal-code", |
- "billing country", |
- "billing tel", |
- "shipping name", |
- "shipping address-line1", |
- "shipping address-level2", |
- "shipping address-level1", |
- "shipping postal-code", |
- "shipping country", |
- "shipping tel", |
- }; |
-const char kTestCCNumberAmex[] = "376200000000002"; |
-const char kTestCCNumberVisa[] = "4111111111111111"; |
-const char kTestCCNumberMaster[] = "5555555555554444"; |
-const char kTestCCNumberDiscover[] = "6011111111111117"; |
-const char kTestCCNumberIncomplete[] = "4111111111"; |
-// Credit card number fails Luhn check. |
-const char kTestCCNumberInvalid[] = "4111111111111112"; |
- |
-bool HasAnyError(const ValidityMessages& messages, ServerFieldType field) { |
- return !messages.GetMessageOrDefault(field).text.empty(); |
-} |
- |
-bool HasUnsureError(const ValidityMessages& messages, ServerFieldType field) { |
- const ValidityMessage& message = messages.GetMessageOrDefault(field); |
- return !message.text.empty() && !message.sure; |
-} |
- |
-class TestAutofillDialogView : public AutofillDialogView { |
- public: |
- TestAutofillDialogView() |
- : updates_started_(0), save_details_locally_checked_(true) {} |
- ~TestAutofillDialogView() override {} |
- |
- void Show() override {} |
- void Hide() override {} |
- |
- void UpdatesStarted() override { |
- updates_started_++; |
- } |
- |
- void UpdatesFinished() override { |
- updates_started_--; |
- EXPECT_GE(updates_started_, 0); |
- } |
- |
- void UpdateNotificationArea() override { |
- EXPECT_GE(updates_started_, 1); |
- } |
- |
- void UpdateButtonStrip() override { |
- EXPECT_GE(updates_started_, 1); |
- } |
- |
- void UpdateDetailArea() override { |
- EXPECT_GE(updates_started_, 1); |
- } |
- |
- void UpdateSection(DialogSection section) override { |
- section_updates_[section]++; |
- EXPECT_GE(updates_started_, 1); |
- } |
- |
- void UpdateErrorBubble() override { |
- EXPECT_GE(updates_started_, 1); |
- } |
- |
- void FillSection(DialogSection section, |
- ServerFieldType originating_type) override {} |
- void GetUserInput(DialogSection section, FieldValueMap* output) override { |
- *output = outputs_[section]; |
- } |
- |
- base::string16 GetCvc() override { return base::string16(); } |
- |
- bool SaveDetailsLocally() override { return save_details_locally_checked_; } |
- |
- MOCK_METHOD0(ModelChanged, void()); |
- MOCK_METHOD0(UpdateForErrors, void()); |
- |
- void ValidateSection(DialogSection) override {} |
- |
- void SetUserInput(DialogSection section, const FieldValueMap& map) { |
- outputs_[section] = map; |
- } |
- |
- void CheckSaveDetailsLocallyCheckbox(bool checked) { |
- save_details_locally_checked_ = checked; |
- } |
- |
- void ClearSectionUpdates() { |
- section_updates_.clear(); |
- } |
- |
- std::map<DialogSection, size_t> section_updates() const { |
- return section_updates_; |
- } |
- |
- private: |
- std::map<DialogSection, FieldValueMap> outputs_; |
- std::map<DialogSection, size_t> section_updates_; |
- |
- int updates_started_; |
- bool save_details_locally_checked_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogView); |
-}; |
- |
-class TestAutofillDialogController |
- : public AutofillDialogControllerImpl, |
- public base::SupportsWeakPtr<TestAutofillDialogController> { |
- public: |
- TestAutofillDialogController( |
- content::WebContents* contents, |
- const FormData& form_structure, |
- const GURL& source_url, |
- const AutofillClient::ResultCallback& callback) |
- : AutofillDialogControllerImpl(contents, |
- form_structure, |
- source_url, |
- callback), |
- submit_button_delay_count_(0) {} |
- |
- ~TestAutofillDialogController() override {} |
- |
- AutofillDialogView* CreateView() override { |
- return new testing::NiceMock<TestAutofillDialogView>(); |
- } |
- |
- void Init(content::BrowserContext* browser_context) { |
- Profile* profile = Profile::FromBrowserContext(browser_context); |
- test_manager_.Init(WebDataServiceFactory::GetAutofillWebDataForProfile( |
- profile, |
- ServiceAccessType::EXPLICIT_ACCESS), |
- user_prefs::UserPrefs::Get(browser_context), |
- AccountTrackerServiceFactory::GetForProfile(profile), |
- SigninManagerFactory::GetForProfile(profile), |
- browser_context->IsOffTheRecord()); |
- } |
- |
- TestAutofillDialogView* GetView() { |
- return static_cast<TestAutofillDialogView*>(view()); |
- } |
- |
- TestPersonalDataManager* GetTestingManager() { |
- return &test_manager_; |
- } |
- |
- MockAddressValidator* GetMockValidator() { |
- return &mock_validator_; |
- } |
- |
- const GURL& open_tab_url() { return open_tab_url_; } |
- |
- void SimulateSubmitButtonDelayBegin() { |
- AutofillDialogControllerImpl::SubmitButtonDelayBegin(); |
- } |
- |
- void SimulateSubmitButtonDelayEnd() { |
- AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting(); |
- } |
- |
- // Returns the number of times that the submit button was delayed. |
- int get_submit_button_delay_count() const { |
- return submit_button_delay_count_; |
- } |
- |
- MOCK_METHOD0(LoadRiskFingerprintData, void()); |
- using AutofillDialogControllerImpl::IsEditingExistingData; |
- using AutofillDialogControllerImpl::IsManuallyEditingSection; |
- using AutofillDialogControllerImpl::popup_input_type; |
- |
- protected: |
- PersonalDataManager* GetManager() const override { |
- return const_cast<TestAutofillDialogController*>(this)-> |
- GetTestingManager(); |
- } |
- |
- AddressValidator* GetValidator() override { |
- return &mock_validator_; |
- } |
- |
- void OpenTabWithUrl(const GURL& url) override { |
- open_tab_url_ = url; |
- } |
- |
- // AutofillDialogControllerImpl calls this method before showing the dialog |
- // window. |
- void SubmitButtonDelayBegin() override { |
- // Do not delay enabling the submit button in testing. |
- submit_button_delay_count_++; |
- } |
- |
- private: |
- TestPersonalDataManager test_manager_; |
- |
- // A mock validator object to prevent network requests and track when |
- // validation rules are loaded or validation attempts occur. |
- testing::NiceMock<MockAddressValidator> mock_validator_; |
- |
- GURL open_tab_url_; |
- |
- // The number of times that the submit button was delayed. |
- int submit_button_delay_count_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController); |
-}; |
- |
-class AutofillDialogControllerTest : public ChromeRenderViewHostTestHarness { |
- protected: |
- AutofillDialogControllerTest() : form_structure_(NULL) { |
- CountryNames::SetLocaleString("en-US"); |
- } |
- |
- // testing::Test implementation: |
- void SetUp() override { |
- ChromeRenderViewHostTestHarness::SetUp(); |
- Reset(); |
- } |
- |
- void TearDown() override { |
- if (controller_) |
- controller_->ViewClosed(); |
- ChromeRenderViewHostTestHarness::TearDown(); |
- } |
- |
- void Reset() { |
- if (controller_) |
- controller_->ViewClosed(); |
- |
- profile()->GetPrefs()->ClearPref(::prefs::kAutofillDialogSaveData); |
- |
- // We have to clear the old local state before creating a new one. |
- scoped_local_state_.reset(); |
- scoped_local_state_.reset(new ScopedTestingLocalState( |
- TestingBrowserProcess::GetGlobal())); |
- |
- SetUpControllerWithFormData(DefaultFormData()); |
- } |
- |
- FormData DefaultFormData() { |
- FormData form_data; |
- for (size_t i = 0; i < arraysize(kFieldsFromPage); ++i) { |
- FormFieldData field; |
- field.autocomplete_attribute = kFieldsFromPage[i]; |
- form_data.fields.push_back(field); |
- } |
- return form_data; |
- } |
- |
- // Creates a new controller for |form_data|. |
- void ResetControllerWithFormData(const FormData& form_data) { |
- if (controller_) |
- controller_->ViewClosed(); |
- |
- AutofillClient::ResultCallback callback = |
- base::Bind(&AutofillDialogControllerTest::FinishedCallback, |
- base::Unretained(this)); |
- controller_ = (new testing::NiceMock<TestAutofillDialogController>( |
- web_contents(), |
- form_data, |
- GURL(kSourceUrl), |
- callback))->AsWeakPtr(); |
- controller_->Init(profile()); |
- } |
- |
- // Creates a new controller for |form_data|. |
- void SetUpControllerWithFormData(const FormData& form_data) { |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- } |
- |
- // Fills the inputs in SECTION_CC with data. |
- void FillCreditCardInputs() { |
- FieldValueMap cc_outputs; |
- const DetailInputs& cc_inputs = |
- controller()->RequestedFieldsForSection(SECTION_CC); |
- for (size_t i = 0; i < cc_inputs.size(); ++i) { |
- cc_outputs[cc_inputs[i].type] = cc_inputs[i].type == CREDIT_CARD_NUMBER ? |
- ASCIIToUTF16(kTestCCNumberVisa) : ASCIIToUTF16("11"); |
- } |
- controller()->GetView()->SetUserInput(SECTION_CC, cc_outputs); |
- } |
- |
- // Activates the 'Add new foo' option from the |section|'s suggestions |
- // dropdown and fills the |section|'s inputs with the data from the |
- // |data_model|. If |section| is SECTION_CC, also fills in '123' for the CVC. |
- void FillInputs(DialogSection section, const AutofillDataModel& data_model) { |
- // Select the 'Add new foo' option. |
- ui::MenuModel* model = GetMenuModelForSection(section); |
- if (model) |
- model->ActivatedAt(model->GetItemCount() - 2); |
- |
- // Fill the inputs. |
- FieldValueMap outputs; |
- const DetailInputs& inputs = |
- controller()->RequestedFieldsForSection(section); |
- for (size_t i = 0; i < inputs.size(); ++i) { |
- ServerFieldType type = inputs[i].type; |
- base::string16 output; |
- if (type == CREDIT_CARD_VERIFICATION_CODE) |
- output = ASCIIToUTF16("123"); |
- else |
- output = data_model.GetInfo(AutofillType(type), "en-US"); |
- outputs[inputs[i].type] = output; |
- } |
- controller()->GetView()->SetUserInput(section, outputs); |
- } |
- |
- std::vector<DialogNotification> NotificationsOfType( |
- DialogNotification::Type type) { |
- std::vector<DialogNotification> right_type; |
- const std::vector<DialogNotification>& notifications = |
- controller()->CurrentNotifications(); |
- for (size_t i = 0; i < notifications.size(); ++i) { |
- if (notifications[i].type() == type) |
- right_type.push_back(notifications[i]); |
- } |
- return right_type; |
- } |
- |
- void UseBillingForShipping() { |
- controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(0); |
- } |
- |
- base::string16 ValidateCCNumber(DialogSection section, |
- const std::string& cc_number, |
- bool should_pass) { |
- FieldValueMap outputs; |
- outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States"); |
- outputs[CREDIT_CARD_NUMBER] = UTF8ToUTF16(cc_number); |
- ValidityMessages messages = |
- controller()->InputsAreValid(section, outputs); |
- EXPECT_EQ(should_pass, !messages.HasSureError(CREDIT_CARD_NUMBER)); |
- return messages.GetMessageOrDefault(CREDIT_CARD_NUMBER).text; |
- } |
- |
- // Returns true if the given |section| contains a field of the given |type|. |
- bool SectionContainsField(DialogSection section, ServerFieldType type) { |
- const DetailInputs& inputs = |
- controller()->RequestedFieldsForSection(section); |
- for (DetailInputs::const_iterator it = inputs.begin(); it != inputs.end(); |
- ++it) { |
- if (it->type == type) |
- return true; |
- } |
- return false; |
- } |
- |
- SuggestionsMenuModel* GetMenuModelForSection(DialogSection section) { |
- ui::MenuModel* model = controller()->MenuModelForSection(section); |
- return static_cast<SuggestionsMenuModel*>(model); |
- } |
- |
- void SubmitAndVerifyShippingAndBillingResults() { |
- // Test after setting use billing for shipping. |
- UseBillingForShipping(); |
- |
- controller()->OnAccept(); |
- |
- ASSERT_EQ(20U, form_structure()->field_count()); |
- EXPECT_EQ(ADDRESS_HOME_COUNTRY, |
- form_structure()->field(11)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(11)->Type().group()); |
- EXPECT_EQ(ADDRESS_HOME_COUNTRY, |
- form_structure()->field(18)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_HOME, form_structure()->field(18)->Type().group()); |
- base::string16 billing_country = form_structure()->field(11)->value; |
- EXPECT_EQ(2U, billing_country.size()); |
- base::string16 shipping_country = form_structure()->field(18)->value; |
- EXPECT_EQ(2U, shipping_country.size()); |
- EXPECT_FALSE(billing_country.empty()); |
- EXPECT_FALSE(shipping_country.empty()); |
- EXPECT_EQ(billing_country, shipping_country); |
- |
- EXPECT_EQ(CREDIT_CARD_NAME_FULL, |
- form_structure()->field(1)->Type().GetStorableType()); |
- base::string16 cc_name = form_structure()->field(1)->value; |
- EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType()); |
- EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group()); |
- base::string16 billing_name = form_structure()->field(6)->value; |
- EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType()); |
- EXPECT_EQ(NAME, form_structure()->field(13)->Type().group()); |
- base::string16 shipping_name = form_structure()->field(13)->value; |
- |
- EXPECT_FALSE(cc_name.empty()); |
- EXPECT_FALSE(billing_name.empty()); |
- EXPECT_FALSE(shipping_name.empty()); |
- EXPECT_EQ(cc_name, billing_name); |
- EXPECT_EQ(cc_name, shipping_name); |
- } |
- |
- TestAutofillDialogController* controller() { return controller_.get(); } |
- |
- const FormStructure* form_structure() { return form_structure_; } |
- |
- private: |
- void FinishedCallback(AutofillClient::RequestAutocompleteResult result, |
- const base::string16& debug_message, |
- const FormStructure* form_structure) { |
- form_structure_ = form_structure; |
- } |
- |
-#if defined(OS_WIN) |
- // http://crbug.com/227221 |
- ui::ScopedOleInitializer ole_initializer_; |
-#endif |
- |
- // The controller owns itself. |
- base::WeakPtr<TestAutofillDialogController> controller_; |
- |
- // Returned when the dialog closes successfully. |
- const FormStructure* form_structure_; |
- |
- std::unique_ptr<ScopedTestingLocalState> scoped_local_state_; |
-}; |
- |
-} // namespace |
- |
-TEST_F(AutofillDialogControllerTest, RefuseToShowWithNoAutocompleteAttributes) { |
- FormFieldData email_field; |
- email_field.name = ASCIIToUTF16("email"); |
- FormFieldData cc_field; |
- cc_field.name = ASCIIToUTF16("cc"); |
- FormFieldData billing_field; |
- billing_field.name = ASCIIToUTF16("billing name"); |
- |
- FormData form_data; |
- form_data.fields.push_back(email_field); |
- form_data.fields.push_back(cc_field); |
- form_data.fields.push_back(billing_field); |
- |
- SetUpControllerWithFormData(form_data); |
- EXPECT_FALSE(controller()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, RefuseToShowWithNoCcField) { |
- FormFieldData shipping_tel; |
- shipping_tel.autocomplete_attribute = "shipping tel"; |
- |
- FormData form_data; |
- form_data.fields.push_back(shipping_tel); |
- |
- SetUpControllerWithFormData(form_data); |
- EXPECT_FALSE(controller()); |
- |
- // Any cc- field will do. |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-csc"; |
- form_data.fields.push_back(cc_field); |
- |
- SetUpControllerWithFormData(form_data); |
- EXPECT_TRUE(controller()); |
-} |
- |
-// Ensure the default ValidityMessage has the expected values. |
-TEST_F(AutofillDialogControllerTest, DefaultValidityMessage) { |
- ValidityMessages messages; |
- ValidityMessage message = messages.GetMessageOrDefault(UNKNOWN_TYPE); |
- EXPECT_FALSE(message.sure); |
- EXPECT_TRUE(message.text.empty()); |
-} |
- |
-// This test makes sure nothing falls over when fields are being validity- |
-// checked. |
-TEST_F(AutofillDialogControllerTest, ValidityCheck) { |
- for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { |
- DialogSection section = static_cast<DialogSection>(i); |
- const DetailInputs& shipping_inputs = |
- controller()->RequestedFieldsForSection(section); |
- for (DetailInputs::const_iterator iter = shipping_inputs.begin(); |
- iter != shipping_inputs.end(); ++iter) { |
- controller()->InputValidityMessage(section, iter->type, base::string16()); |
- } |
- } |
-} |
- |
-// Test for phone number validation. |
-TEST_F(AutofillDialogControllerTest, PhoneNumberValidation) { |
- for (size_t i = 0; i < 2; ++i) { |
- ServerFieldType phone = i == 0 ? PHONE_HOME_WHOLE_NUMBER : |
- PHONE_BILLING_WHOLE_NUMBER; |
- ServerFieldType address = i == 0 ? ADDRESS_HOME_COUNTRY : |
- ADDRESS_BILLING_COUNTRY; |
- DialogSection section = i == 0 ? SECTION_SHIPPING : SECTION_BILLING; |
- |
- FieldValueMap outputs; |
- const DetailInputs& inputs = |
- controller()->RequestedFieldsForSection(section); |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- for (size_t j = 0; j < inputs.size(); ++j) { |
- const ServerFieldType type = inputs[j].type; |
- outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); |
- } |
- |
- // Make sure country is United States. |
- outputs[address] = ASCIIToUTF16("United States"); |
- |
- // Existing data should have no errors. |
- ValidityMessages messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_FALSE(HasAnyError(messages, phone)); |
- |
- // Input an empty phone number. |
- outputs[phone] = base::string16(); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(HasUnsureError(messages, phone)); |
- |
- // Input an invalid phone number. |
- outputs[phone] = ASCIIToUTF16("ABC"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(messages.HasSureError(phone)); |
- |
- // Input a local phone number. |
- outputs[phone] = ASCIIToUTF16("2155546699"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_FALSE(HasAnyError(messages, phone)); |
- |
- // Input an invalid local phone number. |
- outputs[phone] = ASCIIToUTF16("215554669"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(messages.HasSureError(phone)); |
- |
- // Input an international phone number. |
- outputs[phone] = ASCIIToUTF16("+33 892 70 12 39"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_FALSE(HasAnyError(messages, phone)); |
- |
- // Input an invalid international phone number. |
- outputs[phone] = ASCIIToUTF16("+112333 892 70 12 39"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(messages.HasSureError(phone)); |
- |
- // Input a valid Canadian number. |
- outputs[phone] = ASCIIToUTF16("+1 506 887 1234"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_FALSE(HasAnyError(messages, phone)); |
- |
- // Input a valid Canadian number without the country code. |
- outputs[phone] = ASCIIToUTF16("506 887 1234"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(HasAnyError(messages, phone)); |
- |
- // Input a valid Canadian toll-free number. |
- outputs[phone] = ASCIIToUTF16("310 1234"); |
- messages = controller()->InputsAreValid(section, outputs); |
- EXPECT_TRUE(HasAnyError(messages, phone)); |
- } |
-} |
- |
-TEST_F(AutofillDialogControllerTest, ExpirationDateValidity) { |
- ui::ComboboxModel* exp_year_model = |
- controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR); |
- ui::ComboboxModel* exp_month_model = |
- controller()->ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH); |
- |
- base::string16 default_year_value = |
- exp_year_model->GetItemAt(exp_year_model->GetDefaultIndex()); |
- base::string16 default_month_value = |
- exp_month_model->GetItemAt(exp_month_model->GetDefaultIndex()); |
- |
- base::string16 other_year_value = |
- exp_year_model->GetItemAt(exp_year_model->GetItemCount() - 1); |
- base::string16 other_month_value = |
- exp_month_model->GetItemAt(exp_month_model->GetItemCount() - 1); |
- |
- FieldValueMap outputs; |
- outputs[CREDIT_CARD_EXP_MONTH] = default_month_value; |
- outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value; |
- |
- // Expiration default values generate unsure validation errors (but not sure). |
- ValidityMessages messages = controller()->InputsAreValid(SECTION_CC, outputs); |
- EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
- EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); |
- |
- // Expiration date with default month fails. |
- outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = other_year_value; |
- messages = controller()->InputsAreValid(SECTION_CC, outputs); |
- EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
- EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); |
- |
- // Expiration date with default year fails. |
- outputs[CREDIT_CARD_EXP_MONTH] = other_month_value; |
- outputs[CREDIT_CARD_EXP_4_DIGIT_YEAR] = default_year_value; |
- messages = controller()->InputsAreValid(SECTION_CC, outputs); |
- EXPECT_TRUE(HasUnsureError(messages, CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
- EXPECT_FALSE(HasUnsureError(messages, CREDIT_CARD_EXP_MONTH)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, BillingNameValidation) { |
- FieldValueMap outputs; |
- outputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("United States"); |
- |
- // Input an empty billing name. |
- outputs[NAME_BILLING_FULL] = base::string16(); |
- ValidityMessages messages = controller()->InputsAreValid(SECTION_BILLING, |
- outputs); |
- EXPECT_TRUE(HasUnsureError(messages, NAME_BILLING_FULL)); |
- |
- // Input a non-empty billing name. |
- outputs[NAME_BILLING_FULL] = ASCIIToUTF16("Bob"); |
- messages = controller()->InputsAreValid(SECTION_BILLING, outputs); |
- EXPECT_FALSE(HasAnyError(messages, NAME_BILLING_FULL)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, CreditCardNumberValidation) { |
- // Should accept AMEX, Visa, Master and Discover. |
- ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, true); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberDiscover, true); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberAmex, true); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberIncomplete, false); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberInvalid, false); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, AutofillProfiles) { |
- ui::MenuModel* shipping_model = |
- controller()->MenuModelForSection(SECTION_SHIPPING); |
- // Since the PersonalDataManager is empty, this should only have the |
- // "use billing", "add new" and "manage" menu items. |
- ASSERT_TRUE(shipping_model); |
- EXPECT_EQ(3, shipping_model->GetItemCount()); |
- // On the other hand, the other models should be NULL when there's no |
- // suggestion. |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING)); |
- |
- EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3); |
- |
- // Empty profiles are ignored. |
- AutofillProfile empty_profile(base::GenerateGUID(), kSettingsOrigin); |
- empty_profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("John Doe")); |
- controller()->GetTestingManager()->AddTestingProfile(&empty_profile); |
- shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); |
- ASSERT_TRUE(shipping_model); |
- EXPECT_EQ(3, shipping_model->GetItemCount()); |
- |
- // An otherwise full but unverified profile should be ignored. |
- AutofillProfile full_profile(test::GetFullProfile()); |
- full_profile.set_origin("https://www.example.com"); |
- full_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); |
- ASSERT_TRUE(shipping_model); |
- EXPECT_EQ(3, shipping_model->GetItemCount()); |
- |
- // A full, verified profile should be picked up. |
- AutofillProfile verified_profile(test::GetVerifiedProfile()); |
- verified_profile.SetRawInfo(ADDRESS_HOME_LINE2, base::string16()); |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- shipping_model = controller()->MenuModelForSection(SECTION_SHIPPING); |
- ASSERT_TRUE(shipping_model); |
- EXPECT_EQ(4, shipping_model->GetItemCount()); |
-} |
- |
-// Checks that a valid profile is selected by default, but if invalid is |
-// popped into edit mode. |
-TEST_F(AutofillDialogControllerTest, AutofillProfilesPopInvalidIntoEdit) { |
- SuggestionsMenuModel* shipping_model = |
- GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(3, shipping_model->GetItemCount()); |
- // "Same as billing" is selected. |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- |
- AutofillProfile verified_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- EXPECT_EQ(4, shipping_model->GetItemCount()); |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- |
- // Now make up a problem and make sure the profile isn't in the list. |
- Reset(); |
- FieldProblemMap problems; |
- problems.insert(std::make_pair(::i18n::addressinput::POSTAL_CODE, |
- ::i18n::addressinput::MISMATCHING_VALUE)); |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("US"), _, _)). |
- WillRepeatedly(DoAll(SetArgPointee<2>(problems), |
- Return(AddressValidator::SUCCESS))); |
- |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- shipping_model = GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(4, shipping_model->GetItemCount()); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
-} |
- |
-// Makes sure suggestion profiles are re-validated when validation rules load. |
-TEST_F(AutofillDialogControllerTest, AutofillProfilesRevalidateAfterRulesLoad) { |
- SuggestionsMenuModel* shipping_model = |
- GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(3, shipping_model->GetItemCount()); |
- // "Same as billing" is selected. |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- AutofillProfile verified_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- EXPECT_EQ(4, shipping_model->GetItemCount()); |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- |
- FieldProblemMap problems; |
- problems.insert(std::make_pair(::i18n::addressinput::POSTAL_CODE, |
- ::i18n::addressinput::MISMATCHING_VALUE)); |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("US"), _, _)). |
- WillRepeatedly(DoAll(SetArgPointee<2>(problems), |
- Return(AddressValidator::SUCCESS))); |
- |
- controller()->OnAddressValidationRulesLoaded("US", true); |
- EXPECT_EQ(4, shipping_model->GetItemCount()); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); |
- EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
-} |
- |
-// Makes sure that the choice of which Autofill profile to use for each section |
-// is sticky. |
-TEST_F(AutofillDialogControllerTest, AutofillProfileDefaults) { |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- AutofillProfile profile2(test::GetVerifiedProfile2()); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- controller()->GetTestingManager()->AddTestingProfile(&profile2); |
- |
- // Until a selection has been made, the default shipping suggestion is the |
- // first one (after "use billing"). |
- SuggestionsMenuModel* shipping_model = |
- GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(1, shipping_model->checked_item()); |
- |
- for (int i = 2; i >= 0; --i) { |
- shipping_model = GetMenuModelForSection(SECTION_SHIPPING); |
- shipping_model->ExecuteCommand(i, 0); |
- FillCreditCardInputs(); |
- controller()->OnAccept(); |
- |
- Reset(); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- controller()->GetTestingManager()->AddTestingProfile(&profile2); |
- shipping_model = GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(i, shipping_model->checked_item()); |
- } |
- |
- // Try again, but don't add the default profile to the PDM. The dialog |
- // should fall back to the first profile. |
- shipping_model->ExecuteCommand(2, 0); |
- FillCreditCardInputs(); |
- controller()->OnAccept(); |
- Reset(); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- shipping_model = GetMenuModelForSection(SECTION_SHIPPING); |
- EXPECT_EQ(1, shipping_model->checked_item()); |
-} |
- |
-// Makes sure that a newly added Autofill profile becomes set as the default |
-// choice for the next run. |
-TEST_F(AutofillDialogControllerTest, NewAutofillProfileIsDefault) { |
- |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- // Until a selection has been made, the default suggestion is the first one. |
- // For the shipping section, this follows the "use billing" suggestion. |
- EXPECT_EQ(0, GetMenuModelForSection(SECTION_CC)->checked_item()); |
- EXPECT_EQ(1, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); |
- |
- // Fill in the shipping and credit card sections with new data. |
- AutofillProfile new_profile(test::GetVerifiedProfile2()); |
- CreditCard new_credit_card(test::GetVerifiedCreditCard2()); |
- FillInputs(SECTION_SHIPPING, new_profile); |
- FillInputs(SECTION_CC, new_credit_card); |
- controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); |
- controller()->OnAccept(); |
- |
- // Update the |new_profile| and |new_credit_card|'s guids to the saved ones. |
- new_profile.set_guid( |
- controller()->GetTestingManager()->imported_profile().guid()); |
- new_credit_card.set_guid( |
- controller()->GetTestingManager()->imported_credit_card().guid()); |
- |
- // Reload the dialog. The newly added address should now be set as the |
- // default. |
- Reset(); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- controller()->GetTestingManager()->AddTestingProfile(&new_profile); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- // Until a selection has been made, the default suggestion is the first one. |
- // For the shipping section, this follows the "use billing" suggestion. |
- EXPECT_EQ(2, GetMenuModelForSection(SECTION_SHIPPING)->checked_item()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SuggestValidEmail) { |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- const base::string16 kValidEmail = ASCIIToUTF16(kFakeEmail); |
- profile.SetRawInfo(EMAIL_ADDRESS, kValidEmail); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- |
- // "add", "manage", and 1 suggestion. |
- EXPECT_EQ( |
- 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount()); |
- // "add", "manage", 1 suggestion, and "same as billing". |
- EXPECT_EQ( |
- 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidEmail) { |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(".!#$%&'*+/=?^_`-@-..")); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- |
- EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); |
- // "add", "manage", 1 suggestion, and "same as billing". |
- EXPECT_EQ( |
- 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SuggestValidAddress) { |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- full_profile.set_origin(kSettingsOrigin); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- // "add", "manage", and 1 suggestion. |
- EXPECT_EQ( |
- 3, controller()->MenuModelForSection(SECTION_BILLING)->GetItemCount()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, DoNotSuggestInvalidAddress) { |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- full_profile.set_origin(kSettingsOrigin); |
- full_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("C")); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, DoNotSuggestIncompleteAddress) { |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- profile.SetRawInfo(ADDRESS_HOME_STATE, base::string16()); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- |
- // Same as shipping, manage, add new. |
- EXPECT_EQ(3, |
- controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
- EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, DoSuggestShippingAddressWithoutEmail) { |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- profile.SetRawInfo(EMAIL_ADDRESS, base::string16()); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- |
- // Same as shipping, manage, add new, profile with missing email. |
- EXPECT_EQ(4, |
- controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
- // Billing addresses require email. |
- EXPECT_FALSE(!!controller()->MenuModelForSection(SECTION_BILLING)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, AutofillCreditCards) { |
- // Since the PersonalDataManager is empty, this should only have the |
- // default menu items. |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); |
- |
- EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(3); |
- |
- // Empty cards are ignored. |
- CreditCard empty_card(base::GenerateGUID(), kSettingsOrigin); |
- empty_card.SetRawInfo(CREDIT_CARD_NAME_FULL, ASCIIToUTF16("John Doe")); |
- controller()->GetTestingManager()->AddTestingCreditCard(&empty_card); |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); |
- |
- // An otherwise full but unverified card should be ignored. |
- CreditCard full_card(test::GetCreditCard()); |
- full_card.set_origin("https://www.example.com"); |
- controller()->GetTestingManager()->AddTestingCreditCard(&full_card); |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); |
- |
- // A full, verified card should be picked up. |
- CreditCard verified_card(test::GetCreditCard()); |
- verified_card.set_origin(kSettingsOrigin); |
- controller()->GetTestingManager()->AddTestingCreditCard(&verified_card); |
- ui::MenuModel* credit_card_model = |
- controller()->MenuModelForSection(SECTION_CC); |
- ASSERT_TRUE(credit_card_model); |
- EXPECT_EQ(3, credit_card_model->GetItemCount()); |
-} |
- |
-// Test selecting a shipping address different from billing as address. |
-TEST_F(AutofillDialogControllerTest, DontUseBillingAsShipping) { |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- AutofillProfile full_profile2(test::GetVerifiedProfile2()); |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile2); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- ui::MenuModel* shipping_model = |
- controller()->MenuModelForSection(SECTION_SHIPPING); |
- shipping_model->ActivatedAt(2); |
- |
- controller()->OnAccept(); |
- ASSERT_EQ(20U, form_structure()->field_count()); |
- EXPECT_EQ(ADDRESS_HOME_STATE, |
- form_structure()->field(9)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(9)->Type().group()); |
- EXPECT_EQ(ADDRESS_HOME_STATE, |
- form_structure()->field(16)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_HOME, form_structure()->field(16)->Type().group()); |
- base::string16 billing_state = form_structure()->field(9)->value; |
- base::string16 shipping_state = form_structure()->field(16)->value; |
- EXPECT_FALSE(billing_state.empty()); |
- EXPECT_FALSE(shipping_state.empty()); |
- EXPECT_NE(billing_state, shipping_state); |
- |
- EXPECT_EQ(CREDIT_CARD_NAME_FULL, |
- form_structure()->field(1)->Type().GetStorableType()); |
- base::string16 cc_name = form_structure()->field(1)->value; |
- EXPECT_EQ(NAME_FULL, form_structure()->field(6)->Type().GetStorableType()); |
- EXPECT_EQ(NAME_BILLING, form_structure()->field(6)->Type().group()); |
- base::string16 billing_name = form_structure()->field(6)->value; |
- EXPECT_EQ(NAME_FULL, form_structure()->field(13)->Type().GetStorableType()); |
- EXPECT_EQ(NAME, form_structure()->field(13)->Type().group()); |
- base::string16 shipping_name = form_structure()->field(13)->value; |
- |
- EXPECT_FALSE(cc_name.empty()); |
- EXPECT_FALSE(billing_name.empty()); |
- EXPECT_FALSE(shipping_name.empty()); |
- // Billing name should always be the same as cardholder name. |
- EXPECT_EQ(cc_name, billing_name); |
- EXPECT_NE(cc_name, shipping_name); |
-} |
- |
-// Test selecting UseBillingForShipping. |
-TEST_F(AutofillDialogControllerTest, UseBillingAsShipping) { |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- |
- AutofillProfile full_profile2(test::GetVerifiedProfile2()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile2); |
- |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC)); |
- ASSERT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- |
- SubmitAndVerifyShippingAndBillingResults(); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, UseBillingAsShippingManualInput) { |
- ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC)); |
- ASSERT_TRUE(controller()->IsManuallyEditingSection(SECTION_BILLING)); |
- |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- FillInputs(SECTION_CC, credit_card); |
- |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- FillInputs(SECTION_BILLING, full_profile); |
- |
- SubmitAndVerifyShippingAndBillingResults(); |
-} |
- |
-// Tests that shipping and billing telephone fields are supported, and filled |
-// in by their respective profiles. http://crbug.com/244515 |
-TEST_F(AutofillDialogControllerTest, BillingVsShippingPhoneNumber) { |
- FormFieldData shipping_tel; |
- shipping_tel.autocomplete_attribute = "shipping tel"; |
- FormFieldData billing_tel; |
- billing_tel.autocomplete_attribute = "billing tel"; |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-csc"; |
- |
- FormData form_data; |
- form_data.fields.push_back(shipping_tel); |
- form_data.fields.push_back(billing_tel); |
- form_data.fields.push_back(cc_field); |
- SetUpControllerWithFormData(form_data); |
- |
- // The profile that will be chosen for the shipping section. |
- AutofillProfile shipping_profile(test::GetVerifiedProfile()); |
- // The profile that will be chosen for the billing section. |
- AutofillProfile billing_profile(test::GetVerifiedProfile2()); |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingProfile(&shipping_profile); |
- controller()->GetTestingManager()->AddTestingProfile(&billing_profile); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- ui::MenuModel* billing_model = |
- controller()->MenuModelForSection(SECTION_BILLING); |
- billing_model->ActivatedAt(1); |
- |
- controller()->OnAccept(); |
- ASSERT_EQ(3U, form_structure()->field_count()); |
- EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
- form_structure()->field(0)->Type().GetStorableType()); |
- EXPECT_EQ(PHONE_HOME, form_structure()->field(0)->Type().group()); |
- EXPECT_EQ(PHONE_HOME_WHOLE_NUMBER, |
- form_structure()->field(1)->Type().GetStorableType()); |
- EXPECT_EQ(PHONE_BILLING, form_structure()->field(1)->Type().group()); |
- EXPECT_EQ(shipping_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER), |
- form_structure()->field(0)->value); |
- EXPECT_EQ(billing_profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER), |
- form_structure()->field(1)->value); |
- EXPECT_NE(form_structure()->field(1)->value, |
- form_structure()->field(0)->value); |
-} |
- |
-// Similar to the above, but tests that street-address (i.e. all lines of the |
-// street address) is successfully filled for both shipping and billing |
-// sections. |
-TEST_F(AutofillDialogControllerTest, BillingVsShippingStreetAddress) { |
- FormFieldData shipping_address; |
- shipping_address.autocomplete_attribute = "shipping street-address"; |
- FormFieldData billing_address; |
- billing_address.autocomplete_attribute = "billing street-address"; |
- FormFieldData shipping_address_textarea; |
- shipping_address_textarea.autocomplete_attribute = "shipping street-address"; |
- shipping_address_textarea.form_control_type = "textarea"; |
- FormFieldData billing_address_textarea; |
- billing_address_textarea.autocomplete_attribute = "billing street-address"; |
- billing_address_textarea.form_control_type = "textarea"; |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-csc"; |
- |
- FormData form_data; |
- form_data.fields.push_back(shipping_address); |
- form_data.fields.push_back(billing_address); |
- form_data.fields.push_back(shipping_address_textarea); |
- form_data.fields.push_back(billing_address_textarea); |
- form_data.fields.push_back(cc_field); |
- SetUpControllerWithFormData(form_data); |
- |
- // The profile that will be chosen for the shipping section. |
- AutofillProfile shipping_profile(test::GetVerifiedProfile()); |
- // The profile that will be chosen for the billing section. |
- AutofillProfile billing_profile(test::GetVerifiedProfile2()); |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingProfile(&shipping_profile); |
- controller()->GetTestingManager()->AddTestingProfile(&billing_profile); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- ui::MenuModel* billing_model = |
- controller()->MenuModelForSection(SECTION_BILLING); |
- billing_model->ActivatedAt(1); |
- |
- controller()->OnAccept(); |
- ASSERT_EQ(5U, form_structure()->field_count()); |
- EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS, |
- form_structure()->field(0)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_HOME, form_structure()->field(0)->Type().group()); |
- EXPECT_EQ(ADDRESS_HOME_STREET_ADDRESS, |
- form_structure()->field(1)->Type().GetStorableType()); |
- EXPECT_EQ(ADDRESS_BILLING, form_structure()->field(1)->Type().group()); |
- // Inexact matching; single-line inputs get the address data concatenated but |
- // separated by commas. |
- EXPECT_TRUE(base::StartsWith(form_structure()->field(0)->value, |
- shipping_profile.GetRawInfo(ADDRESS_HOME_LINE1), |
- base::CompareCase::SENSITIVE)); |
- EXPECT_TRUE(base::EndsWith(form_structure()->field(0)->value, |
- shipping_profile.GetRawInfo(ADDRESS_HOME_LINE2), |
- base::CompareCase::SENSITIVE)); |
- EXPECT_TRUE(base::StartsWith(form_structure()->field(1)->value, |
- billing_profile.GetRawInfo(ADDRESS_HOME_LINE1), |
- base::CompareCase::SENSITIVE)); |
- EXPECT_TRUE(base::EndsWith(form_structure()->field(1)->value, |
- billing_profile.GetRawInfo(ADDRESS_HOME_LINE2), |
- base::CompareCase::SENSITIVE)); |
- // The textareas should be an exact match. |
- EXPECT_EQ(shipping_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS), |
- form_structure()->field(2)->value); |
- EXPECT_EQ(billing_profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS), |
- form_structure()->field(3)->value); |
- |
- EXPECT_NE(form_structure()->field(1)->value, |
- form_structure()->field(0)->value); |
- EXPECT_NE(form_structure()->field(3)->value, |
- form_structure()->field(2)->value); |
-} |
- |
-// Test asking for different pieces of the name. |
-TEST_F(AutofillDialogControllerTest, NamePieces) { |
- const char* const attributes[] = { |
- "shipping name", |
- "billing name", |
- "billing given-name", |
- "billing family-name", |
- "billing additional-name", |
- "cc-csc" |
- }; |
- |
- FormData form_data; |
- for (size_t i = 0; i < arraysize(attributes); ++i) { |
- FormFieldData field; |
- field.autocomplete_attribute.assign(attributes[i]); |
- form_data.fields.push_back(field); |
- } |
- |
- SetUpControllerWithFormData(form_data); |
- |
- // Billing. |
- AutofillProfile test_profile(test::GetVerifiedProfile()); |
- test_profile.SetInfo(AutofillType(NAME_FULL), |
- ASCIIToUTF16("Fabian Jackson von Nacho"), |
- "en-US"); |
- controller()->GetTestingManager()->AddTestingProfile(&test_profile); |
- |
- // Credit card. |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- // Make shipping name different from billing. |
- AutofillProfile test_profile2(test::GetVerifiedProfile2()); |
- test_profile2.SetInfo(AutofillType(NAME_FULL), |
- ASCIIToUTF16("Don Ford"), |
- "en-US"); |
- controller()->GetTestingManager()->AddTestingProfile(&test_profile2); |
- ui::MenuModel* shipping_model = |
- controller()->MenuModelForSection(SECTION_SHIPPING); |
- shipping_model->ActivatedAt(2); |
- |
- controller()->OnAccept(); |
- |
- EXPECT_EQ(NAME_FULL, form_structure()->field(0)->Type().GetStorableType()); |
- EXPECT_EQ(ASCIIToUTF16("Don Ford"), |
- form_structure()->field(0)->value); |
- |
- EXPECT_EQ(NAME_FULL, form_structure()->field(1)->Type().GetStorableType()); |
- EXPECT_EQ(ASCIIToUTF16("Fabian Jackson von Nacho"), |
- form_structure()->field(1)->value); |
- |
- EXPECT_EQ(NAME_FIRST, form_structure()->field(2)->Type().GetStorableType()); |
- EXPECT_EQ(ASCIIToUTF16("Fabian"), |
- form_structure()->field(2)->value); |
- |
- EXPECT_EQ(NAME_LAST, form_structure()->field(3)->Type().GetStorableType()); |
- EXPECT_EQ(ASCIIToUTF16("von Nacho"), |
- form_structure()->field(3)->value); |
- |
- EXPECT_EQ(NAME_MIDDLE, form_structure()->field(4)->Type().GetStorableType()); |
- EXPECT_EQ(ASCIIToUTF16("Jackson"), |
- form_structure()->field(4)->value); |
-} |
- |
-// Tests that adding an autofill profile and then submitting works. |
-TEST_F(AutofillDialogControllerTest, AddAutofillProfile) { |
- EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(2); |
- |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING); |
- // Activate the "Add billing address" menu item. |
- model->ActivatedAt(model->GetItemCount() - 2); |
- |
- // Fill in the inputs from the profile. |
- FieldValueMap outputs; |
- const DetailInputs& inputs = |
- controller()->RequestedFieldsForSection(SECTION_BILLING); |
- AutofillProfile full_profile2(test::GetVerifiedProfile2()); |
- for (size_t i = 0; i < inputs.size(); ++i) { |
- const ServerFieldType type = inputs[i].type; |
- outputs[type] = full_profile2.GetInfo(AutofillType(type), "en-US"); |
- } |
- controller()->GetView()->SetUserInput(SECTION_BILLING, outputs); |
- |
- controller()->OnAccept(); |
- const AutofillProfile& added_profile = |
- controller()->GetTestingManager()->imported_profile(); |
- |
- const DetailInputs& shipping_inputs = |
- controller()->RequestedFieldsForSection(SECTION_SHIPPING); |
- for (size_t i = 0; i < shipping_inputs.size(); ++i) { |
- const ServerFieldType type = shipping_inputs[i].type; |
- EXPECT_EQ(full_profile2.GetInfo(AutofillType(type), "en-US"), |
- added_profile.GetInfo(AutofillType(type), "en-US")); |
- } |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SaveDetailsInChrome) { |
- EXPECT_CALL(*controller()->GetView(), ModelChanged()).Times(4); |
- |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- |
- CreditCard card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingCreditCard(&card); |
- EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); |
- |
- controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(0); |
- EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); |
- |
- controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1); |
- EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome()); |
- |
- profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false); |
- EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); |
- |
- profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, true); |
- controller()->MenuModelForSection(SECTION_BILLING)->ActivatedAt(1); |
- EXPECT_TRUE(controller()->ShouldOfferToSaveInChrome()); |
- |
- profile()->ForceIncognito(true); |
- EXPECT_FALSE(controller()->ShouldOfferToSaveInChrome()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, DisabledAutofill) { |
- ASSERT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kAutofillEnabled)); |
- |
- AutofillProfile verified_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- |
- CreditCard credit_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); |
- |
- // Verify suggestions menus should be showing when Autofill is enabled. |
- EXPECT_TRUE(controller()->MenuModelForSection(SECTION_CC)); |
- EXPECT_TRUE(controller()->MenuModelForSection(SECTION_BILLING)); |
- EXPECT_EQ( |
- 4, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
- |
- EXPECT_CALL(*controller()->GetView(), ModelChanged()); |
- profile()->GetPrefs()->SetBoolean(prefs::kAutofillEnabled, false); |
- |
- // Verify billing and credit card suggestions menus are hidden when Autofill |
- // is disabled. |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_CC)); |
- EXPECT_FALSE(controller()->MenuModelForSection(SECTION_BILLING)); |
- // And that the shipping suggestions menu has less selections. |
- EXPECT_EQ( |
- 2, controller()->MenuModelForSection(SECTION_SHIPPING)->GetItemCount()); |
- |
- // Additionally, editing fields should not show Autofill popups. |
- ASSERT_NO_FATAL_FAILURE(controller()->UserEditedOrActivatedInput( |
- SECTION_BILLING, NAME_BILLING_FULL, gfx::NativeView(), gfx::Rect(), |
- verified_profile.GetInfo(AutofillType(NAME_FULL), "en-US").substr(0, 1), |
- true)); |
- EXPECT_EQ(UNKNOWN_TYPE, controller()->popup_input_type()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, ShippingSectionCanBeHidden) { |
- FormFieldData email_field; |
- email_field.autocomplete_attribute = "email"; |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-number"; |
- FormFieldData billing_field; |
- billing_field.autocomplete_attribute = "billing address-level1"; |
- |
- FormData form_data; |
- form_data.fields.push_back(email_field); |
- form_data.fields.push_back(cc_field); |
- form_data.fields.push_back(billing_field); |
- |
- AutofillProfile full_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&full_profile); |
- SetUpControllerWithFormData(form_data); |
- |
- EXPECT_FALSE(controller()->SectionIsActive(SECTION_SHIPPING)); |
- |
- FillCreditCardInputs(); |
- controller()->OnAccept(); |
- EXPECT_TRUE(form_structure()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SaveInChromeByDefault) { |
- EXPECT_TRUE(controller()->ShouldSaveInChrome()); |
- FillCreditCardInputs(); |
- controller()->OnAccept(); |
- EXPECT_TRUE(controller()->ShouldSaveInChrome()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, |
- SaveInChromePreferenceNotRememberedOnCancel) { |
- EXPECT_TRUE(controller()->ShouldSaveInChrome()); |
- controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false); |
- controller()->OnCancel(); |
- EXPECT_TRUE(controller()->ShouldSaveInChrome()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, |
- SaveInChromePreferenceRememberedOnSuccess) { |
- EXPECT_TRUE(controller()->ShouldSaveInChrome()); |
- FillCreditCardInputs(); |
- controller()->GetView()->CheckSaveDetailsLocallyCheckbox(false); |
- controller()->OnAccept(); |
- EXPECT_FALSE(controller()->ShouldSaveInChrome()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SubmitButtonIsDisabled) { |
- EXPECT_EQ(1, controller()->get_submit_button_delay_count()); |
- |
- // Begin the submit button delay. |
- controller()->SimulateSubmitButtonDelayBegin(); |
- EXPECT_FALSE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); |
- |
- // End the submit button delay. |
- controller()->SimulateSubmitButtonDelayEnd(); |
- EXPECT_TRUE(controller()->IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, IconsForFields_NoCreditCard) { |
- FieldValueMap values; |
- values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); |
- FieldIconMap icons = controller()->IconsForFields(values); |
- EXPECT_TRUE(icons.empty()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, IconsForFields_CreditCardNumberOnly) { |
- FieldValueMap values; |
- values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); |
- values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa); |
- FieldIconMap icons = controller()->IconsForFields(values); |
- EXPECT_EQ(1UL, icons.size()); |
- EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, IconsForFields_CvcOnly) { |
- FieldValueMap values; |
- values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); |
- values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123"); |
- FieldIconMap icons = controller()->IconsForFields(values); |
- EXPECT_EQ(1UL, icons.size()); |
- EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, IconsForFields_BothCreditCardAndCvc) { |
- FieldValueMap values; |
- values[EMAIL_ADDRESS] = ASCIIToUTF16(kFakeEmail); |
- values[CREDIT_CARD_NUMBER] = ASCIIToUTF16(kTestCCNumberVisa); |
- values[CREDIT_CARD_VERIFICATION_CODE] = ASCIIToUTF16("123"); |
- FieldIconMap icons = controller()->IconsForFields(values); |
- EXPECT_EQ(2UL, icons.size()); |
- EXPECT_EQ(1UL, icons.count(CREDIT_CARD_VERIFICATION_CODE)); |
- EXPECT_EQ(1UL, icons.count(CREDIT_CARD_NUMBER)); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, FieldControlsIcons) { |
- EXPECT_TRUE(controller()->FieldControlsIcons(CREDIT_CARD_NUMBER)); |
- EXPECT_FALSE(controller()->FieldControlsIcons(CREDIT_CARD_VERIFICATION_CODE)); |
- EXPECT_FALSE(controller()->FieldControlsIcons(EMAIL_ADDRESS)); |
-} |
- |
-// Verifies that a call to the IconsForFields() method before the card type is |
-// known returns a placeholder image that is at least as large as the icons for |
-// all of the supported major credit card issuers. |
-TEST_F(AutofillDialogControllerTest, IconReservedForCreditCardField) { |
- FieldValueMap inputs; |
- inputs[CREDIT_CARD_NUMBER] = base::string16(); |
- |
- FieldIconMap icons = controller()->IconsForFields(inputs); |
- EXPECT_EQ(1U, icons.size()); |
- |
- ASSERT_EQ(1U, icons.count(CREDIT_CARD_NUMBER)); |
- gfx::Image placeholder_icon = icons[CREDIT_CARD_NUMBER]; |
- |
- // Verify that the placeholder icon is at least as large as the icons for the |
- // supported credit card issuers. |
- const int kSupportedCardIdrs[] = { |
- IDR_AUTOFILL_CC_AMEX, |
- IDR_AUTOFILL_CC_DISCOVER, |
- IDR_AUTOFILL_CC_GENERIC, |
- IDR_AUTOFILL_CC_MASTERCARD, |
- IDR_AUTOFILL_CC_VISA, |
- }; |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- for (size_t i = 0; i < arraysize(kSupportedCardIdrs); ++i) { |
- SCOPED_TRACE(base::SizeTToString(i)); |
- gfx::Image supported_card_icon = rb.GetImageNamed(kSupportedCardIdrs[i]); |
- EXPECT_GE(placeholder_icon.Width(), supported_card_icon.Width()); |
- EXPECT_GE(placeholder_icon.Height(), supported_card_icon.Height()); |
- } |
-} |
- |
-TEST_F(AutofillDialogControllerTest, CountryChangeUpdatesSection) { |
- TestAutofillDialogView* view = controller()->GetView(); |
- view->ClearSectionUpdates(); |
- |
- controller()->UserEditedOrActivatedInput(SECTION_SHIPPING, |
- ADDRESS_HOME_COUNTRY, |
- gfx::NativeView(), |
- gfx::Rect(), |
- ASCIIToUTF16("Belarus"), |
- true); |
- std::map<DialogSection, size_t> updates = view->section_updates(); |
- EXPECT_EQ(1U, updates[SECTION_SHIPPING]); |
- EXPECT_EQ(1U, updates.size()); |
- |
- view->ClearSectionUpdates(); |
- |
- controller()->UserEditedOrActivatedInput(SECTION_BILLING, |
- ADDRESS_BILLING_COUNTRY, |
- gfx::NativeView(), |
- gfx::Rect(), |
- ASCIIToUTF16("Italy"), |
- true); |
- updates = view->section_updates(); |
- EXPECT_EQ(1U, updates[SECTION_BILLING]); |
- EXPECT_EQ(1U, updates.size()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, CorrectCountryFromInputs) { |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("DE"), _, _)); |
- |
- FieldValueMap billing_inputs; |
- billing_inputs[ADDRESS_BILLING_COUNTRY] = ASCIIToUTF16("Germany"); |
- controller()->InputsAreValid(SECTION_BILLING, billing_inputs); |
- |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("FR"), _, _)); |
- |
- FieldValueMap shipping_inputs; |
- shipping_inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("France"); |
- controller()->InputsAreValid(SECTION_SHIPPING, shipping_inputs); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, ValidationRulesLoadedOnCountryChange) { |
- ResetControllerWithFormData(DefaultFormData()); |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- LoadRules("US")).Times(AtLeast(1)); |
- controller()->Show(); |
- |
- EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("FR")); |
- controller()->UserEditedOrActivatedInput(SECTION_BILLING, |
- ADDRESS_BILLING_COUNTRY, |
- gfx::NativeView(), |
- gfx::Rect(), |
- ASCIIToUTF16("France"), |
- true); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, UsValidationRulesLoadedForJpOnlyProfile) { |
- ResetControllerWithFormData(DefaultFormData()); |
- AutofillProfile jp_profile(base::GenerateGUID(), kSettingsOrigin); |
- jp_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("JP")); |
- controller()->GetTestingManager()->AddTestingProfile(&jp_profile); |
- EXPECT_CALL(*controller()->GetMockValidator(), LoadRules("US")).Times(0); |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- LoadRules("JP")).Times(AtLeast(1)); |
- controller()->Show(); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, InvalidWhenRulesNotReady) { |
- // Select "Add new shipping address...". |
- controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(1); |
- |
- // If the rules haven't loaded yet, validation errors should show on submit. |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("US"), _, _)). |
- WillRepeatedly(Return(AddressValidator::RULES_NOT_READY)); |
- |
- FieldValueMap inputs; |
- inputs[ADDRESS_HOME_ZIP] = ASCIIToUTF16("1234"); |
- inputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("United States"); |
- |
- ValidityMessages messages = |
- controller()->InputsAreValid(SECTION_SHIPPING, inputs); |
- EXPECT_FALSE(messages.GetMessageOrDefault(ADDRESS_HOME_ZIP).text.empty()); |
- EXPECT_FALSE(messages.HasSureError(ADDRESS_HOME_ZIP)); |
- // Country should never show an error message as it's always valid. |
- EXPECT_TRUE(messages.GetMessageOrDefault(ADDRESS_HOME_COUNTRY).text.empty()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, ValidButUnverifiedWhenRulesFail) { |
- // Add suggestions so the credit card and billing sections aren't showing |
- // their manual inputs (to isolate to just shipping). |
- AutofillProfile verified_profile(test::GetVerifiedProfile()); |
- controller()->GetTestingManager()->AddTestingProfile(&verified_profile); |
- CreditCard verified_card(test::GetVerifiedCreditCard()); |
- controller()->GetTestingManager()->AddTestingCreditCard(&verified_card); |
- |
- // Select "Add new shipping address...". |
- controller()->MenuModelForSection(SECTION_SHIPPING)->ActivatedAt(2); |
- |
- // If the rules are unavailable, validation errors should not show. |
- EXPECT_CALL(*controller()->GetMockValidator(), |
- ValidateAddress(CountryCodeMatcher("US"), _, _)). |
- WillRepeatedly(Return(AddressValidator::RULES_UNAVAILABLE)); |
- |
- FieldValueMap outputs; |
- AutofillProfile full_profile(test::GetFullProfile()); |
- const DetailInputs& inputs = |
- controller()->RequestedFieldsForSection(SECTION_SHIPPING); |
- for (size_t i = 0; i < inputs.size(); ++i) { |
- const ServerFieldType type = inputs[i].type; |
- outputs[type] = full_profile.GetInfo(AutofillType(type), "en-US"); |
- } |
- controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs); |
- controller()->GetView()->CheckSaveDetailsLocallyCheckbox(true); |
- controller()->OnAccept(); |
- |
- // Profiles saved while rules are unavailable shouldn't be verified. |
- const AutofillProfile& imported_profile = |
- controller()->GetTestingManager()->imported_profile(); |
- ASSERT_EQ(imported_profile.GetInfo(AutofillType(NAME_FULL), "en-US"), |
- full_profile.GetInfo(AutofillType(NAME_FULL), "en-US")); |
- EXPECT_EQ(imported_profile.origin(), GURL(kSourceUrl).GetOrigin().spec()); |
- EXPECT_FALSE(imported_profile.IsVerified()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, LimitedCountryChoices) { |
- ui::ComboboxModel* shipping_country_model = |
- controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY); |
- const int default_number_of_countries = |
- shipping_country_model->GetItemCount(); |
- // We show a lot of countries by default, but the exact number doesn't matter. |
- EXPECT_GT(default_number_of_countries, 50); |
- |
- // Create a form data that simulates: |
- // <select autocomplete="billing country"> |
- // <option value="AU">Down Under</option> |
- // <option value="">fR</option> <!-- Case doesn't matter --> |
- // <option value="GRMNY">Germany</option> |
- // </select> |
- // Only country codes are respected, whether they're in value or the option's |
- // text content. Thus the first two options should be recognized. |
- FormData form_data; |
- FormFieldData field; |
- field.autocomplete_attribute = "billing country"; |
- field.option_contents.push_back(ASCIIToUTF16("Down Under")); |
- field.option_values.push_back(ASCIIToUTF16("AU")); |
- field.option_contents.push_back(ASCIIToUTF16("Fr")); |
- field.option_values.push_back(ASCIIToUTF16("")); |
- field.option_contents.push_back(ASCIIToUTF16("Germany")); |
- field.option_values.push_back(ASCIIToUTF16("GRMNY")); |
- |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-csc"; |
- |
- form_data.fields.push_back(field); |
- form_data.fields.push_back(cc_field); |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- |
- // Shipping model shouldn't have changed. |
- shipping_country_model = |
- controller()->ComboboxModelForAutofillType(ADDRESS_HOME_COUNTRY); |
- EXPECT_EQ(default_number_of_countries, |
- shipping_country_model->GetItemCount()); |
- // Billing model now only has two items. |
- ui::ComboboxModel* billing_country_model = |
- controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY); |
- ASSERT_EQ(2, billing_country_model->GetItemCount()); |
- EXPECT_EQ(billing_country_model->GetItemAt(0), ASCIIToUTF16("Australia")); |
- EXPECT_EQ(billing_country_model->GetItemAt(1), ASCIIToUTF16("France")); |
- |
- // Make sure it also applies to profile suggestions. |
- AutofillProfile us_profile(test::GetVerifiedProfile()); |
- us_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US")); |
- controller()->GetTestingManager()->AddTestingProfile(&us_profile); |
- // Don't show a suggestion if the only one that exists is disabled. |
- EXPECT_FALSE( |
- controller()->SuggestionStateForSection(SECTION_BILLING).visible); |
- |
- // Add a profile with an acceptable country; suggestion should be shown. |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- AutofillProfile au_profile(test::GetVerifiedProfile2()); |
- au_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("AU")); |
- controller()->GetTestingManager()->AddTestingProfile(&us_profile); |
- controller()->GetTestingManager()->AddTestingProfile(&au_profile); |
- ui::MenuModel* model = controller()->MenuModelForSection(SECTION_BILLING); |
- ASSERT_TRUE(model); |
- EXPECT_EQ(4, model->GetItemCount()); |
- EXPECT_FALSE(model->IsEnabledAt(0)); |
- EXPECT_TRUE(model->IsEnabledAt(1)); |
- |
- // Add <input type="text" autocomplete="billing country"></input> |
- // This should open up selection of all countries again. |
- FormFieldData field2; |
- field2.autocomplete_attribute = "billing country"; |
- form_data.fields.push_back(field2); |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- |
- billing_country_model = |
- controller()->ComboboxModelForAutofillType(ADDRESS_BILLING_COUNTRY); |
- EXPECT_EQ(default_number_of_countries, |
- billing_country_model->GetItemCount()); |
-} |
- |
-// http://crbug.com/388018 |
-TEST_F(AutofillDialogControllerTest, NoCountryChoices) { |
- // Create a form data that simulates: |
- // <select autocomplete="billing country"> |
- // <option value="ATL">Atlantis</option> |
- // <option value="ELD">Eldorado</option> |
- // </select> |
- // i.e. contains a list of no valid countries. |
- FormData form_data; |
- FormFieldData field; |
- field.autocomplete_attribute = "billing country"; |
- field.option_contents.push_back(ASCIIToUTF16("Atlantis")); |
- field.option_values.push_back(ASCIIToUTF16("ATL")); |
- field.option_contents.push_back(ASCIIToUTF16("Eldorado")); |
- field.option_values.push_back(ASCIIToUTF16("ELD")); |
- |
- FormFieldData cc_field; |
- cc_field.autocomplete_attribute = "cc-csc"; |
- |
- form_data.fields.push_back(field); |
- form_data.fields.push_back(cc_field); |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- |
- // Controller aborts and self destructs. |
- EXPECT_EQ(0, controller()); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, LimitedCcChoices) { |
- // Typically, MC and Visa are both valid. |
- ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, true); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true); |
- |
- FormData form_data; |
- FormFieldData field; |
- field.autocomplete_attribute = "billing cc-type"; |
- field.option_contents.push_back(ASCIIToUTF16("Visa")); |
- field.option_values.push_back(ASCIIToUTF16("V")); |
- field.option_contents.push_back(ASCIIToUTF16("Amex")); |
- field.option_values.push_back(ASCIIToUTF16("AX")); |
- form_data.fields.push_back(field); |
- ResetControllerWithFormData(form_data); |
- controller()->Show(); |
- |
- // MC is not valid because it's missing from FormData. |
- EXPECT_EQ(l10n_util::GetStringUTF16( |
- IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_MASTERCARD), |
- ValidateCCNumber(SECTION_CC, kTestCCNumberMaster, false)); |
- ValidateCCNumber(SECTION_CC, kTestCCNumberVisa, true); |
- |
- CreditCard visa_card(test::GetVerifiedCreditCard()); |
- CreditCard amex_card(test::GetVerifiedCreditCard2()); |
- |
- CreditCard master_card(base::GenerateGUID(), kSettingsOrigin); |
- test::SetCreditCardInfo( |
- &master_card, "Mr Foo", "5105105105105100", "07", "2099"); |
- |
- controller()->GetTestingManager()->AddTestingCreditCard(&visa_card); |
- controller()->GetTestingManager()->AddTestingCreditCard(&amex_card); |
- controller()->GetTestingManager()->AddTestingCreditCard(&master_card); |
- |
- // The stored MC is disabled in the dropdown. |
- ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC); |
- ASSERT_TRUE(model); |
- ASSERT_EQ(5, model->GetItemCount()); |
- EXPECT_TRUE(model->IsEnabledAt(0)); |
- EXPECT_TRUE(model->IsEnabledAt(1)); |
- EXPECT_FALSE(model->IsEnabledAt(2)); |
- EXPECT_TRUE(model->IsEnabledAt(3)); |
- EXPECT_TRUE(model->IsEnabledAt(4)); |
- |
- SetUpControllerWithFormData(form_data); |
- |
- // Discover is disallowed because it's not in FormData. |
- ValidateCCNumber(SECTION_CC, kTestCCNumberDiscover, false); |
-} |
- |
-TEST_F(AutofillDialogControllerTest, SuggestCountrylessProfiles) { |
- FieldValueMap outputs; |
- outputs[ADDRESS_HOME_COUNTRY] = ASCIIToUTF16("US"); |
- controller()->GetView()->SetUserInput(SECTION_SHIPPING, outputs); |
- |
- AutofillProfile profile(test::GetVerifiedProfile()); |
- profile.SetRawInfo(NAME_FULL, ASCIIToUTF16("The Man Without a Country")); |
- profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::string16()); |
- controller()->GetTestingManager()->AddTestingProfile(&profile); |
- |
- controller()->UserEditedOrActivatedInput( |
- SECTION_SHIPPING, |
- NAME_FULL, |
- gfx::NativeView(), |
- gfx::Rect(), |
- profile.GetRawInfo(NAME_FULL).substr(0, 1), |
- true); |
- EXPECT_EQ(NAME_FULL, controller()->popup_input_type()); |
-} |
- |
-} // namespace autofill |