chromium/chrome/browser/fast_checkout/fast_checkout_personal_data_helper_impl_unittest.cc

// 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 "chrome/browser/fast_checkout/fast_checkout_personal_data_helper_impl.h"

#include "base/uuid.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/autofill/core/browser/address_data_manager.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/payments_data_manager.h"
#include "components/autofill/core/browser/test_personal_data_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

using ::autofill::AutofillProfile;
using ::autofill::CreditCard;
using ::testing::Eq;

CreditCard GetEmptyCreditCard() {
  CreditCard credit_card(base::Uuid::GenerateRandomV4().AsLowercaseString(),
                         "");
  autofill::test::SetCreditCardInfo(&credit_card, /*name_on_card=*/"",
                                    /*card_number=*/"",
                                    autofill::test::NextMonth().c_str(),
                                    autofill::test::NextYear().c_str(), "1");
  return credit_card;
}

const AutofillProfile kProfile = autofill::test::GetFullProfile();
const AutofillProfile kIncompleteProfile =
    autofill::test::GetIncompleteProfile1();
const CreditCard kCreditCard = autofill::test::GetCreditCard();
const CreditCard kEmptyCreditCard = GetEmptyCreditCard();

std::unique_ptr<KeyedService> BuildTestPersonalDataManager(
    content::BrowserContext* context) {
  auto personal_data_manager =
      std::make_unique<autofill::TestPersonalDataManager>();
  personal_data_manager->test_address_data_manager().SetAutofillProfileEnabled(
      true);
  personal_data_manager->test_payments_data_manager()
      .SetAutofillPaymentMethodsEnabled(true);
  personal_data_manager->test_payments_data_manager()
      .SetAutofillWalletImportEnabled(true);
  return personal_data_manager;
}

class FastCheckoutPersonalDataHelperTest
    : public ChromeRenderViewHostTestHarness {
 protected:
  void SetUp() override {
    content::RenderViewHostTestHarness::SetUp();

    autofill::PersonalDataManagerFactory::GetInstance()->SetTestingFactory(
        GetBrowserContext(),
        base::BindRepeating(&BuildTestPersonalDataManager));

    personal_data_helper_ =
        std::make_unique<FastCheckoutPersonalDataHelperImpl>(web_contents());
  }

  FastCheckoutPersonalDataHelperImpl* personal_data_helper() {
    return personal_data_helper_.get();
  }

 private:
  std::unique_ptr<FastCheckoutPersonalDataHelperImpl> personal_data_helper_;
};

TEST_F(FastCheckoutPersonalDataHelperTest,
       GetPersonalDataManager_ReturnsValidPointer) {
  EXPECT_TRUE(personal_data_helper()->GetPersonalDataManager());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidAddressProfiles_HasValidProfiles_ReturnsFalse) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kProfile);

  EXPECT_FALSE(personal_data_helper()->GetValidAddressProfiles().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidAddressProfiles_HasOnlyInvalidProfiles_ReturnsTrue) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kIncompleteProfile);

  EXPECT_TRUE(personal_data_helper()->GetValidAddressProfiles().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidAddressProfiles_HasValidAndInvalidProfiles_ReturnsFalse) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kProfile);
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kIncompleteProfile);

  EXPECT_FALSE(personal_data_helper()->GetValidAddressProfiles().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidCreditCards_HasValidCreditCards_ReturnsFalse) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kCreditCard);

  EXPECT_FALSE(personal_data_helper()->GetValidCreditCards().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidCreditCards_HasOnlyInvalidCreditCards_ReturnsTrue) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kEmptyCreditCard);

  EXPECT_TRUE(personal_data_helper()->GetValidCreditCards().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       NoValidCreditCards_HasValidAndInvalidCreditCards_ReturnsFalse) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kCreditCard);
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kEmptyCreditCard);

  EXPECT_FALSE(personal_data_helper()->GetValidCreditCards().empty());
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       GetCreditCardsToSuggest_ReturnsOnlyCardsWithNumber) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kCreditCard);
  personal_data_helper()
      ->GetPersonalDataManager()
      ->payments_data_manager()
      .AddCreditCard(kEmptyCreditCard);

  std::vector<autofill::CreditCard*> cards =
      personal_data_helper()->GetCreditCardsToSuggest();

  EXPECT_EQ(cards.size(), 1UL);
  EXPECT_EQ(*cards.front(), kCreditCard);
}

TEST_F(FastCheckoutPersonalDataHelperTest,
       GetProfilesToSuggest_ReturnsAllProfiles) {
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kProfile);
  personal_data_helper()
      ->GetPersonalDataManager()
      ->address_data_manager()
      .AddProfile(kIncompleteProfile);

  std::vector<const autofill::AutofillProfile*> profiles =
      personal_data_helper()->GetProfilesToSuggest();

  EXPECT_EQ(profiles.size(), 2UL);
}

}  // namespace