diff --git a/README.md b/README.md index 836c2057..7b13c95f 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,8 @@ Split.configure do |config| # before experiment reset or deleted config.on_before_experiment_reset = -> (example) { # Do something on reset } config.on_before_experiment_delete = -> (experiment) { # Do something else on delete } + # after experiment winner had been set + config.on_experiment_winner_choose = -> (experiment) { # Do something on winner choose } end ``` diff --git a/lib/split/configuration.rb b/lib/split/configuration.rb index 5647fa49..e36cbca3 100644 --- a/lib/split/configuration.rb +++ b/lib/split/configuration.rb @@ -20,6 +20,7 @@ class Configuration attr_accessor :on_experiment_reset attr_accessor :on_experiment_delete attr_accessor :on_before_experiment_reset + attr_accessor :on_experiment_winner_choose attr_accessor :on_before_experiment_delete attr_accessor :include_rails_helper attr_accessor :beta_probability_simulations @@ -216,6 +217,7 @@ def initialize @on_experiment_delete = proc{|experiment|} @on_before_experiment_reset = proc{|experiment|} @on_before_experiment_delete = proc{|experiment|} + @on_experiment_winner_choose = proc{|experiment|} @db_failover_allow_parameter_override = false @allow_multiple_experiments = false @enabled = true diff --git a/lib/split/experiment.rb b/lib/split/experiment.rb index b9c5fac7..36a7a26f 100644 --- a/lib/split/experiment.rb +++ b/lib/split/experiment.rb @@ -155,6 +155,7 @@ def has_winner? def winner=(winner_name) redis.hset(:experiment_winner, name, winner_name.to_s) @has_winner = true + Split.configuration.on_experiment_winner_choose.call(self) end def participant_count diff --git a/spec/experiment_spec.rb b/spec/experiment_spec.rb index fe7ec44a..c90f865d 100644 --- a/spec/experiment_spec.rb +++ b/spec/experiment_spec.rb @@ -118,7 +118,7 @@ def alternative(color) experiment = Split::Experiment.new('basket_text', :alternatives => ['Basket', "Cart"], :resettable => false) expect(experiment.resettable).to be_falsey end - + context 'from configuration' do let(:experiment_name) { :my_experiment } let(:experiments) do @@ -130,7 +130,7 @@ def alternative(color) end before { Split.configuration.experiments = experiments } - + it 'assigns default values to the experiment' do expect(Split::Experiment.new(experiment_name).resettable).to eq(true) end @@ -233,12 +233,17 @@ def alternative(color) end describe 'winner=' do - it "should allow you to specify a winner" do + it 'should allow you to specify a winner' do experiment.save experiment.winner = 'red' expect(experiment.winner.name).to eq('red') end + it 'should call the on_experiment_winner_choose hook' do + expect(Split.configuration.on_experiment_winner_choose).to receive(:call) + experiment.winner = 'green' + end + context 'when has_winner state is memoized' do before { expect(experiment).to_not have_winner }