1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/user_education/common/ntp_promo/ntp_promo_controller.h"
#include "base/test/mock_callback.h"
#include "components/user_education/common/ntp_promo/ntp_promo_registry.h"
#include "components/user_education/common/ntp_promo/ntp_promo_specification.h"
#include "components/user_education/common/user_education_data.h"
#include "components/user_education/test/test_user_education_storage_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace user_education {
namespace {
using ::testing::_;
using ::testing::Return;
constexpr char kPromoId[] = "promo";
class NtpPromoControllerTest : public testing::Test {
public:
NtpPromoControllerTest() : controller_(registry_, storage_service_) {}
protected:
void RegisterPromo(
NtpPromoIdentifier id,
NtpPromoSpecification::EligibilityCallback eligibility_callback,
NtpPromoSpecification::ActionCallback action_callback) {
registry_.AddPromo(NtpPromoSpecification(
id, NtpPromoContent("", 0, 0), eligibility_callback, action_callback,
/*show_after=*/{}, user_education::Metadata()));
}
NtpPromoRegistry registry_;
test::TestUserEducationStorageService storage_service_;
NtpPromoController controller_;
};
} // namespace
// Note: Parameterize these eligibility tests when there are more of them.
TEST_F(NtpPromoControllerTest, IneligiblePromoHidden) {
base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
eligibility_callback;
RegisterPromo(kPromoId, eligibility_callback.Get(),
NtpPromoSpecification::ActionCallback());
EXPECT_CALL(eligibility_callback, Run(_))
.WillOnce(Return(NtpPromoSpecification::Eligibility::kIneligible));
const auto showable_promos = controller_.GetShowablePromos();
EXPECT_TRUE(showable_promos.pending.empty());
EXPECT_TRUE(showable_promos.completed.empty());
}
TEST_F(NtpPromoControllerTest, EligiblePromoShows) {
base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
eligibility_callback;
RegisterPromo(kPromoId, eligibility_callback.Get(),
NtpPromoSpecification::ActionCallback());
EXPECT_CALL(eligibility_callback, Run(_))
.WillOnce(Return(NtpPromoSpecification::Eligibility::kEligible));
const auto showable_promos = controller_.GetShowablePromos();
EXPECT_EQ(showable_promos.pending.size(), 1u);
EXPECT_TRUE(showable_promos.completed.empty());
}
TEST_F(NtpPromoControllerTest, CompletedPromoShows) {
base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
eligibility_callback;
RegisterPromo(kPromoId, eligibility_callback.Get(),
NtpPromoSpecification::ActionCallback());
EXPECT_CALL(eligibility_callback, Run(_))
.WillOnce(Return(NtpPromoSpecification::Eligibility::kCompleted));
const auto showable_promos = controller_.GetShowablePromos();
EXPECT_TRUE(showable_promos.pending.empty());
EXPECT_EQ(showable_promos.completed.size(), 1u);
}
TEST_F(NtpPromoControllerTest, MarkedCompletePromoShows) {
base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
eligibility_callback;
RegisterPromo(kPromoId, eligibility_callback.Get(),
NtpPromoSpecification::ActionCallback());
EXPECT_CALL(eligibility_callback, Run(_))
.WillOnce(Return(NtpPromoSpecification::Eligibility::kEligible));
user_education::KeyedNtpPromoData keyed_data;
keyed_data.completed = base::Time::Now();
storage_service_.SaveNtpPromoData(kPromoId, keyed_data);
const auto showable_promos = controller_.GetShowablePromos();
EXPECT_TRUE(showable_promos.pending.empty());
EXPECT_EQ(showable_promos.completed.size(), 1u);
}
TEST_F(NtpPromoControllerTest, ClickInvokesPromoAction) {
base::MockRepeatingCallback<void(Browser*)> action_callback;
RegisterPromo(kPromoId, NtpPromoSpecification::EligibilityCallback(),
action_callback.Get());
EXPECT_CALL(action_callback, Run(_));
controller_.OnPromoClicked(kPromoId);
}
} // namespace user_education
|