chromium/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java

// Copyright 2024 The Chromium Authors
// 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.privacy_sandbox;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withText;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasItems;

import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;

import androidx.test.filters.SmallTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.JniMocker;
import org.chromium.base.test.util.UserActionTester;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;

/** Tests {@link TopicsManageFragment} */
@RunWith(ChromeJUnit4ClassRunner.class)
@Batch(Batch.PER_CLASS)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public final class TopicsManageFragmentTest {
    private static final String TOPIC_NAME_1 = "Topic 1";

    @Rule public ChromeBrowserTestRule mChromeBrowserTestRule = new ChromeBrowserTestRule();

    @Rule
    public SettingsActivityTestRule<TopicsManageFragment> mSettingsActivityTestRule =
            new SettingsActivityTestRule<>(TopicsManageFragment.class);

    @Rule public JniMocker mocker = new JniMocker();

    private FakePrivacySandboxBridge mFakePrivacySandboxBridge;
    private UserActionTester mUserActionTester;

    @Before
    public void setUp() {
        mFakePrivacySandboxBridge = new FakePrivacySandboxBridge();
        mocker.mock(PrivacySandboxBridgeJni.TEST_HOOKS, mFakePrivacySandboxBridge);

        mUserActionTester = new UserActionTester();
    }

    @After
    public void tearDown() {
        mUserActionTester.tearDown();
    }

    private void startTopicsManageSettings() {
        mSettingsActivityTestRule.startSettingsActivity();
        onViewWaiting(withText(containsString("Choose which broad categories")));
    }

    @Test
    @SmallTest
    public void testOpenManagePage() {
        startTopicsManageSettings();
        assertThat(
                mUserActionTester.getActions(),
                hasItems("Settings.PrivacySandbox.Topics.Manage.PageOpened"));
    }

    @Test
    @SmallTest
    public void testToggleTopic() {
        mFakePrivacySandboxBridge.setFirstLevelTopics(TOPIC_NAME_1);
        startTopicsManageSettings();
        onView(withText(TOPIC_NAME_1)).perform(click());
        assertThat(
                mUserActionTester.getActions(),
                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicBlocked"));
        onView(withText(TOPIC_NAME_1)).perform(click());
        assertThat(
                mUserActionTester.getActions(),
                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicEnabled"));
    }

    @Test
    @SmallTest
    public void testToggleTopicDialog() {
        mFakePrivacySandboxBridge.setFirstLevelTopics(TOPIC_NAME_1);
        mFakePrivacySandboxBridge.setChildTopics(TOPIC_NAME_1);
        startTopicsManageSettings();
        onView(withText(TOPIC_NAME_1)).perform(click());
        onViewWaiting(withText("Cancel")).check(matches(isDisplayed()));
        onView(withText("Block")).perform(click());
        assertThat(
                mUserActionTester.getActions(),
                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicBlockingConfirmed"));
        onView(withText(TOPIC_NAME_1)).perform(click());
        assertThat(
                mUserActionTester.getActions(),
                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicEnabled"));
    }
}