blob: 18240c5aeeefe09c303734fae92fcabc3ef4e01d [file] [log] [blame]
// Copyright 2021 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.childaccounts;
import static org.mockito.Mockito.verify;
import android.accounts.Account;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
import org.chromium.components.signin.AccountManagerFacade.ChildAccountStatusListener;
import org.chromium.components.signin.AccountUtils;
import org.chromium.components.signin.ChildAccountStatus;
import org.chromium.components.signin.test.util.FakeAccountManagerFacade;
/**
* Unit tests for {@link ChildAccountService}.
*/
@RunWith(BaseRobolectricTestRunner.class)
public class ChildAccountServiceTest {
private static final Account CHILD_ACCOUNT =
AccountUtils.createAccountFromName("child.account@gmail.com");
private final FakeAccountManagerFacade mFakeFacade = new FakeAccountManagerFacade(null) {
@Override
public void checkChildAccountStatus(Account account, ChildAccountStatusListener listener) {
listener.onStatusReady(account.name.startsWith("child")
? ChildAccountStatus.REGULAR_CHILD
: ChildAccountStatus.NOT_CHILD);
}
};
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final AccountManagerTestRule mAccountManagerTestRule =
new AccountManagerTestRule(mFakeFacade);
@Mock
private ChildAccountStatusListener mListenerMock;
@Test
public void testChildAccountStatusWhenNoAccountsOnDevice() {
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD);
}
@Test
public void testChildAccountStatusWhenTwoChildAccountsOnDevice() {
// For product reason, child account cannot share device, so as long
// as more than one account detected on device, the child account status
// on device should be NOT_CHILD.
mAccountManagerTestRule.addAccount(CHILD_ACCOUNT);
mAccountManagerTestRule.addAccount("child.account2@gmail.com");
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD);
}
@Test
public void testChildAccountStatusWhenOneChildAndOneAdultAccountsOnDevice() {
mAccountManagerTestRule.addAccount(CHILD_ACCOUNT);
mAccountManagerTestRule.addAccount("adult.account@gmail.com");
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD);
}
@Test
public void testChildAccountStatusWhenTwoAdultAccountsOnDevice() {
mAccountManagerTestRule.addAccount("adult.account1@gmail.com");
mAccountManagerTestRule.addAccount("adult.account2@gmail.com");
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD);
}
@Test
public void testChildAccountStatusWhenOnlyOneAdultAccountOnDevice() {
mAccountManagerTestRule.addAccount("adult.account1@gmail.com");
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD);
}
@Test
public void testChildAccountStatusWhenOnlyOneChildAccountOnDevice() {
mAccountManagerTestRule.addAccount(CHILD_ACCOUNT);
ChildAccountService.checkChildAccountStatus(mListenerMock);
verify(mListenerMock).onStatusReady(ChildAccountStatus.REGULAR_CHILD);
}
}