blob: fd8fc268108369733621168b0af49619bbc87c9f [file] [log] [blame]
// 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();
}
}