Skip to content

Commit 7a075be

Browse files
authored
Merge pull request #721 from henrique-ft/fix-context-shim-override-behavior
Fix context shim override behavior
2 parents e8120d1 + 18ad66a commit 7a075be

File tree

4 files changed

+83
-21
lines changed

4 files changed

+83
-21
lines changed

lib/split/encapsulated_helper.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ def initialize(context)
2323
@context = context
2424
end
2525

26+
def params
27+
request.params if request_present?
28+
end
29+
30+
def request
31+
@context.request if @context.respond_to?(:request)
32+
end
33+
2634
def ab_user
2735
@ab_user ||= Split::User.new(@context)
2836
end

lib/split/helper.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ def override_alternative(experiment_name)
121121
end
122122

123123
def override_alternative_by_params(experiment_name)
124-
defined?(params) && params[OVERRIDE_PARAM_NAME] && params[OVERRIDE_PARAM_NAME][experiment_name]
124+
params_present? && params[OVERRIDE_PARAM_NAME] && params[OVERRIDE_PARAM_NAME][experiment_name]
125125
end
126126

127127
def override_alternative_by_cookies(experiment_name)
128-
return unless defined?(request)
128+
return unless request_present?
129129

130130
if request.cookies && request.cookies.key?("split_override")
131131
experiments = JSON.parse(request.cookies["split_override"]) rescue {}
@@ -134,34 +134,42 @@ def override_alternative_by_cookies(experiment_name)
134134
end
135135

136136
def split_generically_disabled?
137-
defined?(params) && params["SPLIT_DISABLE"]
137+
params_present? && params["SPLIT_DISABLE"]
138138
end
139139

140140
def ab_user
141141
@ab_user ||= User.new(self)
142142
end
143143

144144
def exclude_visitor?
145-
defined?(request) && (instance_exec(request, &Split.configuration.ignore_filter) || is_ignored_ip_address? || is_robot? || is_preview?)
145+
request_present? && (instance_exec(request, &Split.configuration.ignore_filter) || is_ignored_ip_address? || is_robot? || is_preview?)
146146
end
147147

148148
def is_robot?
149-
defined?(request) && request.user_agent =~ Split.configuration.robot_regex
149+
request_present? && request.user_agent =~ Split.configuration.robot_regex
150150
end
151151

152152
def is_preview?
153-
defined?(request) && defined?(request.headers) && request.headers["x-purpose"] == "preview"
153+
request_present? && defined?(request.headers) && request.headers["x-purpose"] == "preview"
154154
end
155155

156156
def is_ignored_ip_address?
157157
return false if Split.configuration.ignore_ip_addresses.empty?
158158

159159
Split.configuration.ignore_ip_addresses.each do |ip|
160-
return true if defined?(request) && (request.ip == ip || (ip.class == Regexp && request.ip =~ ip))
160+
return true if request_present? && (request.ip == ip || (ip.class == Regexp && request.ip =~ ip))
161161
end
162162
false
163163
end
164164

165+
def params_present?
166+
defined?(params) && params != nil
167+
end
168+
169+
def request_present?
170+
defined?(request) && request != nil
171+
end
172+
165173
def active_experiments
166174
ab_user.active_experiments
167175
end

spec/encapsulated_helper_spec.rb

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
describe Split::EncapsulatedHelper do
66
include Split::EncapsulatedHelper
77

8-
def params
9-
raise NoMethodError, "This method is not really defined"
10-
end
11-
128
describe "ab_test" do
139
before do
1410
allow_any_instance_of(Split::EncapsulatedHelper::ContextShim).to receive(:ab_user)
1511
.and_return(mock_user)
1612
end
1713

18-
it "should not raise an error when params raises an error" do
19-
expect { params }.to raise_error(NoMethodError)
20-
expect { ab_test("link_color", "blue", "red") }.not_to raise_error
14+
context "when params raises an error" do
15+
before do
16+
allow(self).to receive(:params).and_raise(NoMethodError)
17+
end
18+
19+
it "should not raise an error " do
20+
expect { params }.to raise_error(NoMethodError)
21+
expect { ab_test("link_color", "blue", "red") }.not_to raise_error
22+
end
2123
end
2224

2325
it "calls the block with selected alternative" do
@@ -43,8 +45,43 @@ def params
4345
include Split::EncapsulatedHelper
4446
public :session
4547
}.new
48+
4649
expect(ctx).to receive(:session) { {} }
4750
expect { ctx.ab_test("link_color", "blue", "red") }.not_to raise_error
4851
end
52+
53+
context "when request is defined in context of ContextShim" do
54+
context "when overriding by params" do
55+
it do
56+
ctx = Class.new {
57+
public :session
58+
def request
59+
build_request(params: {
60+
"ab_test" => { "link_color" => "blue" }
61+
})
62+
end
63+
}.new
64+
65+
context_shim = Split::EncapsulatedHelper::ContextShim.new(ctx)
66+
expect(context_shim.ab_test("link_color", "blue", "red")).to be("blue")
67+
end
68+
end
69+
70+
context "when overriding by cookies" do
71+
it do
72+
ctx = Class.new {
73+
public :session
74+
def request
75+
build_request(cookies: {
76+
"split_override" => '{ "link_color": "red" }'
77+
})
78+
end
79+
}.new
80+
81+
context_shim = Split::EncapsulatedHelper::ContextShim.new(ctx)
82+
expect(context_shim.ab_test("link_color", "blue", "red")).to be("red")
83+
end
84+
end
85+
end
4986
end
5087
end

spec/spec_helper.rb

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,20 @@ def params
4444
@params ||= {}
4545
end
4646

47-
def request(ua = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27")
48-
@request ||= begin
49-
r = OpenStruct.new
50-
r.user_agent = ua
51-
r.ip = "192.168.1.1"
52-
r
53-
end
47+
def request
48+
@request ||= build_request
49+
end
50+
51+
def build_request(
52+
ua: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27",
53+
ip: "192.168.1.1",
54+
params: {},
55+
cookies: {}
56+
)
57+
r = OpenStruct.new
58+
r.user_agent = ua
59+
r.ip = ip
60+
r.params = params
61+
r.cookies = cookies
62+
r
5463
end

0 commit comments

Comments
 (0)