Commit 1d40a24d authored by Alice Wang's avatar Alice Wang Committed by Commit Bot

[Android][Signin] Test and refactor sign out dialog

This CL tests and refactors the SignOutDialogFragment.

Bug: 967374
Change-Id: Ibe0af76022877305b38513d5855e238465635469
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1982557
Commit-Queue: Alice Wang <aliceywang@chromium.org>
Reviewed-by: default avatarTanmoy Mollik <triploblastic@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#730124}
parent 8fb47ccd
......@@ -192,6 +192,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogTest.java",
"junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineDelegateTest.java",
"junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineTest.java",
"junit/src/org/chromium/chrome/browser/signin/SignOutDialogFragmentTest.java",
"junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java",
"junit/src/org/chromium/chrome/browser/signin/SigninPromoUtilTest.java",
"junit/src/org/chromium/chrome/browser/signin/SigninUtilsStartActivityTest.java",
......
......@@ -72,6 +72,7 @@ public class AccountManagementFragment extends PreferenceFragmentCompat
* The key for an integer value in arguments bundle to
* specify the correct GAIA service that has triggered the dialog.
* If the argument is not set, GAIA_SERVICE_TYPE_NONE is used as the origin of the dialog.
* TODO(https://crbug.com/1038924): Set the TAG variables of this class to private
*/
public static final String SHOW_GAIA_SERVICE_TYPE_EXTRA = "ShowGAIAServiceType";
......@@ -212,11 +213,8 @@ public class AccountManagementFragment extends PreferenceFragmentCompat
SigninUtils.logEvent(
ProfileAccountManagementMetrics.TOGGLE_SIGNOUT, mGaiaServiceType);
SignOutDialogFragment signOutFragment = new SignOutDialogFragment();
Bundle args = new Bundle();
args.putInt(SHOW_GAIA_SERVICE_TYPE_EXTRA, mGaiaServiceType);
signOutFragment.setArguments(args);
SignOutDialogFragment signOutFragment =
SignOutDialogFragment.create(mGaiaServiceType);
signOutFragment.setTargetFragment(AccountManagementFragment.this, 0);
signOutFragment.show(getFragmentManager(), SIGN_OUT_DIALOG_TAG);
......@@ -398,6 +396,7 @@ public class AccountManagementFragment extends PreferenceFragmentCompat
@Override
public void onSignOutDialogDismissed(boolean signOutClicked) {
// TODO(https://crbug.com/1038924): Signout is recorded twice when cancelled
if (!signOutClicked) {
SigninUtils.logEvent(ProfileAccountManagementMetrics.SIGNOUT_CANCEL, mGaiaServiceType);
}
......
......@@ -28,7 +28,7 @@ public class SignOutDialogFragment extends DialogFragment implements
/**
* The extra key used to specify the GAIA service that triggered this dialog.
*/
public static final String SHOW_GAIA_SERVICE_TYPE_EXTRA = "ShowGAIAServiceType";
private static final String SHOW_GAIA_SERVICE_TYPE_EXTRA = "ShowGAIAServiceType";
/**
* Receives updates when the user clicks "Sign out" or dismisses the dialog.
......@@ -58,6 +58,14 @@ public class SignOutDialogFragment extends DialogFragment implements
*/
private @GAIAServiceType int mGaiaServiceType = GAIAServiceType.GAIA_SERVICE_TYPE_NONE;
public static SignOutDialogFragment create(@GAIAServiceType int gaiaServiceType) {
SignOutDialogFragment signOutFragment = new SignOutDialogFragment();
Bundle args = new Bundle();
args.putInt(SHOW_GAIA_SERVICE_TYPE_EXTRA, gaiaServiceType);
signOutFragment.setArguments(args);
return signOutFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (getArguments() != null) {
......
// Copyright 2019 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.
package org.chromium.chrome.browser.signin;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.robolectric.Robolectric;
import org.robolectric.shadows.ShadowAlertDialog;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.DisableNativeTestRule;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
import org.chromium.components.signin.GAIAServiceType;
/** Tests for {@link SignOutDialogFragment}. */
@RunWith(BaseRobolectricTestRunner.class)
public class SignOutDialogFragmentTest {
private static final String TEST_DOMAIN = "test.domain.example.com";
private class DummySignOutTargetFragment
extends Fragment implements SignOutDialogFragment.SignOutDialogListener {
@Override
public void onSignOutClicked(boolean forceWipeUserData) {}
@Override
public void onSignOutDialogDismissed(boolean signOutClicked) {}
}
@Rule
public final DisableNativeTestRule mDisableNative = new DisableNativeTestRule();
@Rule
public final JniMocker mocker = new JniMocker();
@Mock
private SigninUtils.Natives mSigninUtilsNativeMock;
@Mock
private SigninManager mSigninManagerMock;
@Spy
private final DummySignOutTargetFragment mTargetFragment = new DummySignOutTargetFragment();
private SignOutDialogFragment mSignOutDialog;
private FragmentManager mFragmentManager;
@Before
public void setUp() {
initMocks(this);
mocker.mock(SigninUtilsJni.TEST_HOOKS, mSigninUtilsNativeMock);
IdentityServicesProvider.setInstanceForTests(mock(IdentityServicesProvider.class));
when(IdentityServicesProvider.get().getSigninManager()).thenReturn(mSigninManagerMock);
setUpSignOutDialog();
}
private void setUpSignOutDialog() {
mFragmentManager =
Robolectric.setupActivity(FragmentActivity.class).getSupportFragmentManager();
mFragmentManager.beginTransaction().add(mTargetFragment, null).commit();
mSignOutDialog = SignOutDialogFragment.create(GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
mSignOutDialog.setTargetFragment(mTargetFragment, 0);
}
@Test
public void testMessageWhenAccountIsManaged() {
when(mSigninManagerMock.getManagementDomain()).thenReturn(TEST_DOMAIN);
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
TextView messageTextView = alertDialog.findViewById(android.R.id.message);
assertEquals(
mSignOutDialog.getString(R.string.signout_managed_account_message, TEST_DOMAIN),
messageTextView.getText());
}
@Test
public void testPositiveButtonWhenAccountIsManaged() {
when(mSigninManagerMock.getManagementDomain()).thenReturn(TEST_DOMAIN);
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
verify(mSigninUtilsNativeMock)
.logEvent(ProfileAccountManagementMetrics.SIGNOUT_SIGNOUT,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
verify(mTargetFragment).onSignOutClicked(false);
}
@Test
public void testPositiveButtonWhenAccountIsNotManagedAndRemoveLocalDataNotChecked() {
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
verify(mSigninUtilsNativeMock)
.logEvent(ProfileAccountManagementMetrics.SIGNOUT_SIGNOUT,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
verify(mTargetFragment).onSignOutClicked(false);
}
@Test
public void testPositiveButtonWhenAccountIsNotManagedAndRemoveLocalDataChecked() {
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.findViewById(R.id.remove_local_data).performClick();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
verify(mSigninUtilsNativeMock)
.logEvent(ProfileAccountManagementMetrics.SIGNOUT_SIGNOUT,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
verify(mTargetFragment).onSignOutClicked(true);
}
@Test
public void testNegativeButtonHasNoEffectWhenAccountIsManaged() {
when(mSigninManagerMock.getManagementDomain()).thenReturn(TEST_DOMAIN);
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick();
verify(mTargetFragment, never()).onSignOutClicked(anyBoolean());
}
@Test
public void testNegativeButtonHasNoEffectWhenAccountIsNotManaged() {
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick();
verify(mTargetFragment, never()).onSignOutClicked(anyBoolean());
}
@Test
public void testDismissWhenPositiveButtonIsNotClicked() {
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.dismiss();
verify(mSigninUtilsNativeMock)
.logEvent(ProfileAccountManagementMetrics.SIGNOUT_CANCEL,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
verify(mTargetFragment).onSignOutDialogDismissed(false);
}
@Test
public void testDismissWhenPositiveButtonIsClicked() {
AlertDialog alertDialog = getSignOutAlertDialogAfterShowingIt();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
alertDialog.dismiss();
verify(mSigninUtilsNativeMock)
.logEvent(ProfileAccountManagementMetrics.SIGNOUT_CANCEL,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
verify(mTargetFragment).onSignOutDialogDismissed(true);
}
private AlertDialog getSignOutAlertDialogAfterShowingIt() {
mSignOutDialog.show(mFragmentManager, null);
return (AlertDialog) ShadowAlertDialog.getLatestDialog();
}
}
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