blob: bed1b6b78237a096b983a7c3536a329c49be2c3f [file] [log] [blame]
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +01001// Copyright (c) 2013 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#import "chrome/browser/ui/cocoa/autofill/autofill_section_container.h"
6
7#include "base/mac/foundation_util.h"
Ben Murdocheb525c52013-07-10 11:40:50 +01008#include "base/mac/scoped_nsobject.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01009#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010010#include "chrome/browser/ui/autofill/autofill_dialog_models.h"
Ben Murdoch32409262013-08-07 11:04:47 +010011#include "chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010012#import "chrome/browser/ui/cocoa/autofill/autofill_input_field.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010013#import "chrome/browser/ui/cocoa/autofill/layout_view.h"
14#import "chrome/browser/ui/cocoa/menu_button.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010015#include "testing/gtest/include/gtest/gtest.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010016#include "testing/gtest_mac.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010017#include "testing/platform_test.h"
18#include "ui/base/models/combobox_model.h"
19#include "ui/base/models/simple_menu_model.h"
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000020#import "ui/gfx/test/ui_cocoa_test_helper.h"
21
22using base::ASCIIToUTF16;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010023
24namespace {
25
26class AutofillSectionContainerTest : public ui::CocoaTest {
27 public:
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010028 AutofillSectionContainerTest() : section_(autofill::SECTION_BILLING) {}
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010029 virtual void SetUp() {
30 CocoaTest::SetUp();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010031 ResetContainer();
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010032 }
33
34 void ResetContainer() {
35 container_.reset(
36 [[AutofillSectionContainer alloc]
Ben Murdoch32409262013-08-07 11:04:47 +010037 initWithDelegate:&delegate_
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010038 forSection:section_]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010039 [[test_window() contentView] setSubviews:@[ [container_ view] ]];
40 }
41
42 protected:
Ben Murdocheb525c52013-07-10 11:40:50 +010043 base::scoped_nsobject<AutofillSectionContainer> container_;
Ben Murdoch32409262013-08-07 11:04:47 +010044 testing::NiceMock<autofill::MockAutofillDialogViewDelegate> delegate_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010045 autofill::DialogSection section_;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010046};
47
48} // namespace
49
50TEST_VIEW(AutofillSectionContainerTest, [container_ view])
51
52TEST_F(AutofillSectionContainerTest, HasSubviews) {
53 bool hasLayoutView = false;
54 bool hasTextField = false;
55 bool hasSuggestButton = false;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010056 bool hasSuggestionView = false;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010057
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010058 ASSERT_EQ(4U, [[[container_ view] subviews] count]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010059 for (NSView* view in [[container_ view] subviews]) {
60 if ([view isKindOfClass:[NSTextField class]]) {
61 hasTextField = true;
62 } else if ([view isKindOfClass:[LayoutView class]]) {
63 hasLayoutView = true;
64 } else if ([view isKindOfClass:[MenuButton class]]) {
65 hasSuggestButton = true;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010066 } else if ([view isKindOfClass:[NSView class]]) {
67 hasSuggestionView = true;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010068 }
69 }
70
71 EXPECT_TRUE(hasSuggestButton);
72 EXPECT_TRUE(hasLayoutView);
73 EXPECT_TRUE(hasTextField);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010074 EXPECT_TRUE(hasSuggestionView);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010075}
76
77TEST_F(AutofillSectionContainerTest, ModelsPopulateComboboxes) {
78 using namespace autofill;
79 using namespace testing;
80
81 const DetailInput kTestInputs[] = {
Torne (Richard Coles)a3f6a492013-12-18 16:25:09 +000082 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH },
83 { DetailInput::SHORT, CREDIT_CARD_EXP_4_DIGIT_YEAR },
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010084 };
85
86 DetailInputs inputs;
87 inputs.push_back(kTestInputs[0]);
Ben Murdochba5b9a62013-08-12 14:20:17 +010088 inputs.push_back(kTestInputs[1]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010089
Ben Murdochba5b9a62013-08-12 14:20:17 +010090 autofill::MonthComboboxModel monthComboModel;
91 autofill::YearComboboxModel yearComboModel;
Ben Murdoch32409262013-08-07 11:04:47 +010092 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_))
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010093 .WillOnce(ReturnRef(inputs));
Ben Murdoch32409262013-08-07 11:04:47 +010094 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH))
Ben Murdochba5b9a62013-08-12 14:20:17 +010095 .WillRepeatedly(Return(&monthComboModel));
96 EXPECT_CALL(
97 delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR))
98 .WillRepeatedly(Return(&yearComboModel));
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010099 ResetContainer();
100
101 NSPopUpButton* popup = base::mac::ObjCCastStrict<NSPopUpButton>(
102 [container_ getField:CREDIT_CARD_EXP_MONTH]);
103 EXPECT_EQ(13, [popup numberOfItems]);
Ben Murdochba5b9a62013-08-12 14:20:17 +0100104 EXPECT_NSEQ(@"Month", [popup itemTitleAtIndex:0]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100105 EXPECT_NSEQ(@"01", [popup itemTitleAtIndex:1]);
106 EXPECT_NSEQ(@"02", [popup itemTitleAtIndex:2]);
107 EXPECT_NSEQ(@"03", [popup itemTitleAtIndex:3]);
108 EXPECT_NSEQ(@"12", [popup itemTitleAtIndex:12]);
Ben Murdochba5b9a62013-08-12 14:20:17 +0100109
110 NSPopUpButton* yearPopup = base::mac::ObjCCastStrict<NSPopUpButton>(
111 [container_ getField:CREDIT_CARD_EXP_4_DIGIT_YEAR]);
112 EXPECT_EQ(11, [yearPopup numberOfItems]);
113 EXPECT_NSEQ(@"Year", [yearPopup itemTitleAtIndex:0]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100114};
115
116TEST_F(AutofillSectionContainerTest, OutputMatchesDefinition) {
117 using namespace autofill;
118 using namespace testing;
119
120 const DetailInput kTestInputs[] = {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000121 { DetailInput::LONG, EMAIL_ADDRESS },
Torne (Richard Coles)a3f6a492013-12-18 16:25:09 +0000122 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH },
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100123 };
124 autofill::MonthComboboxModel comboModel;
125 DetailInputs inputs;
126 inputs.push_back(kTestInputs[0]);
127 inputs.push_back(kTestInputs[1]);
128
Ben Murdoch32409262013-08-07 11:04:47 +0100129 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_))
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100130 .WillOnce(ReturnRef(inputs));
Ben Murdoch32409262013-08-07 11:04:47 +0100131 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS))
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100132 .WillRepeatedly(ReturnNull());
Ben Murdoch32409262013-08-07 11:04:47 +0100133 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH))
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100134 .WillRepeatedly(Return(&comboModel));
135
136 ResetContainer();
137
138 NSPopUpButton* popup = base::mac::ObjCCastStrict<NSPopUpButton>(
139 [container_ getField:CREDIT_CARD_EXP_MONTH]);
140 [popup selectItemWithTitle:@"02"];
141 [[container_ getField:EMAIL_ADDRESS] setStringValue:@"magic@example.org"];
142
Torne (Richard Coles)f2477e02013-11-28 11:55:43 +0000143 autofill::FieldValueMap output;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100144 [container_ getInputs:&output];
145
146 ASSERT_EQ(inputs.size(), output.size());
Torne (Richard Coles)f2477e02013-11-28 11:55:43 +0000147 EXPECT_EQ(ASCIIToUTF16("magic@example.org"), output[inputs[0].type]);
148 EXPECT_EQ(ASCIIToUTF16("02"), output[inputs[1].type]);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100149}
150
151TEST_F(AutofillSectionContainerTest, SuggestionsPopulatedByController) {
152 ui::SimpleMenuModel model(NULL);
153 model.AddItem(10, ASCIIToUTF16("a"));
154 model.AddItem(11, ASCIIToUTF16("b"));
155
156 using namespace autofill;
157 using namespace testing;
158
Ben Murdoch32409262013-08-07 11:04:47 +0100159 EXPECT_CALL(delegate_, MenuModelForSection(section_))
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100160 .WillOnce(Return(&model));
161
162 ResetContainer();
163 MenuButton* button = nil;
164 for (id item in [[container_ view] subviews]) {
165 if ([item isKindOfClass:[MenuButton class]]) {
166 button = item;
167 break;
168 }
169 }
170
171 NSMenu* menu = [button attachedMenu];
172 // Expect _three_ items - popup menus need an empty first item.
173 ASSERT_EQ(3, [menu numberOfItems]);
174
175 EXPECT_NSEQ(@"a", [[menu itemAtIndex:1] title]);
176 EXPECT_NSEQ(@"b", [[menu itemAtIndex:2] title]);
Ben Murdocheb525c52013-07-10 11:40:50 +0100177}
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100178
179TEST_F(AutofillSectionContainerTest, FieldsAreInitiallyValid) {
180 using namespace autofill;
181 using namespace testing;
182
183 const DetailInput kTestInputs[] = {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000184 { DetailInput::LONG, EMAIL_ADDRESS },
Torne (Richard Coles)a3f6a492013-12-18 16:25:09 +0000185 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH },
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100186 };
187
188 MonthComboboxModel comboModel;
189 DetailInputs inputs;
190 inputs.push_back(kTestInputs[0]);
191 inputs.push_back(kTestInputs[1]);
192
Ben Murdoch32409262013-08-07 11:04:47 +0100193 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100194 .WillOnce(ReturnRef(inputs));
Ben Murdoch32409262013-08-07 11:04:47 +0100195 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100196 .WillRepeatedly(ReturnNull());
Ben Murdoch32409262013-08-07 11:04:47 +0100197 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100198 .WillRepeatedly(Return(&comboModel));
199
200 ResetContainer();
201 NSControl<AutofillInputField>* field = [container_ getField:EMAIL_ADDRESS];
202 EXPECT_FALSE([field invalid]);
203 field = [container_ getField:CREDIT_CARD_EXP_MONTH];
204 EXPECT_FALSE([field invalid]);
205}
206
207TEST_F(AutofillSectionContainerTest, ControllerInformsValidity) {
208 using namespace autofill;
209 using namespace testing;
210
211 const DetailInput kTestInputs[] = {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000212 { DetailInput::LONG, EMAIL_ADDRESS },
213 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH },
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100214 };
215
216 MonthComboboxModel comboModel;
217 DetailInputs inputs;
218 inputs.push_back(kTestInputs[0]);
219 inputs.push_back(kTestInputs[1]);
220
Torne (Richard Coles)4e180b62013-10-18 15:46:22 +0100221 ValidityMessages validity, validity2;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100222
Torne (Richard Coles)4e180b62013-10-18 15:46:22 +0100223 validity.Set(EMAIL_ADDRESS,
224 ValidityMessage(ASCIIToUTF16("Some error message"), false));
225 validity2.Set(CREDIT_CARD_EXP_MONTH,
226 ValidityMessage(ASCIIToUTF16("Some other error message"), false));
Ben Murdoch32409262013-08-07 11:04:47 +0100227 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100228 .WillOnce(ReturnRef(inputs));
Ben Murdoch32409262013-08-07 11:04:47 +0100229 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100230 .WillRepeatedly(ReturnNull());
Ben Murdoch32409262013-08-07 11:04:47 +0100231 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100232 .WillRepeatedly(Return(&comboModel));
233
234 ResetContainer();
Torne (Richard Coles)f2477e02013-11-28 11:55:43 +0000235 autofill::FieldValueMap output;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100236 [container_ getInputs:&output];
Torne (Richard Coles)4e180b62013-10-18 15:46:22 +0100237 EXPECT_CALL(delegate_, InputsAreValid(section_, output))
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100238 .WillOnce(Return(validity))
239 .WillOnce(Return(validity2));
240
241 [container_ validateFor:VALIDATE_FINAL];
242 NSControl<AutofillInputField>* field = [container_ getField:EMAIL_ADDRESS];
243 EXPECT_TRUE([field invalid]);
244 field = [container_ getField:CREDIT_CARD_EXP_MONTH];
245 EXPECT_FALSE([field invalid]);
246
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100247 [container_ validateFor:VALIDATE_FINAL];
248 field = [container_ getField:EMAIL_ADDRESS];
249 EXPECT_FALSE([field invalid]);
250 field = [container_ getField:CREDIT_CARD_EXP_MONTH];
251 EXPECT_TRUE([field invalid]);
Ben Murdoch32409262013-08-07 11:04:47 +0100252}