* Allowing VariantQuery for Feed Generation Apologies for the breadth of this pull request, I had considered many small commits, but felt that would've been more effort for the value provided. This commit includes the following: - Documentation updates to the feed variant (though not the final pass) - Renaming and adding RelevancyLevers that help differentiate - Adding RelevancyLever#range to provide documentation - Reducing redundent controller logic by making a `Articles::Feeds.feed_for` method. - Adding some configuration validation for RelevancyLevers - Adding constants for better clarification - Testing unhappy paths for feed configuration - Adjusting the module namespace of some objects - Exposing top-level configurations for variants (along with their defaults) - Creating the VariantyQuery that at present inherits from the `Articles::Feeds::WeightedQueryStrategy` As implemented, we can deploy this code to production without using the new VariantQuery. Once we toggle on the `:feed_uses_variant_query_feature` FeatureFlag, it will switch to using the VariantQuery. The VariantQuery's two variants and the internal configuration of `Articles::Feeds::WeightedQueryStrategy` produce the same query. The goal of this factor is to allow for a quick on and off toggle of the feed query; to ensure that what we introduce remains performant. - Closes forem/forem#17272 - Closes forem/forem#17276 - Closes forem/forem#17216 In addition, I will be recording a code-walkthrough and linking that recording to the pull request. * Apply suggestions from code review Co-authored-by: Mac Siri <krairit.siri@gmail.com> Co-authored-by: Mac Siri <krairit.siri@gmail.com>
74 lines
2.9 KiB
Ruby
74 lines
2.9 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe AbExperiment do
|
|
let(:controller) { ApplicationController.new }
|
|
let(:user) { double }
|
|
|
|
describe ".get_feed_variant_for" do
|
|
before do
|
|
allow(controller).to receive(:field_test).with(AbExperiment::CURRENT_FEED_STRATEGY_EXPERIMENT,
|
|
participant: user).and_return("special")
|
|
end
|
|
|
|
it "returns an inquirable string" do
|
|
result = described_class.get_feed_variant_for(user: user, controller: controller)
|
|
expect(result).to eq("special")
|
|
expect(result).to be_special
|
|
end
|
|
end
|
|
|
|
describe ".get" do
|
|
before do
|
|
allow(controller).to receive(:field_test).with(AbExperiment::CURRENT_FEED_STRATEGY_EXPERIMENT,
|
|
participant: user).and_return("special")
|
|
end
|
|
|
|
context "with :feed_strategy_round_3 experiment" do
|
|
it "repurposes the :feed_strategy experiment" do
|
|
expect(described_class.get(experiment: described_class::CURRENT_FEED_STRATEGY_EXPERIMENT,
|
|
user: user,
|
|
controller: controller,
|
|
default_value: "default")).to eq("special")
|
|
end
|
|
end
|
|
|
|
context "with :feed_strategy experiment" do
|
|
before do
|
|
allow(controller).to receive(:field_test).with(:feed_strategy, participant: user).and_return("special")
|
|
end
|
|
|
|
let(:experiment) { :feed_strategy }
|
|
|
|
it "returns an inquirable string" do
|
|
result = described_class.get(experiment: :feed_strategy,
|
|
user: user,
|
|
controller: controller,
|
|
default_value: "default")
|
|
expect(result).to eq("special")
|
|
expect(result).to be_special
|
|
end
|
|
|
|
it "allows for an config override" do
|
|
result = described_class.get(experiment: :feed_strategy,
|
|
user: user,
|
|
controller: controller,
|
|
default_value: "special",
|
|
config: { "AB_EXPERIMENT_FEED_STRATEGY" => "not_special" })
|
|
expect(result).to eq("not_special")
|
|
expect(result).to be_not_special
|
|
end
|
|
|
|
it "returns the default value when the FeatureFlipper is off" do
|
|
allow(FeatureFlag).to receive(:accessible?).with(:ab_experiment_feed_strategy).and_return(false)
|
|
|
|
result = described_class.get(experiment: :feed_strategy,
|
|
user: user,
|
|
controller: controller,
|
|
default_value: "special",
|
|
config: { "AB_EXPERIMENT_FEED_STRATEGY" => "not_special" })
|
|
expect(result).to eq("special")
|
|
expect(result).to be_special
|
|
end
|
|
end
|
|
end
|
|
end
|