Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3189)

Unified Diff: chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm

Issue 878743007: Implement CredentialItemView and tests for the Mac account chooser. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm
diff --git a/chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm b/chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..30a22f3df63fa54fb4bf7df291d46513695ee793
--- /dev/null
+++ b/chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm
@@ -0,0 +1,199 @@
+// 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 "chrome/browser/ui/cocoa/passwords/credential_item_view.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
+#include "grit/theme_resources.h"
+#include "testing/gtest_mac.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#include "third_party/ocmock/gtest_support.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/image/image.h"
+
+// A test implementation of a CredentialItemDelegate to stub out interactions.
+@interface CredentialItemTestDelegate : NSObject<CredentialItemDelegate>
+@property(readonly) BOOL didFetchAvatar;
+@property(readonly) GURL fetchedAvatarURL;
+@property(readonly) CredentialItemView* viewForFetchedAvatar;
+@property(readonly) BOOL didSelectPasswordForm;
+@property(readonly) autofill::PasswordForm selectedPasswordForm;
+@property(readonly) password_manager::CredentialType selectedCredentialType;
+@end
+
+@implementation CredentialItemTestDelegate
+@synthesize didFetchAvatar = didFetchAvatar_;
+@synthesize fetchedAvatarURL = fetchedAvatarURL_;
+@synthesize viewForFetchedAvatar = viewForFetchedAvatar_;
+@synthesize didSelectPasswordForm = didSelectPasswordForm_;
+@synthesize selectedPasswordForm = selectedPasswordForm_;
+@synthesize selectedCredentialType = selectedCredentialType_;
+
+- (void)fetchAvatar:(const GURL&)avatarURL forView:(CredentialItemView*)view {
+ didFetchAvatar_ = YES;
+ fetchedAvatarURL_ = avatarURL;
+ viewForFetchedAvatar_ = view;
+}
+
+- (void)selectPasswordForm:(const autofill::PasswordForm&)passwordForm
+ credentialType:(password_manager::CredentialType)credentialType {
+ didSelectPasswordForm_ = YES;
+ selectedPasswordForm_ = passwordForm;
+ selectedCredentialType_ = credentialType;
+}
+
+@end
+
+namespace {
+
+// Returns an NSImage suitable for use as a test avatar.
+NSImage* TestAvatar() {
+ return ResourceBundle::GetSharedInstance()
groby-ooo-7-16 2015/02/19 17:01:33 Why not just use an empty NSImage and skip using t
dconnelly 2015/02/20 15:36:06 Done.
+ .GetNativeImageNamed(IDR_BOOKMARK_BAR_FOLDER)
+ .ToNSImage();
+}
+
+// Determines whether |left| and |right| have the same data representation.
+bool ImagesEqual(NSImage* left, NSImage* right) {
groby-ooo-7-16 2015/02/19 17:01:33 Do you need this byte-by-byte comparison? Isn't EX
dconnelly 2015/02/20 15:36:06 Done.
+ if (!left || !right)
+ return left == right;
+ gfx::Image leftImage([left copy]);
+ gfx::Image rightImage([right copy]);
+ return leftImage.As1xPNGBytes()->Equals(rightImage.As1xPNGBytes());
+}
+
+// Returns a PasswordForm with only a username.
+autofill::PasswordForm BasicCredential() {
+ autofill::PasswordForm credential;
groby-ooo-7-16 2015/02/19 17:01:33 I vaguely recall autofill has various test helpers
dconnelly 2015/02/20 15:36:06 These are pretty basic and skip everything that ac
+ credential.username_value = base::ASCIIToUTF16("taco");
+ return credential;
+}
+
+// Returns a PasswordForm with a username and display name.
+autofill::PasswordForm CredentialWithName() {
+ autofill::PasswordForm credential;
+ credential.username_value = base::ASCIIToUTF16("pizza");
+ credential.display_name = base::ASCIIToUTF16("margherita pizza");
+ return credential;
+}
+
+// Returns a PasswordForm with a username and avatar URL.
+autofill::PasswordForm CredentialWithAvatar() {
+ autofill::PasswordForm credential;
+ credential.username_value = base::ASCIIToUTF16("sandwich");
+ credential.avatar_url = GURL("http://sandwich.com/pastrami.jpg");
+ return credential;
+}
+
+// Returns a PasswordForm with a username, display name, and avatar URL.
+autofill::PasswordForm CredentialWithNameAndAvatar() {
+ autofill::PasswordForm credential;
+ credential.username_value = base::ASCIIToUTF16("noodle");
+ credential.display_name = base::ASCIIToUTF16("pasta amatriciana");
+ credential.avatar_url = GURL("http://pasta.com/amatriciana.png");
+ return credential;
+}
+
+// Tests for CredentialItemViewTest.
+class CredentialItemViewTest : public CocoaTest {
+ protected:
+ void SetUp() override {
+ delegate_.reset([[CredentialItemTestDelegate alloc] init]);
+ }
+
+ // Returns a delegate for testing.
+ CredentialItemTestDelegate* delegate() { return delegate_.get(); }
+
+ // Returns an autoreleased view populated from |form|.
+ CredentialItemView* view(const autofill::PasswordForm& form) {
+ return [[[CredentialItemView alloc]
+ initWithPasswordForm:form
+ credentialType:password_manager::CredentialType::
+ CREDENTIAL_TYPE_LOCAL
+ delegate:delegate()] autorelease];
+ }
+
+ private:
+ base::scoped_nsobject<CredentialItemTestDelegate> delegate_;
+};
groby-ooo-7-16 2015/02/19 17:01:33 Please add a TEST_VIEW test
dconnelly 2015/02/20 15:36:06 CredentialItemView can't |display| itself. Should
+
+TEST_F(CredentialItemViewTest, BasicCredential) {
+ autofill::PasswordForm form(BasicCredential());
+ CredentialItemView* item = view(form);
+
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.username_value),
+ [item usernameLabel].stringValue);
+ EXPECT_EQ(nil, [item nameLabel]);
+ EXPECT_FALSE([delegate() didFetchAvatar]);
+ EXPECT_TRUE(
+ ImagesEqual([CredentialItemView defaultAvatar], [item avatarView].image));
+}
+
+TEST_F(CredentialItemViewTest, CredentialWithName) {
+ autofill::PasswordForm form(CredentialWithName());
+ CredentialItemView* item = view(form);
+
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.username_value),
+ [item usernameLabel].stringValue);
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.display_name),
+ [item nameLabel].stringValue);
+ EXPECT_FALSE([delegate() didFetchAvatar]);
+ EXPECT_TRUE(
+ ImagesEqual([CredentialItemView defaultAvatar], [item avatarView].image));
+}
+
+TEST_F(CredentialItemViewTest, CredentialWithAvatar) {
+ autofill::PasswordForm form(CredentialWithAvatar());
+ CredentialItemView* item = view(form);
+
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.username_value),
+ [item usernameLabel].stringValue);
+ EXPECT_EQ(nil, [item nameLabel]);
+ EXPECT_TRUE([delegate() didFetchAvatar]);
+ EXPECT_EQ(form.avatar_url, [delegate() fetchedAvatarURL]);
+ EXPECT_EQ(item, [delegate() viewForFetchedAvatar]);
+ EXPECT_TRUE(
+ ImagesEqual([CredentialItemView defaultAvatar], [item avatarView].image));
+
+ NSImage* testAvatar = TestAvatar();
+ [item updateAvatar:testAvatar];
+ EXPECT_TRUE(ImagesEqual(testAvatar, [item avatarView].image));
+}
+
+TEST_F(CredentialItemViewTest, CredentialWithNameAndAvatar) {
+ autofill::PasswordForm form(CredentialWithNameAndAvatar());
+ CredentialItemView* item = view(form);
+
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.username_value),
+ [item usernameLabel].stringValue);
+ EXPECT_NSEQ(base::SysUTF16ToNSString(form.display_name),
+ [item nameLabel].stringValue);
+ EXPECT_TRUE([delegate() didFetchAvatar]);
+ EXPECT_EQ(form.avatar_url, [delegate() fetchedAvatarURL]);
+ EXPECT_EQ(item, [delegate() viewForFetchedAvatar]);
+ EXPECT_TRUE(
+ ImagesEqual([CredentialItemView defaultAvatar], [item avatarView].image));
+
+ NSImage* testAvatar = TestAvatar();
+ [item updateAvatar:testAvatar];
+ EXPECT_TRUE(ImagesEqual(testAvatar, [item avatarView].image));
+}
+
+TEST_F(CredentialItemViewTest, ClickNotifiesDelegate) {
+ autofill::PasswordForm form(BasicCredential());
+ CredentialItemView* item = view(form);
+
+ EXPECT_FALSE([delegate() didSelectPasswordForm]);
+ [item performClick:nil];
+ EXPECT_TRUE([delegate() didSelectPasswordForm]);
+ EXPECT_EQ(form, [delegate() selectedPasswordForm]);
+ EXPECT_EQ(password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL,
+ [delegate() selectedCredentialType]);
+ EXPECT_TRUE(
+ ImagesEqual([CredentialItemView defaultAvatar], [item avatarView].image));
+}
+
+} // namespace

Powered by Google App Engine
This is Rietveld 408576698