docbrown/spec/models/ab_experiment_spec.rb
Jeremy Friesen 0d0464be2f
Allowing VariantQuery for Feed Generation (#17382)
* 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>
2022-04-21 11:07:09 -04:00

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