vanity 3.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +28 -0
  3. data/.github/workflows/test.yml +3 -6
  4. data/.rubocop.yml +114 -0
  5. data/.rubocop_todo.yml +67 -0
  6. data/Appraisals +9 -31
  7. data/CHANGELOG +5 -0
  8. data/Gemfile +7 -3
  9. data/Gemfile.lock +31 -3
  10. data/README.md +4 -9
  11. data/Rakefile +25 -24
  12. data/bin/vanity +1 -1
  13. data/doc/configuring.textile +1 -0
  14. data/gemfiles/rails52.gemfile +6 -3
  15. data/gemfiles/rails52.gemfile.lock +34 -9
  16. data/gemfiles/rails60.gemfile +6 -3
  17. data/gemfiles/rails60.gemfile.lock +34 -9
  18. data/gemfiles/rails61.gemfile +6 -3
  19. data/gemfiles/rails61.gemfile.lock +34 -9
  20. data/lib/generators/vanity/migration_generator.rb +5 -7
  21. data/lib/vanity/adapters/abstract_adapter.rb +43 -45
  22. data/lib/vanity/adapters/active_record_adapter.rb +30 -30
  23. data/lib/vanity/adapters/mock_adapter.rb +14 -18
  24. data/lib/vanity/adapters/mongodb_adapter.rb +73 -69
  25. data/lib/vanity/adapters/redis_adapter.rb +19 -27
  26. data/lib/vanity/adapters.rb +1 -1
  27. data/lib/vanity/autoconnect.rb +6 -7
  28. data/lib/vanity/commands/list.rb +7 -7
  29. data/lib/vanity/commands/report.rb +18 -22
  30. data/lib/vanity/configuration.rb +19 -19
  31. data/lib/vanity/connection.rb +12 -14
  32. data/lib/vanity/experiment/ab_test.rb +82 -70
  33. data/lib/vanity/experiment/alternative.rb +3 -5
  34. data/lib/vanity/experiment/base.rb +24 -19
  35. data/lib/vanity/experiment/bayesian_bandit_score.rb +7 -13
  36. data/lib/vanity/experiment/definition.rb +6 -6
  37. data/lib/vanity/frameworks/rails.rb +39 -39
  38. data/lib/vanity/frameworks.rb +2 -2
  39. data/lib/vanity/helpers.rb +1 -1
  40. data/lib/vanity/metric/active_record.rb +21 -19
  41. data/lib/vanity/metric/base.rb +22 -23
  42. data/lib/vanity/metric/google_analytics.rb +6 -9
  43. data/lib/vanity/metric/remote.rb +3 -5
  44. data/lib/vanity/playground.rb +3 -6
  45. data/lib/vanity/vanity.rb +8 -12
  46. data/lib/vanity/version.rb +1 -1
  47. data/test/adapters/active_record_adapter_test.rb +1 -5
  48. data/test/adapters/mock_adapter_test.rb +0 -2
  49. data/test/adapters/mongodb_adapter_test.rb +1 -5
  50. data/test/adapters/redis_adapter_test.rb +2 -3
  51. data/test/adapters/shared_tests.rb +9 -12
  52. data/test/autoconnect_test.rb +3 -3
  53. data/test/cli_test.rb +0 -1
  54. data/test/configuration_test.rb +18 -34
  55. data/test/connection_test.rb +3 -3
  56. data/test/dummy/Rakefile +1 -1
  57. data/test/dummy/app/controllers/use_vanity_controller.rb +12 -8
  58. data/test/dummy/app/mailers/vanity_mailer.rb +3 -3
  59. data/test/dummy/config/application.rb +1 -1
  60. data/test/dummy/config/boot.rb +3 -3
  61. data/test/dummy/config/environment.rb +1 -1
  62. data/test/dummy/config/environments/development.rb +0 -1
  63. data/test/dummy/config/environments/test.rb +1 -1
  64. data/test/dummy/config/initializers/session_store.rb +1 -1
  65. data/test/dummy/config.ru +1 -1
  66. data/test/dummy/script/rails +2 -2
  67. data/test/experiment/ab_test.rb +148 -154
  68. data/test/experiment/base_test.rb +48 -32
  69. data/test/frameworks/rails/action_controller_test.rb +25 -25
  70. data/test/frameworks/rails/action_mailer_test.rb +2 -2
  71. data/test/frameworks/rails/action_view_test.rb +5 -6
  72. data/test/frameworks/rails/rails_test.rb +147 -181
  73. data/test/helper_test.rb +2 -2
  74. data/test/metric/active_record_test.rb +174 -212
  75. data/test/metric/base_test.rb +21 -46
  76. data/test/metric/google_analytics_test.rb +17 -25
  77. data/test/metric/remote_test.rb +7 -10
  78. data/test/playground_test.rb +7 -14
  79. data/test/templates_test.rb +16 -20
  80. data/test/test_helper.rb +28 -29
  81. data/test/vanity_test.rb +4 -10
  82. data/test/web/rails/dashboard_test.rb +21 -21
  83. data/vanity.gemspec +8 -7
  84. metadata +28 -30
  85. data/gemfiles/rails42.gemfile +0 -33
  86. data/gemfiles/rails42.gemfile.lock +0 -265
  87. data/gemfiles/rails42_protected_attributes.gemfile +0 -34
  88. data/gemfiles/rails42_protected_attributes.gemfile.lock +0 -264
  89. data/gemfiles/rails51.gemfile +0 -33
  90. data/gemfiles/rails51.gemfile.lock +0 -285
@@ -1,7 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
3
  describe Vanity::Experiment::Base do
4
-
5
4
  before do
6
5
  metric "Happiness"
7
6
  end
@@ -9,28 +8,28 @@ describe Vanity::Experiment::Base do
9
8
  # -- Defining experiment --
10
9
 
11
10
  it "can access experiment by id" do
12
- exp = new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
11
+ exp = new_ab_test(:ice_cream_flavor) do
12
+ metrics :happiness
13
+ default false
14
+ end
13
15
  assert_equal exp, experiment(:ice_cream_flavor)
14
16
  end
15
17
 
16
18
  it "fails when defining same experiment twice" do
17
- File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
18
- f.write <<-RUBY
19
+ File.write("tmp/experiments/ice_cream_flavor.rb", <<-RUBY)
19
20
  ab_test "Ice Cream Flavor" do
20
21
  default false
21
22
  end
22
23
  ab_test "Ice Cream Flavor" do
23
24
  default false
24
25
  end
25
- RUBY
26
- end
26
+ RUBY
27
27
  Vanity.unload!
28
28
  assert_raises NameError do
29
29
  experiment(:ice_cream_flavor)
30
30
  end
31
31
  end
32
32
 
33
-
34
33
  # -- Loading experiments --
35
34
 
36
35
  it "fails if cannot load named experiment" do
@@ -40,24 +39,20 @@ describe Vanity::Experiment::Base do
40
39
  end
41
40
 
42
41
  it "loads the experiment" do
43
- File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
44
- f.write <<-RUBY
42
+ File.write("tmp/experiments/ice_cream_flavor.rb", <<-RUBY)
45
43
  ab_test "Ice Cream Flavor" do
46
44
  def xmts
47
45
  "x"
48
46
  end
49
47
  default false
50
48
  end
51
- RUBY
52
- end
49
+ RUBY
53
50
  Vanity.unload!
54
51
  assert_equal "x", experiment(:ice_cream_flavor).xmts
55
52
  end
56
53
 
57
54
  it "fails if error loading experiment" do
58
- File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
59
- f.write "fail 'yawn!'"
60
- end
55
+ File.write("tmp/experiments/ice_cream_flavor.rb", "fail 'yawn!'")
61
56
  Vanity.unload!
62
57
  assert_raises NameError do
63
58
  experiment(:ice_cream_flavor)
@@ -65,9 +60,7 @@ describe Vanity::Experiment::Base do
65
60
  end
66
61
 
67
62
  it "complains if not defined where expected" do
68
- File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
69
- f.write ""
70
- end
63
+ File.write("tmp/experiments/ice_cream_flavor.rb", "")
71
64
  Vanity.unload!
72
65
  assert_raises NameError do
73
66
  experiment(:ice_cream_flavor)
@@ -75,37 +68,46 @@ describe Vanity::Experiment::Base do
75
68
  end
76
69
 
77
70
  it "reloading experiments" do
78
- new_ab_test(:ab) { metrics :happiness; default false }
79
- new_ab_test(:cd) { metrics :happiness; default false }
71
+ new_ab_test(:ab) do
72
+ metrics :happiness
73
+ default false
74
+ end
75
+ new_ab_test(:cd) do
76
+ metrics :happiness
77
+ default false
78
+ end
80
79
  assert_equal 2, Vanity.playground.experiments.size
81
80
  Vanity.playground.reload!
82
81
  assert Vanity.playground.experiments.empty?
83
82
  end
84
83
 
85
-
86
84
  # -- Attributes --
87
85
 
88
86
  it "maps the experiment name to id" do
89
- experiment = new_ab_test("Ice Cream Flavor/Tastes") { metrics :happiness; default false }
87
+ experiment = new_ab_test("Ice Cream Flavor/Tastes") do
88
+ metrics :happiness
89
+ default false
90
+ end
90
91
  assert_equal "Ice Cream Flavor/Tastes", experiment.name
91
92
  assert_equal :ice_cream_flavor_tastes, experiment.id
92
93
  end
93
94
 
94
95
  it "saves the experiment after definition" do
95
- File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
96
- f.write <<-RUBY
96
+ File.write("tmp/experiments/ice_cream_flavor.rb", <<-RUBY)
97
97
  ab_test "Ice Cream Flavor" do
98
98
  default false
99
99
  end
100
- RUBY
101
- end
100
+ RUBY
102
101
  Vanity.unload!
103
102
  metric :happiness
104
103
  Vanity.playground.experiment(:ice_cream_flavor)
105
104
  end
106
105
 
107
106
  it "has created timestamp" do
108
- new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
107
+ new_ab_test(:ice_cream_flavor) do
108
+ metrics :happiness
109
+ default false
110
+ end
109
111
  assert_kind_of Time, experiment(:ice_cream_flavor).created_at
110
112
  assert_in_delta experiment(:ice_cream_flavor).created_at.to_i, Time.now.to_i, 1
111
113
  end
@@ -113,12 +115,18 @@ describe Vanity::Experiment::Base do
113
115
  it "keeps created timestamp across definitions" do
114
116
  past = Date.today - 1
115
117
  Timecop.freeze past.to_time do
116
- new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
118
+ new_ab_test(:ice_cream_flavor) do
119
+ metrics :happiness
120
+ default false
121
+ end
117
122
  end
118
123
 
119
124
  vanity_reset
120
125
  metric :happiness
121
- new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
126
+ new_ab_test(:ice_cream_flavor) do
127
+ metrics :happiness
128
+ default false
129
+ end
122
130
  assert_equal past.to_time.to_i, experiment(:ice_cream_flavor).created_at.to_i
123
131
  end
124
132
 
@@ -133,7 +141,10 @@ describe Vanity::Experiment::Base do
133
141
 
134
142
  it "stores nothing when collection disabled" do
135
143
  not_collecting!
136
- new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
144
+ new_ab_test(:ice_cream_flavor) do
145
+ metrics :happiness
146
+ default false
147
+ end
137
148
  experiment(:ice_cream_flavor).complete!
138
149
  end
139
150
 
@@ -142,7 +153,10 @@ describe Vanity::Experiment::Base do
142
153
  # check_completion is called by derived classes, but since it's
143
154
  # part of the base_test I'm testing it here.
144
155
  it "handles error in check completion" do
145
- new_ab_test(:ab) { metrics :happiness; default false }
156
+ new_ab_test(:ab) do
157
+ metrics :happiness
158
+ default false
159
+ end
146
160
  e = experiment(:ab)
147
161
  e.complete_if { true }
148
162
  e.stubs(:complete!).raises(RuntimeError, "A forced error")
@@ -152,7 +166,10 @@ describe Vanity::Experiment::Base do
152
166
  end
153
167
 
154
168
  it "complete updates completed_at" do
155
- new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
169
+ new_ab_test(:ice_cream_flavor) do
170
+ metrics :happiness
171
+ default false
172
+ end
156
173
 
157
174
  time = Time.utc(2008, 9, 1, 12, 0, 0)
158
175
  Timecop.freeze(time) do
@@ -160,5 +177,4 @@ describe Vanity::Experiment::Base do
160
177
  end
161
178
  assert_equal time, experiment(:ice_cream_flavor).completed_at
162
179
  end
163
-
164
180
  end
@@ -19,9 +19,7 @@ class UseVanityControllerTest < ActionController::TestCase
19
19
  end
20
20
 
21
21
  # Rails 3 configuration for cookies
22
- if ::Rails.respond_to?(:application)
23
- ::Rails.application.config.session_options[:domain] = '.foo.bar'
24
- end
22
+ ::Rails.application.config.session_options[:domain] = '.foo.bar' if ::Rails.respond_to?(:application)
25
23
  end
26
24
 
27
25
  def teardown
@@ -31,25 +29,25 @@ class UseVanityControllerTest < ActionController::TestCase
31
29
  def test_render_js_for_tests
32
30
  Vanity.playground.use_js!
33
31
  get :js
34
- assert_match /script.*v=pie_or_cake=.*script/m, @response.body
32
+ assert_match(/script.*v=pie_or_cake=.*script/m, @response.body)
35
33
  end
36
34
 
37
35
  def test_view_helper_ab_test_js_for_tests
38
36
  Vanity.playground.use_js!
39
37
  get :view_helper_ab_test_js
40
- assert_match /script.*v=pie_or_cake=.*script/m, @response.body
38
+ assert_match(/script.*v=pie_or_cake=.*script/m, @response.body)
41
39
  end
42
40
 
43
41
  def test_global_ab_test_js_for_tests
44
42
  Vanity.playground.use_js!
45
43
  get :global_ab_test_js
46
- assert_match /script.*v=pie_or_cake=.*script/m, @response.body
44
+ assert_match(/script.*v=pie_or_cake=.*script/m, @response.body)
47
45
  end
48
46
 
49
47
  def test_render_model_js_for_tests
50
48
  Vanity.playground.use_js!
51
49
  get :model_js
52
- assert_match /script.*v=pie_or_cake=.*script/m, @response.body
50
+ assert_match(/script.*v=pie_or_cake=.*script/m, @response.body)
53
51
  end
54
52
 
55
53
  def test_chooses_sets_alternatives_for_rails_tests
@@ -77,10 +75,10 @@ class UseVanityControllerTest < ActionController::TestCase
77
75
  def test_vanity_cookie_is_persistent
78
76
  get :index
79
77
  cookie = @response["Set-Cookie"].to_s
80
- assert_match /vanity_id=[a-f0-9]{32};/, cookie
78
+ assert_match(/vanity_id=[a-f0-9]{32};/, cookie)
81
79
  expires = cookie[/expires=(.*)(;|$)/, 1]
82
80
  assert expires
83
- assert_in_delta Time.parse(expires), Time.now + 20 * 365 * 24 * 60 * 60, 1.day
81
+ assert_in_delta Time.parse(expires), Time.now + (20 * 365 * 24 * 60 * 60), 1.day
84
82
  end
85
83
 
86
84
  def test_vanity_cookie_default_id
@@ -91,7 +89,7 @@ class UseVanityControllerTest < ActionController::TestCase
91
89
  def test_vanity_cookie_retains_id
92
90
  @request.cookies["vanity_id"] = "from_last_time"
93
91
  get :index
94
- assert_equal "from_last_time", cookies["vanity_id"]
92
+ assert_equal "from_last_time", cookies["vanity_id"]
95
93
  end
96
94
 
97
95
  def test_vanity_cookie_uses_configuration
@@ -107,13 +105,13 @@ class UseVanityControllerTest < ActionController::TestCase
107
105
  end
108
106
 
109
107
  def test_vanity_identity_set_from_user
110
- @controller.current_user = stub("user", :id=>"user_id")
108
+ @controller.current_user = stub("user", id: "user_id")
111
109
  get :index
112
110
  assert_equal "user_id", @controller.send(:vanity_identity)
113
111
  end
114
112
 
115
113
  def test_vanity_identity_with_null_user_falls_back_to_cookie
116
- @controller.current_user = stub("user", :id=>nil)
114
+ @controller.current_user = stub("user", id: nil)
117
115
  get :index
118
116
  assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/
119
117
  end
@@ -130,6 +128,7 @@ class UseVanityControllerTest < ActionController::TestCase
130
128
  def test_vanity_identity_set_with_block
131
129
  UseVanityController.class_eval do
132
130
  attr_accessor :project_id
131
+
133
132
  use_vanity { |controller| controller.project_id }
134
133
  end
135
134
  @controller.project_id = "576"
@@ -138,26 +137,27 @@ class UseVanityControllerTest < ActionController::TestCase
138
137
  end
139
138
 
140
139
  def test_vanity_identity_set_with_identity_paramater
141
- params = { :_identity => "id_from_params" }
140
+ params = { _identity: "id_from_params" }
142
141
  get :index, params
143
142
  assert_equal "id_from_params", @controller.send(:vanity_identity)
144
143
  end
145
144
 
146
145
  def test_vanity_identity_prefers_block_over_symbol
147
146
  UseVanityController.class_eval do
148
- attr_accessor :project_id
147
+ attr_accessor :project_id # rubocop:todo Lint/DuplicateMethods
148
+
149
149
  use_vanity(:current_user) { |controller| controller.project_id }
150
150
  end
151
151
  @controller.project_id = "576"
152
- @controller.current_user = stub(:id=>"user_id")
152
+ @controller.current_user = stub(id: "user_id")
153
153
 
154
154
  get :index
155
155
  assert_equal "576", @controller.send(:vanity_identity)
156
156
  end
157
157
 
158
- def test_vanity_identity_prefers_parameter_over_cookie
158
+ def test_vanity_identity_prefers_parameter_over_cookie
159
159
  @request.cookies['vanity_id'] = "old_id"
160
- params = { :_identity => "id_from_params" }
160
+ params = { _identity: "id_from_params" }
161
161
  get :index, params
162
162
  assert_equal "id_from_params", @controller.send(:vanity_identity)
163
163
  assert cookies['vanity_id'], "id_from_params"
@@ -165,7 +165,7 @@ class UseVanityControllerTest < ActionController::TestCase
165
165
 
166
166
  def test_vanity_identity_prefers_cookie_over_object
167
167
  @request.cookies['vanity_id'] = "from_last_time"
168
- @controller.current_user = stub(:id=>"user_id")
168
+ @controller.current_user = stub(id: "user_id")
169
169
  get :index
170
170
  assert_equal "from_last_time", @controller.send(:vanity_identity)
171
171
  end
@@ -173,7 +173,7 @@ class UseVanityControllerTest < ActionController::TestCase
173
173
  # query parameter filter
174
174
 
175
175
  def test_redirects_and_loses_vanity_query_parameter
176
- params = { :foo=>"bar", :_vanity=>"567" }
176
+ params = { foo: "bar", _vanity: "567" }
177
177
  get :index, params
178
178
  assert_redirected_to "/use_vanity?foo=bar"
179
179
  end
@@ -182,8 +182,9 @@ class UseVanityControllerTest < ActionController::TestCase
182
182
  first = experiment(:pie_or_cake).alternatives.first
183
183
  fingerprint = experiment(:pie_or_cake).fingerprint(first)
184
184
  10.times do
185
- @controller = nil ; setup_controller_request_and_response
186
- params = { :_vanity => fingerprint }
185
+ @controller = nil
186
+ setup_controller_request_and_response
187
+ params = { _vanity: fingerprint }
187
188
  get :index, params
188
189
  assert_equal experiment(:pie_or_cake).choose, experiment(:pie_or_cake).alternatives.first
189
190
  assert experiment(:pie_or_cake).showing?(first)
@@ -194,21 +195,20 @@ class UseVanityControllerTest < ActionController::TestCase
194
195
  experiment(:pie_or_cake).chooses(experiment(:pie_or_cake).alternatives.last.value)
195
196
  first = experiment(:pie_or_cake).alternatives.first
196
197
  fingerprint = experiment(:pie_or_cake).fingerprint(first)
197
- params = { :foo => "bar", :_vanity => fingerprint }
198
+ params = { foo: "bar", _vanity: fingerprint }
198
199
  post :index, params
199
200
  assert_response :success
200
201
  assert !experiment(:pie_or_cake).showing?(first)
201
202
  end
202
203
 
203
204
  def test_track_param_tracks_a_metric
204
- params = { :_identity => "123", :_track => "sugar_high" }
205
+ params = { _identity: "123", _track: "sugar_high" }
205
206
  get :index, params
206
207
  assert_equal experiment(:pie_or_cake).alternatives[0].converted, 1
207
208
  end
208
209
 
209
210
  def test_cookie_domain_from_rails_configuration
210
211
  get :index
211
- assert_match /domain=.foo.bar/, @response["Set-Cookie"] if ::Rails.respond_to?(:application)
212
+ assert_match(/domain=.foo.bar/, @response["Set-Cookie"]) if ::Rails.respond_to?(:application)
212
213
  end
213
-
214
214
  end
@@ -15,7 +15,7 @@ class UseVanityMailerTest < ActionMailer::TestCase
15
15
 
16
16
  def test_js_enabled_still_adds_participant
17
17
  Vanity.playground.use_js!
18
- experiment(:pie_or_cake).identify { }
18
+ experiment(:pie_or_cake).identify {} # rubocop:todo Lint/EmptyBlock
19
19
  experiment(:pie_or_cake).chooses(:pie)
20
20
  VanityMailer.ab_test_subject(nil)
21
21
 
@@ -24,7 +24,7 @@ class UseVanityMailerTest < ActionMailer::TestCase
24
24
  end
25
25
 
26
26
  def test_returns_different_alternatives
27
- experiment(:pie_or_cake).identify { }
27
+ experiment(:pie_or_cake).identify {} # rubocop:todo Lint/EmptyBlock
28
28
 
29
29
  experiment(:pie_or_cake).chooses(:pie)
30
30
  email = VanityMailer.ab_test_subject(nil)
@@ -34,13 +34,13 @@ class RailsHelperTest < ActionView::TestCase
34
34
  end
35
35
 
36
36
  def test_vanity_track_url_for_returns_url_with_identity_and_metrics
37
- self.expects(:url_for).with(:controller => "controller", :action => "action", :_identity => '123', :_track => :sugar_high)
38
- vanity_track_url_for("123", :sugar_high, :controller => "controller", :action => "action")
37
+ expects(:url_for).with(controller: "controller", action: "action", _identity: '123', _track: :sugar_high)
38
+ vanity_track_url_for("123", :sugar_high, controller: "controller", action: "action")
39
39
  end
40
40
 
41
41
  def test_vanity_tracking_image
42
- self.expects(:url_for).with(:controller => :vanity, :action => :image, :_identity => '123', :_track => :sugar_high).returns("/url")
43
- assert_equal image_tag("/url", :width => "1px", :height => "1px", :alt => ""), vanity_tracking_image("123", :sugar_high, options = {})
42
+ expects(:url_for).with(controller: :vanity, action: :image, _identity: '123', _track: :sugar_high).returns("/url")
43
+ assert_equal image_tag("/url", width: "1px", height: "1px", alt: ""), vanity_tracking_image("123", :sugar_high, options = {}) # rubocop:todo Lint/UselessAssignment
44
44
  end
45
45
 
46
46
  def test_vanity_experiments
@@ -53,7 +53,7 @@ class RailsHelperTest < ActionView::TestCase
53
53
  end
54
54
 
55
55
  def test_vanity_experiments_return_is_read_only
56
- result = ab_test(:pie_or_cake)
56
+ result = ab_test(:pie_or_cake) # rubocop:todo Lint/UselessAssignment
57
57
  vanity_experiments_returns = vanity_experiments
58
58
  vanity_experiments_returns[:some_new_key] = 'some new value'
59
59
  assert_equal vanity_experiments.keys.length, 1
@@ -62,5 +62,4 @@ class RailsHelperTest < ActionView::TestCase
62
62
  def test_vanity_experiments_returns_empty_hash_when_no_experiments
63
63
  assert_equal vanity_experiments, {}
64
64
  end
65
-
66
65
  end