vanity 3.1.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/linting.yml +28 -0
- data/.github/workflows/test.yml +3 -6
- data/.rubocop.yml +114 -0
- data/.rubocop_todo.yml +67 -0
- data/Appraisals +9 -31
- data/CHANGELOG +5 -0
- data/Gemfile +7 -3
- data/Gemfile.lock +31 -3
- data/README.md +4 -9
- data/Rakefile +25 -24
- data/bin/vanity +1 -1
- data/doc/configuring.textile +1 -0
- data/gemfiles/rails52.gemfile +6 -3
- data/gemfiles/rails52.gemfile.lock +34 -9
- data/gemfiles/rails60.gemfile +6 -3
- data/gemfiles/rails60.gemfile.lock +34 -9
- data/gemfiles/rails61.gemfile +6 -3
- data/gemfiles/rails61.gemfile.lock +34 -9
- data/lib/generators/vanity/migration_generator.rb +5 -7
- data/lib/vanity/adapters/abstract_adapter.rb +43 -45
- data/lib/vanity/adapters/active_record_adapter.rb +30 -30
- data/lib/vanity/adapters/mock_adapter.rb +14 -18
- data/lib/vanity/adapters/mongodb_adapter.rb +73 -69
- data/lib/vanity/adapters/redis_adapter.rb +19 -27
- data/lib/vanity/adapters.rb +1 -1
- data/lib/vanity/autoconnect.rb +6 -7
- data/lib/vanity/commands/list.rb +7 -7
- data/lib/vanity/commands/report.rb +18 -22
- data/lib/vanity/configuration.rb +19 -19
- data/lib/vanity/connection.rb +12 -14
- data/lib/vanity/experiment/ab_test.rb +82 -70
- data/lib/vanity/experiment/alternative.rb +3 -5
- data/lib/vanity/experiment/base.rb +24 -19
- data/lib/vanity/experiment/bayesian_bandit_score.rb +7 -13
- data/lib/vanity/experiment/definition.rb +6 -6
- data/lib/vanity/frameworks/rails.rb +39 -39
- data/lib/vanity/frameworks.rb +2 -2
- data/lib/vanity/helpers.rb +1 -1
- data/lib/vanity/metric/active_record.rb +21 -19
- data/lib/vanity/metric/base.rb +22 -23
- data/lib/vanity/metric/google_analytics.rb +6 -9
- data/lib/vanity/metric/remote.rb +3 -5
- data/lib/vanity/playground.rb +3 -6
- data/lib/vanity/vanity.rb +8 -12
- data/lib/vanity/version.rb +1 -1
- data/test/adapters/active_record_adapter_test.rb +1 -5
- data/test/adapters/mock_adapter_test.rb +0 -2
- data/test/adapters/mongodb_adapter_test.rb +1 -5
- data/test/adapters/redis_adapter_test.rb +2 -3
- data/test/adapters/shared_tests.rb +9 -12
- data/test/autoconnect_test.rb +3 -3
- data/test/cli_test.rb +0 -1
- data/test/configuration_test.rb +18 -34
- data/test/connection_test.rb +3 -3
- data/test/dummy/Rakefile +1 -1
- data/test/dummy/app/controllers/use_vanity_controller.rb +12 -8
- data/test/dummy/app/mailers/vanity_mailer.rb +3 -3
- data/test/dummy/config/application.rb +1 -1
- data/test/dummy/config/boot.rb +3 -3
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/development.rb +0 -1
- data/test/dummy/config/environments/test.rb +1 -1
- data/test/dummy/config/initializers/session_store.rb +1 -1
- data/test/dummy/config.ru +1 -1
- data/test/dummy/script/rails +2 -2
- data/test/experiment/ab_test.rb +148 -154
- data/test/experiment/base_test.rb +48 -32
- data/test/frameworks/rails/action_controller_test.rb +25 -25
- data/test/frameworks/rails/action_mailer_test.rb +2 -2
- data/test/frameworks/rails/action_view_test.rb +5 -6
- data/test/frameworks/rails/rails_test.rb +147 -181
- data/test/helper_test.rb +2 -2
- data/test/metric/active_record_test.rb +174 -212
- data/test/metric/base_test.rb +21 -46
- data/test/metric/google_analytics_test.rb +17 -25
- data/test/metric/remote_test.rb +7 -10
- data/test/playground_test.rb +7 -14
- data/test/templates_test.rb +16 -20
- data/test/test_helper.rb +28 -29
- data/test/vanity_test.rb +4 -10
- data/test/web/rails/dashboard_test.rb +21 -21
- data/vanity.gemspec +8 -7
- metadata +28 -30
- data/gemfiles/rails42.gemfile +0 -33
- data/gemfiles/rails42.gemfile.lock +0 -265
- data/gemfiles/rails42_protected_attributes.gemfile +0 -34
- data/gemfiles/rails42_protected_attributes.gemfile.lock +0 -264
- data/gemfiles/rails51.gemfile +0 -33
- data/gemfiles/rails51.gemfile.lock +0 -285
data/test/metric/base_test.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
3
|
describe "Metric via playground" do
|
4
|
-
|
5
4
|
it "knows all loaded metrics" do
|
6
5
|
metric "Yawns/sec", "Cheers/sec"
|
7
6
|
assert Vanity.playground.metrics.keys.include?(:yawns_sec)
|
@@ -9,34 +8,28 @@ describe "Metric via playground" do
|
|
9
8
|
end
|
10
9
|
|
11
10
|
it "loads metric definitions" do
|
12
|
-
File.
|
13
|
-
f.write <<-RUBY
|
11
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
14
12
|
metric "Yawns/sec" do
|
15
13
|
def xmts
|
16
14
|
"x"
|
17
15
|
end
|
18
16
|
end
|
19
|
-
|
20
|
-
end
|
17
|
+
RUBY
|
21
18
|
assert_equal "x", Vanity.playground.metric(:yawns_sec).xmts
|
22
19
|
end
|
23
20
|
|
24
21
|
it "bubbles up loaded metrics" do
|
25
|
-
File.
|
26
|
-
f.write "fail 'yawn!'"
|
27
|
-
end
|
22
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", "fail 'yawn!'")
|
28
23
|
assert_raises NameError do
|
29
24
|
Vanity.playground.metric(:yawns_sec)
|
30
25
|
end
|
31
26
|
end
|
32
27
|
|
33
28
|
it "map identifier from file name" do
|
34
|
-
File.
|
35
|
-
f.write <<-RUBY
|
29
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
36
30
|
metric "yawns/hour" do
|
37
31
|
end
|
38
|
-
|
39
|
-
end
|
32
|
+
RUBY
|
40
33
|
assert Vanity.playground.metric(:yawns_sec)
|
41
34
|
end
|
42
35
|
|
@@ -64,19 +57,16 @@ describe "Metric via playground" do
|
|
64
57
|
end
|
65
58
|
|
66
59
|
it "bootstraps the metric" do
|
67
|
-
File.
|
68
|
-
f.write <<-RUBY
|
60
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
69
61
|
metric "yawns/hour" do
|
70
62
|
end
|
71
|
-
|
72
|
-
end
|
63
|
+
RUBY
|
73
64
|
Vanity.playground.track!(:yawns_sec)
|
74
65
|
Vanity.playground.track!(:yawns_sec)
|
75
66
|
assert Vanity.playground.connection.get_metric_last_update_at(:yawns_sec)
|
76
67
|
end
|
77
68
|
end
|
78
69
|
|
79
|
-
|
80
70
|
describe "Metric tracking" do
|
81
71
|
it "disabled when metrics are disabled" do
|
82
72
|
not_collecting!
|
@@ -100,7 +90,7 @@ describe "Metric tracking" do
|
|
100
90
|
Timecop.freeze((today - 2).to_time) { 2.times { Vanity.playground.track! :yawns_sec } }
|
101
91
|
1.times { Vanity.playground.track! :yawns_sec }
|
102
92
|
boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
|
103
|
-
assert_equal [0,4,0,2,0,1], boredom
|
93
|
+
assert_equal [0, 4, 0, 2, 0, 1], boredom
|
104
94
|
end
|
105
95
|
|
106
96
|
it "with no value" do
|
@@ -117,7 +107,7 @@ describe "Metric tracking" do
|
|
117
107
|
Timecop.freeze((today - 2).to_time) { Vanity.playground.track! :yawns_sec, 2 }
|
118
108
|
Vanity.playground.track! :yawns_sec
|
119
109
|
boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
|
120
|
-
assert_equal [0,4,0,2,0,1], boredom
|
110
|
+
assert_equal [0, 4, 0, 2, 0, 1], boredom
|
121
111
|
end
|
122
112
|
|
123
113
|
it "runs hook" do
|
@@ -136,7 +126,7 @@ describe "Metric tracking" do
|
|
136
126
|
not_collecting!
|
137
127
|
metric "Many Happy Returns"
|
138
128
|
total = 0
|
139
|
-
Vanity.playground.metric(:many_happy_returns).hook do |
|
129
|
+
Vanity.playground.metric(:many_happy_returns).hook do |_metric_id, _timestamp, count|
|
140
130
|
total += count
|
141
131
|
end
|
142
132
|
Vanity.playground.track! :many_happy_returns, 6
|
@@ -162,39 +152,31 @@ describe "Metric tracking" do
|
|
162
152
|
end
|
163
153
|
end
|
164
154
|
|
165
|
-
|
166
155
|
describe "Metric name" do
|
167
156
|
it "can be whatever" do
|
168
|
-
File.
|
169
|
-
f.write <<-RUBY
|
157
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
170
158
|
metric "Yawns per second" do
|
171
159
|
end
|
172
|
-
|
173
|
-
end
|
160
|
+
RUBY
|
174
161
|
assert_equal "Yawns per second", Vanity.playground.metric(:yawns_sec).name
|
175
162
|
end
|
176
163
|
end
|
177
164
|
|
178
|
-
|
179
165
|
describe "Metric description" do
|
180
166
|
it "metric with description" do
|
181
|
-
File.
|
182
|
-
f.write <<-RUBY
|
167
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
183
168
|
metric "Yawns/sec" do
|
184
169
|
description "Am I that boring?"
|
185
170
|
end
|
186
|
-
|
187
|
-
end
|
171
|
+
RUBY
|
188
172
|
assert_equal "Am I that boring?", Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
|
189
173
|
end
|
190
174
|
|
191
175
|
it "metric without description" do
|
192
|
-
File.
|
193
|
-
f.write <<-RUBY
|
176
|
+
File.write("tmp/experiments/metrics/yawns_sec.rb", <<-RUBY)
|
194
177
|
metric "Yawns/sec" do
|
195
178
|
end
|
196
|
-
|
197
|
-
end
|
179
|
+
RUBY
|
198
180
|
assert_nil Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
|
199
181
|
end
|
200
182
|
|
@@ -204,19 +186,16 @@ describe "Metric description" do
|
|
204
186
|
end
|
205
187
|
end
|
206
188
|
|
207
|
-
|
208
189
|
describe "Metric bounds" do
|
209
190
|
it "metric with bounds" do
|
210
|
-
File.
|
211
|
-
f.write <<-RUBY
|
191
|
+
File.write("tmp/experiments/metrics/sky_is_limit.rb", <<-RUBY)
|
212
192
|
metric "Sky is limit" do
|
213
193
|
def bounds
|
214
194
|
[6,12]
|
215
195
|
end
|
216
196
|
end
|
217
|
-
|
218
|
-
|
219
|
-
assert_equal [6,12], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
|
197
|
+
RUBY
|
198
|
+
assert_equal [6, 12], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
|
220
199
|
end
|
221
200
|
|
222
201
|
it "metric without bounds" do
|
@@ -230,7 +209,6 @@ describe "Metric bounds" do
|
|
230
209
|
end
|
231
210
|
end
|
232
211
|
|
233
|
-
|
234
212
|
describe "Metric last_update_at" do
|
235
213
|
it "for new metric" do
|
236
214
|
metric "Coolness"
|
@@ -249,7 +227,6 @@ describe "Metric last_update_at" do
|
|
249
227
|
end
|
250
228
|
end
|
251
229
|
|
252
|
-
|
253
230
|
describe "Metric data" do
|
254
231
|
it "explicit dates" do
|
255
232
|
metric "Yawns/sec"
|
@@ -287,15 +264,13 @@ describe "Metric data" do
|
|
287
264
|
end
|
288
265
|
|
289
266
|
it "using custom values method" do
|
290
|
-
File.
|
291
|
-
f.write <<-RUBY
|
267
|
+
File.write("tmp/experiments/metrics/hours_in_day.rb", <<-RUBY)
|
292
268
|
metric "Hours in day" do
|
293
269
|
def values(from, to)
|
294
270
|
(from..to).map { |d| 24 }
|
295
271
|
end
|
296
272
|
end
|
297
|
-
|
298
|
-
end
|
273
|
+
RUBY
|
299
274
|
data = Vanity::Metric.data(Vanity.playground.metric(:hours_in_day))
|
300
275
|
assert_equal [24] * 90, data.map(&:last)
|
301
276
|
end
|
@@ -2,27 +2,23 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
describe "Google Analytics" do
|
4
4
|
before do
|
5
|
-
File.
|
6
|
-
f.write <<-RUBY
|
5
|
+
File.write("tmp/experiments/metrics/ga.rb", <<-RUBY)
|
7
6
|
metric "GA" do
|
8
7
|
google_analytics "UA2"
|
9
8
|
end
|
10
|
-
|
11
|
-
end
|
9
|
+
RUBY
|
12
10
|
end
|
13
11
|
|
14
|
-
GA_RESULT = Struct.new(:date, :pageviews, :visits)
|
15
|
-
GA_PROFILE = Struct.new(:web_property_id)
|
12
|
+
GA_RESULT = Struct.new(:date, :pageviews, :visits) # rubocop:todo Lint/ConstantDefinitionInBlock
|
13
|
+
GA_PROFILE = Struct.new(:web_property_id) # rubocop:todo Lint/ConstantDefinitionInBlock
|
16
14
|
|
17
15
|
it "fail if Garb not available" do
|
18
|
-
File.
|
19
|
-
f.write <<-RUBY
|
16
|
+
File.write("tmp/experiments/metrics/ga.rb", <<-RUBY)
|
20
17
|
metric "GA" do
|
21
18
|
expects(:require).raises LoadError
|
22
19
|
google_analytics "UA2"
|
23
20
|
end
|
24
|
-
|
25
|
-
end
|
21
|
+
RUBY
|
26
22
|
assert_raises LoadError do
|
27
23
|
Vanity.playground.metrics
|
28
24
|
end
|
@@ -45,13 +41,11 @@ describe "Google Analytics" do
|
|
45
41
|
end
|
46
42
|
|
47
43
|
it "accept other metrics" do
|
48
|
-
File.
|
49
|
-
f.write <<-RUBY
|
44
|
+
File.write("tmp/experiments/metrics/ga.rb", <<-RUBY)
|
50
45
|
metric "GA" do
|
51
46
|
google_analytics "UA2", :visitors
|
52
47
|
end
|
53
|
-
|
54
|
-
end
|
48
|
+
RUBY
|
55
49
|
Vanity.playground.metrics
|
56
50
|
assert_equal [:visitors], metric(:ga).report.metrics.elements
|
57
51
|
end
|
@@ -67,35 +61,33 @@ describe "Google Analytics" do
|
|
67
61
|
Vanity.playground.metrics
|
68
62
|
Garb::Profile.expects(:all).returns(Array.new(3) { |i| GA_PROFILE.new("UA#{i + 1}") })
|
69
63
|
metric(:ga).report.stubs(:send_request_for_body).returns(nil)
|
70
|
-
Garb::ReportResponse.stubs(:new).returns(mock(:
|
64
|
+
Garb::ReportResponse.stubs(:new).returns(mock(results: []))
|
71
65
|
metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12"))
|
72
66
|
assert_equal "UA2", metric(:ga).report.profile.web_property_id
|
73
67
|
end
|
74
68
|
|
75
69
|
it "should map results from report" do
|
76
70
|
Vanity.playground.metrics
|
77
|
-
today = Date.today
|
78
|
-
response = mock(:
|
71
|
+
today = Date.today # rubocop:todo Lint/UselessAssignment
|
72
|
+
response = mock(results: Array.new(3) { |i| GA_RESULT.new("2010021#{i}", i + 1) })
|
79
73
|
Garb::Profile.stubs(:all).returns([])
|
80
74
|
Garb::ReportResponse.expects(:new).returns(response)
|
81
75
|
metric(:ga).report.stubs(:send_request_for_body).returns(nil)
|
82
|
-
assert_equal [1,2,3], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12"))
|
76
|
+
assert_equal [1, 2, 3], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12"))
|
83
77
|
end
|
84
78
|
|
85
79
|
it "mapping GA metrics to single value" do
|
86
|
-
File.
|
87
|
-
f.write <<-RUBY
|
80
|
+
File.write("tmp/experiments/metrics/ga.rb", <<-RUBY)
|
88
81
|
metric "GA" do
|
89
82
|
google_analytics "UA2", :mapper=>lambda { |e| e.pageviews * e.visits }
|
90
83
|
end
|
91
|
-
|
92
|
-
end
|
84
|
+
RUBY
|
93
85
|
Vanity.playground.metrics
|
94
|
-
today = Date.today
|
95
|
-
response = mock(:
|
86
|
+
today = Date.today # rubocop:todo Lint/UselessAssignment
|
87
|
+
response = mock(results: Array.new(3) { |i| GA_RESULT.new("2010021#{i}", i + 1, i + 1) })
|
96
88
|
Garb::Profile.stubs(:all).returns([])
|
97
89
|
Garb::ReportResponse.expects(:new).returns(response)
|
98
90
|
metric(:ga).report.stubs(:send_request_for_body).returns(nil)
|
99
|
-
assert_equal [1,4,9], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12"))
|
91
|
+
assert_equal [1, 4, 9], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12"))
|
100
92
|
end
|
101
93
|
end
|
data/test/metric/remote_test.rb
CHANGED
@@ -2,13 +2,11 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
describe "Remote metrics" do
|
4
4
|
before do
|
5
|
-
File.
|
6
|
-
f.write <<-RUBY
|
5
|
+
File.write("tmp/experiments/metrics/sandbox.rb", <<-RUBY)
|
7
6
|
metric "Sandbox" do
|
8
7
|
remote "http://api.vanitydash.com/metrics/sandbox"
|
9
8
|
end
|
10
|
-
|
11
|
-
end
|
9
|
+
RUBY
|
12
10
|
|
13
11
|
Dir.chdir "tmp" do
|
14
12
|
Vanity.playground.load!
|
@@ -28,7 +26,6 @@ describe "Remote metrics" do
|
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
|
32
29
|
describe "Remote send" do
|
33
30
|
before do
|
34
31
|
@metric = Vanity::Metric.new(Vanity.playground, :sandbox)
|
@@ -40,7 +37,7 @@ describe "Remote send" do
|
|
40
37
|
it "remote send in sequence" do
|
41
38
|
Vanity.playground.track! :sandbox
|
42
39
|
Vanity.playground.track! :sandbox
|
43
|
-
assert_requested(:post, "http://api.vanitydash.com/metrics/sandbox", :
|
40
|
+
assert_requested(:post, "http://api.vanitydash.com/metrics/sandbox", times: 2)
|
44
41
|
end
|
45
42
|
|
46
43
|
it "remote sends url-encoded data" do
|
@@ -59,7 +56,7 @@ describe "Remote send" do
|
|
59
56
|
end
|
60
57
|
|
61
58
|
it "remote sends array of values" do
|
62
|
-
Vanity.playground.track! :sandbox, [1,2,3]
|
59
|
+
Vanity.playground.track! :sandbox, [1, 2, 3]
|
63
60
|
assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["values[]"] == %w{1 2 3} }
|
64
61
|
end
|
65
62
|
|
@@ -90,7 +87,7 @@ describe "Remote send" do
|
|
90
87
|
Vanity.playground.track! :sandbox
|
91
88
|
stub_request(:post, /api/)
|
92
89
|
Vanity.playground.track! :sandbox
|
93
|
-
assert_requested(:post, /api/, :
|
90
|
+
assert_requested(:post, /api/, times: 2)
|
94
91
|
end
|
95
92
|
|
96
93
|
it "remote send handles timeout error" do
|
@@ -98,13 +95,13 @@ describe "Remote send" do
|
|
98
95
|
Vanity.playground.track! :sandbox
|
99
96
|
stub_request(:post, /api/)
|
100
97
|
Vanity.playground.track! :sandbox
|
101
|
-
assert_requested(:post, /api/, :
|
98
|
+
assert_requested(:post, /api/, times: 2)
|
102
99
|
end
|
103
100
|
|
104
101
|
it "remote does not send when metrics disabled" do
|
105
102
|
not_collecting!
|
106
103
|
Vanity.playground.track! :sandbox
|
107
104
|
Vanity.playground.track! :sandbox
|
108
|
-
assert_requested(:post, /api/, :
|
105
|
+
assert_requested(:post, /api/, times: 0)
|
109
106
|
end
|
110
107
|
end
|
data/test/playground_test.rb
CHANGED
@@ -1,28 +1,23 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
3
|
describe Vanity::Playground do
|
4
|
-
|
5
4
|
it "has one global instance" do
|
6
5
|
assert instance = Vanity.playground
|
7
6
|
assert_equal instance, Vanity.playground
|
8
7
|
end
|
9
8
|
|
10
9
|
it "creates metrics hooks on initialization for tracking" do
|
11
|
-
File.
|
12
|
-
f.write <<-RUBY
|
10
|
+
File.write("tmp/experiments/metrics/coolness.rb", <<-RUBY)
|
13
11
|
metric "coolness" do
|
14
12
|
end
|
15
|
-
|
16
|
-
end
|
13
|
+
RUBY
|
17
14
|
|
18
|
-
File.
|
19
|
-
f.write <<-RUBY
|
15
|
+
File.write("tmp/experiments/foobar.rb", <<-RUBY)
|
20
16
|
ab_test :foobar do
|
21
17
|
metrics :coolness
|
22
18
|
default false
|
23
19
|
end
|
24
|
-
|
25
|
-
end
|
20
|
+
RUBY
|
26
21
|
|
27
22
|
# new_ab_test :foobar do
|
28
23
|
# alternatives "foo", "bar"
|
@@ -56,7 +51,7 @@ describe Vanity::Playground do
|
|
56
51
|
proc = Vanity.playground.on_datastore_error
|
57
52
|
assert proc.respond_to?(:call)
|
58
53
|
assert_silent do
|
59
|
-
proc.call(Exception.new("datastore error"), self.class, caller[
|
54
|
+
proc.call(Exception.new("datastore error"), self.class, caller(1..1).first[/`.*'/][1..-2], [1, 2, 3])
|
60
55
|
end
|
61
56
|
end
|
62
57
|
end
|
@@ -105,12 +100,10 @@ describe Vanity::Playground do
|
|
105
100
|
|
106
101
|
describe "#experiments" do
|
107
102
|
it "saves experiments exactly once" do
|
108
|
-
File.
|
109
|
-
f.write <<-RUBY
|
103
|
+
File.write("tmp/experiments/foobar.rb", <<-RUBY)
|
110
104
|
ab_test :foobar do
|
111
105
|
end
|
112
|
-
|
113
|
-
end
|
106
|
+
RUBY
|
114
107
|
Vanity::Experiment::AbTest.any_instance.expects(:save).once
|
115
108
|
Vanity.playground.experiments
|
116
109
|
end
|
data/test/templates_test.rb
CHANGED
@@ -7,7 +7,7 @@ describe Vanity::Templates do
|
|
7
7
|
|
8
8
|
describe "template" do
|
9
9
|
it "resolves templates from the configured path" do
|
10
|
-
custom_view_path = File.expand_path(File.join(Rails.root, 'app', 'views', 'vanity'))
|
10
|
+
custom_view_path = File.expand_path(File.join(Rails.root, 'app', 'views', 'vanity')) # rubocop:todo Lint/UselessAssignment
|
11
11
|
gem_view_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'vanity', 'templates'))
|
12
12
|
expected = File.join(gem_view_path, 'foo.html')
|
13
13
|
|
@@ -15,33 +15,29 @@ describe Vanity::Templates do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "resolves templates from a Rails view directory when configured" do
|
18
|
-
|
19
|
-
|
20
|
-
Vanity.configuration.templates_path = custom_view_path
|
18
|
+
custom_view_path = File.expand_path(File.join(Rails.root, 'app', 'views', 'vanity'))
|
19
|
+
Vanity.configuration.templates_path = custom_view_path
|
21
20
|
|
22
|
-
|
21
|
+
expected = File.expand_path(File.join(custom_view_path, 'foo.html'))
|
23
22
|
|
24
|
-
|
25
|
-
|
23
|
+
FileUtils.mkpath(custom_view_path)
|
24
|
+
File.open(expected, "w")
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
26
|
+
assert_equal expected, Vanity::Templates.new.path('foo.html')
|
27
|
+
ensure
|
28
|
+
FileUtils.rm_rf(custom_view_path)
|
31
29
|
end
|
32
30
|
|
33
31
|
it "ignores an empty view directory" do
|
34
|
-
|
35
|
-
|
36
|
-
FileUtils.mkpath(custom_view_path)
|
32
|
+
custom_view_path = File.expand_path(File.join(Rails.root, 'app', 'views', 'vanity'))
|
33
|
+
FileUtils.mkpath(custom_view_path)
|
37
34
|
|
38
|
-
|
39
|
-
|
35
|
+
gem_view_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'vanity', 'templates'))
|
36
|
+
expected = File.join(gem_view_path, 'foo.html')
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
38
|
+
assert_equal expected, Vanity::Templates.new.path('foo.html')
|
39
|
+
ensure
|
40
|
+
FileUtils.rm_rf(custom_view_path)
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
data/test/test_helper.rb
CHANGED
@@ -12,10 +12,10 @@ require "active_record"
|
|
12
12
|
|
13
13
|
begin
|
14
14
|
require "rails"
|
15
|
-
rescue LoadError
|
15
|
+
rescue LoadError # rubocop:todo Lint/SuppressedException
|
16
16
|
end
|
17
17
|
|
18
|
-
require File.expand_path(
|
18
|
+
require File.expand_path('dummy/config/environment.rb', __dir__)
|
19
19
|
require "rails/test_help"
|
20
20
|
|
21
21
|
require "vanity"
|
@@ -27,16 +27,16 @@ require "webmock/minitest"
|
|
27
27
|
# Due to load order differences in Rails boot and test requires we have to
|
28
28
|
# manually require these
|
29
29
|
|
30
|
-
# TODO wonder if we can load rails only for the rails tests...
|
30
|
+
# TODO: wonder if we can load rails only for the rails tests...
|
31
31
|
require 'vanity/frameworks/rails'
|
32
32
|
Vanity::Rails.load!
|
33
33
|
|
34
34
|
if $DEBUG
|
35
|
-
$logger = Logger.new(STDOUT)
|
36
|
-
$logger.level = Logger::DEBUG
|
35
|
+
$logger = Logger.new(STDOUT) # rubocop:todo Style/GlobalVars
|
36
|
+
$logger.level = Logger::DEBUG # rubocop:todo Style/GlobalVars
|
37
37
|
else
|
38
|
-
$logger = Logger.new(STDOUT)
|
39
|
-
$logger.level = Logger::FATAL
|
38
|
+
$logger = Logger.new(STDOUT) # rubocop:todo Style/GlobalVars
|
39
|
+
$logger.level = Logger::FATAL # rubocop:todo Style/GlobalVars
|
40
40
|
end
|
41
41
|
|
42
42
|
module VanityTestHelpers
|
@@ -46,13 +46,13 @@ module VanityTestHelpers
|
|
46
46
|
DATABASE_OPTIONS = {
|
47
47
|
"redis" => "redis://localhost/15",
|
48
48
|
"mongodb" => "mongodb://localhost/vanity",
|
49
|
-
"active_record" => { :
|
50
|
-
"mock" => "mock:/"
|
49
|
+
"active_record" => { adapter: "active_record", active_record_adapter: "default" },
|
50
|
+
"mock" => "mock:/",
|
51
51
|
}
|
52
52
|
|
53
|
-
DATABASE = DATABASE_OPTIONS[ENV["DB"]] or raise "No support yet for #{ENV[
|
53
|
+
DATABASE = DATABASE_OPTIONS[ENV["DB"]] or raise "No support yet for #{ENV['DB']}"
|
54
54
|
|
55
|
-
TEST_DATA_FILES = Dir[File.expand_path(
|
55
|
+
TEST_DATA_FILES = Dir[File.expand_path('data/*', __dir__)]
|
56
56
|
VANITY_CONFIGS = TEST_DATA_FILES.each.with_object({}) do |path, hash|
|
57
57
|
hash[File.basename(path)] = File.read(path)
|
58
58
|
end
|
@@ -73,7 +73,7 @@ module VanityTestHelpers
|
|
73
73
|
# or reload an experiment (saved by the previous playground).
|
74
74
|
def vanity_reset
|
75
75
|
Vanity.reset!
|
76
|
-
Vanity.configuration.logger = $logger
|
76
|
+
Vanity.configuration.logger = $logger # rubocop:todo Style/GlobalVars
|
77
77
|
Vanity.configuration.experiments_path = "tmp/experiments"
|
78
78
|
|
79
79
|
Vanity.disconnect!
|
@@ -99,7 +99,6 @@ module VanityTestHelpers
|
|
99
99
|
Vanity.connect!(DATABASE)
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
102
|
# Defines the specified metrics (one or more names). Returns metric, or array
|
104
103
|
# of metric (if more than one argument).
|
105
104
|
def metric(*names)
|
@@ -144,9 +143,9 @@ module VanityTestHelpers
|
|
144
143
|
def dummy_request
|
145
144
|
# Rails 5 compatibility
|
146
145
|
if ActionDispatch::TestRequest.respond_to?(:create)
|
147
|
-
ActionDispatch::TestRequest.create
|
146
|
+
ActionDispatch::TestRequest.create
|
148
147
|
else
|
149
|
-
ActionDispatch::TestRequest.new
|
148
|
+
ActionDispatch::TestRequest.new
|
150
149
|
end
|
151
150
|
end
|
152
151
|
|
@@ -154,13 +153,13 @@ module VanityTestHelpers
|
|
154
153
|
# override the built-in setup/teardown methods, so we alias_method_chain
|
155
154
|
# them to run.
|
156
155
|
def self.included(klass)
|
157
|
-
klass.class_eval
|
158
|
-
|
159
|
-
|
156
|
+
klass.class_eval do
|
157
|
+
alias_method :teardown_before, :teardown
|
158
|
+
alias_method :teardown, :teardown_after
|
160
159
|
|
161
|
-
|
162
|
-
|
163
|
-
|
160
|
+
alias_method :setup_before, :setup
|
161
|
+
alias_method :setup, :setup_after
|
162
|
+
end
|
164
163
|
end
|
165
164
|
end
|
166
165
|
|
@@ -196,7 +195,7 @@ module LegacyTestRequests
|
|
196
195
|
ActiveRecord::VERSION::MAJOR <= 4
|
197
196
|
end
|
198
197
|
|
199
|
-
def get(path, params={}, headers={})
|
198
|
+
def get(path, params = {}, headers = {})
|
200
199
|
if rails4?
|
201
200
|
process(path, 'GET', params, headers)
|
202
201
|
else
|
@@ -204,7 +203,7 @@ module LegacyTestRequests
|
|
204
203
|
end
|
205
204
|
end
|
206
205
|
|
207
|
-
def post(path, params={}, headers={})
|
206
|
+
def post(path, params = {}, headers = {})
|
208
207
|
if rails4?
|
209
208
|
process(path, 'POST', params, headers)
|
210
209
|
else
|
@@ -212,7 +211,7 @@ module LegacyTestRequests
|
|
212
211
|
end
|
213
212
|
end
|
214
213
|
|
215
|
-
def put(path, params={}, headers={})
|
214
|
+
def put(path, params = {}, headers = {})
|
216
215
|
if rails4?
|
217
216
|
process(path, 'PUT', params, headers)
|
218
217
|
else
|
@@ -220,7 +219,7 @@ module LegacyTestRequests
|
|
220
219
|
end
|
221
220
|
end
|
222
221
|
|
223
|
-
def delete(path, params={}, headers={})
|
222
|
+
def delete(path, params = {}, headers = {})
|
224
223
|
if rails4?
|
225
224
|
process(path, 'DELETE', params, headers)
|
226
225
|
else
|
@@ -233,7 +232,7 @@ if defined?(ActionController::TestCase)
|
|
233
232
|
class ActionController::TestCase
|
234
233
|
include LegacyTestRequests
|
235
234
|
|
236
|
-
alias
|
235
|
+
alias setup_controller_request_and_response_without_vanity setup_controller_request_and_response
|
237
236
|
# Sets Vanity.context to the current controller, so you can do things like:
|
238
237
|
# experiment(:simple).chooses(:green)
|
239
238
|
def setup_controller_request_and_response
|
@@ -244,13 +243,13 @@ if defined?(ActionController::TestCase)
|
|
244
243
|
end
|
245
244
|
|
246
245
|
if defined?(ActionDispatch::IntegrationTest)
|
247
|
-
class ActionDispatch::IntegrationTest
|
246
|
+
class ActionDispatch::IntegrationTest # rubocop:todo Lint/EmptyClass
|
248
247
|
end
|
249
248
|
end
|
250
249
|
|
251
250
|
if ENV["DB"] == "active_record"
|
252
251
|
ActiveRecord::Base.establish_connection
|
253
|
-
ActiveRecord::Base.logger = $logger
|
252
|
+
ActiveRecord::Base.logger = $logger # rubocop:todo Style/GlobalVars
|
254
253
|
|
255
254
|
Vanity.connect!(VanityTestHelpers::DATABASE)
|
256
255
|
|
@@ -262,7 +261,7 @@ if ENV["DB"] == "active_record"
|
|
262
261
|
require "generators/vanity/migration_generator"
|
263
262
|
Rails::Generators.invoke "vanity"
|
264
263
|
|
265
|
-
migrate_path = File.expand_path(
|
264
|
+
migrate_path = File.expand_path('dummy/db/migrate', __dir__)
|
266
265
|
if defined?(ActiveRecord::MigrationContext)
|
267
266
|
ActiveRecord::MigrationContext.new(migrate_path).migrate
|
268
267
|
else
|