Commit 65ebdbba authored by Nohemi Fernandez's avatar Nohemi Fernandez Committed by Commit Bot

[iOS] Add test coverage for Manage Sync Settings mediator.

Adds test to cover the Advanced Sync Settings section of the "Manage
Sync" page.

Bug: 1125631
Change-Id: Ic4cde0a1bc03e111a71dc5a04bf3c3865ba1941e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2507550
Commit-Queue: Nohemi Fernandez <fernandex@chromium.org>
Reviewed-by: default avatarJérôme Lebel <jlebel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823200}
parent 7a9a1607
......@@ -93,7 +93,7 @@ source_set("constants") {
"manage_sync_settings_constants.h",
"manage_sync_settings_constants.mm",
]
deps = []
deps = [ "//ios/chrome/browser/ui/list_model" ]
}
source_set("eg_app_support+eg2") {
......@@ -156,3 +156,29 @@ source_set("eg2_tests") {
]
frameworks = [ "UIKit.framework" ]
}
source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ]
testonly = true
sources = [ "manage_sync_settings_mediator_unittest.mm" ]
deps = [
":google_services",
"//base/test:test_support",
"//components/autofill/core/common",
"//components/prefs",
"//components/prefs:test_support",
"//components/sync/driver",
"//components/sync/driver:test_support",
"//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/main:test_support",
"//ios/chrome/browser/sync",
"//ios/chrome/browser/sync:test_support",
"//ios/chrome/browser/ui/settings/google_services:constants",
"//ios/chrome/browser/ui/table_view",
"//ios/chrome/browser/ui/table_view/cells",
"//ios/web/public/test",
"//ios/web/public/test",
"//testing/gtest",
"//third_party/ocmock:ocmock",
]
}
......@@ -7,10 +7,59 @@
#import <Foundation/Foundation.h>
#import "ios/chrome/browser/ui/list_model/list_model.h"
// Accessibility identifier for the Data from Chrome Sync cell.
extern NSString* const kDataFromChromeSyncAccessibilityIdentifier;
// Accessibility identifier for Manage Sync table view.
extern NSString* const kManageSyncTableViewAccessibilityIdentifier;
// Sections used in Sync Settings page.
typedef NS_ENUM(NSInteger, SyncSettingsSectionIdentifier) {
// Section for all the sync settings.
SyncDataTypeSectionIdentifier = kSectionIdentifierEnumZero,
// Advanced settings.
AdvancedSettingsSectionIdentifier,
// Sync errors.
SyncErrorsSectionIdentifier,
};
// Item types used per Sync Setting section.
// Types are used to uniquely identify SyncSwitchItem items.
typedef NS_ENUM(NSInteger, SyncSettingsItemType) {
// SyncDataTypeSectionIdentifier section.
// Sync everything item.
SyncEverythingItemType = kItemTypeEnumZero,
// kSyncAutofill.
AutofillDataTypeItemType,
// kSyncBookmarks.
BookmarksDataTypeItemType,
// kSyncOmniboxHistory.
HistoryDataTypeItemType,
// kSyncOpenTabs.
OpenTabsDataTypeItemType,
// kSyncPasswords
PasswordsDataTypeItemType,
// kSyncReadingList.
ReadingListDataTypeItemType,
// kSyncPreferences.
SettingsDataTypeItemType,
// Item for kAutofillWalletImportEnabled.
AutocompleteWalletItemType,
// AdvancedSettingsSectionIdentifier section.
// Encryption item.
EncryptionItemType,
// Google activity controls item.
GoogleActivityControlsItemType,
// Data from Chrome sync.
DataFromChromeSync,
// Sync errors.
RestartAuthenticationFlowErrorItemType,
ReauthDialogAsSyncIsInAuthErrorItemType,
ShowPassphraseDialogErrorItemType,
SyncNeedsTrustedVaultKeyErrorItemType,
SyncDisabledByAdministratorErrorItemType,
};
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_MANAGE_SYNC_SETTINGS_CONSTANTS_H_
......@@ -42,56 +42,6 @@ using l10n_util::GetNSString;
namespace {
// List of sections.
typedef NS_ENUM(NSInteger, SectionIdentifier) {
// Section for all the sync settings.
SyncDataTypeSectionIdentifier = kSectionIdentifierEnumZero,
// Advanced settings.
AdvancedSettingsSectionIdentifier,
// Sync errors.
SyncErrorsSectionIdentifier,
};
// List of items. For implementation details in
// ManageSyncSettingsTableViewController, two SyncSwitchItem items should not
// share the same type. The cell UISwitch tag is used to save the item type, and
// when the user taps on the switch, this tag is used to retreive the item based
// on the type.
typedef NS_ENUM(NSInteger, ItemType) {
// SyncDataTypeSectionIdentifier section.
// Sync everything item.
SyncEverythingItemType = kItemTypeEnumZero,
// kSyncAutofill.
AutofillDataTypeItemType,
// kSyncBookmarks.
BookmarksDataTypeItemType,
// kSyncOmniboxHistory.
HistoryDataTypeItemType,
// kSyncOpenTabs.
OpenTabsDataTypeItemType,
// kSyncPasswords
PasswordsDataTypeItemType,
// kSyncReadingList.
ReadingListDataTypeItemType,
// kSyncPreferences.
SettingsDataTypeItemType,
// Item for kAutofillWalletImportEnabled.
AutocompleteWalletItemType,
// AdvancedSettingsSectionIdentifier section.
// Encryption item.
EncryptionItemType,
// Google activity controls item.
GoogleActivityControlsItemType,
// Data from Chrome sync.
DataFromChromeSync,
// Sync errors.
RestartAuthenticationFlowErrorItemType,
ReauthDialogAsSyncIsInAuthErrorItemType,
ShowPassphraseDialogErrorItemType,
SyncNeedsTrustedVaultKeyErrorItemType,
SyncDisabledByAdministratorErrorItemType,
};
// Enterprise icon.
NSString* kGoogleServicesEnterpriseImage = @"google_services_enterprise";
// Sync error icon.
......@@ -465,7 +415,8 @@ NSString* kGoogleServicesSyncErrorImage = @"google_services_sync_error";
base::AutoReset<BOOL> autoReset(&_ignoreSyncStateChanges, YES);
SyncSwitchItem* syncSwitchItem = base::mac::ObjCCast<SyncSwitchItem>(item);
syncSwitchItem.on = value;
ItemType itemType = static_cast<ItemType>(item.type);
SyncSettingsItemType itemType =
static_cast<SyncSettingsItemType>(item.type);
switch (itemType) {
case SyncEverythingItemType:
self.syncSetupService->SetSyncingAllDataTypes(value);
......@@ -520,7 +471,7 @@ NSString* kGoogleServicesSyncErrorImage = @"google_services_sync_error";
}
- (void)didSelectItem:(TableViewItem*)item {
ItemType itemType = static_cast<ItemType>(item.type);
SyncSettingsItemType itemType = static_cast<SyncSettingsItemType>(item.type);
switch (itemType) {
case EncryptionItemType:
if (self.syncSetupService->GetSyncServiceState() ==
......@@ -627,7 +578,7 @@ NSString* kGoogleServicesSyncErrorImage = @"google_services_sync_error";
- (BOOL)updateSyncErrorItems {
TableViewModel* model = self.consumer.tableViewModel;
BOOL hasError = NO;
ItemType type;
SyncSettingsItemType type;
if (self.isSyncDisabledByAdministrator) {
type = SyncDisabledByAdministratorErrorItemType;
......
// Copyright 2020 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 "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h"
#import <UIKit/UIKit.h>
#import "components/autofill/core/common/autofill_prefs.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
#import "components/sync/driver/mock_sync_service.h"
#include "components/sync/driver/sync_service.h"
#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#import "ios/chrome/browser/main/test_browser.h"
#import "ios/chrome/browser/sync/profile_sync_service_factory.h"
#import "ios/chrome/browser/sync/sync_setup_service_factory.h"
#import "ios/chrome/browser/sync/sync_setup_service_mock.h"
#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h"
#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h"
#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_image_item.h"
#import "ios/chrome/browser/ui/table_view/table_view_model.h"
#import "ios/web/public/test/web_task_environment.h"
#import "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#import "third_party/ocmock/gtest_support.h"
#import "third_party/ocmock/ocmock_extensions.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using ::testing::_;
using ::testing::NiceMock;
using ::testing::Return;
namespace {
std::unique_ptr<KeyedService> CreateMockSyncService(
web::BrowserState* context) {
return std::make_unique<NiceMock<syncer::MockSyncService>>();
}
std::unique_ptr<KeyedService> CreateMockSyncSetupService(
web::BrowserState* context) {
ChromeBrowserState* browser_state =
ChromeBrowserState::FromBrowserState(context);
return std::make_unique<SyncSetupServiceMock>(
ProfileSyncServiceFactory::GetForBrowserState(browser_state));
}
PrefService* SetPrefService() {
TestingPrefServiceSimple* prefs = new TestingPrefServiceSimple();
PrefRegistrySimple* registry = prefs->registry();
registry->RegisterBooleanPref(autofill::prefs::kAutofillWalletImportEnabled,
true);
return prefs;
}
} // namespace
class ManageSyncSettingsMediatorTest : public PlatformTest {
public:
void SetUp() override {
PlatformTest::SetUp();
TestChromeBrowserState::Builder builder;
builder.AddTestingFactory(ProfileSyncServiceFactory::GetInstance(),
base::BindRepeating(&CreateMockSyncService));
builder.AddTestingFactory(SyncSetupServiceFactory::GetInstance(),
base::BindRepeating(&CreateMockSyncSetupService));
browser_state_ = builder.Build();
consumer_ = [[ManageSyncSettingsTableViewController alloc]
initWithStyle:UITableViewStyleGrouped];
[consumer_ loadModel];
pref_service_ = SetPrefService();
sync_setup_service_mock_ = static_cast<SyncSetupServiceMock*>(
SyncSetupServiceFactory::GetForBrowserState(browser_state_.get()));
sync_service_mock_ = static_cast<syncer::MockSyncService*>(
ProfileSyncServiceFactory::GetForBrowserState(browser_state_.get()));
mediator_ = [[ManageSyncSettingsMediator alloc]
initWithSyncService:sync_service_mock_
userPrefService:pref_service_];
mediator_.syncSetupService = sync_setup_service_mock_;
mediator_.consumer = consumer_;
}
void SetupSyncServiceInitializedExpectations() {
ON_CALL(*sync_setup_service_mock_, IsSyncEnabled())
.WillByDefault(Return(true));
ON_CALL(*sync_setup_service_mock_, IsSyncingAllDataTypes())
.WillByDefault(Return(true));
ON_CALL(*sync_setup_service_mock_, HasFinishedInitialSetup())
.WillByDefault(Return(true));
ON_CALL(*sync_service_mock_, GetTransportState())
.WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
}
void SetupSyncDisabledExpectations() {
ON_CALL(*sync_setup_service_mock_, IsSyncEnabled())
.WillByDefault(Return(false));
ON_CALL(*sync_setup_service_mock_, IsSyncingAllDataTypes())
.WillByDefault(Return(true));
ON_CALL(*sync_setup_service_mock_, HasFinishedInitialSetup())
.WillByDefault(Return(false));
ON_CALL(*sync_service_mock_, GetTransportState())
.WillByDefault(Return(syncer::SyncService::TransportState::DISABLED));
}
protected:
// Needed for test browser state created by TestChromeBrowserState().
web::WebTaskEnvironment task_environment_;
syncer::MockSyncService* sync_service_mock_;
SyncSetupServiceMock* sync_setup_service_mock_;
std::unique_ptr<TestChromeBrowserState> browser_state_;
ManageSyncSettingsMediator* mediator_ = nullptr;
ManageSyncSettingsTableViewController* consumer_ = nullptr;
PrefService* pref_service_ = nullptr;
};
// Tests for Advanced Settings items.
// Tests that encryption is not accessible when Sync settings have not been
// confirmed.
TEST_F(ManageSyncSettingsMediatorTest, SyncServiceSetupNotCommitted) {
SetupSyncDisabledExpectations();
ON_CALL(*sync_setup_service_mock_, GetSyncServiceState())
.WillByDefault(Return(SyncSetupService::kSyncSettingsNotConfirmed));
[mediator_ manageSyncSettingsTableViewControllerLoadModel:mediator_.consumer];
NSArray* advanced_settings_items = [mediator_.consumer.tableViewModel
itemsInSectionWithIdentifier:SyncSettingsSectionIdentifier::
AdvancedSettingsSectionIdentifier];
ASSERT_EQ(3UL, advanced_settings_items.count);
TableViewImageItem* encryption_item = advanced_settings_items[0];
ASSERT_EQ(encryption_item.type, SyncSettingsItemType::EncryptionItemType);
ASSERT_FALSE(encryption_item.enabled);
}
// Tests that encryption is not accessible when Sync is disabled by the
// administrator.
TEST_F(ManageSyncSettingsMediatorTest, SyncServiceDisabledByAdministrator) {
SetupSyncDisabledExpectations();
ON_CALL(*sync_service_mock_, GetDisableReasons())
.WillByDefault(
Return(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY));
[mediator_ manageSyncSettingsTableViewControllerLoadModel:mediator_.consumer];
NSArray* advanced_settings_items = [mediator_.consumer.tableViewModel
itemsInSectionWithIdentifier:SyncSettingsSectionIdentifier::
AdvancedSettingsSectionIdentifier];
ASSERT_EQ(3UL, advanced_settings_items.count);
TableViewImageItem* encryption_item = advanced_settings_items[0];
ASSERT_EQ(encryption_item.type, SyncSettingsItemType::EncryptionItemType);
ASSERT_FALSE(encryption_item.enabled);
}
// Tests that encryption is accessible when there is a Sync error due to a
// missing passphrase, but Sync has otherwise been enabled.
TEST_F(ManageSyncSettingsMediatorTest, SyncServiceDisabledNeedsPassphrase) {
SetupSyncServiceInitializedExpectations();
ON_CALL(*sync_setup_service_mock_, GetSyncServiceState())
.WillByDefault(Return(SyncSetupService::kSyncServiceNeedsPassphrase));
[mediator_ manageSyncSettingsTableViewControllerLoadModel:mediator_.consumer];
NSArray* advanced_settings_items = [mediator_.consumer.tableViewModel
itemsInSectionWithIdentifier:SyncSettingsSectionIdentifier::
AdvancedSettingsSectionIdentifier];
ASSERT_EQ(3UL, advanced_settings_items.count);
TableViewImageItem* encryption_item = advanced_settings_items[0];
ASSERT_EQ(encryption_item.type, SyncSettingsItemType::EncryptionItemType);
ASSERT_TRUE(encryption_item.enabled);
}
// Tests that encryption is accessible when Sync is enabled.
TEST_F(ManageSyncSettingsMediatorTest, SyncServiceEnabled) {
SetupSyncServiceInitializedExpectations();
ON_CALL(*sync_setup_service_mock_, GetSyncServiceState())
.WillByDefault(Return(SyncSetupService::kNoSyncServiceError));
[mediator_ manageSyncSettingsTableViewControllerLoadModel:mediator_.consumer];
NSArray* advanced_settings_items = [mediator_.consumer.tableViewModel
itemsInSectionWithIdentifier:SyncSettingsSectionIdentifier::
AdvancedSettingsSectionIdentifier];
ASSERT_EQ(3UL, advanced_settings_items.count);
TableViewImageItem* encryption_item = advanced_settings_items[0];
ASSERT_EQ(encryption_item.type, SyncSettingsItemType::EncryptionItemType);
ASSERT_TRUE(encryption_item.enabled);
}
......@@ -304,6 +304,7 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/ui/settings/clear_browsing_data:unit_tests",
"//ios/chrome/browser/ui/settings/credit_card_scanner:unit_tests",
"//ios/chrome/browser/ui/settings/default_browser:unit_tests",
"//ios/chrome/browser/ui/settings/google_services:unit_tests",
"//ios/chrome/browser/ui/settings/language:unit_tests",
"//ios/chrome/browser/ui/settings/password:unit_tests",
"//ios/chrome/browser/ui/settings/password/password_details:unit_tests",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment