blob: 4fe67487de7bd5a174b14b1846166f17b9dc61d5 [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/glic/browser_ui/glic_button_controller.h"
#include <memory>
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/contextual_cueing/contextual_cueing_service.h"
#include "chrome/browser/glic/browser_ui/glic_button_controller_delegate.h"
#include "chrome/browser/glic/browser_ui/glic_vector_icon_manager.h"
#include "chrome/browser/glic/glic_pref_names.h"
#include "chrome/browser/glic/glic_profile_manager.h"
#include "chrome/browser/glic/public/glic_keyed_service.h"
#include "chrome/browser/glic/test_support/glic_test_util.h"
#include "chrome/browser/global_features.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.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 "components/prefs/pref_service.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/vector_icon_types.h"
namespace glic {
namespace {
class MockGlicKeyedService : public glic::GlicKeyedService {
public:
MockGlicKeyedService(
content::BrowserContext* browser_context,
signin::IdentityManager* identity_manager,
ProfileManager* profile_manager,
GlicProfileManager* glic_profile_manager,
contextual_cueing::ContextualCueingService* contextual_cueing_service)
: GlicKeyedService(Profile::FromBrowserContext(browser_context),
identity_manager,
profile_manager,
glic_profile_manager,
contextual_cueing_service) {}
MOCK_METHOD(void, TryPreload, (), (override));
};
class MockGlicButtonControllerDelegate
: public glic::GlicButtonControllerDelegate {
public:
void SetGlicShowState(bool show) override { show_state_ = show; }
void SetGlicIcon(const gfx::VectorIcon& icon) override { icon_ = &icon; }
bool show_state() const { return show_state_; }
const gfx::VectorIcon* icon() const { return icon_; }
private:
bool show_state_ = false;
raw_ptr<const gfx::VectorIcon> icon_ = nullptr;
};
} // namespace
class GlicButtonControllerTest : public testing::Test {
public:
void SetUp() override {
// Enable kGlic and kTabstripComboButton by default for testing.
scoped_feature_list_.InitWithFeatures(
{features::kGlic, features::kTabstripComboButton,
features::kGlicRollout},
{});
testing_profile_manager_ = std::make_unique<TestingProfileManager>(
TestingBrowserProcess::GetGlobal());
ASSERT_TRUE(testing_profile_manager_->SetUp());
TestingBrowserProcess::GetGlobal()->CreateGlobalFeaturesForTesting();
profile_ = testing_profile_manager_->CreateTestingProfile("profile");
mock_glic_service_ = std::make_unique<MockGlicKeyedService>(
profile_, identity_test_environment.identity_manager(),
testing_profile_manager_->profile_manager(), &glic_profile_manager_,
/*contextual_cueing_service=*/nullptr);
glic_button_controller_ = std::make_unique<GlicButtonController>(
profile_, &mock_glic_controller_delegate_, mock_glic_service_.get());
ForceSigninAndModelExecutionCapability(profile_);
}
void TearDown() override {
TestingBrowserProcess::GetGlobal()->GetFeatures()->Shutdown();
scoped_feature_list_.Reset();
}
GlicButtonController* controller() { return glic_button_controller_.get(); }
MockGlicButtonControllerDelegate* controller_delegate() {
return &mock_glic_controller_delegate_;
}
Profile* profile() { return profile_; }
private:
base::test::ScopedFeatureList scoped_feature_list_;
content::BrowserTaskEnvironment task_environment;
std::unique_ptr<TestingProfileManager> testing_profile_manager_;
raw_ptr<Profile> profile_ = nullptr;
signin::IdentityTestEnvironment identity_test_environment;
GlicProfileManager glic_profile_manager_;
MockGlicButtonControllerDelegate mock_glic_controller_delegate_;
std::unique_ptr<MockGlicKeyedService> mock_glic_service_;
std::unique_ptr<GlicButtonController> glic_button_controller_;
};
// Test that settings changes are reflected in the show state of the controller
// delegate.
TEST_F(GlicButtonControllerTest, GlicSettings) {
PrefService* prefs = profile()->GetPrefs();
prefs->SetInteger(
::prefs::kGeminiSettings,
static_cast<int>(glic::prefs::SettingsPolicyState::kEnabled));
prefs->SetBoolean(glic::prefs::kGlicPinnedToTabstrip, true);
EXPECT_TRUE(controller_delegate()->show_state());
prefs->SetInteger(
::prefs::kGeminiSettings,
static_cast<int>(glic::prefs::SettingsPolicyState::kDisabled));
prefs->SetBoolean(glic::prefs::kGlicPinnedToTabstrip, true);
EXPECT_FALSE(controller_delegate()->show_state());
prefs->SetInteger(
::prefs::kGeminiSettings,
static_cast<int>(glic::prefs::SettingsPolicyState::kEnabled));
prefs->SetBoolean(glic::prefs::kGlicPinnedToTabstrip, false);
EXPECT_FALSE(controller_delegate()->show_state());
prefs->SetInteger(
::prefs::kGeminiSettings,
static_cast<int>(glic::prefs::SettingsPolicyState::kDisabled));
prefs->SetBoolean(glic::prefs::kGlicPinnedToTabstrip, false);
EXPECT_FALSE(controller_delegate()->show_state());
}
} // namespace glic