blob: 3035c6e998d414c3f51d24b3ae366ffc08dc2160 [file] [log] [blame]
// 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.
#ifndef COMPONENTS_USER_EDUCATION_TEST_TEST_FEATURE_PROMO_PRECONDITION_H_
#define COMPONENTS_USER_EDUCATION_TEST_TEST_FEATURE_PROMO_PRECONDITION_H_
#include <optional>
#include <string>
#include <vector>
#include "base/feature_list.h"
#include "base/memory/raw_ptr.h"
#include "components/user_education/common/feature_promo/feature_promo_controller.h"
#include "components/user_education/common/feature_promo/feature_promo_precondition.h"
#include "components/user_education/common/feature_promo/feature_promo_result.h"
#include "components/user_education/common/feature_promo/feature_promo_specification.h"
#include "components/user_education/common/feature_promo/impl/precondition_list_provider.h"
#include "components/user_education/common/user_education_context.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace user_education::test {
// Precondition list provider that forwards to a pre-generated list of caching
// preconditions (whose values can be individually set by id).
class TestPreconditionListProvider : public PreconditionListProvider {
public:
TestPreconditionListProvider();
~TestPreconditionListProvider() override;
// Sets the expected promo specification for the next query. If the next call
// does not match, or there are multiple calls, an error will be generated.
//
// To accept any value, call `ClearExpectedPromoForFutureQueries()`.
void SetExpectedPromoForNextQuery(const FeaturePromoSpecification& spec,
const UserEducationContextPtr& context);
// Sets the expected promo specification to "don't care" for all future calls
// to `GetPreconditions()` unless `SetExpectedPromoForNextQuery()` is called
// again. This is the default.
void ClearExpectedPromoForFutureQueries();
// Adds a precondition with the specified parameters and default allowed
// state.
void Add(FeaturePromoPrecondition::Identifier identifier,
std::string description,
FeaturePromoResult initial_result);
// Sets the default `result` for a particular `id` which has already been
// added.
void SetDefault(FeaturePromoPrecondition::Identifier id,
FeaturePromoResult result);
// Sets the specific `result` for a particular `id` for `iph_feature` only.
// This overrides the default value.
void SetForFeature(const base::Feature& iph_feature,
FeaturePromoPrecondition::Identifier id,
FeaturePromoResult result);
// PreconditionListProvider:
FeaturePromoPreconditionList GetPreconditions(
const FeaturePromoSpecification& spec,
const FeaturePromoParams& params,
const UserEducationContextPtr& context) const override;
private:
// Cache of preconditions that simulate values.
struct PreconditionData;
class TestPrecondition;
std::vector<std::unique_ptr<PreconditionData>> data_;
// Mutable so that it can be cleared out during calls to `GetPreconditions()`.
mutable std::optional<raw_ptr<const FeaturePromoSpecification>>
next_query_spec_;
mutable UserEducationContextPtr next_query_context_;
};
class MockPreconditionListProvider : public PreconditionListProvider {
public:
MockPreconditionListProvider();
~MockPreconditionListProvider() override;
MOCK_METHOD(FeaturePromoPreconditionList,
GetPreconditions,
(const FeaturePromoSpecification&,
const FeaturePromoParams&,
const UserEducationContextPtr&),
(const, override));
};
} // namespace user_education::test
#endif // COMPONENTS_USER_EDUCATION_TEST_TEST_FEATURE_PROMO_PRECONDITION_H_