1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_pending_view_controller.h"
7 #include "base/mac/scoped_nsobject.h"
8 #include "base/strings/string16.h"
9 #include "base/strings/utf_string_conversions.h"
10 #import "chrome/browser/ui/cocoa/bubble_combobox.h"
11 #include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
12 #import "chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_pending_view_controller.h"
13 #include "chrome/browser/ui/cocoa/passwords/manage_passwords_controller_test.h"
14 #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h"
15 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h"
16 #include "chrome/browser/ui/passwords/save_password_refusal_combobox_model.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "testing/gtest_mac.h"
20 @interface ManagePasswordsBubblePendingViewTestDelegate
21 : NSObject<ManagePasswordsBubblePendingViewDelegate> {
25 @property(readonly) BOOL dismissed;
26 @property(readonly) BOOL neverSave;
29 @implementation ManagePasswordsBubblePendingViewTestDelegate
31 @synthesize dismissed = dismissed_;
32 @synthesize neverSave = neverSave_;
34 - (void)viewShouldDismiss {
38 - (void)passwordShouldNeverBeSavedOnSiteWithExistingPasswords {
46 void ClickMenuItem(BubbleCombobox* button, int index) {
47 // Skip the title if applicable.
49 performActionForItemAtIndex:(button.pullsDown ? index + 1 : index)];
52 class ManagePasswordsBubblePendingViewControllerTest
53 : public ManagePasswordsControllerTest {
55 ManagePasswordsBubblePendingViewControllerTest() : controller_(nil) {}
57 virtual void SetUp() override {
58 ManagePasswordsControllerTest::SetUp();
60 [[ManagePasswordsBubblePendingViewTestDelegate alloc] init]);
61 ui_controller()->SetState(password_manager::ui::PENDING_PASSWORD_STATE);
64 ManagePasswordsBubblePendingViewTestDelegate* delegate() {
65 return delegate_.get();
68 ManagePasswordsBubblePendingViewController* controller() {
70 controller_.reset([[ManagePasswordsBubblePendingViewController alloc]
72 delegate:delegate()]);
73 [controller_ loadView];
75 return controller_.get();
79 base::scoped_nsobject<ManagePasswordsBubblePendingViewController> controller_;
80 base::scoped_nsobject<ManagePasswordsBubblePendingViewTestDelegate> delegate_;
83 TEST_F(ManagePasswordsBubblePendingViewControllerTest,
84 ShouldSavePasswordAndDismissWhenSaveClicked) {
85 [controller().saveButton performClick:nil];
87 EXPECT_TRUE([delegate() dismissed]);
88 EXPECT_TRUE(ui_controller()->saved_password());
89 EXPECT_FALSE(ui_controller()->never_saved_password());
92 TEST_F(ManagePasswordsBubblePendingViewControllerTest,
93 ShouldNopeAndDismissWhenNopeClicked) {
94 BubbleCombobox* nopeButton = [controller() nopeButton];
95 ClickMenuItem(nopeButton, SavePasswordRefusalComboboxModel::INDEX_NOPE);
97 EXPECT_TRUE([delegate() dismissed]);
98 EXPECT_FALSE(ui_controller()->saved_password());
99 EXPECT_FALSE(ui_controller()->never_saved_password());
102 TEST_F(ManagePasswordsBubblePendingViewControllerTest,
103 ShouldNeverSaveAndDismissWhenNeverSaveClickedWithoutAnyBestMatches) {
104 BubbleCombobox* nopeButton = [controller() nopeButton];
105 ClickMenuItem(nopeButton,
106 SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE);
108 EXPECT_TRUE([delegate() dismissed]);
109 EXPECT_FALSE(ui_controller()->saved_password());
110 EXPECT_TRUE(ui_controller()->never_saved_password());
113 TEST_F(ManagePasswordsBubblePendingViewControllerTest,
114 ShouldConfirmNeverSaveWhenNeverSaveClickedOnSiteWithPasswordsSaved) {
116 autofill::PasswordForm form;
117 form.username_value = base::ASCIIToUTF16("username");
118 form.password_value = base::ASCIIToUTF16("password");
119 autofill::ConstPasswordFormMap map;
120 map[base::ASCIIToUTF16("username")] = &form;
121 ui_controller()->SetPasswordFormMap(map);
122 EXPECT_FALSE(model()->best_matches().empty());
124 BubbleCombobox* nopeButton = [controller() nopeButton];
125 ClickMenuItem(nopeButton,
126 SavePasswordRefusalComboboxModel::INDEX_NEVER_FOR_THIS_SITE);
128 EXPECT_TRUE([delegate() neverSave]);
129 EXPECT_FALSE(ui_controller()->saved_password());
130 EXPECT_FALSE(ui_controller()->never_saved_password());