chromium/chrome/browser/lacros/account_manager/profile_account_manager_unittest.cc

// Copyright 2021 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/lacros/account_manager/profile_account_manager.h"

#include "base/check.h"
#include "base/files/file_path.h"
#include "base/scoped_observation.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/account_manager_core/account.h"
#include "components/account_manager_core/mock_account_manager_facade.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

class ProfileAccountManagerTest : public testing::Test {
 public:
  ProfileAccountManagerTest()
      : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {
    CHECK(testing_profile_manager_.SetUp());
    testing_profile_manager_.SetAccountProfileMapper(
        std::make_unique<AccountProfileMapper>(
            &mock_facade_, storage(),
            testing_profile_manager_.local_state()->Get()));
  }

  AccountProfileMapper* mapper() {
    return testing_profile_manager_.profile_manager()
        ->GetAccountProfileMapper();
  }

 private:
  ProfileAttributesStorage* storage() {
    return &testing_profile_manager_.profile_manager()
                ->GetProfileAttributesStorage();
  }

  content::BrowserTaskEnvironment task_environment_;
  account_manager::MockAccountManagerFacade mock_facade_;
  TestingProfileManager testing_profile_manager_;
};

TEST_F(ProfileAccountManagerTest, Observer) {
  const base::FilePath kProfilePath("/Profile/Path");
  const account_manager::Account kAccount{
      {"GaiaID", account_manager::AccountType::kGaia}, "raw_email"};
  ProfileAccountManager manager(mapper(), kProfilePath);
  account_manager::MockAccountManagerFacadeObserver mock_observer;
  base::ScopedObservation<ProfileAccountManager,
                          account_manager::AccountManagerFacade::Observer>
      observation{&mock_observer};
  observation.Observe(&manager);
  // Observer is called for the relevant profile.
  EXPECT_CALL(mock_observer,
              OnAccountUpserted(testing::Field(&account_manager::Account::key,
                                               kAccount.key)));
  manager.OnAccountUpserted(kProfilePath, kAccount);
  testing::Mock::VerifyAndClearExpectations(&mock_observer);
  EXPECT_CALL(mock_observer,
              OnAccountRemoved(testing::Field(&account_manager::Account::key,
                                              kAccount.key)));
  manager.OnAccountRemoved(kProfilePath, kAccount);
  testing::Mock::VerifyAndClearExpectations(&mock_observer);
  // Observer is not called for another profile.
  const base::FilePath kOtherPath("/Other/Path");
  EXPECT_CALL(mock_observer, OnAccountUpserted(testing::_)).Times(0);
  EXPECT_CALL(mock_observer, OnAccountRemoved(testing::_)).Times(0);
  manager.OnAccountUpserted(kOtherPath, kAccount);
  manager.OnAccountRemoved(kOtherPath, kAccount);
  testing::Mock::VerifyAndClearExpectations(&mock_observer);
}