// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/search_engines/enterprise_site_search_manager.h"

#include <string>
#include <utility>

#include "base/test/mock_callback.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/search_engines/default_search_manager.h"
#include "components/search_engines/template_url_data.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using testing::_;
using testing::ElementsAre;
using testing::IsEmpty;
using testing::Pointee;
using testing::Property;

double kTimestamp = static_cast<double>(
    base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds());

base::Value::Dict GenerateSiteSearchPrefEntry(const std::string& keyword) {
  base::Value::Dict entry;
  entry.Set(DefaultSearchManager::kShortName, keyword + "name");
  entry.Set(DefaultSearchManager::kKeyword, keyword);
  entry.Set(DefaultSearchManager::kURL,
            std::string("http://") + keyword + ".com/{searchTerms}");
  entry.Set(DefaultSearchManager::kCreatedByPolicy,
            static_cast<int>(TemplateURLData::CreatedByPolicy::kSiteSearch));
  entry.Set(DefaultSearchManager::kEnforcedByPolicy, false);
  entry.Set(DefaultSearchManager::kFeaturedByPolicy, false);
  entry.Set(DefaultSearchManager::kFaviconURL,
            std::string("http://") + keyword + ".com/favicon.ico");
  entry.Set(DefaultSearchManager::kSafeForAutoReplace, false);
  entry.Set(DefaultSearchManager::kDateCreated, kTimestamp);
  entry.Set(DefaultSearchManager::kLastModified, kTimestamp);
  return entry;
}

class EnterpriseSiteSearchManagerTest : public testing::Test {
 public:
  EnterpriseSiteSearchManagerTest() = default;
  ~EnterpriseSiteSearchManagerTest() override = default;

  void SetUp() override {
    scoped_feature_list_.InitAndEnableFeature(
        omnibox::kSiteSearchSettingsPolicy);

    pref_service_ =
        std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
    EnterpriseSiteSearchManager::RegisterProfilePrefs(
        pref_service_->registry());
  }

  sync_preferences::TestingPrefServiceSyncable* pref_service() {
    return pref_service_.get();
  }

 private:
  std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
  base::test::ScopedFeatureList scoped_feature_list_;
};

TEST_F(EnterpriseSiteSearchManagerTest, EmptyList) {
  base::MockRepeatingCallback<void(
      EnterpriseSiteSearchManager::OwnedTemplateURLDataVector&&)>
      callback;
  EXPECT_CALL(callback, Run(IsEmpty())).Times(1);

  EnterpriseSiteSearchManager manager(pref_service(), callback.Get());
  pref_service()->SetManagedPref(
      EnterpriseSiteSearchManager::kSiteSearchSettingsPrefName,
      base::Value::List());
}

TEST_F(EnterpriseSiteSearchManagerTest, NonEmptyList) {
  base::Value::List pref_value;
  pref_value.Append(GenerateSiteSearchPrefEntry("work"));
  pref_value.Append(GenerateSiteSearchPrefEntry("docs"));

  base::MockRepeatingCallback<void(
      EnterpriseSiteSearchManager::OwnedTemplateURLDataVector&&)>
      callback;
  EXPECT_CALL(
      callback,
      Run(ElementsAre(Pointee(Property(&TemplateURLData::keyword, u"work")),
                      Pointee(Property(&TemplateURLData::keyword, u"docs")))))
      .Times(1);

  EnterpriseSiteSearchManager manager(pref_service(), callback.Get());
  pref_service()->SetManagedPref(
      EnterpriseSiteSearchManager::kSiteSearchSettingsPrefName,
      std::move(pref_value));
}

TEST_F(EnterpriseSiteSearchManagerTest, NotCreatedByPolicy) {
  base::Value::List pref_value;
  pref_value.Append(GenerateSiteSearchPrefEntry("work"));
  pref_value.Append(GenerateSiteSearchPrefEntry("docs"));

  base::MockRepeatingCallback<void(
      EnterpriseSiteSearchManager::OwnedTemplateURLDataVector&&)>
      callback;
  EXPECT_CALL(callback, Run(_)).Times(0);

  EnterpriseSiteSearchManager manager(pref_service(), callback.Get());
  pref_service()->SetUserPref(
      EnterpriseSiteSearchManager::kSiteSearchSettingsPrefName,
      std::move(pref_value));
}
