vanity 1.9.3 → 2.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +0 -1
- data/.travis.yml +2 -53
- data/Appraisals +3 -12
- data/CHANGELOG +1 -5
- data/Gemfile +0 -10
- data/Gemfile.lock +3 -38
- data/README.rdoc +2 -13
- data/Rakefile +7 -13
- data/bin/vanity +0 -1
- data/doc/rails.textile +0 -12
- data/gemfiles/rails32.gemfile +2 -4
- data/gemfiles/rails32.gemfile.lock +6 -14
- data/gemfiles/rails4.gemfile +1 -4
- data/gemfiles/rails4.gemfile.lock +5 -15
- data/lib/vanity/adapters/active_record_adapter.rb +14 -10
- data/lib/vanity/experiment/ab_test.rb +1 -1
- data/lib/vanity/frameworks/rails.rb +11 -17
- data/lib/vanity/frameworks.rb +3 -10
- data/lib/vanity/metric/active_record.rb +20 -19
- data/lib/vanity/playground.rb +1 -3
- data/lib/vanity/version.rb +1 -1
- data/test/adapters/redis_adapter_test.rb +26 -27
- data/test/autoconnect_test.rb +19 -17
- data/test/cli_test.rb +19 -26
- data/test/experiment/ab_test.rb +2 -15
- data/test/experiment/base_test.rb +18 -22
- data/test/frameworks/rails/action_controller_test.rb +184 -0
- data/test/frameworks/rails/action_mailer_test.rb +65 -0
- data/test/{rails_helper_test.rb → frameworks/rails/action_view_test.rb} +1 -1
- data/test/frameworks/rails/rails_test.rb +285 -0
- data/test/helper_test.rb +13 -10
- data/test/metric/active_record_test.rb +50 -66
- data/test/metric/base_test.rb +39 -41
- data/test/metric/google_analytics_test.rb +13 -16
- data/test/metric/remote_test.rb +18 -19
- data/test/playground_test.rb +1 -1
- data/test/test_helper.rb +25 -43
- data/test/{rails_dashboard_test.rb → web/rails/dashboard_test.rb} +2 -1
- data/vanity.gemspec +3 -2
- metadata +33 -33
- data/gemfiles/rails3.gemfile +0 -32
- data/gemfiles/rails3.gemfile.lock +0 -172
- data/gemfiles/rails31.gemfile +0 -32
- data/gemfiles/rails31.gemfile.lock +0 -181
- data/generators/templates/vanity_migration.rb +0 -54
- data/generators/vanity_generator.rb +0 -8
- data/test/myapp/app/controllers/application_controller.rb +0 -2
- data/test/myapp/app/controllers/main_controller.rb +0 -7
- data/test/myapp/config/boot.rb +0 -110
- data/test/myapp/config/environment.rb +0 -10
- data/test/myapp/config/environments/production.rb +0 -0
- data/test/myapp/config/routes.rb +0 -3
- data/test/passenger_test.rb +0 -52
- data/test/rails_test.rb +0 -554
data/lib/vanity/frameworks.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
1
|
# Automatically configure Vanity.
|
2
2
|
if defined?(Rails)
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require 'vanity/frameworks/rails'
|
7
|
-
Vanity::Rails.load!
|
8
|
-
end
|
9
|
-
end
|
10
|
-
else
|
11
|
-
Rails.configuration.after_initialize do
|
12
|
-
require 'vanity/frameworks/rails'
|
3
|
+
class Plugin < Rails::Railtie # :nodoc:
|
4
|
+
initializer "vanity.require" do |app|
|
5
|
+
require 'vanity/frameworks/rails'
|
13
6
|
Vanity::Rails.load!
|
14
7
|
end
|
15
8
|
end
|
@@ -35,18 +35,21 @@ module Vanity
|
|
35
35
|
# @since 1.2.0
|
36
36
|
# @see Vanity::Metric::ActiveRecord
|
37
37
|
def model(class_or_scope, options = nil)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
38
|
+
ActiveSupport.on_load(:active_record, :yield=>true) do
|
39
|
+
class_or_scope = class_or_scope.constantize if class_or_scope.is_a?(String)
|
40
|
+
options = options || {}
|
41
|
+
conditions = options.delete(:conditions)
|
42
|
+
@ar_scoped = conditions ? class_or_scope.scoped(:conditions=>conditions) : class_or_scope
|
43
|
+
@ar_aggregate = AGGREGATES.find { |key| options.has_key?(key) }
|
44
|
+
@ar_column = options.delete(@ar_aggregate)
|
45
|
+
fail "Cannot use multiple aggregates in a single metric" if AGGREGATES.find { |key| options.has_key?(key) }
|
46
|
+
@ar_timestamp = options.delete(:timestamp) || :created_at
|
47
|
+
@ar_timestamp, @ar_timestamp_table = @ar_timestamp.to_s.split('.').reverse
|
48
|
+
@ar_timestamp_table ||= @ar_scoped.table_name
|
49
|
+
fail "Unrecognized options: #{options.keys * ", "}" unless options.empty?
|
50
|
+
@ar_scoped.after_create self
|
51
|
+
extend ActiveRecord
|
52
|
+
end
|
50
53
|
end
|
51
54
|
|
52
55
|
# Calling model method on a metric extends it with these modules, redefining
|
@@ -57,13 +60,11 @@ module Vanity
|
|
57
60
|
|
58
61
|
# This values method queries the database.
|
59
62
|
def values(sdate, edate)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
rescue NoMethodError #In Rails 2.3, if no time zone has been set this fails
|
66
|
-
end
|
63
|
+
time = Time.now.in_time_zone
|
64
|
+
difference = time.to_date - Date.today
|
65
|
+
sdate = sdate + difference
|
66
|
+
edate = edate + difference
|
67
|
+
|
67
68
|
query = { :conditions=> { @ar_timestamp_table => { @ar_timestamp => (sdate.to_time...(edate + 1).to_time) } },
|
68
69
|
:group=>"date(#{@ar_scoped.quoted_table_name}.#{@ar_scoped.connection.quote_column_name @ar_timestamp})" }
|
69
70
|
grouped = @ar_column ? @ar_scoped.send(@ar_aggregate, @ar_column, query) : @ar_scoped.count(query)
|
data/lib/vanity/playground.rb
CHANGED
@@ -492,9 +492,7 @@ module Vanity
|
|
492
492
|
|
493
493
|
# Path to template.
|
494
494
|
def template(name)
|
495
|
-
|
496
|
-
path << ".erb" unless name["."]
|
497
|
-
path
|
495
|
+
File.join(File.dirname(__FILE__), "templates/#{name}")
|
498
496
|
end
|
499
497
|
end
|
500
498
|
end
|
data/lib/vanity/version.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require "vanity/adapters/redis_adapter"
|
3
|
+
describe Vanity::Adapters::RedisAdapter do
|
4
|
+
before do
|
6
5
|
require "redis"
|
7
6
|
require "redis/namespace"
|
8
7
|
end
|
9
8
|
|
10
|
-
|
9
|
+
it "warns on disconnect error" do
|
11
10
|
if defined?(Redis)
|
12
|
-
|
11
|
+
assert_silent do
|
13
12
|
Redis.any_instance.stubs(:connect!)
|
14
13
|
mocked_redis = stub("Redis")
|
15
14
|
mocked_redis.expects(:client).raises(RuntimeError)
|
@@ -29,98 +28,98 @@ class RedisAdapterTest < Test::Unit::TestCase
|
|
29
28
|
[redis_adapter, mocked_redis]
|
30
29
|
end
|
31
30
|
|
32
|
-
|
31
|
+
it "connects to existing redis" do
|
33
32
|
mocked_redis = stub("Redis")
|
34
33
|
adapter = Vanity::Adapters.redis_connection(:redis => mocked_redis)
|
35
34
|
assert_equal mocked_redis, adapter.redis
|
36
35
|
end
|
37
36
|
|
38
|
-
|
37
|
+
it "gracefully fails in #metric_track" do
|
39
38
|
redis_adapter, mocked_redis = stub_redis
|
40
39
|
mocked_redis.stubs(:incrby).raises(RuntimeError)
|
41
40
|
|
42
|
-
|
41
|
+
assert_silent do
|
43
42
|
redis_adapter.metric_track("metric", Time.now.to_s, "3ff62e2fb51f0b22646a342a2d357aec", [1])
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
47
|
-
|
46
|
+
it "gracefully fails in #set experiment created at" do
|
48
47
|
redis_adapter, mocked_redis = stub_redis
|
49
48
|
mocked_redis.stubs(:setnx).raises(RuntimeError)
|
50
49
|
|
51
|
-
|
50
|
+
assert_silent do
|
52
51
|
redis_adapter.set_experiment_created_at("price_options", Time.now)
|
53
52
|
end
|
54
53
|
end
|
55
54
|
|
56
|
-
|
55
|
+
it "gracefully fails in #is_experiment_completed?" do
|
57
56
|
redis_adapter, mocked_redis = stub_redis
|
58
57
|
mocked_redis.stubs(:exists).raises(RuntimeError)
|
59
58
|
|
60
|
-
|
59
|
+
assert_silent do
|
61
60
|
redis_adapter.is_experiment_completed?("price_options")
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
|
-
|
64
|
+
it "gracefully fails in #ab_show" do
|
66
65
|
redis_adapter, mocked_redis = stub_redis
|
67
66
|
mocked_redis.stubs(:[]=).raises(RuntimeError)
|
68
67
|
|
69
|
-
|
68
|
+
assert_silent do
|
70
69
|
redis_adapter.ab_show("price_options", "3ff62e2fb51f0b22646a342a2d357aec", 0)
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
|
-
|
73
|
+
it "gracefully fails in #ab_showing" do
|
75
74
|
redis_adapter, mocked_redis = stub_redis
|
76
75
|
mocked_redis.stubs(:[]).raises(RuntimeError)
|
77
76
|
|
78
|
-
|
77
|
+
assert_silent do
|
79
78
|
redis_adapter.ab_showing("price_options", "3ff62e2fb51f0b22646a342a2d357aec")
|
80
79
|
end
|
81
80
|
end
|
82
81
|
|
83
|
-
|
82
|
+
it "gracefully fails in #ab_not_showing" do
|
84
83
|
redis_adapter, mocked_redis = stub_redis
|
85
84
|
mocked_redis.stubs(:del).raises(RuntimeError)
|
86
85
|
|
87
|
-
|
86
|
+
assert_silent do
|
88
87
|
redis_adapter.ab_not_showing("price_options", "3ff62e2fb51f0b22646a342a2d357aec")
|
89
88
|
end
|
90
89
|
end
|
91
90
|
|
92
|
-
|
91
|
+
it "gracefully fails in #ab_add_participant" do
|
93
92
|
redis_adapter, mocked_redis = stub_redis
|
94
93
|
mocked_redis.stubs(:sadd).raises(RuntimeError)
|
95
94
|
|
96
|
-
|
95
|
+
assert_silent do
|
97
96
|
redis_adapter.ab_add_participant("price_options", "3ff62e2fb51f0b22646a342a2d357aec", 0)
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
101
|
-
|
100
|
+
it "gracefully fails in #ab_seen" do
|
102
101
|
redis_adapter, mocked_redis = stub_redis
|
103
102
|
mocked_redis.stubs(:sismember).raises(RuntimeError)
|
104
103
|
|
105
|
-
|
104
|
+
assert_silent do
|
106
105
|
redis_adapter.ab_seen("price_options", "3ff62e2fb51f0b22646a342a2d357aec", 0)
|
107
106
|
end
|
108
107
|
end
|
109
108
|
|
110
|
-
|
109
|
+
it "gracefully fails in #ab_assigned" do
|
111
110
|
redis_adapter, mocked_redis = stub_redis
|
112
111
|
mocked_redis.stubs(:sismember).raises(RuntimeError)
|
113
112
|
|
114
|
-
|
113
|
+
assert_silent do
|
115
114
|
redis_adapter.ab_assigned("price_options", "3ff62e2fb51f0b22646a342a2d357aec")
|
116
115
|
end
|
117
116
|
end
|
118
117
|
|
119
|
-
|
118
|
+
it "gracefully fails in #ab_add_conversion" do
|
120
119
|
redis_adapter, mocked_redis = stub_redis
|
121
120
|
mocked_redis.stubs(:sismember).raises(RuntimeError)
|
122
121
|
|
123
|
-
|
122
|
+
assert_silent do
|
124
123
|
redis_adapter.ab_add_conversion("price_options", 0, "3ff62e2fb51f0b22646a342a2d357aec")
|
125
124
|
end
|
126
125
|
end
|
data/test/autoconnect_test.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
|
3
|
+
describe Vanity::Autoconnect do
|
4
|
+
describe ".playground_should_autoconnect?" do
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
it "returns true by default" do
|
7
|
+
autoconnect = Vanity::Autoconnect.playground_should_autoconnect?
|
8
|
+
assert autoconnect == true
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
it "returns false if environment flag is set" do
|
12
|
+
ENV['VANITY_DISABLED'] = '1'
|
13
|
+
autoconnect = Vanity::Autoconnect.playground_should_autoconnect?
|
14
|
+
assert autoconnect == false
|
15
|
+
ENV['VANITY_DISABLED'] = nil
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
it "returns false if in assets:precompile rake task" do
|
19
|
+
Rake.expects(:application).returns(stub(:top_level_tasks => ['assets:precompile']))
|
20
|
+
autoconnect = Vanity::Autoconnect.playground_should_autoconnect?
|
21
|
+
assert autoconnect == false
|
22
|
+
end
|
21
23
|
end
|
22
|
-
end
|
24
|
+
end
|
data/test/cli_test.rb
CHANGED
@@ -1,53 +1,46 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
|
3
|
+
describe "bin/vanity" do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
it "responds to version" do
|
6
|
+
proc {
|
7
|
+
IO.any_instance.expects(:puts)
|
8
|
+
ARGV.clear
|
9
|
+
ARGV << '--version'
|
10
|
+
load "bin/vanity"
|
11
|
+
}.must_raise SystemExit
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
it "responds to help" do
|
15
|
+
proc {
|
16
|
+
IO.any_instance.expects(:puts)
|
17
|
+
ARGV.clear
|
18
|
+
ARGV << '--help'
|
19
|
+
load "bin/vanity"
|
20
|
+
}.must_raise SystemExit
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "responds to list" do
|
24
24
|
require "vanity/commands/list"
|
25
25
|
Vanity::Commands.expects(:list)
|
26
26
|
ARGV.clear
|
27
27
|
ARGV << 'list'
|
28
28
|
load "bin/vanity"
|
29
|
-
rescue SystemExit => e
|
30
|
-
assert e.status == 0
|
31
29
|
end
|
32
30
|
|
33
|
-
|
31
|
+
it "responds to report" do
|
34
32
|
require "vanity/commands/report"
|
35
33
|
Vanity::Commands.expects(:report)
|
36
34
|
ARGV.clear
|
37
35
|
ARGV << 'report'
|
38
36
|
load "bin/vanity"
|
39
|
-
rescue SystemExit => e
|
40
|
-
assert e.status == 0
|
41
37
|
end
|
42
38
|
|
43
|
-
|
39
|
+
it "responds to unknown commands" do
|
44
40
|
require "vanity/commands/upgrade"
|
45
41
|
Vanity::Commands.expects(:upgrade)
|
46
42
|
ARGV.clear
|
47
43
|
ARGV << 'upgrade'
|
48
44
|
load "bin/vanity"
|
49
|
-
rescue SystemExit => e
|
50
|
-
assert e.status == 0
|
51
45
|
end
|
52
|
-
|
53
46
|
end
|
data/test/experiment/ab_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
class AbTestController < ActionController::Base
|
4
4
|
use_vanity :current_user
|
@@ -13,11 +13,7 @@ class AbTestController < ActionController::Base
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_capture
|
16
|
-
|
17
|
-
render :inline=>"<%= ab_test :simple do |value| %><%= value %><% end %>"
|
18
|
-
else
|
19
|
-
render :inline=>"<% ab_test :simple do |value| %><%= value %><% end %>"
|
20
|
-
end
|
16
|
+
render :inline=>"<%= ab_test :simple do |value| %><%= value %><% end %>"
|
21
17
|
end
|
22
18
|
|
23
19
|
def track
|
@@ -35,15 +31,6 @@ class AbTestTest < ActionController::TestCase
|
|
35
31
|
metric "Coolness"
|
36
32
|
end
|
37
33
|
|
38
|
-
def teardown
|
39
|
-
super
|
40
|
-
if RUBY_VERSION == '1.8.7'
|
41
|
-
GC.enable
|
42
|
-
GC.start
|
43
|
-
GC.disable
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
34
|
# -- Experiment definition --
|
48
35
|
|
49
36
|
def test_requires_at_least_two_alternatives_per_experiment
|
@@ -1,20 +1,19 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
|
3
|
+
describe Vanity::Experiment::Base do
|
4
4
|
|
5
|
-
|
6
|
-
super
|
5
|
+
before do
|
7
6
|
metric "Happiness"
|
8
7
|
end
|
9
8
|
|
10
9
|
# -- Defining experiment --
|
11
10
|
|
12
|
-
|
11
|
+
it "can access experiment by id" do
|
13
12
|
exp = new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
14
13
|
assert_equal exp, experiment(:ice_cream_flavor)
|
15
14
|
end
|
16
15
|
|
17
|
-
|
16
|
+
it "fails when defining same experiment twice" do
|
18
17
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
19
18
|
f.write <<-RUBY
|
20
19
|
ab_test "Ice Cream Flavor" do
|
@@ -33,13 +32,13 @@ class ExperimentTest < Test::Unit::TestCase
|
|
33
32
|
|
34
33
|
# -- Loading experiments --
|
35
34
|
|
36
|
-
|
35
|
+
it "fails if cannot load named experiment" do
|
37
36
|
assert_raises Vanity::NoExperimentError do
|
38
37
|
experiment(:ice_cream_flavor)
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
|
41
|
+
it "loads the experiment" do
|
43
42
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
44
43
|
f.write <<-RUBY
|
45
44
|
ab_test "Ice Cream Flavor" do
|
@@ -53,7 +52,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
53
52
|
assert_equal "x", experiment(:ice_cream_flavor).xmts
|
54
53
|
end
|
55
54
|
|
56
|
-
|
55
|
+
it "fails if error loading experiment" do
|
57
56
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
58
57
|
f.write "fail 'yawn!'"
|
59
58
|
end
|
@@ -62,7 +61,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
|
-
|
64
|
+
it "complains if not defined where expected" do
|
66
65
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
67
66
|
f.write ""
|
68
67
|
end
|
@@ -71,7 +70,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
|
-
|
73
|
+
it "reloading experiments" do
|
75
74
|
new_ab_test(:ab) { metrics :happiness }
|
76
75
|
new_ab_test(:cd) { metrics :happiness }
|
77
76
|
assert_equal 2, Vanity.playground.experiments.size
|
@@ -82,13 +81,13 @@ class ExperimentTest < Test::Unit::TestCase
|
|
82
81
|
|
83
82
|
# -- Attributes --
|
84
83
|
|
85
|
-
|
84
|
+
it "maps the experiment name to id" do
|
86
85
|
experiment = new_ab_test("Ice Cream Flavor/Tastes") { metrics :happiness }
|
87
86
|
assert_equal "Ice Cream Flavor/Tastes", experiment.name
|
88
87
|
assert_equal :ice_cream_flavor_tastes, experiment.id
|
89
88
|
end
|
90
89
|
|
91
|
-
|
90
|
+
it "saves the experiment after definition" do
|
92
91
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
93
92
|
f.write <<-RUBY
|
94
93
|
ab_test "Ice Cream Flavor" do
|
@@ -100,19 +99,16 @@ class ExperimentTest < Test::Unit::TestCase
|
|
100
99
|
Vanity.playground.experiment(:ice_cream_flavor)
|
101
100
|
end
|
102
101
|
|
103
|
-
|
102
|
+
it "has created timestamp" do
|
104
103
|
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
105
104
|
assert_kind_of Time, experiment(:ice_cream_flavor).created_at
|
106
105
|
assert_in_delta experiment(:ice_cream_flavor).created_at.to_i, Time.now.to_i, 1
|
107
106
|
end
|
108
107
|
|
109
|
-
|
108
|
+
it "keeps created timestamp across definitions" do
|
110
109
|
past = Date.today - 1
|
111
110
|
Timecop.freeze past.to_time do
|
112
|
-
puts "timecop: #{Time.now.to_i}"
|
113
|
-
assert_equal past.to_time.to_i, Time.now.to_i
|
114
111
|
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
115
|
-
assert_equal past.to_time.to_i, experiment(:ice_cream_flavor).created_at.to_i
|
116
112
|
end
|
117
113
|
|
118
114
|
new_playground
|
@@ -121,7 +117,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
121
117
|
assert_equal past.to_time.to_i, experiment(:ice_cream_flavor).created_at.to_i
|
122
118
|
end
|
123
119
|
|
124
|
-
|
120
|
+
it "has a description" do
|
125
121
|
new_ab_test :ice_cream_flavor do
|
126
122
|
description "Because 31 is not enough ..."
|
127
123
|
metrics :happiness
|
@@ -129,7 +125,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
129
125
|
assert_equal "Because 31 is not enough ...", experiment(:ice_cream_flavor).description
|
130
126
|
end
|
131
127
|
|
132
|
-
|
128
|
+
it "stores nothing when collection disabled" do
|
133
129
|
not_collecting!
|
134
130
|
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
135
131
|
experiment(:ice_cream_flavor).complete!
|
@@ -139,7 +135,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
139
135
|
|
140
136
|
# check_completion is called by derived classes, but since it's
|
141
137
|
# part of the base_test I'm testing it here.
|
142
|
-
|
138
|
+
it "handles error in check completion" do
|
143
139
|
new_ab_test(:ab) { metrics :happiness }
|
144
140
|
e = experiment(:ab)
|
145
141
|
e.complete_if { true }
|
@@ -149,7 +145,7 @@ class ExperimentTest < Test::Unit::TestCase
|
|
149
145
|
e.track!(:a, Time.now, 10)
|
150
146
|
end
|
151
147
|
|
152
|
-
|
148
|
+
it "complete updates completed_at" do
|
153
149
|
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
154
150
|
|
155
151
|
time = Time.utc(2008, 9, 1, 12, 0, 0)
|