910e62b5创建于 1月15日历史提交
// 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/lens/lens_overlay_languages_controller.h"

#include <vector>

#include "base/run_loop.h"
#include "base/test/bind.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/lens/core/mojom/translate.mojom.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/lens/lens_overlay_url_builder.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/browser_task_environment.h"
#include "net/http/http_status_code.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace lens {

constexpr char kExampleJsonResponse[] = R"JSON(
  {
    "sourceLanguages": [
      {
        "language": "auto",
        "name": "Detect language"
      },
      {
        "language": "en",
        "name": "English"
      }
    ],
    "targetLanguages": [
      {
        "language": "en",
        "name": "English"
      },
      {
        "language": "es",
        "name": "Spanish"
      }
    ]
  }
)JSON";
constexpr char kExampleIncorrectJsonResponse[] = R"JSON(
[
  {
    "language": "auto",
    "name": "Detect language"
  },
  {
    "language": "en",
    "name": "English"
  }
]
)JSON";

class LensOverlayLanguagesControllerTest : public testing::Test {
 protected:
  void SetUp() override {
    TestingProfile::Builder profile_builder;
    profile_builder.SetSharedURLLoaderFactory(
        test_url_loader_factory_.GetSafeWeakWrapper());
    profile_ = profile_builder.Build();

    g_browser_process->SetApplicationLocale("en-US");
  }

  TestingProfile* profile() { return profile_.get(); }

  network::TestURLLoaderFactory test_url_loader_factory_;

 private:
  content::BrowserTaskEnvironment task_environment_;
  std::unique_ptr<TestingProfile> profile_;
  std::vector<lens::mojom::LanguagePtr> sent_languages_;
};

TEST_F(LensOverlayLanguagesControllerTest,
       SendGetSupportedLanguagesRequest_SuccessfulResponse) {
  auto languages_controller =
      std::make_unique<LensOverlayLanguagesController>(profile());
  std::string locale;
  std::vector<mojom::LanguagePtr> sent_source_languages;
  std::vector<mojom::LanguagePtr> sent_target_languages;

  base::RunLoop run_loop;
  languages_controller->SendGetSupportedLanguagesRequest(
      base::BindLambdaForTesting(
          [&](const std::string& browser_locale,
              std::vector<mojom::LanguagePtr> source_languages,
              std::vector<mojom::LanguagePtr> target_languages) {
            locale = browser_locale;
            sent_source_languages = std::move(source_languages);
            sent_target_languages = std::move(target_languages);
            run_loop.Quit();
          }));
  test_url_loader_factory_.SimulateResponseForPendingRequest(
      BuildTranslateLanguagesURL("US", "en").spec(), kExampleJsonResponse);
  run_loop.Run();

  EXPECT_EQ(locale, "en-US");

  EXPECT_EQ(sent_source_languages.size(), 2UL);
  const auto& detect_language = sent_source_languages.at(0);
  EXPECT_EQ(detect_language->language_code, "auto");
  EXPECT_EQ(detect_language->name, "Detect language");
  const auto& english_language = sent_source_languages.at(1);
  EXPECT_EQ(english_language->language_code, "en");
  EXPECT_EQ(english_language->name, "English");

  EXPECT_EQ(sent_target_languages.size(), 2UL);
  const auto& english_target = sent_target_languages.at(0);
  EXPECT_EQ(english_target->language_code, "en");
  EXPECT_EQ(english_target->name, "English");
  const auto& spanish_target = sent_target_languages.at(1);
  EXPECT_EQ(spanish_target->language_code, "es");
  EXPECT_EQ(spanish_target->name, "Spanish");
}

TEST_F(LensOverlayLanguagesControllerTest,
       SendGetSupportedLanguagesRequest_RequestTimeOut) {
  auto languages_controller =
      std::make_unique<LensOverlayLanguagesController>(profile());
  std::string locale;
  std::vector<mojom::LanguagePtr> sent_source_languages;
  std::vector<mojom::LanguagePtr> sent_target_languages;

  base::RunLoop run_loop;
  languages_controller->SendGetSupportedLanguagesRequest(
      base::BindLambdaForTesting(
          [&](const std::string& browser_locale,
              std::vector<mojom::LanguagePtr> source_languages,
              std::vector<mojom::LanguagePtr> target_languages) {
            locale = browser_locale;
            sent_source_languages = std::move(source_languages);
            sent_target_languages = std::move(target_languages);
            run_loop.Quit();
          }));
  test_url_loader_factory_.SimulateResponseForPendingRequest(
      BuildTranslateLanguagesURL("US", "en").spec(), "",
      net::HTTP_REQUEST_TIMEOUT);
  run_loop.Run();

  EXPECT_EQ(locale, "en-US");
  EXPECT_EQ(sent_source_languages.size(), 0UL);
  EXPECT_EQ(sent_target_languages.size(), 0UL);
}

TEST_F(LensOverlayLanguagesControllerTest,
       SendGetSupportedLanguagesRequest_EmptyResponse) {
  auto languages_controller =
      std::make_unique<LensOverlayLanguagesController>(profile());
  std::string locale;
  std::vector<mojom::LanguagePtr> sent_source_languages;
  std::vector<mojom::LanguagePtr> sent_target_languages;

  base::RunLoop run_loop;
  languages_controller->SendGetSupportedLanguagesRequest(
      base::BindLambdaForTesting(
          [&](const std::string& browser_locale,
              std::vector<mojom::LanguagePtr> source_languages,
              std::vector<mojom::LanguagePtr> target_languages) {
            locale = browser_locale;
            sent_source_languages = std::move(source_languages);
            sent_target_languages = std::move(target_languages);
            run_loop.Quit();
          }));
  test_url_loader_factory_.SimulateResponseForPendingRequest(
      BuildTranslateLanguagesURL("US", "en").spec(), "");
  run_loop.Run();

  EXPECT_EQ(locale, "en-US");
  EXPECT_EQ(sent_source_languages.size(), 0UL);
  EXPECT_EQ(sent_target_languages.size(), 0UL);
}

TEST_F(LensOverlayLanguagesControllerTest,
       SendGetSupportedLanguagesRequest_IncorrectResponse) {
  auto languages_controller =
      std::make_unique<LensOverlayLanguagesController>(profile());
  std::string locale;
  std::vector<mojom::LanguagePtr> sent_source_languages;
  std::vector<mojom::LanguagePtr> sent_target_languages;

  base::RunLoop run_loop;
  languages_controller->SendGetSupportedLanguagesRequest(
      base::BindLambdaForTesting(
          [&](const std::string& browser_locale,
              std::vector<mojom::LanguagePtr> source_languages,
              std::vector<mojom::LanguagePtr> target_languages) {
            locale = browser_locale;
            sent_source_languages = std::move(source_languages);
            sent_target_languages = std::move(target_languages);
            run_loop.Quit();
          }));
  test_url_loader_factory_.SimulateResponseForPendingRequest(
      BuildTranslateLanguagesURL("US", "en").spec(),
      kExampleIncorrectJsonResponse);
  run_loop.Run();

  EXPECT_EQ(locale, "en-US");
  EXPECT_EQ(sent_source_languages.size(), 0UL);
  EXPECT_EQ(sent_target_languages.size(), 0UL);
}

}  // namespace lens