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..97e7048e405f7a24ed4f2df4361ce3dea660e111 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/passwords/credential_item_view_unittest.mm |
@@ -0,0 +1,184 @@ |
+// 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 "testing/gtest_mac.h" |
+#import "third_party/ocmock/OCMock/OCMock.h" |
+#include "third_party/ocmock/gtest_support.h" |
+#include "ui/gfx/image/image.h" |
+ |
+@interface CredentialItemView(Testing) |
+@property(nonatomic, readonly) NSTextField* nameLabel; |
+@property(nonatomic, readonly) NSTextField* usernameLabel; |
+@property(nonatomic, readonly) NSImageView* avatarView; |
+@end |
+ |
+// A test implementation of a CredentialItemDelegate to stub out interactions. |
+@interface CredentialItemTestDelegate : NSObject<CredentialItemDelegate> |
+@property(nonatomic, readonly) BOOL didFetchAvatar; |
+@property(nonatomic, readonly) GURL fetchedAvatarURL; |
+@property(nonatomic, readonly) CredentialItemView* viewForFetchedAvatar; |
+@property(nonatomic, readonly) BOOL didSelectPasswordForm; |
+@property(nonatomic, readonly) autofill::PasswordForm selectedPasswordForm; |
+@property(nonatomic, 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 { |
+ |
+// Determines whether |left| and |right| have the same data representation. |
+// Necessary because [CredentialItemView defaultAvatar] does some ImageSkia |
+// stuff that creates new NSImage instances. |
+bool ImagesEqual(NSImage* left, NSImage* right) { |
dconnelly
2015/03/04 12:30:54
This had to come back. See comment.
groby-ooo-7-16
2015/03/04 16:17:59
Ah well - it was worth a try :)
|
+ 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; |
+ 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_; |
+}; |
+ |
+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)); |
+ |
+ [item updateAvatar:nil]; |
+ EXPECT_FALSE([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)); |
+ |
+ [item updateAvatar:nil]; |
+ EXPECT_FALSE([item avatarView].image); |
+} |
+ |
+} // namespace |