charted 0.0.8 → 0.1.0

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.
@@ -0,0 +1,101 @@
1
+ require_relative 'helper'
2
+
3
+ class ModelTest < ChartedTest
4
+ def test_create
5
+ site = Charted::Site.create(domain: 'localhost')
6
+ visitor = Charted::Visitor.create(
7
+ site: site,
8
+ bucket: 0,
9
+ ip_address: '67.188.42.140',
10
+ user_agent:
11
+ 'Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1')
12
+ visit = Charted::Visit.create(
13
+ visitor: visitor,
14
+ path: '/',
15
+ title: 'Prime',
16
+ referrer: 'http://www.google.com?q=Charted+Test')
17
+
18
+ assert_equal(site, visit.site)
19
+ assert_equal([visit], visitor.visits)
20
+ assert_equal('Charted Test', visit.search_terms)
21
+ assert_match(/^\w{6}$/, visitor.secret)
22
+ assert_equal("#{visitor.id}-#{visitor.bucket}-#{visitor.secret}", visitor.cookie)
23
+ assert_equal('Linux', visitor.platform)
24
+ assert_equal('Firefox', visitor.browser)
25
+ assert_equal('14.0.1', visitor.browser_version)
26
+
27
+ assert_equal(visitor, site.visitor_with_cookie(visitor.cookie))
28
+ assert_nil(site.visitor_with_cookie("#{visitor.id}-zzzzz"))
29
+ assert_nil(site.visitor_with_cookie("0-zzzzz"))
30
+ assert_nil(site.visitor_with_cookie(nil))
31
+
32
+ event = visitor.make_events('User Clicked').first
33
+ assert_equal(site, event.site)
34
+ assert_equal(visitor, event.visitor)
35
+ assert_equal('User Clicked', event.label)
36
+
37
+ conversion = visitor.start_conversions('User Purchased;User Abandon').first
38
+ visitor.start_conversions('User Purchased') # no effect
39
+ assert_equal(2, visitor.conversions.length)
40
+ assert_equal(site, conversion.site)
41
+ assert_equal(visitor, conversion.visitor)
42
+ assert_equal('User Purchased', conversion.label)
43
+ refute(conversion.ended?)
44
+ visitor.end_goals('User Purchased')
45
+ conversion.refresh
46
+ assert(conversion.ended?)
47
+ visitor.end_goals('Nonexistant') # no effect
48
+ assert_equal(2, visitor.conversions.length)
49
+
50
+ experiment = visitor.start_experiments('User Next:A').first
51
+ visitor.start_experiments('User Next:A') # no effect
52
+ visitor.start_experiments('User Next:B') # changes bucket
53
+ experiment.refresh
54
+ assert_equal(1, visitor.experiments.length)
55
+ assert_equal(site, experiment.site)
56
+ assert_equal(visitor, experiment.visitor)
57
+ assert_equal('User Next', experiment.label)
58
+ assert_equal('B', experiment.bucket)
59
+ refute(experiment.ended?)
60
+ visitor.end_goals('User Next')
61
+ experiment.refresh
62
+ assert(experiment.ended?)
63
+ visitor.end_goals('Nonexistant') # no effect
64
+ assert_equal(1, visitor.experiments.length)
65
+ end
66
+
67
+ def test_user_agents
68
+ visitor = Charted::Visitor.new
69
+
70
+ visitor.user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
71
+ assert_equal('Internet Explorer', visitor.browser)
72
+ assert_equal('7.0', visitor.browser_version)
73
+ assert_equal('Windows', visitor.platform)
74
+
75
+ visitor.user_agent = 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8'
76
+ assert_equal('Safari', visitor.browser)
77
+ assert_equal('1.2.2', visitor.browser_version)
78
+ assert_equal('Macintosh', visitor.platform)
79
+
80
+ visitor.user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 Ubuntu/8.04 (hardy) Firefox/2.0.0.19'
81
+ assert_equal('Firefox', visitor.browser)
82
+ assert_equal('2.0.0.19', visitor.browser_version)
83
+ assert_equal('Linux', visitor.platform)
84
+ end
85
+
86
+ def test_blanks
87
+ site = Charted::Site.create(:domain => 'localhost')
88
+ visitor = Charted::Visitor.create(
89
+ :site => site,
90
+ :user_agent => '',
91
+ :ip_address => '')
92
+ visit = Charted::Visit.create(
93
+ :visitor => visitor,
94
+ :path => '/',
95
+ :title => 'Prime',
96
+ :referrer => '')
97
+ assert(site.id)
98
+ assert(visitor.id)
99
+ assert(visit.id)
100
+ end
101
+ end
metadata CHANGED
@@ -1,144 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: charted
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Hugh Bien
9
8
  autorequire:
10
- bindir: .
9
+ bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-25 00:00:00.000000000 Z
11
+ date: 2014-08-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sinatra
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: '1.4'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: '1.4'
30
27
  - !ruby/object:Gem::Dependency
31
- name: data_mapper
28
+ name: sequel
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: '4.12'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: '4.12'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: geoip
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: '1.4'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: '1.4'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: pony
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: '0'
61
+ version: '1.10'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: '0'
68
+ version: '1.10'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: useragent
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
- version: '0'
75
+ version: '0.10'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
- version: '0'
82
+ version: '0.10'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: search_terms
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - "~>"
100
88
  - !ruby/object:Gem::Version
101
- version: '0'
89
+ version: '0.0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - "~>"
108
95
  - !ruby/object:Gem::Version
109
- version: '0'
96
+ version: '0.0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: dashes
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '0.0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - "~>"
124
109
  - !ruby/object:Gem::Version
125
- version: '0'
110
+ version: '0.0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: minitest
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - "~>"
132
116
  - !ruby/object:Gem::Version
133
- version: '0'
117
+ version: '5.4'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - "~>"
140
123
  - !ruby/object:Gem::Version
141
- version: '0'
124
+ version: '5.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rack-test
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.6'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.6'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sqlite3
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.3'
142
153
  description: A Sinatra app for tracking web traffic on multiple sites.
143
154
  email:
144
155
  - hugh@hughbien.com
@@ -149,35 +160,45 @@ extra_rdoc_files: []
149
160
  files:
150
161
  - LICENSE.md
151
162
  - README.md
163
+ - bin/charted
152
164
  - config.ru
153
165
  - geoip.dat
154
- - charted
155
166
  - lib/charted.rb
156
- - test/charted_test.rb
167
+ - lib/charted/app.rb
168
+ - lib/charted/command.rb
169
+ - lib/charted/config.rb
170
+ - lib/charted/model.rb
171
+ - lib/charted/version.rb
172
+ - migrate/001_init_schema.rb
173
+ - public/charted/script.js
174
+ - test/app_test.rb
175
+ - test/command_test.rb
176
+ - test/config_test.rb
157
177
  - test/fixtures.rb
158
- - ./charted
178
+ - test/helper.rb
179
+ - test/model_test.rb
159
180
  homepage: https://github.com/hughbien/charted
160
- licenses: []
181
+ licenses:
182
+ - BSD
183
+ metadata: {}
161
184
  post_install_message:
162
185
  rdoc_options: []
163
186
  require_paths:
164
187
  - lib
165
188
  required_ruby_version: !ruby/object:Gem::Requirement
166
- none: false
167
189
  requirements:
168
- - - ! '>='
190
+ - - "~>"
169
191
  - !ruby/object:Gem::Version
170
- version: '0'
192
+ version: '2.0'
171
193
  required_rubygems_version: !ruby/object:Gem::Requirement
172
- none: false
173
194
  requirements:
174
- - - ! '>='
195
+ - - ">="
175
196
  - !ruby/object:Gem::Version
176
- version: 1.3.6
197
+ version: '0'
177
198
  requirements: []
178
199
  rubyforge_project:
179
- rubygems_version: 1.8.23
200
+ rubygems_version: 2.2.0
180
201
  signing_key:
181
- specification_version: 3
202
+ specification_version: 4
182
203
  summary: Minimal web traffic analytics
183
204
  test_files: []
@@ -1,389 +0,0 @@
1
- ENV['RACK_ENV'] = 'test'
2
-
3
- require File.expand_path('../lib/charted', File.dirname(__FILE__))
4
- require 'dm-migrations'
5
- require 'minitest/autorun'
6
- require 'rack'
7
- require 'rack/test'
8
- require 'rack/server'
9
- require 'fileutils'
10
-
11
- DataMapper.setup(:default, 'sqlite::memory:')
12
- DataMapper.auto_migrate!
13
-
14
- module Pony
15
- def self.mail(fields)
16
- @last_mail = fields
17
- end
18
-
19
- def self.last_mail
20
- @last_mail
21
- end
22
- end
23
-
24
- class ChartedTest < MiniTest::Unit::TestCase
25
- def setup
26
- Charted.configure(false) do |c|
27
- c.email 'dev@localhost'
28
- c.db_adapter 'sqlite3'
29
- c.db_host 'localhost'
30
- c.db_username 'root'
31
- c.db_password 'secret'
32
- c.db_database 'test.sqlite3'
33
- c.sites ['localhost']
34
- end
35
- Pony.mail(nil)
36
- end
37
-
38
- def teardown
39
- FileUtils.rm_rf(File.expand_path('../temp', File.dirname(__FILE__)))
40
- end
41
- end
42
-
43
- class ConfigTest < ChartedTest
44
- def test_db
45
- assert_equal('dev@localhost', Charted.config.email)
46
- assert_equal('sqlite3', Charted.config.db_adapter)
47
- assert_equal('localhost', Charted.config.db_host)
48
- assert_equal('root', Charted.config.db_username)
49
- assert_equal('secret', Charted.config.db_password)
50
- assert_equal('test.sqlite3', Charted.config.db_database)
51
- assert_equal(['localhost'], Charted.config.sites)
52
- end
53
- end
54
-
55
- class ModelTest < ChartedTest
56
- def setup
57
- Charted::Site.destroy
58
- Charted::Visitor.destroy
59
- Charted::Visit.destroy
60
- Charted::Event.destroy
61
- Charted::Conversion.destroy
62
- Charted::Experiment.destroy
63
- end
64
-
65
- def test_create
66
- site = Charted::Site.create(domain: 'localhost')
67
- visitor = Charted::Visitor.create(
68
- site: site,
69
- bucket: 0,
70
- ip_address: '67.188.42.140',
71
- user_agent:
72
- 'Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1')
73
- visit = Charted::Visit.create(
74
- visitor: visitor,
75
- path: '/',
76
- title: 'Prime',
77
- referrer: 'http://www.google.com?q=Charted+Test')
78
-
79
- assert_equal(site, visit.site)
80
- assert_equal([visit], site.visits)
81
- assert_equal('Charted Test', visit.search_terms)
82
- assert_match(/^\w{5}$/, visitor.secret)
83
- assert_equal("#{visitor.id}-#{visitor.bucket}-#{visitor.secret}", visitor.cookie)
84
- assert_equal('Linux', visitor.platform)
85
- assert_equal('Firefox', visitor.browser)
86
- assert_equal('14.0.1', visitor.browser_version)
87
-
88
- assert_equal(visitor, site.visitor_with_cookie(visitor.cookie))
89
- assert_nil(site.visitor_with_cookie("#{visitor.id}-zzzzz"))
90
- assert_nil(site.visitor_with_cookie("0-zzzzz"))
91
- assert_nil(site.visitor_with_cookie(nil))
92
-
93
- event = visitor.make_events('User Clicked').first
94
- assert_equal(site, event.site)
95
- assert_equal(visitor, event.visitor)
96
- assert_equal('User Clicked', event.label)
97
-
98
- conversion = visitor.start_conversions('User Purchased;User Abandon').first
99
- visitor.start_conversions('User Purchased') # no effect
100
- assert_equal(2, visitor.conversions.length)
101
- assert_equal(site, conversion.site)
102
- assert_equal(visitor, conversion.visitor)
103
- assert_equal('User Purchased', conversion.label)
104
- refute(conversion.ended?)
105
- visitor.end_goals('User Purchased')
106
- assert(conversion.ended?)
107
- visitor.end_goals('Nonexistant') # no effect
108
- assert_equal(2, visitor.conversions.length)
109
-
110
- experiment = visitor.start_experiments('User Next:A').first
111
- visitor.start_experiments('User Next:A') # no effect
112
- visitor.start_experiments('User Next:B') # changes bucket
113
- assert_equal(1, visitor.experiments.length)
114
- assert_equal(site, experiment.site)
115
- assert_equal(visitor, experiment.visitor)
116
- assert_equal('User Next', experiment.label)
117
- assert_equal('B', experiment.bucket)
118
- refute(experiment.ended?)
119
- visitor.end_goals('User Next')
120
- assert(experiment.ended?)
121
- visitor.end_goals('Nonexistant') # no effect
122
- assert_equal(1, visitor.experiments.length)
123
- end
124
-
125
- def test_unique_identifier
126
- assert_match(/^\w{5}$/, Charted::Visitor.generate_secret)
127
- end
128
-
129
- def test_user_agents
130
- visitor = Charted::Visitor.new
131
-
132
- visitor.user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
133
- assert_equal('Internet Explorer', visitor.browser)
134
- assert_equal('7.0', visitor.browser_version)
135
- assert_equal('Windows', visitor.platform)
136
-
137
- visitor.user_agent = 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8'
138
- assert_equal('Safari', visitor.browser)
139
- assert_equal('1.2.2', visitor.browser_version)
140
- assert_equal('Macintosh', visitor.platform)
141
-
142
- visitor.user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 Ubuntu/8.04 (hardy) Firefox/2.0.0.19'
143
- assert_equal('Firefox', visitor.browser)
144
- assert_equal('2.0.0.19', visitor.browser_version)
145
- assert_equal('Linux', visitor.platform)
146
- end
147
-
148
- def test_blanks
149
- site = Charted::Site.create(:domain => 'localhost')
150
- visitor = Charted::Visitor.create(
151
- :site => site,
152
- :user_agent => '',
153
- :ip_address => '')
154
- visit = Charted::Visit.create(
155
- :visitor => visitor,
156
- :path => '/',
157
- :title => 'Prime',
158
- :referrer => '')
159
- assert(site.id)
160
- assert(visitor.id)
161
- assert(visit.id)
162
- end
163
- end
164
-
165
- class AppTest < ChartedTest
166
- include Rack::Test::Methods
167
-
168
- def setup
169
- Charted::Site.destroy
170
- Charted::Visitor.destroy
171
- Charted::Visit.destroy
172
- Charted::Event.destroy
173
- Charted::Conversion.destroy
174
- Charted::Experiment.destroy
175
- clear_cookies
176
-
177
- @site = Charted::Site.create(:domain => 'example.org')
178
- @params = {
179
- :bucket => 1,
180
- :path => '/',
181
- :title => 'Prime',
182
- :referrer => 'http://localhost/?k=v',
183
- :resolution => '1280x800'
184
- }
185
- @env = {
186
- 'HTTP_USER_AGENT' =>
187
- 'Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1',
188
- 'REMOTE_ADDR' => '67.188.42.140'
189
- }
190
- end
191
-
192
- def test_environment
193
- assert_equal(:test, Charted::App.environment)
194
- end
195
-
196
- def test_bad_domain
197
- get '/charted', @params, 'HTTP_HOST' => 'localhost'
198
- assert_equal(404, last_response.status)
199
- assert_equal(0, Charted::Visitor.count)
200
- assert_equal(0, Charted::Visit.count)
201
- end
202
-
203
- def test_new_visitor
204
- get '/charted', @params, @env
205
- assert(last_response.ok?)
206
- assert_equal(1, Charted::Visitor.count)
207
- assert_equal(1, Charted::Visit.count)
208
-
209
- visitor = Charted::Visitor.first
210
- visit = Charted::Visit.first
211
- assert_equal(@site, visitor.site)
212
- assert_equal(@site, visit.site)
213
- assert_equal('Prime', visit.title)
214
- assert_equal('/', visit.path)
215
- assert_equal('http://localhost/?k=v', visit.referrer)
216
- assert_equal('1280x800', visitor.resolution)
217
- assert_equal('United States', visitor.country)
218
- assert_equal(visitor.cookie, rack_mock_session.cookie_jar['charted'])
219
- end
220
-
221
- def test_old_visitor
222
- visitor = Charted::Visitor.create(:site => @site)
223
- visit = Charted::Visit.create(
224
- :visitor => visitor, :path => '/', :title => 'Prime')
225
- set_cookie("charted=#{visitor.cookie}")
226
-
227
- get '/charted', @params, @env
228
- assert(last_response.ok?)
229
- assert_equal(1, Charted::Visitor.count)
230
- assert_equal(2, Charted::Visit.count)
231
- assert_equal(visitor.cookie, rack_mock_session.cookie_jar['charted'])
232
- end
233
-
234
- def test_visitor_bad_cookie
235
- visitor = Charted::Visitor.create(:site => @site)
236
- visit = Charted::Visit.create(
237
- :visitor => visitor, :path => '/', :title => 'Prime')
238
- set_cookie("charted=#{visitor.id}-zzzzz")
239
-
240
- get '/charted', @params, @env
241
- assert(last_response.ok?)
242
- assert_equal(2, Charted::Visitor.count)
243
- assert_equal(2, Charted::Visit.count)
244
- refute_equal(visitor.cookie, rack_mock_session.cookie_jar['charted'])
245
- end
246
-
247
- def test_events # TODO: use correct HTTP methods?
248
- get '/charted/record', events: 'Event Label;Event Label 2'
249
- assert_equal(404, last_response.status)
250
-
251
- visitor = @site.visitors.create
252
- set_cookie("charted=#{visitor.cookie}")
253
- get '/charted/record', events: 'Event Label;Event Label 2'
254
- assert(last_response.ok?)
255
- assert_equal(2, Charted::Event.count)
256
-
257
- event = Charted::Event.first(label: 'Event Label')
258
- assert_equal(@site, event.site)
259
- assert_equal(visitor, event.visitor)
260
- assert_equal('Event Label', event.label)
261
-
262
- event2 = Charted::Event.first(label: 'Event Label 2')
263
- assert(event2)
264
- assert_equal('Event Label 2', event2.label)
265
- end
266
-
267
- def test_conversions
268
- visitor = @site.visitors.create
269
- set_cookie("charted=#{visitor.cookie}")
270
- get '/charted', @params.merge(conversions: 'Logo Clicked;Button Clicked'), @env
271
- assert(last_response.ok?)
272
- assert_equal(2, Charted::Conversion.count)
273
-
274
- logo = visitor.conversions.first(label: 'Logo Clicked')
275
- button = visitor.conversions.first(label: 'Button Clicked')
276
- refute(logo.ended?)
277
- refute(button.ended?)
278
-
279
- get '/charted/record', goals: 'Logo Clicked;Button Clicked'
280
- assert(last_response.ok?)
281
- logo.reload
282
- button.reload
283
- assert(logo.ended?)
284
- assert(button.ended?)
285
- end
286
-
287
- def test_experiments
288
- visitor = @site.visitors.create
289
- set_cookie("charted=#{visitor.cookie}")
290
- get '/charted', @params.merge(experiments: 'Logo:A;Button:B'), @env
291
- assert(last_response.ok?)
292
- assert_equal(2, Charted::Experiment.count)
293
-
294
- logo = visitor.experiments.first(label: 'Logo')
295
- button = visitor.experiments.first(label: 'Button')
296
- assert_equal('Logo', logo.label)
297
- assert_equal('A', logo.bucket)
298
- refute(logo.ended?)
299
- assert_equal('Button', button.label)
300
- assert_equal('B', button.bucket)
301
- refute(button.ended?)
302
-
303
- get '/charted/record', goals: 'Logo;Button'
304
- assert(last_response.ok?)
305
- logo.reload
306
- button.reload
307
- assert(logo.ended?)
308
- assert(button.ended?)
309
- end
310
-
311
- private
312
- def app
313
- @app ||= Rack::Server.new.app
314
- end
315
- end
316
-
317
- class CommandTest < ChartedTest
318
- def setup
319
- @cmd = Charted::Command.new
320
- @cmd.config_loaded = true
321
- Charted::Site.destroy
322
- Charted::Visitor.destroy
323
- Charted::Visit.destroy
324
- Charted::Event.destroy
325
- Charted::Conversion.destroy
326
- Charted::Experiment.destroy
327
- Charted::Site.create(:domain => 'localhost')
328
- Charted::Site.create(:domain => 'example.org')
329
- end
330
-
331
- def test_site
332
- assert_raises(Charted::ExitError) { @cmd.site = 'nomatch' }
333
- assert_equal(['No sites matching "nomatch"'], @cmd.output)
334
- assert_nil(@cmd.site)
335
-
336
- @cmd.output = nil
337
- assert_raises(Charted::ExitError) { @cmd.site = 'l' }
338
- assert_equal(['"l" ambiguous: localhost, example.org'], @cmd.output)
339
-
340
- @cmd.site = 'local'
341
- assert_equal('localhost', @cmd.site.domain)
342
-
343
- @cmd.site = 'ample'
344
- assert_equal('example.org', @cmd.site.domain)
345
- end
346
-
347
- def test_clean
348
- site = Charted::Site.first(domain: 'localhost')
349
- visitor = site.visitors.create
350
- visitor.events.create(label: 'Label')
351
- visitor.conversions.create(label: 'Label')
352
- visitor.experiments.create(label: 'Label', bucket: 'A')
353
- @cmd.output = nil
354
- @cmd.clean
355
- visitor.reload
356
- assert_equal(1, visitor.events.size)
357
- assert_equal(1, visitor.conversions.size)
358
- assert_equal(1, visitor.experiments.size)
359
-
360
- @cmd.output = nil
361
- @cmd.clean('Label')
362
- visitor.reload
363
- assert_equal(0, visitor.events.size)
364
- assert_equal(0, visitor.conversions.size)
365
- assert_equal(0, visitor.experiments.size)
366
- end
367
-
368
- def test_dashboard
369
- assert_raises(Charted::ExitError) { @cmd.dashboard }
370
- assert_equal(['Please specify website with --site'], @cmd.output)
371
-
372
- @cmd.output = nil
373
- @cmd.site = 'localhost'
374
- @cmd.dashboard
375
- end
376
-
377
- def test_js
378
- @cmd.output = nil
379
- @cmd.js
380
- assert_match("var Charted", @cmd.output[0])
381
- end
382
-
383
- def test_format
384
- assert_equal('-10,200', @cmd.send(:format, -10200))
385
- assert_equal('-1', @cmd.send(:format, -1))
386
- assert_equal('1', @cmd.send(:format, 1))
387
- assert_equal('1,200,300', @cmd.send(:format, 1200300))
388
- end
389
- end