Index: ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm |
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2050057d2c5e5c3ad59421bcb982e0a4d371209f |
--- /dev/null |
+++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm |
@@ -0,0 +1,182 @@ |
+// Copyright 2015 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. |
+ |
+#import "ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.h" |
+ |
+#include <memory> |
+ |
+#include "base/compiler_specific.h" |
+#include "base/strings/utf_string_conversions.h" |
+#import "base/test/ios/wait_util.h" |
+#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/core/browser/mock_password_store.h" |
+#include "components/password_manager/core/browser/password_manager_test_utils.h" |
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
+#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" |
+#import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h" |
+#include "ios/web/public/test/test_web_thread_bundle.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+@interface SavePasswordsCollectionViewController (InternalMethods) |
+- (void)onGetPasswordStoreResults: |
+ (const std::vector<autofill::PasswordForm*>&)result; |
+@end |
+ |
+namespace { |
+ |
+class SavePasswordsCollectionViewControllerTest |
+ : public CollectionViewControllerTest { |
+ protected: |
+ SavePasswordsCollectionViewControllerTest() |
+ : thread_bundle_(web::TestWebThreadBundle::REAL_DB_THREAD) {} |
+ |
+ void SetUp() override { |
+ TestChromeBrowserState::Builder test_cbs_builder; |
+ chrome_browser_state_ = test_cbs_builder.Build(); |
+ CollectionViewControllerTest::SetUp(); |
+ IOSChromePasswordStoreFactory::GetInstance()->SetTestingFactory( |
+ chrome_browser_state_.get(), |
+ &password_manager::BuildPasswordStore< |
+ web::BrowserState, password_manager::MockPasswordStore>); |
+ CreateController(); |
+ } |
+ |
+ CollectionViewController* NewController() override NS_RETURNS_RETAINED { |
+ return [[SavePasswordsCollectionViewController alloc] |
+ initWithBrowserState:chrome_browser_state_.get()]; |
+ } |
+ |
+ // Adds a form to SavePasswordsTableViewController. |
+ void AddPasswordForm(autofill::PasswordForm* form) { |
+ SavePasswordsCollectionViewController* save_password_controller = |
+ static_cast<SavePasswordsCollectionViewController*>(controller()); |
+ std::vector<autofill::PasswordForm*> passwords; |
+ passwords.push_back(form); |
+ [save_password_controller onGetPasswordStoreResults:passwords]; |
+ } |
+ |
+ // Creates and adds a saved password form. |
+ void AddSavedForm() { |
+ autofill::PasswordForm* form = new autofill::PasswordForm(); |
+ form->origin = GURL("http://www.example.com/accounts/LoginAuth"); |
+ form->action = GURL("http://www.example.com/accounts/Login"); |
+ form->username_element = base::ASCIIToUTF16("Email"); |
+ form->username_value = base::ASCIIToUTF16("test@egmail.com"); |
+ form->password_element = base::ASCIIToUTF16("Passwd"); |
+ form->password_value = base::ASCIIToUTF16("test"); |
+ form->submit_element = base::ASCIIToUTF16("signIn"); |
+ form->signon_realm = "http://www.example.com/"; |
+ form->preferred = false; |
+ form->scheme = autofill::PasswordForm::SCHEME_HTML; |
+ form->blacklisted_by_user = false; |
+ AddPasswordForm(form); |
+ } |
+ |
+ // Creates and adds a blacklisted site form to never offer to save |
+ // user's password to those sites. |
+ void AddBlacklistedForm1() { |
+ autofill::PasswordForm* form = new autofill::PasswordForm(); |
+ form->origin = GURL("http://www.secret.com/login"); |
+ form->action = GURL("http://www.secret.com/action"); |
+ form->username_element = base::ASCIIToUTF16("email"); |
+ form->username_value = base::ASCIIToUTF16("test@secret.com"); |
+ form->password_element = base::ASCIIToUTF16("password"); |
+ form->password_value = base::ASCIIToUTF16("cantsay"); |
+ form->submit_element = base::ASCIIToUTF16("signIn"); |
+ form->signon_realm = "http://www.secret.com/"; |
+ form->preferred = false; |
+ form->scheme = autofill::PasswordForm::SCHEME_HTML; |
+ form->blacklisted_by_user = true; |
+ AddPasswordForm(form); |
+ } |
+ |
+ // Creates and adds another blacklisted site form to never offer to save |
+ // user's password to those sites. |
+ void AddBlacklistedForm2() { |
+ autofill::PasswordForm* form = new autofill::PasswordForm(); |
+ form->origin = GURL("http://www.secret2.com/login"); |
+ form->action = GURL("http://www.secret2.com/action"); |
+ form->username_element = base::ASCIIToUTF16("email"); |
+ form->username_value = base::ASCIIToUTF16("test@secret2.com"); |
+ form->password_element = base::ASCIIToUTF16("password"); |
+ form->password_value = base::ASCIIToUTF16("cantsay"); |
+ form->submit_element = base::ASCIIToUTF16("signIn"); |
+ form->signon_realm = "http://www.secret2.com/"; |
+ form->preferred = false; |
+ form->scheme = autofill::PasswordForm::SCHEME_HTML; |
+ form->blacklisted_by_user = true; |
+ AddPasswordForm(form); |
+ } |
+ |
+ web::TestWebThreadBundle thread_bundle_; |
+ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
+}; |
+ |
+// Tests default case has no saved sites and no blacklisted sites. |
+TEST_F(SavePasswordsCollectionViewControllerTest, TestInitialization) { |
+ CheckController(); |
+ EXPECT_EQ(2, NumberOfSections()); |
+} |
+ |
+// Tests adding one item in saved password section. |
+TEST_F(SavePasswordsCollectionViewControllerTest, AddSavedPasswords) { |
+ AddSavedForm(); |
+ EXPECT_EQ(3, NumberOfSections()); |
+ EXPECT_EQ(1, NumberOfItemsInSection(2)); |
+} |
+ |
+// Tests adding one item in blacklisted password section. |
+TEST_F(SavePasswordsCollectionViewControllerTest, AddBlacklistedPasswords) { |
+ AddBlacklistedForm1(); |
+ EXPECT_EQ(3, NumberOfSections()); |
+ EXPECT_EQ(1, NumberOfItemsInSection(2)); |
+} |
+ |
+// Tests adding one item in saved password section, and two items in blacklisted |
+// password section. |
+TEST_F(SavePasswordsCollectionViewControllerTest, AddSavedAndBlacklisted) { |
+ AddSavedForm(); |
+ AddBlacklistedForm1(); |
+ AddBlacklistedForm2(); |
+ |
+ // There should be two sections added. |
+ EXPECT_EQ(4, NumberOfSections()); |
+ // There should be 1 row in saved password section. |
+ EXPECT_EQ(1, NumberOfItemsInSection(2)); |
+ // There should be 2 rows in blacklisted password section. |
+ EXPECT_EQ(2, NumberOfItemsInSection(3)); |
+} |
+ |
+// Tests deleting items from saved passwords and blacklisted passwords sections. |
+TEST_F(SavePasswordsCollectionViewControllerTest, DeleteItems) { |
+ AddSavedForm(); |
+ AddBlacklistedForm1(); |
+ AddBlacklistedForm2(); |
+ |
+ void (^deleteItemWithWait)(int, int) = ^(int i, int j) { |
+ __block BOOL completionCalled = NO; |
+ this->DeleteItem(i, j, ^{ |
+ completionCalled = YES; |
+ }); |
+ base::test::ios::WaitUntilCondition(^bool() { |
+ return completionCalled; |
+ }); |
+ }; |
+ |
+ // Delete item in save passwords section. |
+ deleteItemWithWait(2, 0); |
+ EXPECT_EQ(3, NumberOfSections()); |
+ // Section 2 should now be the blacklisted passwords section, and should still |
+ // have both its items. |
+ EXPECT_EQ(2, NumberOfItemsInSection(2)); |
+ |
+ // Delete item in blacklisted passwords section. |
+ deleteItemWithWait(2, 0); |
+ EXPECT_EQ(1, NumberOfItemsInSection(2)); |
+ deleteItemWithWait(2, 0); |
+ // There should be no password sections remaining. |
+ EXPECT_EQ(2, NumberOfSections()); |
+} |
+ |
+} // namespace |