Chromium Code Reviews| 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 |