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

#include "chrome/browser/password_manager/update_password_infobar_delegate_android.h"

#include <memory>

#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/password_manager/chrome_password_manager_client.h"
#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/browser/fake_form_fetcher.h"
#include "components/password_manager/core/browser/password_form_manager.h"
#include "components/password_manager/core/browser/password_manager.h"
#include "components/password_manager/core/browser/stub_form_saver.h"
#include "components/password_manager/core/browser/stub_password_manager_client.h"
#include "components/password_manager/core/browser/stub_password_manager_driver.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"

using password_manager::PasswordFormManager;

namespace {

class TestUpdatePasswordInfoBarDelegate : public UpdatePasswordInfoBarDelegate {
 public:
  TestUpdatePasswordInfoBarDelegate(
      content::WebContents* web_contents,
      std::unique_ptr<password_manager::PasswordFormManager> form_to_save,
      bool is_smartlock_branding_enabled)
      : UpdatePasswordInfoBarDelegate(web_contents,
                                      std::move(form_to_save),
                                      is_smartlock_branding_enabled) {}

  ~TestUpdatePasswordInfoBarDelegate() override {}
};

}  // namespace

class UpdatePasswordInfoBarDelegateTest
    : public ChromeRenderViewHostTestHarness {
 public:
  UpdatePasswordInfoBarDelegateTest();
  ~UpdatePasswordInfoBarDelegateTest() override {}

  void SetUp() override;
  void TearDown() override;

  const autofill::PasswordForm& test_form() { return test_form_; }
  std::unique_ptr<password_manager::PasswordFormManager>
  CreateTestFormManager();

 protected:
  std::unique_ptr<PasswordManagerInfoBarDelegate> CreateDelegate(
      std::unique_ptr<password_manager::PasswordFormManager>
          password_form_manager,
      bool is_smartlock_branding_enabled);

  password_manager::StubPasswordManagerClient client_;
  password_manager::StubPasswordManagerDriver driver_;
  password_manager::PasswordManager password_manager_;

  autofill::PasswordForm test_form_;

 private:
  password_manager::FakeFormFetcher fetcher_;

  DISALLOW_COPY_AND_ASSIGN(UpdatePasswordInfoBarDelegateTest);
};

UpdatePasswordInfoBarDelegateTest::UpdatePasswordInfoBarDelegateTest()
    : password_manager_(&client_) {
  test_form_.origin = GURL("https://example.com");
  test_form_.username_value = base::ASCIIToUTF16("username");
  test_form_.password_value = base::ASCIIToUTF16("12345");
}

void UpdatePasswordInfoBarDelegateTest::SetUp() {
  ChromeRenderViewHostTestHarness::SetUp();
  autofill::ChromeAutofillClient::CreateForWebContents(web_contents());
  ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
      web_contents(),
      autofill::ChromeAutofillClient::FromWebContents(web_contents()));
}

void UpdatePasswordInfoBarDelegateTest::TearDown() {
  ChromeRenderViewHostTestHarness::TearDown();
}

std::unique_ptr<password_manager::PasswordFormManager>
UpdatePasswordInfoBarDelegateTest::CreateTestFormManager() {
  auto manager = std::make_unique<password_manager::PasswordFormManager>(
      &password_manager_, &client_, driver_.AsWeakPtr(), test_form(),
      std::make_unique<password_manager::StubFormSaver>(), &fetcher_);
  manager->Init(nullptr);
  manager->ProvisionallySave(test_form());
  return manager;
}

std::unique_ptr<PasswordManagerInfoBarDelegate>
UpdatePasswordInfoBarDelegateTest::CreateDelegate(
    std::unique_ptr<password_manager::PasswordFormManager>
        password_form_manager,
    bool is_smartlock_branding_enabled) {
  std::unique_ptr<PasswordManagerInfoBarDelegate> delegate(
      new TestUpdatePasswordInfoBarDelegate(web_contents(),
                                            std::move(password_form_manager),
                                            is_smartlock_branding_enabled));
  return delegate;
}

TEST_F(UpdatePasswordInfoBarDelegateTest, HasDetailsMessageForSignedIn) {
  std::unique_ptr<password_manager::PasswordFormManager> password_form_manager(
      CreateTestFormManager());
  std::unique_ptr<PasswordManagerInfoBarDelegate> infobar(
      CreateDelegate(std::move(password_form_manager),
                     true /* is_smartlock_branding_enabled */));
  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_SAVE_PASSWORD_FOOTER),
            infobar->GetDetailsMessageText());
}

TEST_F(UpdatePasswordInfoBarDelegateTest, EmptyDetailsMessageForNotSignedIn) {
  std::unique_ptr<password_manager::PasswordFormManager> password_form_manager(
      CreateTestFormManager());
  std::unique_ptr<PasswordManagerInfoBarDelegate> infobar(
      CreateDelegate(std::move(password_form_manager),
                     false /* is_smartlock_branding_enabled */));
  EXPECT_TRUE(infobar->GetDetailsMessageText().empty());
}
