spec/flipper/feature_spec.rb in flipper-0.6.3 vs spec/flipper/feature_spec.rb in flipper-0.7.0.beta1
- old
+ new
@@ -4,12 +4,11 @@
require 'flipper/instrumenters/memory'
describe Flipper::Feature do
subject { described_class.new(:search, adapter) }
- let(:source) { {} }
- let(:adapter) { Flipper::Adapters::Memory.new(source) }
+ let(:adapter) { Flipper::Adapters::Memory.new }
describe "#initialize" do
it "sets name" do
feature = described_class.new(:search, adapter)
feature.name.should eq(:search)
@@ -35,10 +34,24 @@
feature.instrumenter.should be(instrumenter)
end
end
end
+ describe "#to_s" do
+ it "returns name as string" do
+ feature = described_class.new(:search, adapter)
+ feature.to_s.should eq("search")
+ end
+ end
+
+ describe "#to_param" do
+ it "returns name as string" do
+ feature = described_class.new(:search, adapter)
+ feature.to_param.should eq("search")
+ end
+ end
+
describe "#gate_for" do
context "with percentage of actors" do
it "returns percentage of actors gate" do
percentage = Flipper::Types::PercentageOfActors.new(10)
gate = subject.gate_for(percentage)
@@ -46,34 +59,30 @@
end
end
end
describe "#gates" do
- it "returns array of gates with each gate's instrumenter set" do
- instrumenter = double('Instrumenter')
- instance = described_class.new(:search, adapter, :instrumenter => instrumenter)
+ it "returns array of gates" do
+ instance = described_class.new(:search, adapter)
instance.gates.should be_instance_of(Array)
instance.gates.each do |gate|
gate.should be_a(Flipper::Gate)
- gate.instrumenter.should be(instrumenter)
end
instance.gates.size.should be(5)
end
end
describe "#gate" do
context "with symbol name" do
it "returns gate by name" do
- boolean_gate = subject.gates.detect { |gate| gate.name == :boolean }
- subject.gate(:boolean).should eq(boolean_gate)
+ subject.gate(:boolean).should be_instance_of(Flipper::Gates::Boolean)
end
end
context "with string name" do
it "returns gate by name" do
- boolean_gate = subject.gates.detect { |gate| gate.name == :boolean }
- subject.gate('boolean').should eq(boolean_gate)
+ subject.gate('boolean').should be_instance_of(Flipper::Gates::Boolean)
end
end
context "with name that does not exist" do
it "returns nil" do
@@ -153,30 +162,66 @@
end
it "returns :on" do
subject.state.should be(:on)
end
+
+ it "returns true for on?" do
+ subject.on?.should be(true)
+ end
+
+ it "returns false for off?" do
+ subject.off?.should be(false)
+ end
+
+ it "returns false for conditional?" do
+ subject.conditional?.should be(false)
+ end
end
context "fully off" do
before do
subject.disable
end
it "returns :off" do
subject.state.should be(:off)
end
+
+ it "returns false for on?" do
+ subject.on?.should be(false)
+ end
+
+ it "returns true for off?" do
+ subject.off?.should be(true)
+ end
+
+ it "returns false for conditional?" do
+ subject.conditional?.should be(false)
+ end
end
context "partially on" do
before do
- subject.enable Flipper::Types::PercentageOfRandom.new(5)
+ subject.enable Flipper::Types::PercentageOfTime.new(5)
end
it "returns :conditional" do
subject.state.should be(:conditional)
end
+
+ it "returns false for on?" do
+ subject.on?.should be(false)
+ end
+
+ it "returns false for off?" do
+ subject.off?.should be(false)
+ end
+
+ it "returns true for conditional?" do
+ subject.conditional?.should be(true)
+ end
end
end
describe "#description" do
context "fully on" do
@@ -200,15 +245,382 @@
end
context "partially on" do
before do
actor = Struct.new(:flipper_id).new(5)
- subject.enable Flipper::Types::PercentageOfRandom.new(5)
+ subject.enable Flipper::Types::PercentageOfTime.new(5)
subject.enable actor
end
it "returns text" do
subject.description.should eq('Enabled for actors ("5"), 5% of the time')
+ end
+ end
+ end
+
+ describe "#enabled_groups" do
+ context "when no groups enabled" do
+ it "returns empty set" do
+ subject.enabled_groups.should eq(Set.new)
+ end
+ end
+
+ context "when one or more groups enabled" do
+ before do
+ @staff = Flipper.register(:staff) { |thing| true }
+ @preview_features = Flipper.register(:preview_features) { |thing| true }
+ @not_enabled = Flipper.register(:not_enabled) { |thing| true }
+ @disabled = Flipper.register(:disabled) { |thing| true }
+ subject.enable @staff
+ subject.enable @preview_features
+ subject.disable @disabled
+ end
+
+ it "returns set of enabled groups" do
+ subject.enabled_groups.should eq(Set.new([
+ @staff,
+ @preview_features,
+ ]))
+ end
+
+ it "does not include groups that have not been enabled" do
+ subject.enabled_groups.should_not include(@not_enabled)
+ end
+
+ it "does not include disabled groups" do
+ subject.enabled_groups.should_not include(@disabled)
+ end
+
+ it "is aliased to groups" do
+ subject.enabled_groups.should eq(subject.groups)
+ end
+ end
+ end
+
+ describe "#disabled_groups" do
+ context "when no groups enabled" do
+ it "returns empty set" do
+ subject.disabled_groups.should eq(Set.new)
+ end
+ end
+
+ context "when one or more groups enabled" do
+ before do
+ @staff = Flipper.register(:staff) { |thing| true }
+ @preview_features = Flipper.register(:preview_features) { |thing| true }
+ @not_enabled = Flipper.register(:not_enabled) { |thing| true }
+ @disabled = Flipper.register(:disabled) { |thing| true }
+ subject.enable @staff
+ subject.enable @preview_features
+ subject.disable @disabled
+ end
+
+ it "returns set of groups that are not enabled" do
+ subject.disabled_groups.should eq(Set[
+ @not_enabled,
+ @disabled,
+ ])
+ end
+ end
+ end
+
+ describe "#groups_value" do
+ context "when no groups enabled" do
+ it "returns empty set" do
+ subject.groups_value.should eq(Set.new)
+ end
+ end
+
+ context "when one or more groups enabled" do
+ before do
+ @staff = Flipper.register(:staff) { |thing| true }
+ @preview_features = Flipper.register(:preview_features) { |thing| true }
+ @not_enabled = Flipper.register(:not_enabled) { |thing| true }
+ @disabled = Flipper.register(:disabled) { |thing| true }
+ subject.enable @staff
+ subject.enable @preview_features
+ subject.disable @disabled
+ end
+
+ it "returns set of enabled groups" do
+ subject.groups_value.should eq(Set.new([
+ @staff.name.to_s,
+ @preview_features.name.to_s,
+ ]))
+ end
+
+ it "does not include groups that have not been enabled" do
+ subject.groups_value.should_not include(@not_enabled.name.to_s)
+ end
+
+ it "does not include disabled groups" do
+ subject.groups_value.should_not include(@disabled.name.to_s)
+ end
+ end
+ end
+
+ describe "#actors_value" do
+ context "when no groups enabled" do
+ it "returns empty set" do
+ subject.actors_value.should eq(Set.new)
+ end
+ end
+
+ context "when one or more actors are enabled" do
+ before do
+ subject.enable Flipper::Types::Actor.new(Struct.new(:flipper_id).new("User:5"))
+ subject.enable Flipper::Types::Actor.new(Struct.new(:flipper_id).new("User:22"))
+ end
+
+ it "returns set of actor ids" do
+ subject.actors_value.should eq(Set.new(["User:5", "User:22"]))
+ end
+ end
+ end
+
+ describe "#boolean_value" do
+ context "when not enabled or disabled" do
+ it "returns false" do
+ subject.boolean_value.should be(false)
+ end
+ end
+
+ context "when enabled" do
+ before do
+ subject.enable
+ end
+
+ it "returns true" do
+ subject.boolean_value.should be(true)
+ end
+ end
+
+ context "when disabled" do
+ before do
+ subject.disable
+ end
+
+ it "returns false" do
+ subject.boolean_value.should be(false)
+ end
+ end
+ end
+
+ describe "#percentage_of_actors_value" do
+ context "when not enabled or disabled" do
+ it "returns nil" do
+ subject.percentage_of_actors_value.should be(0)
+ end
+ end
+
+ context "when enabled" do
+ before do
+ subject.enable Flipper::Types::PercentageOfActors.new(5)
+ end
+
+ it "returns true" do
+ subject.percentage_of_actors_value.should eq(5)
+ end
+ end
+
+ context "when disabled" do
+ before do
+ subject.disable
+ end
+
+ it "returns nil" do
+ subject.percentage_of_actors_value.should be(0)
+ end
+ end
+ end
+
+ describe "#percentage_of_time_value" do
+ context "when not enabled or disabled" do
+ it "returns nil" do
+ subject.percentage_of_time_value.should be(0)
+ end
+ end
+
+ context "when enabled" do
+ before do
+ subject.enable Flipper::Types::PercentageOfTime.new(5)
+ end
+
+ it "returns true" do
+ subject.percentage_of_time_value.should eq(5)
+ end
+ end
+
+ context "when disabled" do
+ before do
+ subject.disable
+ end
+
+ it "returns nil" do
+ subject.percentage_of_time_value.should be(0)
+ end
+ end
+ end
+
+ describe "#gate_values" do
+ context "when no gates are set in adapter" do
+ it "returns default gate values" do
+ subject.gate_values.should eq(Flipper::GateValues.new({
+ :actors => Set.new,
+ :groups => Set.new,
+ :boolean => nil,
+ :percentage_of_actors => nil,
+ :percentage_of_time => nil,
+ }))
+ end
+ end
+
+ context "with gate values set in adapter" do
+ before do
+ subject.enable Flipper::Types::Boolean.new(true)
+ subject.enable Flipper::Types::Actor.new(Struct.new(:flipper_id).new(5))
+ subject.enable Flipper::Types::Group.new(:admins)
+ subject.enable Flipper::Types::PercentageOfTime.new(50)
+ subject.enable Flipper::Types::PercentageOfActors.new(25)
+ end
+
+ it "returns gate values" do
+ subject.gate_values.should eq(Flipper::GateValues.new({
+ :actors => Set.new(["5"]),
+ :groups => Set.new(["admins"]),
+ :boolean => "true",
+ :percentage_of_time => "50",
+ :percentage_of_actors => "25",
+ }))
+ end
+ end
+ end
+
+ describe "#enable_actor/disable_actor" do
+ context "with object that responds to flipper_id" do
+ it "updates the gate values to include the actor" do
+ actor = Struct.new(:flipper_id).new(5)
+ subject.gate_values.actors.should be_empty
+ subject.enable_actor(actor)
+ subject.gate_values.actors.should eq(Set["5"])
+ subject.disable_actor(actor)
+ subject.gate_values.actors.should be_empty
+ end
+ end
+
+ context "with actor instance" do
+ it "updates the gate values to include the actor" do
+ actor = Struct.new(:flipper_id).new(5)
+ instance = Flipper::Types::Actor.wrap(actor)
+ subject.gate_values.actors.should be_empty
+ subject.enable_actor(instance)
+ subject.gate_values.actors.should eq(Set["5"])
+ subject.disable_actor(instance)
+ subject.gate_values.actors.should be_empty
+ end
+ end
+ end
+
+ describe "#enable_group/disable_group" do
+ context "with symbol group name" do
+ it "updates the gate values to include the group" do
+ actor = Struct.new(:flipper_id).new(5)
+ group = Flipper.register(:five_only) { |actor| actor.flipper_id == 5 }
+ subject.gate_values.groups.should be_empty
+ subject.enable_group(:five_only)
+ subject.gate_values.groups.should eq(Set["five_only"])
+ subject.disable_group(:five_only)
+ subject.gate_values.groups.should be_empty
+ end
+ end
+
+ context "with string group name" do
+ it "updates the gate values to include the group" do
+ actor = Struct.new(:flipper_id).new(5)
+ group = Flipper.register(:five_only) { |actor| actor.flipper_id == 5 }
+ subject.gate_values.groups.should be_empty
+ subject.enable_group("five_only")
+ subject.gate_values.groups.should eq(Set["five_only"])
+ subject.disable_group("five_only")
+ subject.gate_values.groups.should be_empty
+ end
+ end
+
+ context "with group instance" do
+ it "updates the gate values for the group" do
+ actor = Struct.new(:flipper_id).new(5)
+ group = Flipper.register(:five_only) { |actor| actor.flipper_id == 5 }
+ subject.gate_values.groups.should be_empty
+ subject.enable_group(group)
+ subject.gate_values.groups.should eq(Set["five_only"])
+ subject.disable_group(group)
+ subject.gate_values.groups.should be_empty
+ end
+ end
+ end
+
+ describe "#enable_percentage_of_time/disable_percentage_of_time" do
+ context "with integer" do
+ it "updates the gate values" do
+ subject.gate_values.percentage_of_time.should be(0)
+ subject.enable_percentage_of_time(56)
+ subject.gate_values.percentage_of_time.should be(56)
+ subject.disable_percentage_of_time
+ subject.gate_values.percentage_of_time.should be(0)
+ end
+ end
+
+ context "with string" do
+ it "updates the gate values" do
+ subject.gate_values.percentage_of_time.should be(0)
+ subject.enable_percentage_of_time("56")
+ subject.gate_values.percentage_of_time.should be(56)
+ subject.disable_percentage_of_time
+ subject.gate_values.percentage_of_time.should be(0)
+ end
+ end
+
+ context "with percentage of time instance" do
+ it "updates the gate values" do
+ percentage = Flipper::Types::PercentageOfTime.new(56)
+ subject.gate_values.percentage_of_time.should be(0)
+ subject.enable_percentage_of_time(percentage)
+ subject.gate_values.percentage_of_time.should be(56)
+ subject.disable_percentage_of_time
+ subject.gate_values.percentage_of_time.should be(0)
+ end
+ end
+ end
+
+ describe "#enable_percentage_of_actors/disable_percentage_of_actors" do
+ context "with integer" do
+ it "updates the gate values" do
+ subject.gate_values.percentage_of_actors.should be(0)
+ subject.enable_percentage_of_actors(56)
+ subject.gate_values.percentage_of_actors.should be(56)
+ subject.disable_percentage_of_actors
+ subject.gate_values.percentage_of_actors.should be(0)
+ end
+ end
+
+ context "with string" do
+ it "updates the gate values" do
+ subject.gate_values.percentage_of_actors.should be(0)
+ subject.enable_percentage_of_actors("56")
+ subject.gate_values.percentage_of_actors.should be(56)
+ subject.disable_percentage_of_actors
+ subject.gate_values.percentage_of_actors.should be(0)
+ end
+ end
+
+ context "with percentage of actors instance" do
+ it "updates the gate values" do
+ percentage = Flipper::Types::PercentageOfActors.new(56)
+ subject.gate_values.percentage_of_actors.should be(0)
+ subject.enable_percentage_of_actors(percentage)
+ subject.gate_values.percentage_of_actors.should be(56)
+ subject.disable_percentage_of_actors
+ subject.gate_values.percentage_of_actors.should be(0)
end
end
end
end