i_wonder 0.0.9 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :ab_test, :class => IWonder::AbTest do
3
+ sequence(:name) {|n| "Test #{n}" }
4
+ sequence(:sym) {|n| "test_#{n}" }
5
+ test_group_names ["Options 1", "Options 2"]
6
+ test_applies_to "session"
7
+
8
+ ab_test_goals {|ab_test_goals| [ab_test_goals.association(:test_goal)] }
9
+ end
10
+
11
+ factory :test_goal, :class => IWonder::AbTestGoal do
12
+ event_type "success"
13
+ end
14
+
15
+ end
@@ -14,7 +14,7 @@ class ABControllerMixinsTest < ActionController::TestCase
14
14
  end
15
15
 
16
16
  test "fetching the correct group" do
17
- @ab_test = IWonder::AbTest.create(:name => "Blah Test", :sym => "blah", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}})
17
+ @ab_test = Factory(:ab_test)
18
18
  @ab_test.update_attribute(:test_applies_to, "session")
19
19
  assert_valid @ab_test
20
20
 
@@ -40,7 +40,7 @@ class ABControllerMixinsTest < ActionController::TestCase
40
40
  end
41
41
 
42
42
  test "adding to test groups" do
43
- @ab_test = IWonder::AbTest.create(:name => "Blah Test", :sym => "blah", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}})
43
+ @ab_test = Factory(:ab_test)
44
44
  @ab_test.update_attribute(:test_applies_to, "session")
45
45
  assert_valid @ab_test
46
46
 
@@ -60,21 +60,35 @@ class ABControllerMixinsTest < ActionController::TestCase
60
60
  end
61
61
 
62
62
  test "if which_test_group works" do
63
- @ab_test = IWonder::AbTest.create(:name => "Blah Test", :sym => "blah", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}})
63
+ @ab_test = Factory(:ab_test)
64
64
  @ab_test.update_attribute(:test_applies_to, "session")
65
65
 
66
66
  assert_equal 0, @ab_test.test_group_memberships.count
67
67
 
68
68
  # first time shouldn't be in a group yet. Will get placed in one.
69
- first_group = @controller.which_test_group?("blah")
69
+ first_group = @controller.which_test_group?(@ab_test.sym)
70
70
  assert_include @ab_test.test_group_names, first_group
71
71
  assert_equal 1, @ab_test.test_group_memberships.count
72
72
 
73
- second_group = @controller.which_test_group?("blah")
73
+ second_group = @controller.which_test_group?(@ab_test.sym)
74
74
  assert_include first_group, second_group
75
75
  assert_equal 1, @ab_test.test_group_memberships.count
76
76
  end
77
77
 
78
+ test "which_test_group doesn't barf on missing member" do
79
+ @ab_test = Factory(:ab_test)
80
+ @ab_test.update_attribute(:test_applies_to, "session")
81
+
82
+ @controller.instance_eval do
83
+ cookies[IWonder::COOKIE_KEY+IWonder::Logging::SESSION_KEY_NAME] = nil
84
+ cookies.delete(IWonder::COOKIE_KEY+IWonder::Logging::SESSION_KEY_NAME)
85
+ end
86
+
87
+ assert_equal 0, @ab_test.test_group_memberships.count
88
+ assert @controller.which_test_group?(@ab_test.sym).present?, "something should still be returned"
89
+ assert_equal 0, @ab_test.test_group_memberships.count, "Shuold not have made a memberhsip"
90
+ end
91
+
78
92
  test "the element the test applies to is not available" do
79
93
  pending
80
94
  end
@@ -84,7 +98,7 @@ class ABControllerMixinsTest < ActionController::TestCase
84
98
  end
85
99
 
86
100
  test "forcing a choice with paramteres" do
87
- @ab_test = IWonder::AbTest.create(:name => "Override Test", :sym => "override_test", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}}, :test_applies_to => "session")
101
+ @ab_test = Factory(:ab_test, :sym => "override_test")
88
102
  assert_valid @ab_test
89
103
 
90
104
  @controller.params[:_force_ab_test] = "override_test"
@@ -0,0 +1,46 @@
1
+ require File.expand_path("../../test_helper.rb", File.dirname(__FILE__))
2
+
3
+ # This is an integration test because I couldn't get the routes to find the controller on functional tests
4
+
5
+ module IWonder
6
+ class AbTestsControllerTest < ActionDispatch::IntegrationTest
7
+
8
+ # test "index works" do
9
+ # AbTest.destroy_all
10
+ # get "i_wonder/ab_tests"
11
+ # assert_response :success
12
+ # end
13
+ #
14
+
15
+ test "update works" do
16
+ AbTest.delete_all
17
+ AbTestGoal.delete_all
18
+
19
+ @ab_test = Factory(:ab_test)
20
+ @ab_test.ab_test_goals.create(:goal_type => "Event", :event_type => "random event")
21
+
22
+ goal_1 = @ab_test.ab_test_goals.first
23
+ goal_2 = @ab_test.ab_test_goals.last
24
+
25
+
26
+ put "i_wonder/ab_tests/#{@ab_test.id}", {:ab_test => {:name => "new name", :ab_test_goals_attributes => {
27
+ "0" => {:id => goal_1.id, :goal_type => "Event", :event_type => "success 2" },
28
+ "1" => {:id => goal_2.id, :goal_type => "Event", :event_type => "random_event", "_destroy" => true },
29
+ "2" => {:goal_type => "Event", :event_type => "new_event" }
30
+ }}}
31
+ assert_valid assigns(:ab_test)
32
+ @ab_test.reload
33
+ assert_redirected_to @ab_test
34
+
35
+ # puts "after:"
36
+ # puts @ab_test.ab_test_goals.collect(&:inspect).join("\n")
37
+ #
38
+ #
39
+ assert_equal "new name", @ab_test.name
40
+ assert_equal 2, @ab_test.ab_test_goals.count, @ab_test.ab_test_goals.collect(&:inspect).join("\n")
41
+ assert_equal "success 2", @ab_test.ab_test_goals.first.event_type
42
+ assert_equal "new_event", @ab_test.ab_test_goals.last.event_type
43
+ end
44
+
45
+ end
46
+ end
@@ -6,12 +6,17 @@ module IWonder
6
6
  class AbTestTest < ActiveSupport::TestCase
7
7
 
8
8
  test "counting results" do
9
- @ab_test = IWonder::AbTest.create(:name => "Unique Test 1", :sym => "unique_sym_1", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}}, :test_applies_to => "session")
9
+ AbTest.delete_all
10
+
11
+ @ab_test = Factory(:ab_test)
12
+ @ab_test.ab_test_goals.create(:goal_type => "Page View", :page_view_controller => "TestController", :page_view_action => "test")
10
13
  assert_valid @ab_test
11
- ab_test_goal = @ab_test.ab_test_goals.first
14
+ ab_test_goal_1 = @ab_test.ab_test_goals[0]
15
+ ab_test_goal_2 = @ab_test.ab_test_goals[1]
16
+ assert_equal "test", ab_test_goal_2.page_view_controller
12
17
 
13
18
  Timecop.travel(Time.zone.now - 1.day) do
14
- assert IWonder::Event.create(:event_type => "success", :session_id => "5") # this should be ignored
19
+ assert Event.create(:event_type => "success", :session_id => "5") # this should be ignored
15
20
  end
16
21
 
17
22
  assert @ab_test.test_group_memberships.create(:member_type => "session", :member_id => "1", :test_group_name => "Option 1")
@@ -20,17 +25,21 @@ module IWonder
20
25
  assert @ab_test.test_group_memberships.create(:member_type => "session", :member_id => "4", :test_group_name => "Option 2")
21
26
  assert @ab_test.test_group_memberships.create(:member_type => "session", :member_id => "5", :test_group_name => "Option 1")
22
27
 
23
- assert IWonder::Event.create(:event_type => "success", :session_id => "1")
24
- assert IWonder::Event.create(:event_type => "random", :session_id => "2")
25
- assert IWonder::Event.create(:event_type => "success", :session_id => "2")
26
- assert IWonder::Event.create(:event_type => "success", :session_id => "3")
27
- assert IWonder::Event.create(:event_type => "random", :session_id => "4")
28
- assert IWonder::Event.create(:event_type => "success", :session_id => "6")
28
+ assert Event.create(:event_type => "success", :session_id => "1")
29
+ assert Event.create(:event_type => "success", :session_id => "1") # duplicate shouldn't be counted
30
+ assert Event.create(:event_type => "hit", :session_id => "1", :controller => "test", :action => "test")
31
+ assert Event.create(:event_type => "random", :session_id => "2")
32
+ assert Event.create(:event_type => "success", :session_id => "2")
33
+ assert Event.create(:event_type => "success", :session_id => "3")
34
+ assert Event.create(:event_type => "random", :session_id => "4")
35
+ assert Event.create(:event_type => "success", :session_id => "6")
29
36
 
30
37
  assert_equal 2, @ab_test.assigned_count("Option 1")
31
38
  assert_equal 3, @ab_test.assigned_count("Option 2")
32
- assert_equal 1, @ab_test.get_results_for("Option 1", ab_test_goal)
33
- assert_equal 2, @ab_test.get_results_for("Option 2", ab_test_goal)
39
+ assert_equal 1, @ab_test.get_results_for("Option 1", ab_test_goal_1)
40
+ assert_equal 2, @ab_test.get_results_for("Option 2", ab_test_goal_1)
41
+
42
+ assert_equal 1, @ab_test.get_results_for("Option 1", ab_test_goal_2)
34
43
  end
35
44
 
36
45
  end
@@ -34,7 +34,7 @@ module IWonder
34
34
  test "Saves Correctly" do
35
35
  assert !File.exists?(AbTesting::Loader.send(:file_name, "save_test"))
36
36
 
37
- @ab_test = IWonder::AbTest.create(:name => "Blah Test", :sym => "save_test", :test_group_names => ["Options 1", "Options 2"], :ab_test_goals_attributes => {"0" => {:event_type => "success"}}, :test_applies_to => "session")
37
+ @ab_test = Factory(:ab_test, :name => "Blah Test", :sym => "save_test")
38
38
  AbTesting::Loader.save_ab_test(@ab_test)
39
39
 
40
40
  assert File.exists?(AbTesting::Loader.send(:file_name, "save_test"))
@@ -48,7 +48,7 @@ module IWonder
48
48
  end
49
49
 
50
50
  test "Updates existing test" do
51
- @ab_test = IWonder::AbTest.create(:name => "Different name", :sym => "save_test", :test_group_names => ["Options 2", "Options 3"], :ab_test_goals_attributes => {"0" => {:event_type => "fail"}}, :test_applies_to => "user")
51
+ @ab_test = Factory(:ab_test, :sym => "save_test")
52
52
  `cp #{TEST_ASSETS + "/i_wonder/save_test.xml"} #{AbTesting::Loader::AB_TEST_DATA_DIR + "/save_test.xml"}`
53
53
 
54
54
  AbTesting::Loader.load_all
@@ -67,7 +67,7 @@ module IWonder
67
67
 
68
68
  test "Test Destruction removes files" do
69
69
  assert !File.exists?(AbTesting::Loader.send(:file_name, "save_test"))
70
- @ab_test = IWonder::AbTest.create(:name => "Blah Test", :sym => "save_test", :test_group_names => ["Options 2", "Options 3"], :ab_test_goals_attributes => {"0" => {:event_type => "fail"}}, :test_applies_to => "user")
70
+ @ab_test = Factory(:ab_test, :sym => "save_test")
71
71
  assert File.exists?(AbTesting::Loader.send(:file_name, "save_test"))
72
72
  @ab_test.destroy
73
73
  assert !File.exists?(AbTesting::Loader.send(:file_name, "save_test"))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i_wonder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-31 00:00:00.000000000Z
12
+ date: 2011-11-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &2156708860 !ruby/object:Gem::Requirement
16
+ requirement: &2156187460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.1.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156708860
24
+ version_requirements: *2156187460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jquery-rails
27
- requirement: &2156882260 !ruby/object:Gem::Requirement
27
+ requirement: &2156185140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2156882260
35
+ version_requirements: *2156185140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: delayed_job
38
- requirement: &2157011100 !ruby/object:Gem::Requirement
38
+ requirement: &2156184220 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '2.1'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2157011100
46
+ version_requirements: *2156184220
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: hash_accessor
49
- requirement: &2157129820 !ruby/object:Gem::Requirement
49
+ requirement: &2156177420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '1.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2157129820
57
+ version_requirements: *2156177420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: factory_girl_rails
60
- requirement: &2157267000 !ruby/object:Gem::Requirement
60
+ requirement: &2156174740 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2157267000
68
+ version_requirements: *2156174740
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pg
71
- requirement: &2157427760 !ruby/object:Gem::Requirement
71
+ requirement: &2156169580 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2157427760
79
+ version_requirements: *2156169580
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: pry
82
- requirement: &2157507260 !ruby/object:Gem::Requirement
82
+ requirement: &2156157320 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2157507260
90
+ version_requirements: *2156157320
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sass
93
- requirement: &2157509260 !ruby/object:Gem::Requirement
93
+ requirement: &2156151100 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '3.1'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2157509260
101
+ version_requirements: *2156151100
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: timecop
104
- requirement: &2157508820 !ruby/object:Gem::Requirement
104
+ requirement: &2156148020 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2157508820
112
+ version_requirements: *2156148020
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: mocha
115
- requirement: &2157508360 !ruby/object:Gem::Requirement
115
+ requirement: &2156146280 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *2157508360
123
+ version_requirements: *2156146280
124
124
  description: Analytics and AB Testing awesomeness for rails.
125
125
  email:
126
126
  - development@forrestzeisler.com
@@ -291,12 +291,14 @@ files:
291
291
  - test/dummy/tmp/cache/assets/DF9/5C0/sprockets%2Fd711a81a91fcc3cd1a30798dd94fdcbd
292
292
  - test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
293
293
  - test/dummy/tmp/cache/assets/E8D/B70/sprockets%2Fd62ab1e993c1edcadba5317fe8c7dffb
294
+ - test/factories/ab_test_factory.rb
294
295
  - test/factories/metric_factory.rb
295
296
  - test/factories/report_factory.rb
296
297
  - test/factories/snapshot_factory.rb
297
298
  - test/functional/ab_controller_mixins_test.rb
298
299
  - test/functional/logging_controller_mixins_test.rb
299
300
  - test/i_wonder_test.rb
301
+ - test/integration/i_wonder/ab_tests_controller_test.rb
300
302
  - test/integration/i_wonder/dashboard_controller_test.rb
301
303
  - test/integration/i_wonder/events_controller_test.rb
302
304
  - test/integration/i_wonder/metrics_controller_test.rb
@@ -428,12 +430,14 @@ test_files:
428
430
  - test/dummy/tmp/cache/assets/DF9/5C0/sprockets%2Fd711a81a91fcc3cd1a30798dd94fdcbd
429
431
  - test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
430
432
  - test/dummy/tmp/cache/assets/E8D/B70/sprockets%2Fd62ab1e993c1edcadba5317fe8c7dffb
433
+ - test/factories/ab_test_factory.rb
431
434
  - test/factories/metric_factory.rb
432
435
  - test/factories/report_factory.rb
433
436
  - test/factories/snapshot_factory.rb
434
437
  - test/functional/ab_controller_mixins_test.rb
435
438
  - test/functional/logging_controller_mixins_test.rb
436
439
  - test/i_wonder_test.rb
440
+ - test/integration/i_wonder/ab_tests_controller_test.rb
437
441
  - test/integration/i_wonder/dashboard_controller_test.rb
438
442
  - test/integration/i_wonder/events_controller_test.rb
439
443
  - test/integration/i_wonder/metrics_controller_test.rb