// 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.

#include "chrome/browser/ui/webui/management/management_ui.h"

#include "base/containers/fixed_flat_set.h"
#include "chrome/test/base/testing_profile.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"

class ManagementUITest : public testing::Test {
 protected:
  content::BrowserTaskEnvironment task_environment_;
  content::RenderViewHostTestEnabler rvh_enabler_;
};

TEST_F(ManagementUITest, VerifyConstructor) {
  TestingProfile profile;
  auto web_contents = content::WebContents::Create(
      content::WebContents::CreateParams(&profile));
  content::TestWebUI web_ui;
  web_ui.set_web_contents(web_contents.get());
  auto controller = std::make_unique<ManagementUI>(&web_ui);
  EXPECT_NE(controller, nullptr);
}

#if BUILDFLAG(IS_CHROMEOS)
// If the link containing strings will appear as a disclosure add here.
TEST_F(ManagementUITest, VerifyLinksHaveRemovedVersion) {
  static constexpr auto kHasNoLinkVersionOrNotApplicable =
      base::MakeFixedFlatSet<int>({IDS_MANAGEMENT_LOG_UPLOAD_ENABLED,
                                   IDS_MANAGEMENT_LEGACY_TECH_REPORT,
                                   // Not applicable strings follow.
                                   IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE,
                                   IDS_MANAGEMENT_DESK_SYNC_OPT_OUT,
                                   IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE});

  std::vector<webui::LocalizedString> localized_strings;
  ManagementUI::GetLocalizedStrings(localized_strings, false);

  for (auto i : localized_strings) {
    // Search for link specifier.
    if (l10n_util::GetStringUTF16(i.id).find(u"href=\"") != std::string::npos) {
      EXPECT_TRUE(kHasNoLinkVersionOrNotApplicable.contains(i.id));
    }
  }
}

// All disclosure strings that contain a link should not be included.
TEST_F(ManagementUITest, VerifyLinksRemoved) {
  static constexpr auto kLinkNotApplicable = base::MakeFixedFlatSet<int>(
      {IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE,
       IDS_MANAGEMENT_DESK_SYNC_OPT_OUT, IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE});
  std::vector<webui::LocalizedString> localized_strings;
  ManagementUI::GetLocalizedStrings(localized_strings, true);

  for (auto i : localized_strings) {
    // Search for link specifier.
    if (l10n_util::GetStringUTF16(i.id).find(u"href=\"") != std::string::npos) {
      EXPECT_TRUE(kLinkNotApplicable.contains(i.id));
    }
  }
}
#endif  // BUILDFLAG(IS_CHROMEOS)

TEST_F(ManagementUITest, VerifyLocalizedStrings) {
  std::vector<webui::LocalizedString> localized_strings;
  ManagementUI::GetLocalizedStrings(localized_strings, false);

  bool found_title = false;
  for (const auto& str : localized_strings) {
    if (std::string_view(str.name) == "title") {
      found_title = true;
    }
  }
  EXPECT_TRUE(found_title);
}
