blob: f7d4ed0e93d445e2141b7a5e0e0aac4e3285721a [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/lobster/lobster_service.h"
#include <memory>
#include "ash/constants/ash_pref_names.h"
#include "ash/public/cpp/lobster/lobster_system_state.h"
#include "base/test/task_environment.h"
#include "base/types/cxx23_to_underlying.h"
#include "chrome/browser/ash/lobster/mock/mock_snapper_provider.h"
#include "chrome/browser/ash/lobster/mock_lobster_system_state_provider.h"
#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
#include "chrome/test/base/chrome_ash_test_base.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "chromeos/ash/components/browser_context_helper/annotated_account_id.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_consent_status.h"
#include "components/account_id/account_id.h"
#include "components/user_manager/fake_user_manager.h"
#include "components/user_manager/scoped_user_manager.h"
#include "components/user_manager/user_names.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class LobsterServiceTest : public ChromeAshTestBase {
public:
LobsterServiceTest() : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
~LobsterServiceTest() override = default;
void SetUp() override {
ChromeAshTestBase::SetUp();
ASSERT_TRUE(profile_manager_.SetUp());
auto* user = fake_user_manager_->AddUser(user_manager::StubAccountId());
fake_user_manager_->LoginUser(user->GetAccountId());
testing_profile_ = profile_manager_.CreateTestingProfile("profile");
ash::AnnotatedAccountId::Set(testing_profile_.get(), user->GetAccountId());
lobster_service_ = std::make_unique<LobsterService>(
std::make_unique<MockSnapperProvider>(), testing_profile_.get());
}
void TearDown() override {
ChromeAshTestBase::TearDown();
lobster_service_.reset();
testing_profile_ = nullptr;
profile_manager_.DeleteAllTestingProfiles();
fake_user_manager_.Reset();
}
TestingProfile* profile() { return testing_profile_; }
LobsterService* lobster_service() { return lobster_service_.get(); }
void ToggleLobsterSettings(bool value) {
profile()->GetPrefs()->SetBoolean(ash::prefs::kLobsterEnabled, value);
}
chromeos::editor_menu::EditorConsentStatus GetLobsterConsentStatus() {
return chromeos::editor_menu::GetConsentStatusFromInteger(
profile()->GetPrefs()->GetInteger(ash::prefs::kOrcaConsentStatus));
}
private:
raw_ptr<TestingProfile> testing_profile_ = nullptr;
TestingProfileManager profile_manager_;
std::unique_ptr<LobsterService> lobster_service_;
user_manager::TypedScopedUserManager<ash::FakeChromeUserManager>
fake_user_manager_{std::make_unique<ash::FakeChromeUserManager>()};
};
TEST_F(LobsterServiceTest,
SwitchingOnSettingToggleWillResetConsentWhichWasPreviouslyDeclined) {
ToggleLobsterSettings(false);
profile()->GetPrefs()->SetInteger(
ash::prefs::kOrcaConsentStatus,
base::to_underlying(
chromeos::editor_menu::EditorConsentStatus::kDeclined));
// Turn on the Lobster Settings
ToggleLobsterSettings(true);
EXPECT_EQ(GetLobsterConsentStatus(),
chromeos::editor_menu::EditorConsentStatus::kUnset);
}
TEST_F(LobsterServiceTest,
SwitchingOnSettingToggleWillNotResetConsentWhichWasPreviouslyApproved) {
ToggleLobsterSettings(true);
profile()->GetPrefs()->SetInteger(
ash::prefs::kOrcaConsentStatus,
base::to_underlying(
chromeos::editor_menu::EditorConsentStatus::kApproved));
// Turn off the Lobster Settings
ToggleLobsterSettings(false);
EXPECT_EQ(GetLobsterConsentStatus(),
chromeos::editor_menu::EditorConsentStatus::kApproved);
// Turn on the Lobster Settings
ToggleLobsterSettings(true);
EXPECT_EQ(GetLobsterConsentStatus(),
chromeos::editor_menu::EditorConsentStatus::kApproved);
}
TEST_F(LobsterServiceTest, CanNotShowLobsterFeatureSettingsToggle) {
std::unique_ptr<MockLobsterSystemStateProvider> mock_system_state_provider =
std::make_unique<MockLobsterSystemStateProvider>();
ON_CALL(*mock_system_state_provider, GetSystemState)
.WillByDefault(testing::Return(ash::LobsterSystemState(
ash::LobsterStatus::kBlocked, /*failed_checks=*/{
ash::LobsterSystemCheck::kInvalidAccountCapabilities,
ash::LobsterSystemCheck::kInvalidRegion})));
lobster_service()->set_lobster_system_state_provider_for_testing(
std::move(mock_system_state_provider));
EXPECT_FALSE(lobster_service()->CanShowFeatureSettingsToggle());
}
TEST_F(LobsterServiceTest, CanShowLobsterFeatureSettingsToggle) {
std::unique_ptr<MockLobsterSystemStateProvider> mock_system_state_provider =
std::make_unique<MockLobsterSystemStateProvider>();
ON_CALL(*mock_system_state_provider, GetSystemState)
.WillByDefault(testing::Return(ash::LobsterSystemState(
ash::LobsterStatus::kBlocked,
/*failed_checks=*/{ash::LobsterSystemCheck::kInvalidInputField,
ash::LobsterSystemCheck::kInvalidInputMethod,
ash::LobsterSystemCheck::kNoInternetConnection})));
lobster_service()->set_lobster_system_state_provider_for_testing(
std::move(mock_system_state_provider));
EXPECT_TRUE(lobster_service()->CanShowFeatureSettingsToggle());
}
} // namespace