media_galleries_dialog_cocoa_unittest.mm revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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.
4
5#include "base/strings/string_number_conversions.h"
6#include "base/strings/utf_string_conversions.h"
7#include "chrome/browser/media_galleries/media_galleries_dialog_controller_mock.h"
8#include "chrome/browser/storage_monitor/storage_info.h"
9#include "chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.h"
10#include "chrome/common/extensions/extension.h"
11#include "chrome/common/extensions/extension_test_util.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14using ::testing::_;
15using ::testing::NiceMock;
16using ::testing::Return;
17using ::testing::ReturnPointee;
18using ::testing::ReturnRef;
19
20MediaGalleryPrefInfo MakePrefInfoForTesting(MediaGalleryPrefId pref_id) {
21  MediaGalleryPrefInfo gallery;
22  gallery.pref_id = pref_id;
23  gallery.device_id =
24      StorageInfo::MakeDeviceId(StorageInfo::FIXED_MASS_STORAGE,
25                                base::Int64ToString(pref_id));
26  gallery.display_name = ASCIIToUTF16("name");
27  return gallery;
28}
29
30class MediaGalleriesDialogTest : public testing::Test {
31 public:
32  MediaGalleriesDialogTest() {}
33  virtual ~MediaGalleriesDialogTest() {}
34  virtual void SetUp() OVERRIDE {
35    dummy_extension_ = extension_test_util::CreateExtensionWithID("dummy");
36  }
37  virtual void TearDown() OVERRIDE {
38    dummy_extension_ = NULL;
39  }
40
41  const extensions::Extension& dummy_extension() const {
42    return *dummy_extension_;
43  }
44
45 private:
46  scoped_refptr<extensions::Extension> dummy_extension_;
47
48  DISALLOW_COPY_AND_ASSIGN(MediaGalleriesDialogTest);
49};
50
51// Tests that checkboxes are initialized according to the contents of
52// permissions().
53TEST_F(MediaGalleriesDialogTest, InitializeCheckboxes) {
54  NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension());
55
56  MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions;
57  attached_permissions.push_back(
58      MediaGalleriesDialogController::GalleryPermission(
59          MakePrefInfoForTesting(1), true));
60  attached_permissions.push_back(
61      MediaGalleriesDialogController::GalleryPermission(
62          MakePrefInfoForTesting(2), false));
63  EXPECT_CALL(controller, AttachedPermissions()).
64      WillRepeatedly(Return(attached_permissions));
65
66  MediaGalleriesDialogController::GalleryPermissionsVector
67      unattached_permissions;
68  EXPECT_CALL(controller, UnattachedPermissions()).
69      WillRepeatedly(Return(unattached_permissions));
70
71  // Initializing checkboxes should not cause them to be toggled.
72  EXPECT_CALL(controller, DidToggleGalleryId(_, _)).
73      Times(0);
74
75  scoped_ptr<MediaGalleriesDialogCocoa> dialog(
76      static_cast<MediaGalleriesDialogCocoa*>(
77          MediaGalleriesDialog::Create(&controller)));
78  EXPECT_EQ(2U, [dialog->checkboxes_ count]);
79
80  NSButton* checkbox1 = [dialog->checkboxes_ objectAtIndex:0];
81  EXPECT_EQ([checkbox1 state], NSOnState);
82
83  NSButton* checkbox2 = [dialog->checkboxes_ objectAtIndex:1];
84  EXPECT_EQ([checkbox2 state], NSOffState);
85}
86
87// Tests that toggling checkboxes updates the controller.
88TEST_F(MediaGalleriesDialogTest, ToggleCheckboxes) {
89  NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension());
90
91  MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions;
92  attached_permissions.push_back(
93      MediaGalleriesDialogController::GalleryPermission(
94          MakePrefInfoForTesting(1), true));
95  EXPECT_CALL(controller, AttachedPermissions()).
96      WillRepeatedly(Return(attached_permissions));
97
98  MediaGalleriesDialogController::GalleryPermissionsVector
99      unattached_permissions;
100  EXPECT_CALL(controller, UnattachedPermissions()).
101      WillRepeatedly(Return(unattached_permissions));
102
103  scoped_ptr<MediaGalleriesDialogCocoa> dialog(
104      static_cast<MediaGalleriesDialogCocoa*>(
105          MediaGalleriesDialog::Create(&controller)));
106  EXPECT_EQ(1U, [dialog->checkboxes_ count]);
107
108  NSButton* checkbox = [dialog->checkboxes_ objectAtIndex:0];
109  EXPECT_EQ([checkbox state], NSOnState);
110
111  EXPECT_CALL(controller, DidToggleGalleryId(1, false));
112  [checkbox performClick:nil];
113  EXPECT_EQ([checkbox state], NSOffState);
114
115  EXPECT_CALL(controller, DidToggleGalleryId(1, true));
116  [checkbox performClick:nil];
117  EXPECT_EQ([checkbox state], NSOnState);
118}
119
120// Tests that UpdateGalleries will add a new checkbox, but only if it refers to
121// a gallery that the dialog hasn't seen before.
122TEST_F(MediaGalleriesDialogTest, UpdateAdds) {
123  NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension());
124
125  MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions;
126  EXPECT_CALL(controller, AttachedPermissions()).
127      WillRepeatedly(ReturnPointee(&attached_permissions));
128
129  MediaGalleriesDialogController::GalleryPermissionsVector
130      unattached_permissions;
131  EXPECT_CALL(controller, UnattachedPermissions()).
132      WillRepeatedly(Return(unattached_permissions));
133
134  scoped_ptr<MediaGalleriesDialogCocoa> dialog(
135      static_cast<MediaGalleriesDialogCocoa*>(
136          MediaGalleriesDialog::Create(&controller)));
137
138  EXPECT_EQ(0U, [dialog->checkboxes_ count]);
139  CGFloat old_container_height = NSHeight([dialog->checkbox_container_ frame]);
140
141  attached_permissions.push_back(
142      MediaGalleriesDialogController::GalleryPermission(
143          MakePrefInfoForTesting(1), true));
144  dialog->UpdateGalleries();
145  EXPECT_EQ(1U, [dialog->checkboxes_ count]);
146
147  // The checkbox container should be taller.
148  CGFloat new_container_height = NSHeight([dialog->checkbox_container_ frame]);
149  EXPECT_GT(new_container_height, old_container_height);
150  old_container_height = new_container_height;
151
152  attached_permissions.push_back(
153      MediaGalleriesDialogController::GalleryPermission(
154          MakePrefInfoForTesting(2), true));
155  dialog->UpdateGalleries();
156  EXPECT_EQ(2U, [dialog->checkboxes_ count]);
157
158  // The checkbox container should be taller.
159  new_container_height = NSHeight([dialog->checkbox_container_ frame]);
160  EXPECT_GT(new_container_height, old_container_height);
161  old_container_height = new_container_height;
162
163  attached_permissions[1].allowed = false;
164  dialog->UpdateGalleries();
165  EXPECT_EQ(2U, [dialog->checkboxes_ count]);
166
167  // The checkbox container height should not have changed.
168  new_container_height = NSHeight([dialog->checkbox_container_ frame]);
169  EXPECT_EQ(new_container_height, old_container_height);
170}
171
172TEST_F(MediaGalleriesDialogTest, ForgetDeletes) {
173  NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension());
174
175  MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions;
176  EXPECT_CALL(controller, AttachedPermissions()).
177      WillRepeatedly(ReturnPointee(&attached_permissions));
178
179  MediaGalleriesDialogController::GalleryPermissionsVector
180      unattached_permissions;
181  EXPECT_CALL(controller, UnattachedPermissions()).
182      WillRepeatedly(Return(unattached_permissions));
183
184  scoped_ptr<MediaGalleriesDialogCocoa> dialog(
185      static_cast<MediaGalleriesDialogCocoa*>(
186          MediaGalleriesDialog::Create(&controller)));
187
188  // Add a couple of galleries.
189  attached_permissions.push_back(
190      MediaGalleriesDialogController::GalleryPermission(
191          MakePrefInfoForTesting(1), true));
192  dialog->UpdateGalleries();
193  attached_permissions.push_back(
194      MediaGalleriesDialogController::GalleryPermission(
195          MakePrefInfoForTesting(2), true));
196  dialog->UpdateGalleries();
197  EXPECT_EQ(2U, [dialog->checkboxes_ count]);
198  CGFloat old_container_height = NSHeight([dialog->checkbox_container_ frame]);
199
200  // Remove a gallery.
201  attached_permissions.erase(attached_permissions.begin());
202  dialog->UpdateGalleries();
203  EXPECT_EQ(1U, [dialog->checkboxes_ count]);
204
205  // The checkbox container should be shorter.
206  CGFloat new_container_height = NSHeight([dialog->checkbox_container_ frame]);
207  EXPECT_LT(new_container_height, old_container_height);
208}
209