vanity 1.1.1 → 1.2.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.
data/test/metric_test.rb CHANGED
@@ -1,287 +1,518 @@
1
1
  require "test/test_helper"
2
2
 
3
- class MetricTest < Test::Unit::TestCase
4
-
3
+ class Sky < ActiveRecord::Base
4
+ connection.drop_table :skies if table_exists?
5
+ connection.create_table :skies do |t|
6
+ t.integer :height
7
+ t.timestamps
8
+ end
9
+
10
+ named_scope :high, lambda { { :conditions=>"height >= 4" } }
11
+ end
12
+
13
+
14
+ context "Metric" do
15
+
5
16
  # -- Via the playground --
6
17
 
7
- def test_playground_tracks_all_loaded_metrics
8
- metric "Yawns/sec", "Cheers/sec"
9
- assert Vanity.playground.metrics.keys.include?(:yawns_sec)
10
- assert Vanity.playground.metrics.keys.include?(:cheers_sec)
11
- end
18
+ context "playground" do
12
19
 
13
- def test_playground_fails_without_metric_file
14
- assert_raises NameError do
15
- Vanity.playground.metric(:yawns_sec)
20
+ test "knows all loaded metrics" do
21
+ metric "Yawns/sec", "Cheers/sec"
22
+ assert Vanity.playground.metrics.keys.include?(:yawns_sec)
23
+ assert Vanity.playground.metrics.keys.include?(:cheers_sec)
16
24
  end
17
- end
18
25
 
19
- def test_playground_loads_metric_definition
20
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
21
- f.write <<-RUBY
22
- metric "Yawns/sec" do
23
- def xmts
24
- "x"
26
+ test "loads metric definitions" do
27
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
28
+ f.write <<-RUBY
29
+ metric "Yawns/sec" do
30
+ def xmts
31
+ "x"
32
+ end
25
33
  end
26
- end
27
- RUBY
34
+ RUBY
35
+ end
36
+ assert_equal "x", Vanity.playground.metric(:yawns_sec).xmts
28
37
  end
29
- assert_equal "x", Vanity.playground.metric(:yawns_sec).xmts
30
- end
31
38
 
32
- def test_metric_loading_handles_name_and_id
33
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
34
- f.write <<-RUBY
35
- metric "Yawns/sec" do
36
- end
37
- RUBY
39
+ test "bubbles up loaded metrics" do
40
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
41
+ f.write "fail 'yawn!'"
42
+ end
43
+ assert_raises NameError do
44
+ Vanity.playground.metric(:yawns_sec)
45
+ end
38
46
  end
39
- assert metric = Vanity.playground.metric(:yawns_sec)
40
- assert_equal "Yawns/sec", metric.name
41
- end
42
47
 
43
- def test_metric_loading_errors_bubble_up
44
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
45
- f.write "fail 'yawn!'"
46
- end
47
- assert_raises NameError do
48
- Vanity.playground.metric(:yawns_sec)
48
+ test "map identifier from file name" do
49
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
50
+ f.write <<-RUBY
51
+ metric "yawns/hour" do
52
+ end
53
+ RUBY
54
+ end
55
+ assert Vanity.playground.metric(:yawns_sec)
49
56
  end
50
- end
51
57
 
52
- def test_metric_name_must_match_file_name
53
- File.open "tmp/experiments/metrics/yawns_hour.rb", "w" do |f|
54
- f.write <<-RUBY
55
- metric "yawns/hour" do
56
- end
57
- RUBY
58
+ test "fails tracking unknown metric" do
59
+ assert_raises NameError do
60
+ Vanity.playground.track! :yawns_sec
61
+ end
58
62
  end
59
- assert_raises NameError do
63
+
64
+ test "reloading metrics" do
65
+ metric "Yawns/sec", "Cheers/sec"
60
66
  Vanity.playground.metric(:yawns_sec)
67
+ Vanity.playground.metric(:cheers_sec)
68
+ assert 2, Vanity.playground.metrics.size
69
+ metrics = Vanity.playground.metrics.values
70
+ Vanity.playground.reload!
71
+ assert 2, Vanity.playground.metrics.size
72
+ assert_not_equal metrics, Vanity.playground.metrics.values
61
73
  end
62
- end
63
74
 
64
- def test_reloading_metrics
65
- metric "Yawns/sec", "Cheers/sec"
66
- Vanity.playground.metric(:yawns_sec)
67
- Vanity.playground.metric(:cheers_sec)
68
- assert 2, Vanity.playground.metrics.size
69
- metrics = Vanity.playground.metrics.values
70
- Vanity.playground.reload!
71
- assert 2, Vanity.playground.metrics.size
72
- assert_not_equal metrics, Vanity.playground.metrics.values
73
- end
75
+ test "ignores undefined metrics in database" do
76
+ metric "Yawns/sec"
77
+ Vanity.playground.reload!
78
+ assert Vanity.playground.metrics.empty?
79
+ end
74
80
 
75
- def test_undefined_metric_in_database
76
- metric "Yawns/sec"
77
- Vanity.playground.reload!
78
- assert Vanity.playground.metrics.empty?
79
81
  end
80
82
 
81
83
 
82
84
  # -- Tracking --
83
85
 
84
- def test_tracking_can_count
85
- metric "Yawns/sec", "Cheers/sec"
86
- 4.times { Vanity.playground.track! :yawns_sec }
87
- 2.times { Vanity.playground.track! :cheers_sec }
88
- yawns = Vanity.playground.metric(:yawns_sec).values(today, today).first
89
- cheers = Vanity.playground.metric(:cheers_sec).values(today, today).first
90
- assert yawns = 2 * cheers
91
- end
86
+ context "tracking" do
87
+ test "can count" do
88
+ metric "Yawns/sec", "Cheers/sec"
89
+ 4.times { Vanity.playground.track! :yawns_sec }
90
+ 2.times { Vanity.playground.track! :cheers_sec }
91
+ yawns = Vanity.playground.metric(:yawns_sec).values(today, today).first
92
+ cheers = Vanity.playground.metric(:cheers_sec).values(today, today).first
93
+ assert yawns = 2 * cheers
94
+ end
92
95
 
93
- def test_tracking_with_value
94
- metric "Yawns/sec", "Cheers/sec", "Looks"
95
- Vanity.playground.track! :yawns_sec, 0
96
- Vanity.playground.track! :cheers_sec, -1
97
- Vanity.playground.track! :looks, 10
98
- assert_equal 0, Vanity.playground.metric(:yawns_sec).values(today, today).sum
99
- assert_equal 0, Vanity.playground.metric(:cheers_sec).values(today, today).sum
100
- assert_equal 10, Vanity.playground.metric(:looks).values(today, today).sum
101
- end
96
+ test "can tell the time" do
97
+ metric "Yawns/sec"
98
+ Timecop.travel(today - 4) { 4.times { Vanity.playground.track! :yawns_sec } }
99
+ Timecop.travel(today - 2) { 2.times { Vanity.playground.track! :yawns_sec } }
100
+ 1.times { Vanity.playground.track! :yawns_sec }
101
+ boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
102
+ assert_equal [0,4,0,2,0,1], boredom
103
+ end
102
104
 
103
- def test_tracking_can_tell_the_time
104
- metric "Yawns/sec"
105
- Timecop.travel(today - 4) { 4.times { Vanity.playground.track! :yawns_sec } }
106
- Timecop.travel(today - 2) { 2.times { Vanity.playground.track! :yawns_sec } }
107
- 1.times { Vanity.playground.track! :yawns_sec }
108
- boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
109
- assert_equal [0,4,0,2,0,1], boredom
110
- end
105
+ test "with no value" do
106
+ metric "Yawns/sec", "Cheers/sec", "Looks"
107
+ Vanity.playground.track! :yawns_sec, 0
108
+ Vanity.playground.track! :cheers_sec, -1
109
+ Vanity.playground.track! :looks, 10
110
+ assert_equal 0, Vanity.playground.metric(:yawns_sec).values(today, today).sum
111
+ assert_equal 0, Vanity.playground.metric(:cheers_sec).values(today, today).sum
112
+ assert_equal 10, Vanity.playground.metric(:looks).values(today, today).sum
113
+ end
111
114
 
112
- def test_tracking_with_count
113
- metric "Yawns/sec"
114
- Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
115
- Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
116
- Vanity.playground.track! :yawns_sec
117
- boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
118
- assert_equal [0,4,0,2,0,1], boredom
119
- end
115
+ test "with count" do
116
+ metric "Yawns/sec"
117
+ Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
118
+ Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
119
+ Vanity.playground.track! :yawns_sec
120
+ boredom = Vanity.playground.metric(:yawns_sec).values(today - 5, today)
121
+ assert_equal [0,4,0,2,0,1], boredom
122
+ end
120
123
 
121
- def test_tracking_runs_hook
122
- metric "Many Happy Returns"
123
- total = 0
124
- Vanity.playground.metric(:many_happy_returns).hook do |metric_id, timestamp, count|
125
- assert_equal :many_happy_returns, metric_id
126
- assert_in_delta Time.now.to_i, timestamp.to_i, 1
127
- total += count
124
+ test "runs hook" do
125
+ metric "Many Happy Returns"
126
+ total = 0
127
+ Vanity.playground.metric(:many_happy_returns).hook do |metric_id, timestamp, count|
128
+ assert_equal :many_happy_returns, metric_id
129
+ assert_in_delta Time.now.to_i, timestamp.to_i, 1
130
+ total += count
131
+ end
132
+ Vanity.playground.track! :many_happy_returns, 6
133
+ assert_equal 6, total
128
134
  end
129
- Vanity.playground.track! :many_happy_returns, 6
130
- assert_equal 6, total
131
- end
132
135
 
133
- def test_tracking_runs_multiple_hooks
134
- metric "Many Happy Returns"
135
- returns = 0
136
- Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
137
- Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
138
- Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
139
- Vanity.playground.track! :many_happy_returns
140
- assert_equal 3, returns
141
- end
136
+ test "runs multiple hooks" do
137
+ metric "Many Happy Returns"
138
+ returns = 0
139
+ Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
140
+ Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
141
+ Vanity.playground.metric(:many_happy_returns).hook { returns += 1 }
142
+ Vanity.playground.track! :many_happy_returns
143
+ assert_equal 3, returns
144
+ end
142
145
 
143
- def test_destroy_metric_wipes_data
144
- metric "Many Happy Returns"
145
- Vanity.playground.track! :many_happy_returns, 3
146
- assert_equal [3], Vanity.playground.metric(:many_happy_returns).values(today, today)
147
- Vanity.playground.metric(:many_happy_returns).destroy!
148
- assert_equal [0], Vanity.playground.metric(:many_happy_returns).values(today, today)
146
+ test "destroy wipes metrics" do
147
+ metric "Many Happy Returns"
148
+ Vanity.playground.track! :many_happy_returns, 3
149
+ assert_equal [3], Vanity.playground.metric(:many_happy_returns).values(today, today)
150
+ Vanity.playground.metric(:many_happy_returns).destroy!
151
+ assert_equal [0], Vanity.playground.metric(:many_happy_returns).values(today, today)
152
+ end
149
153
  end
150
154
 
151
155
 
152
156
  # -- Metric name --
153
-
154
- def test_name_from_definition
155
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
156
- f.write <<-RUBY
157
- metric "Yawns/sec" do
158
- end
159
- RUBY
160
- end
161
- assert_equal "Yawns/sec", Vanity.playground.metric(:yawns_sec).name
162
- end
157
+
158
+ context "name" do
159
+ test "can be whatever" do
160
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
161
+ f.write <<-RUBY
162
+ metric "Yawns per second" do
163
+ end
164
+ RUBY
165
+ end
166
+ assert_equal "Yawns per second", Vanity.playground.metric(:yawns_sec).name
167
+ end
168
+ end
163
169
 
164
170
 
165
171
  # -- Description helper --
166
172
 
167
- def test_description_for_metric_with_description
168
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
169
- f.write <<-RUBY
170
- metric "Yawns/sec" do
171
- description "Am I that boring?"
172
- end
173
- RUBY
173
+ context "description" do
174
+ test "metric with description" do
175
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
176
+ f.write <<-RUBY
177
+ metric "Yawns/sec" do
178
+ description "Am I that boring?"
179
+ end
180
+ RUBY
181
+ end
182
+ assert_equal "Am I that boring?", Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
174
183
  end
175
- assert_equal "Am I that boring?", Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
176
- end
177
184
 
178
- def test_description_for_metric_with_no_description
179
- File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
180
- f.write <<-RUBY
181
- metric "Yawns/sec" do
182
- end
183
- RUBY
185
+ test "metric without description" do
186
+ File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
187
+ f.write <<-RUBY
188
+ metric "Yawns/sec" do
189
+ end
190
+ RUBY
191
+ end
192
+ assert_nil Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
184
193
  end
185
- assert_nil Vanity::Metric.description(Vanity.playground.metric(:yawns_sec))
186
- end
187
194
 
188
- def test_description_for_metric_with_no_description_method
189
- metric = Object.new
190
- assert_nil Vanity::Metric.description(metric)
195
+ test "metric with no method description" do
196
+ metric = Object.new
197
+ assert_nil Vanity::Metric.description(metric)
198
+ end
191
199
  end
192
200
 
193
201
 
194
202
  # -- Metric bounds --
195
203
 
196
- def test_bounds_helper_for_metric_with_bounds
197
- File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
198
- f.write <<-RUBY
199
- metric "Sky is limit" do
200
- def bounds
201
- [6,12]
204
+ context "bounds" do
205
+ test "metric with bounds" do
206
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
207
+ f.write <<-RUBY
208
+ metric "Sky is limit" do
209
+ def bounds
210
+ [6,12]
211
+ end
202
212
  end
203
- end
204
- RUBY
213
+ RUBY
214
+ end
215
+ assert_equal [6,12], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
205
216
  end
206
- assert_equal [6,12], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
207
- end
208
217
 
209
- def test_bounds_helper_for_metric_with_no_bounds
210
- metric "Sky is limit"
211
- assert_equal [nil, nil], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
212
- end
218
+ test "metric without bounds" do
219
+ metric "Sky is limit"
220
+ assert_equal [nil, nil], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit))
221
+ end
213
222
 
214
- def test_bounds_helper_for_metric_with_no_bounds_method
215
- metric = Object.new
216
- assert_equal [nil, nil], Vanity::Metric.bounds(metric)
223
+ test "metric with no method bounds" do
224
+ metric = Object.new
225
+ assert_equal [nil, nil], Vanity::Metric.bounds(metric)
226
+ end
217
227
  end
218
228
 
219
229
 
220
230
  # -- Timestamp --
221
-
222
- def test_metric_has_created_timestamp
223
- metric "Coolness"
224
- metric = Vanity.playground.metric(:coolness)
225
- assert_instance_of Time, metric.created_at
226
- assert_in_delta metric.created_at.to_i, Time.now.to_i, 1
227
- end
228
231
 
229
- def test_metric_keeps_created_timestamp_across_restarts
230
- past = Date.today - 1
231
- Timecop.travel past do
232
+ context "created_at" do
233
+ test "for new metric" do
232
234
  metric "Coolness"
233
- coolness = Vanity.playground.metric(:coolness)
234
- assert_in_delta coolness.created_at.to_i, past.to_time.to_i, 1
235
+ metric = Vanity.playground.metric(:coolness)
236
+ assert_instance_of Time, metric.created_at
237
+ assert_in_delta metric.created_at.to_i, Time.now.to_i, 1
235
238
  end
236
239
 
237
- new_playground
238
- metric "Coolness"
239
- new_cool = Vanity.playground.metric(:coolness)
240
- assert_in_delta new_cool.created_at.to_i, past.to_time.to_i, 1
241
- end
240
+ test "across restarts" do
241
+ past = Date.today - 1
242
+ Timecop.travel past do
243
+ metric "Coolness"
244
+ coolness = Vanity.playground.metric(:coolness)
245
+ assert_in_delta coolness.created_at.to_i, past.to_time.to_i, 1
246
+ end
242
247
 
248
+ new_playground
249
+ metric "Coolness"
250
+ new_cool = Vanity.playground.metric(:coolness)
251
+ assert_in_delta new_cool.created_at.to_i, past.to_time.to_i, 1
252
+ end
253
+ end
243
254
 
244
- # -- Data helper --
245
255
 
246
- def test_data_with_explicit_dates
247
- metric "Yawns/sec"
248
- Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
249
- Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
250
- Vanity.playground.track! :yawns_sec
251
- boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), Date.today - 5, Date.today)
252
- assert_equal [[today - 5, 0], [today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
253
- end
256
+ # -- Data --
254
257
 
255
- def test_data_with_start_date
256
- metric "Yawns/sec"
257
- Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
258
- Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
259
- Vanity.playground.track! :yawns_sec
260
- boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), Date.today - 5)
261
- assert_equal [[today - 5, 0], [today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
262
- end
258
+ context "data" do
259
+ test "explicit dates" do
260
+ metric "Yawns/sec"
261
+ Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
262
+ Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
263
+ Vanity.playground.track! :yawns_sec
264
+ boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), Date.today - 5, Date.today)
265
+ assert_equal [[today - 5, 0], [today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
266
+ end
263
267
 
264
- def test_data_with_duration
265
- metric "Yawns/sec"
266
- Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
267
- Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
268
- Vanity.playground.track! :yawns_sec
269
- boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), 5)
270
- assert_equal [[today - 5, 0], [today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
271
- end
268
+ test "start date only" do
269
+ metric "Yawns/sec"
270
+ Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
271
+ Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
272
+ Vanity.playground.track! :yawns_sec
273
+ boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), Date.today - 4)
274
+ assert_equal [[today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
275
+ end
276
+
277
+ test "start date and duration" do
278
+ metric "Yawns/sec"
279
+ Timecop.travel(today - 4) { Vanity.playground.track! :yawns_sec, 4 }
280
+ Timecop.travel(today - 2) { Vanity.playground.track! :yawns_sec, 2 }
281
+ Vanity.playground.track! :yawns_sec
282
+ boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec), 5)
283
+ assert_equal [[today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom
284
+ end
285
+
286
+ test "no data" do
287
+ metric "Yawns/sec"
288
+ boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec))
289
+ assert_equal 90, boredom.size
290
+ assert_equal [today - 89, 0], boredom.first
291
+ assert_equal [today, 0], boredom.last
292
+ end
293
+
294
+ test "using custom values method" do
295
+ File.open "tmp/experiments/metrics/hours_in_day.rb", "w" do |f|
296
+ f.write <<-RUBY
297
+ metric "Hours in day" do
298
+ def values(from, to)
299
+ (from..to).map { |d| 24 }
300
+ end
301
+ end
302
+ RUBY
303
+ end
304
+ data = Vanity::Metric.data(Vanity.playground.metric(:hours_in_day))
305
+ assert_equal [24] * 90, data.map(&:last)
306
+ end
272
307
 
273
- def test_data_with_no_dates
274
- metric "Yawns/sec"
275
- boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec))
276
- assert_equal [today - 90, 0], boredom.first
277
- assert_equal [today, 0], boredom.last
278
308
  end
279
309
 
280
310
 
311
+ # -- ActiveRecord --
312
+
313
+ context "ActiveRecord" do
314
+
315
+ test "record count" do
316
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
317
+ f.write <<-RUBY
318
+ metric "Sky is limit" do
319
+ model Sky
320
+ end
321
+ RUBY
322
+ end
323
+ Vanity.playground.metrics
324
+ Sky.create!
325
+ assert_equal 1, Sky.count
326
+ assert_equal 1, Vanity::Metric.data(metric(:sky_is_limit)).last.last
327
+ end
328
+
329
+ test "record sum" do
330
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
331
+ f.write <<-RUBY
332
+ metric "Sky is limit" do
333
+ model Sky, :sum=>:height
334
+ end
335
+ RUBY
336
+ end
337
+ Vanity.playground.metrics
338
+ Sky.create! :height=>4
339
+ Sky.create! :height=>2
340
+ assert_equal 6, Vanity::Metric.data(metric(:sky_is_limit)).last.last
341
+ end
342
+
343
+ test "record average" do
344
+ Sky.aggregates
345
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
346
+ f.write <<-RUBY
347
+ metric "Sky is limit" do
348
+ model Sky, :average=>:height
349
+ end
350
+ RUBY
351
+ end
352
+ Vanity.playground.metrics
353
+ Sky.create! :height=>4
354
+ Sky.create! :height=>2
355
+ assert_equal 3, Vanity::Metric.data(metric(:sky_is_limit)).last.last
356
+ end
357
+
358
+ test "record minimum" do
359
+ Sky.aggregates
360
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
361
+ f.write <<-RUBY
362
+ metric "Sky is limit" do
363
+ model Sky, :minimum=>:height
364
+ end
365
+ RUBY
366
+ end
367
+ Vanity.playground.metrics
368
+ Sky.create! :height=>4
369
+ Sky.create! :height=>2
370
+ assert_equal 2, Vanity::Metric.data(metric(:sky_is_limit)).last.last
371
+ end
372
+
373
+ test "record maximum" do
374
+ Sky.aggregates
375
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
376
+ f.write <<-RUBY
377
+ metric "Sky is limit" do
378
+ model Sky, :maximum=>:height
379
+ end
380
+ RUBY
381
+ end
382
+ Vanity.playground.metrics
383
+ Sky.create! :height=>4
384
+ Sky.create! :height=>2
385
+ assert_equal 4, Vanity::Metric.data(metric(:sky_is_limit)).last.last
386
+ end
387
+
388
+ test "with conditions" do
389
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
390
+ f.write <<-RUBY
391
+ metric "Sky is limit" do
392
+ model Sky, :sum=>:height, :conditions=>["height > 4"]
393
+ end
394
+ RUBY
395
+ end
396
+ Vanity.playground.metrics
397
+ high_skies = 0
398
+ metric(:sky_is_limit).hook do |metric_id, timestamp, height|
399
+ assert height > 4
400
+ high_skies += height
401
+ end
402
+ [nil,5,3,6].each do |height|
403
+ Sky.create! :height=>height
404
+ end
405
+ assert_equal 11, Vanity::Metric.data(metric(:sky_is_limit)).sum(&:last)
406
+ assert_equal 11, high_skies
407
+ end
408
+
409
+ test "with scope" do
410
+ Sky.aggregates
411
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
412
+ f.write <<-RUBY
413
+ metric "Sky is limit" do
414
+ model Sky.high
415
+ end
416
+ RUBY
417
+ end
418
+ Vanity.playground.metrics
419
+ total = 0
420
+ metric(:sky_is_limit).hook do |metric_id, timestamp, count|
421
+ total += count
422
+ end
423
+ Sky.create! :height=>4
424
+ Sky.create! :height=>2
425
+ assert_equal 1, Vanity::Metric.data(metric(:sky_is_limit)).last.last
426
+ assert_equal 1, total
427
+ end
428
+
429
+ test "hooks" do
430
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
431
+ f.write <<-RUBY
432
+ metric "Sky is limit" do
433
+ model Sky, :sum=>:height
434
+ end
435
+ RUBY
436
+ end
437
+ Vanity.playground.metrics
438
+ total = 0
439
+ metric(:sky_is_limit).hook do |metric_id, timestamp, count|
440
+ assert_equal :sky_is_limit, metric_id
441
+ assert_in_delta Time.now.to_i, timestamp.to_i, 1
442
+ total += count
443
+ end
444
+ Sky.create! :height=>4
445
+ assert_equal 4, total
446
+ end
447
+
448
+ test "after_create not after_save" do
449
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
450
+ f.write <<-RUBY
451
+ metric "Sky is limit" do
452
+ model Sky
453
+ end
454
+ RUBY
455
+ end
456
+ Vanity.playground.metrics
457
+ once = nil
458
+ metric(:sky_is_limit).hook do
459
+ fail "Metric tracked twice" if once
460
+ once = true
461
+ end
462
+ Sky.create!
463
+ Sky.last.update_attributes :height=>4
464
+ end
465
+
466
+ test "with after_save" do
467
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
468
+ f.write <<-RUBY
469
+ metric "Sky is limit" do
470
+ model Sky, :conditions=>["height > 3"]
471
+ Sky.after_save { |sky| track! if sky.height_changed? && sky.height > 3 }
472
+ end
473
+ RUBY
474
+ end
475
+ Vanity.playground.metrics
476
+ times = 0
477
+ metric(:sky_is_limit).hook do
478
+ times += 1
479
+ end
480
+ Sky.create!
481
+ (1..5).each do |height|
482
+ Sky.last.update_attributes! :height=>height
483
+ end
484
+ assert_equal 2, times
485
+ end
486
+
487
+ test "do it youself" do
488
+ File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
489
+ f.write <<-RUBY
490
+ metric "Sky is limit" do
491
+ Sky.after_save { |sky| track! if sky.height_changed? && sky.height > 3 }
492
+ end
493
+ RUBY
494
+ end
495
+ Vanity.playground.metrics
496
+ (1..5).each do |height|
497
+ Sky.create! :height=>height
498
+ end
499
+ Sky.first.update_attributes! :height=>4
500
+ assert_equal 3, Vanity::Metric.data(metric(:sky_is_limit)).last.last
501
+ end
502
+
503
+ end
504
+
505
+
281
506
  # -- Helper methods --
282
507
 
283
508
  def today
284
509
  @today ||= Date.today
285
510
  end
286
511
 
512
+ teardown do
513
+ Sky.delete_all
514
+ Sky.after_create.clear
515
+ Sky.after_save.clear
516
+ end
517
+
287
518
  end