1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "chrome/browser/ui/cocoa/browser/edit_search_engine_cocoa_controller.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/search_engines/template_url.h"
9 #include "chrome/browser/search_engines/template_url_service_factory.h"
10 #include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
11 #include "chrome/test/base/testing_profile.h"
12 #include "grit/generated_resources.h"
13 #include "grit/theme_resources.h"
14 #include "grit/ui_resources.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #import "testing/gtest_mac.h"
17 #include "testing/platform_test.h"
18 #include "ui/base/l10n/l10n_util_mac.h"
19 #include "ui/base/resource/resource_bundle.h"
20 #include "ui/gfx/image/image.h"
22 @interface FakeEditSearchEngineController : EditSearchEngineCocoaController
24 - (NSTextField*)nameField;
25 - (NSTextField*)keywordField;
26 - (NSTextField*)urlField;
27 - (NSImageView*)nameImage;
28 - (NSImageView*)keywordImage;
29 - (NSImageView*)urlImage;
30 - (NSButton*)doneButton;
32 - (NSImage*)goodImage;
37 @implementation FakeEditSearchEngineController
39 - (NSTextField*)nameField {
43 - (NSTextField*)keywordField {
47 - (NSTextField*)urlField {
51 - (NSImageView*)nameImage {
55 - (NSImageView*)keywordImage {
59 - (NSImageView*)urlImage {
63 - (NSButton*)doneButton {
67 - (NSImage*)goodImage {
68 ui::ResourceBundle& rb = ResourceBundle::GetSharedInstance();
69 return rb.GetNativeImageNamed(IDR_INPUT_GOOD).ToNSImage();
72 - (NSImage*)badImage {
73 ui::ResourceBundle& rb = ResourceBundle::GetSharedInstance();
74 return rb.GetNativeImageNamed(IDR_INPUT_ALERT).ToNSImage();
81 class EditSearchEngineControllerTest : public CocoaProfileTest {
83 virtual void SetUp() {
84 CocoaProfileTest::SetUp();
85 ASSERT_TRUE(profile());
87 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
88 profile(), &TemplateURLServiceFactory::BuildInstanceFor);
90 [[FakeEditSearchEngineController alloc] initWithProfile:profile()
95 virtual void TearDown() {
96 // Force the window to load so we hit |-awakeFromNib| to register as the
97 // window's delegate so that the controller can clean itself up in
98 // |-windowWillClose:|.
99 ASSERT_TRUE([controller_ window]);
102 CocoaProfileTest::TearDown();
105 FakeEditSearchEngineController* controller_;
108 TEST_F(EditSearchEngineControllerTest, ValidImageOriginals) {
109 EXPECT_TRUE([controller_ window]); // Force the window to load.
111 EXPECT_TRUE([[controller_ goodImage] isKindOfClass:[NSImage class]]);
112 EXPECT_TRUE([[controller_ badImage] isKindOfClass:[NSImage class]]);
114 // Test window title is set correctly.
115 NSString* title = l10n_util::GetNSString(
116 IDS_SEARCH_ENGINES_EDITOR_NEW_WINDOW_TITLE);
117 EXPECT_NSEQ(title, [[controller_ window] title]);
120 TEST_F(EditSearchEngineControllerTest, SetImageViews) {
121 EXPECT_TRUE([controller_ window]); // Force the window to load.
122 EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
123 // An empty keyword is not OK.
124 EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
125 EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
128 // This test ensures that on creating a new keyword, we are in an "invalid"
129 // state that cannot save.
130 TEST_F(EditSearchEngineControllerTest, InvalidState) {
131 EXPECT_TRUE([controller_ window]); // Force window to load.
132 NSString* toolTip = nil;
133 EXPECT_FALSE([controller_ validateFields]);
135 EXPECT_NSEQ(@"", [[controller_ nameField] stringValue]);
136 EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
137 toolTip = l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_TITLE_TT);
138 EXPECT_NSEQ(toolTip, [[controller_ nameField] toolTip]);
139 EXPECT_NSEQ(toolTip, [[controller_ nameImage] toolTip]);
141 // Keywords can not be empty strings.
142 EXPECT_NSEQ(@"", [[controller_ keywordField] stringValue]);
143 EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
144 EXPECT_TRUE([[controller_ keywordField] toolTip]);
145 EXPECT_TRUE([[controller_ keywordImage] toolTip]);
147 EXPECT_NSEQ(@"", [[controller_ urlField] stringValue]);
148 EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
149 toolTip = l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_URL_TT);
150 EXPECT_NSEQ(toolTip, [[controller_ urlField] toolTip]);
151 EXPECT_NSEQ(toolTip, [[controller_ urlImage] toolTip]);
154 // Tests that the single name field validates.
155 TEST_F(EditSearchEngineControllerTest, ValidateName) {
156 EXPECT_TRUE([controller_ window]); // Force window to load.
158 EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
159 EXPECT_FALSE([controller_ validateFields]);
161 l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_TITLE_TT);
162 EXPECT_NSEQ(toolTip, [[controller_ nameField] toolTip]);
163 EXPECT_NSEQ(toolTip, [[controller_ nameImage] toolTip]);
164 [[controller_ nameField] setStringValue:@"Test Name"];
165 EXPECT_FALSE([controller_ validateFields]);
166 EXPECT_EQ([controller_ goodImage], [[controller_ nameImage] image]);
167 EXPECT_FALSE([[controller_ nameField] toolTip]);
168 EXPECT_FALSE([[controller_ nameImage] toolTip]);
169 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
172 // The keyword field is not valid if it is empty.
173 TEST_F(EditSearchEngineControllerTest, ValidateKeyword) {
174 EXPECT_TRUE([controller_ window]); // Force window load.
176 EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
177 EXPECT_FALSE([controller_ validateFields]);
178 EXPECT_TRUE([[controller_ keywordField] toolTip]);
179 EXPECT_TRUE([[controller_ keywordImage] toolTip]);
180 [[controller_ keywordField] setStringValue:@"foobar"];
181 EXPECT_FALSE([controller_ validateFields]);
182 EXPECT_EQ([controller_ goodImage], [[controller_ keywordImage] image]);
183 EXPECT_FALSE([[controller_ keywordField] toolTip]);
184 EXPECT_FALSE([[controller_ keywordImage] toolTip]);
185 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
188 // Tests that the URL field validates.
189 TEST_F(EditSearchEngineControllerTest, ValidateURL) {
190 EXPECT_TRUE([controller_ window]); // Force window to load.
192 EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
193 EXPECT_FALSE([controller_ validateFields]);
195 l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_URL_TT);
196 EXPECT_NSEQ(toolTip, [[controller_ urlField] toolTip]);
197 EXPECT_NSEQ(toolTip, [[controller_ urlImage] toolTip]);
198 [[controller_ urlField] setStringValue:@"http://foo-bar.com"];
199 EXPECT_FALSE([controller_ validateFields]);
200 EXPECT_EQ([controller_ goodImage], [[controller_ urlImage] image]);
201 EXPECT_FALSE([[controller_ urlField] toolTip]);
202 EXPECT_FALSE([[controller_ urlImage] toolTip]);
203 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
206 // Tests that if the user enters all valid data that the UI reflects that
207 // and that they can save.
208 TEST_F(EditSearchEngineControllerTest, ValidateFields) {
209 EXPECT_TRUE([controller_ window]); // Force window to load.
211 // State before entering data.
212 EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
213 EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
214 EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
215 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
216 EXPECT_FALSE([controller_ validateFields]);
218 [[controller_ nameField] setStringValue:@"Test Name"];
219 EXPECT_FALSE([controller_ validateFields]);
220 EXPECT_EQ([controller_ goodImage], [[controller_ nameImage] image]);
221 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
223 [[controller_ keywordField] setStringValue:@"foobar"];
224 EXPECT_FALSE([controller_ validateFields]);
225 EXPECT_EQ([controller_ goodImage], [[controller_ keywordImage] image]);
226 EXPECT_FALSE([[controller_ doneButton] isEnabled]);
228 // Once the URL is entered, we should have all 3 valid fields.
229 [[controller_ urlField] setStringValue:@"http://foo-bar.com"];
230 EXPECT_TRUE([controller_ validateFields]);
231 EXPECT_EQ([controller_ goodImage], [[controller_ urlImage] image]);
232 EXPECT_TRUE([[controller_ doneButton] isEnabled]);
235 // Tests editing an existing TemplateURL.
236 TEST_F(EditSearchEngineControllerTest, EditTemplateURL) {
237 TemplateURLData data;
238 data.short_name = ASCIIToUTF16("Foobar");
239 data.SetKeyword(ASCIIToUTF16("keyword"));
240 std::string urlString = TemplateURLRef::DisplayURLToURLRef(
241 ASCIIToUTF16("http://foo-bar.com"));
242 data.SetURL(urlString);
243 TemplateURL url(profile(), data);
244 FakeEditSearchEngineController *controller =
245 [[FakeEditSearchEngineController alloc] initWithProfile:profile()
248 EXPECT_TRUE([controller window]);
249 NSString* title = l10n_util::GetNSString(
250 IDS_SEARCH_ENGINES_EDITOR_EDIT_WINDOW_TITLE);
251 EXPECT_NSEQ(title, [[controller window] title]);
252 NSString* nameString = [[controller nameField] stringValue];
253 EXPECT_NSEQ(@"Foobar", nameString);
254 NSString* keywordString = [[controller keywordField] stringValue];
255 EXPECT_NSEQ(@"keyword", keywordString);
256 NSString* urlValueString = [[controller urlField] stringValue];
257 EXPECT_NSEQ(@"http://foo-bar.com", urlValueString);
258 EXPECT_TRUE([controller validateFields]);