| Index: ios/chrome/browser/ui/promos/signin_promo_view_controller_unittest.mm
|
| diff --git a/ios/chrome/browser/ui/promos/signin_promo_view_controller_unittest.mm b/ios/chrome/browser/ui/promos/signin_promo_view_controller_unittest.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..417d8d1dcb818288e8d39e17e083dfd6a693c157
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/promos/signin_promo_view_controller_unittest.mm
|
| @@ -0,0 +1,171 @@
|
| +// Copyright 2013 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 <UIKit/UIKit.h>
|
| +
|
| +#include <memory>
|
| +
|
| +#import "base/mac/scoped_nsobject.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/sys_string_conversions.h"
|
| +#include "base/version.h"
|
| +#include "components/pref_registry/pref_registry_syncable.h"
|
| +#include "components/sync_preferences/pref_service_mock_factory.h"
|
| +#include "components/sync_preferences/pref_service_syncable.h"
|
| +#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
|
| +#include "ios/chrome/browser/prefs/browser_prefs.h"
|
| +#include "ios/chrome/browser/signin/authentication_service_factory.h"
|
| +#import "ios/chrome/browser/signin/authentication_service_fake.h"
|
| +#import "ios/chrome/browser/ui/promos/signin_promo_view_controller.h"
|
| +#include "ios/chrome/test/block_cleanup_test.h"
|
| +#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
|
| +#include "ios/web/public/test/test_web_thread_bundle.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#import "third_party/ocmock/OCMock/OCMock.h"
|
| +#import "third_party/ocmock/gtest_support.h"
|
| +
|
| +@interface SigninPromoViewController (ExposedForTesting)
|
| +@property(nonatomic, readonly) UIView* accountsContainer;
|
| +- (void)recordPromoDisplayed;
|
| ++ (base::Version)currentVersion;
|
| +@end
|
| +
|
| +namespace {
|
| +// Fake version used in tests.
|
| +base::Version* gFakeCurrentVersion = nullptr;
|
| +}
|
| +
|
| +@interface FakeVersionSigninPromoViewController : SigninPromoViewController
|
| ++ (void)setFakeCurrentVersion:(const std::string&)fakeCurrentVersion;
|
| ++ (void)clearFakeCurrentVersion;
|
| +@end
|
| +
|
| +@implementation FakeVersionSigninPromoViewController
|
| ++ (base::Version)currentVersion {
|
| + DCHECK(gFakeCurrentVersion);
|
| + return *gFakeCurrentVersion;
|
| +}
|
| +
|
| ++ (void)setFakeCurrentVersion:(const std::string&)fakeCurrentVersion {
|
| + [self clearFakeCurrentVersion];
|
| + gFakeCurrentVersion = new base::Version(fakeCurrentVersion);
|
| +}
|
| +
|
| ++ (void)clearFakeCurrentVersion {
|
| + if (gFakeCurrentVersion) {
|
| + delete gFakeCurrentVersion;
|
| + gFakeCurrentVersion = nullptr;
|
| + }
|
| +}
|
| +@end
|
| +
|
| +namespace {
|
| +
|
| +enum ButtonTestingID {
|
| + // IBUITag specified in the .xib file.
|
| + FRONT_CLOSE_BUTTON_ID = 202,
|
| +};
|
| +
|
| +class SigninPromoViewControllerTest : public BlockCleanupTest {
|
| + public:
|
| + ~SigninPromoViewControllerTest() override {}
|
| +
|
| + SigninPromoViewController* controller() { return controller_.get(); }
|
| +
|
| + void SetUp() override {
|
| + BlockCleanupTest::SetUp();
|
| + [FakeVersionSigninPromoViewController setFakeCurrentVersion:"1.0"];
|
| + TestChromeBrowserState::Builder builder;
|
| + builder.SetPrefService(CreatePrefService());
|
| + builder.AddTestingFactory(
|
| + AuthenticationServiceFactory::GetInstance(),
|
| + AuthenticationServiceFake::CreateAuthenticationService);
|
| + chrome_browser_state_ = builder.Build();
|
| + ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()
|
| + ->AddIdentities(@[ @"foo", @"bar" ]);
|
| + controller_.reset([[FakeVersionSigninPromoViewController alloc]
|
| + initWithBrowserState:chrome_browser_state_.get()]);
|
| + }
|
| +
|
| + void TearDown() override {
|
| + NSUserDefaults* standardDefaults = [NSUserDefaults standardUserDefaults];
|
| + [standardDefaults removeObjectForKey:kDisplayedSSORecallForMajorVersionKey];
|
| + [standardDefaults synchronize];
|
| + [FakeVersionSigninPromoViewController clearFakeCurrentVersion];
|
| + BlockCleanupTest::TearDown();
|
| + }
|
| +
|
| + std::unique_ptr<sync_preferences::PrefServiceSyncable> CreatePrefService() {
|
| + sync_preferences::PrefServiceMockFactory factory;
|
| + scoped_refptr<user_prefs::PrefRegistrySyncable> registry(
|
| + new user_prefs::PrefRegistrySyncable);
|
| + std::unique_ptr<sync_preferences::PrefServiceSyncable> prefs =
|
| + factory.CreateSyncable(registry.get());
|
| + RegisterBrowserStatePrefs(registry.get());
|
| + return prefs;
|
| + }
|
| +
|
| + void SetPromoHasBeenShown() {
|
| + SigninPromoViewController* signin_promo_view_controller =
|
| + static_cast<SigninPromoViewController*>(controller());
|
| + EXPECT_TRUE([signin_promo_view_controller
|
| + isKindOfClass:[SigninPromoViewController class]]);
|
| + [signin_promo_view_controller recordPromoDisplayed];
|
| + }
|
| +
|
| + protected:
|
| + web::TestWebThreadBundle thread_bundle_;
|
| + std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
|
| + base::scoped_nsobject<SigninPromoViewController> controller_;
|
| +};
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestConstructorDestructor) {
|
| + EXPECT_TRUE(controller());
|
| + EXPECT_TRUE([controller() view]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillDisplay) {
|
| + EXPECT_TRUE([SigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillNotDisplaySameVersion) {
|
| + SetPromoHasBeenShown();
|
| + EXPECT_FALSE([FakeVersionSigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillNotDisplayOneMinorVersion) {
|
| + SetPromoHasBeenShown();
|
| + // Set the future version to be one minor release ahead.
|
| + [FakeVersionSigninPromoViewController setFakeCurrentVersion:"1.1"];
|
| + EXPECT_FALSE([FakeVersionSigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillNotDisplayTwoMinorVersions) {
|
| + SetPromoHasBeenShown();
|
| + // Set the future version to be two minor releases ahead.
|
| + [FakeVersionSigninPromoViewController setFakeCurrentVersion:"1.2"];
|
| + EXPECT_FALSE([FakeVersionSigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillNotDisplayOneMajorVersion) {
|
| + SetPromoHasBeenShown();
|
| + // Set the future version to be one major release ahead.
|
| + [FakeVersionSigninPromoViewController setFakeCurrentVersion:"2.0"];
|
| + EXPECT_FALSE([FakeVersionSigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +TEST_F(SigninPromoViewControllerTest, TestWillDisplayTwoMajorVersions) {
|
| + SetPromoHasBeenShown();
|
| + // Set the future version to be two major releases ahead.
|
| + [FakeVersionSigninPromoViewController setFakeCurrentVersion:"3.0"];
|
| + EXPECT_TRUE([FakeVersionSigninPromoViewController
|
| + shouldBePresentedForBrowserState:chrome_browser_state_.get()]);
|
| +}
|
| +
|
| +} // namespace
|
|
|