couch_scheduler 0.1.0 → 0.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.
@@ -3,53 +3,353 @@ Feature: Scheduling
3
3
  I want the ability to schedule my documents
4
4
  So that I can control when they are accessible
5
5
 
6
+
6
7
  Scenario: Setting valid start and end dates
7
- Given an instance of a model that includes CouchScheduler
8
- When I set "start" to now
9
- And I set "end" to a day from now
10
- Then I should be able to save my document
8
+
9
+ Given an instance of a model that includes CouchScheduler:
10
+ """
11
+ class Article < CouchRest::Model::Base
12
+ include CouchScheduler
13
+ end
14
+
15
+ @article = Article.new
16
+ """
17
+
18
+ When I set "start" to now:
19
+ """
20
+ @article.start = Time.now
21
+ """
22
+
23
+ And I set "end" to a day from now:
24
+ """
25
+ @article.end = 1.day.from_now
26
+ """
27
+
28
+ Then I should be able to save my document:
29
+ """
30
+ @article.save
31
+ @article.errors.should be_empty
32
+ Article.all.count.should == 1
33
+ """
34
+
11
35
 
12
36
  Scenario: Setting invalid start and end dates
13
- Given an instance of a model that includes CouchScheduler
14
- When I set "start" to now
15
- And I set "end" to yesterday
16
- Then I should not be able to save my document
17
- And I should get an error message that the end "must be greater than start"
18
37
 
38
+ Given an instance of a model that includes CouchScheduler:
39
+ """
40
+ class Article < CouchRest::Model::Base
41
+ include CouchScheduler
42
+ end
43
+
44
+ @article = Article.new
45
+ """
46
+
47
+ When I set "start" to now:
48
+ """
49
+ @article.start = Time.now
50
+ """
51
+
52
+ And I set "end" to yesterday:
53
+ """
54
+ @article.end = 1.day.ago
55
+ """
56
+
57
+ Then I should not be able to save my document:
58
+ """
59
+ @article.save
60
+ @article.errors.should_not be_empty
61
+ Article.all.count.should == 0
62
+ """
63
+
64
+
19
65
  Scenario: Determining if a document is within it's schedule
20
- Given an instance of a model that includes CouchScheduler
21
- When I set "start" to now
22
- And I set "end" to a day from now
23
- Then "within_schedule?" should return true on my instance
24
- When I wait two days
25
- Then "within_schedule?" should return false on my instance
66
+
67
+ Given an instance of a model that includes CouchScheduler:
68
+ """
69
+ class Article < CouchRest::Model::Base
70
+ include CouchScheduler
71
+ end
72
+
73
+ @article = Article.new
74
+ """
75
+
76
+ When I set "start" to now:
77
+ """
78
+ @article.start = Time.now
79
+ """
80
+
81
+ And I set "end" to tomorrow:
82
+ """
83
+ @article.end = 1.day.from_now
84
+ """
85
+
86
+ Then "within_schedule?" should return true on my instance:
87
+ """
88
+ @article.within_schedule?.should be(true)
89
+ """
90
+
91
+ When I wait two days:
92
+ """
93
+ Timecop.freeze 2.days.from_now
94
+ """
95
+
96
+ Then "within_schedule?" should return false on my instance:
97
+ """
98
+ @article.within_schedule?
99
+ """
100
+
26
101
 
27
102
  Scenario: Determining if a document is within it's schedule for a document that has only a start date
28
- Given an instance of a model that includes CouchScheduler
29
- When I set "start" to a day from now
30
- Then "within_schedule?" should return false on my instance
31
- When I wait two days
32
- Then "within_schedule?" should return true on my instance
103
+ Given an instance of a model that includes CouchScheduler:
104
+ """
105
+ class Article < CouchRest::Model::Base
106
+ include CouchScheduler
107
+ end
108
+
109
+ @article = Article.new
110
+ """
111
+
112
+ When I set "start" to now:
113
+ """
114
+ @article.start = Time.now
115
+ """
116
+
117
+ Then "within_schedule?" should return true on my instance:
118
+ """
119
+ @article.within_schedule?.should be(true)
120
+ """
121
+
122
+ When I wait two days:
123
+ """
124
+ Timecop.freeze 2.days.from_now
125
+ """
33
126
 
127
+ Then "within_schedule?" should return true on my instance:
128
+ """
129
+ @article.within_schedule?.should be(true)
130
+ """
131
+
132
+
133
+ @focus
34
134
  Scenario: Determining if a document is within it's schedule for a document that has only an end date
35
- Given an instance of a model that includes CouchScheduler
36
- When I set "end" to a day from now
37
- Then "within_schedule?" should return true on my instance
38
- When I wait two days
39
- Then "within_schedule?" should return false on my instance
135
+
136
+ Given an instance of a model that includes CouchScheduler:
137
+ """
138
+ class Article < CouchRest::Model::Base
139
+ include CouchScheduler
140
+ end
141
+
142
+ @article = Article.new
143
+ """
144
+
145
+ When I set "end" to tomorrow:
146
+ """
147
+ @article.end = 1.day.from_now
148
+ """
149
+
150
+ Then "within_schedule?" should return true on my instance:
151
+ """
152
+ @article.within_schedule?.should be(true)
153
+ """
154
+
155
+ When I wait two days:
156
+ """
157
+ Timecop.freeze 2.days.from_now
158
+ """
159
+
160
+ Then "within_schedule?" should return false on my instance:
161
+ """
162
+ @article.within_schedule?.should be(false)
163
+ """
40
164
 
165
+
166
+ @focus
41
167
  Scenario: Getting all documents that are within schedule on a given date
42
- Given there are several documents currently scheduled
43
- And there are several documents scheduled in the future
44
- Then "by_schedule" should return the documents currently within schedule
45
- And "by_schedule" should not return the documents scheduled in the future
46
168
 
169
+ Given an instance of a model that includes CouchScheduler:
170
+ """
171
+ class Article < CouchRest::Model::Base
172
+ include CouchScheduler
173
+ end
174
+
175
+ @article = Article.new
176
+ """
177
+
178
+ And there are several documents currently scheduled:
179
+ """
180
+ @current_articles = [].tap {|a| 10.times { a << Article.create(:start => Time.now, :end => 1.day.from_now) }}
181
+ @current_articles.length.should == 10
182
+ """
183
+
184
+ And there are several documents scheduled in the future:
185
+ """
186
+ @future_articles = [].tap {|a| 10.times { a << Article.create(:start => 2.days.from_now, :end => 3.days.from_now) }}
187
+ @future_articles.length.should == 10
188
+ Article.all.count.should == 20
189
+ """
190
+
191
+ Then "map_within_schedule!" should return the documents currently within schedule:
192
+ """
193
+ Article.map_within_schedule!.all? {|a| @current_articles.collect(&:id).include? a.id }
194
+ """
195
+
196
+ And "map_within_schedule!" should not return the documents scheduled in the future:
197
+ """
198
+ Article.map_within_schedule!.all? {|a| !@future_articles.collect(&:id).include? a.id }
199
+ """
200
+
201
+ Then "map_within_schedule.key(2.days.from_now.to_date).get!" should return the documents scheduled in the future:
202
+ """
203
+ Article.map_within_schedule.key(2.days.from_now.to_date).get!.all? {|a| @future_articles.collect(&:id).include? a.id }
204
+ """
205
+
206
+ And "map_within_schedule.key(2.days.from_now.to_date).get!" should not return the documents currently scheduled:
207
+ """
208
+ Article.map_within_schedule.key(2.days.from_now.to_date).get!.all? {|a| !@current_articles.collect(&:id).include? a.id }
209
+ """
210
+
211
+
212
+ @focus
47
213
  Scenario: Counting documents
48
- Given there are 3 documents scheduled between now and tomorrow
49
- And ther are 10 documents scheduled between tomorrow and two days from now
50
- Then "count_schedule" should return 3
51
- And "count_schedule :key => 1.day.from_now" should return 10
52
- When I wait a day
53
- Then "count_schedule" should return 10
54
- When I wait another day
55
- Then "count_schedule" should return 0
214
+
215
+ Given a model that includes CouchScheduler:
216
+ """
217
+ class Article < CouchRest::Model::Base
218
+ include CouchScheduler
219
+ end
220
+ """
221
+
222
+ And there are 3 documents scheduled between now and tomorrow:
223
+ """
224
+ 3.times { Article.create :start => Time.now, :end => 1.day.from_now}
225
+ """
226
+
227
+ And there are 10 documents scheduled between tomorrow and two days from now:
228
+ """
229
+ 10.times { Article.create :start => 1.day.from_now, :end => 2.days.from_now }
230
+ """
231
+
232
+ Then "count_within_schedule!" should return 3:
233
+ """
234
+ Article.count_within_schedule!.should == 3
235
+ """
236
+
237
+ And "count_within_schedule.key(1.day.from_now.to_date).get!" should return 10:
238
+ """
239
+ Article.count_within_schedule.key(1.day.from_now.to_date).get!.should == 10
240
+ """
241
+
242
+ When I wait a day:
243
+ """
244
+ Timecop.freeze 1.day.from_now
245
+ """
246
+
247
+ Then "count_within_schedule!" should return 10:
248
+ """
249
+ Article.count_within_schedule!.should == 10
250
+ """
251
+
252
+ When I wait another day:
253
+ """
254
+ Timecop.freeze 1.day.from_now
255
+ """
256
+
257
+ Then "count_within_schedule!" should return 0:
258
+ """
259
+ Article.count_within_schedule!.should == 0
260
+ """
261
+
262
+ @focus
263
+ Scenario: Generating the correct date key index for scheduled documents
264
+
265
+ Given a model that includes CouchScheduler:
266
+ """
267
+ class Article < CouchRest::Model::Base
268
+ include CouchScheduler
269
+ end
270
+ """
271
+
272
+ And the date is January 1st, 2011:
273
+ """
274
+ Timecop.freeze Time.parse("2011/01/01")
275
+ """
276
+
277
+ And there are 3 documents scheduled between now and one month and a day from now:
278
+ """
279
+ 3.times { Article.create :start => Time.now, :end => (1.month.from_now + 1.day)}
280
+ """
281
+
282
+ And there are 10 documents scheduled between one month and a day from now and two months from now:
283
+ """
284
+ 10.times { Article.create :start => (1.month.from_now + 1.day), :end => 2.months.from_now }
285
+ """
286
+
287
+ Then "count_within_schedule!" should return 3:
288
+ """
289
+ Article.count_within_schedule!.should == 3
290
+ """
291
+
292
+ And "count_within_schedule.key('2011-01-01').get!" should return 3:
293
+ """
294
+ Article.count_within_schedule.key('2011-01-01').get!.should == 3
295
+ """
296
+
297
+ And "count_within_schedule.key('2011-02-02).get!" should return 10:
298
+ """
299
+ Article.count_within_schedule.key('2011-02-02').get!.should == 10
300
+ """
301
+
302
+ When I wait a month and a day:
303
+ """
304
+ Timecop.freeze(1.month.from_now + 1.day)
305
+ """
306
+
307
+ Then "count_within_schedule!" should return 10:
308
+ """
309
+ Article.count_within_schedule!.should == 10
310
+ """
311
+
312
+ @focus
313
+ Scenario: Default start within the "schedule" index to the current date
314
+
315
+ Given a model that includes CouchScheduler:
316
+ """
317
+ class Article < CouchRest::Model::Base
318
+ include CouchScheduler
319
+ end
320
+ """
321
+
322
+ And there are 3 documents scheduled to end one month and a day from now:
323
+ """
324
+ 3.times { Article.create :end => (1.month.from_now + 1.day)}
325
+ """
326
+
327
+ And there are 10 documents scheduled to start one month and a day from now:
328
+ """
329
+ 10.times { Article.create :start => (1.month.from_now + 1.day)}
330
+ """
331
+
332
+ Then "count_within_schedule!" should return 3:
333
+ """
334
+ Article.count_within_schedule!.should == 3
335
+ """
336
+
337
+ And "count_within_schedule.key(Time.now.to_date).get!" should return 3:
338
+ """
339
+ Article.count_within_schedule.key(Time.now.to_date).get!.should == 3
340
+ """
341
+
342
+ And "count_within_schedule.key((1.month.from_now + 1.day).to_date).get!" should return 10:
343
+ """
344
+ Article.count_within_schedule.key((1.month.from_now + 1.day).to_date).get!.should == 10
345
+ """
346
+
347
+ When I wait a month and a day:
348
+ """
349
+ Timecop.freeze(1.month.from_now + 1.day)
350
+ """
351
+
352
+ Then "count_within_schedule!" should return 10:
353
+ """
354
+ Article.count_within_schedule!.should == 10
355
+ """
@@ -1,74 +1,7 @@
1
- Given /^an Article model that includes CouchPublish and CouchVisible$/ do
2
- unless defined?(Article)
3
- class Article < CouchRest::Model::Base
4
- include CouchPublish
5
- include CouchScheduler
6
- end
7
- end
1
+ When /^I create.*:$/ do |code|
2
+ eval code
8
3
  end
9
4
 
10
- When /^I create several published articles scheduled now and in the future$/ do
11
- @published_now = []
12
- @published_future = []
13
-
14
- 5.times { @published_now << Article.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.publish! } }
15
- 5.times { @published_future << Article.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.publish! } }
16
- end
17
-
18
- When /^I create several unpublished articles scheduled now and in the future$/ do
19
- @unpublished_now = []
20
- @unpublished_future = []
21
-
22
- 5.times { @unpublished_now << Article.create(:start => Time.now, :end => 1.day.from_now) }
23
- 5.times { @unpublished_future << Article.create(:start => 1.day.from_now, :end => 2.days.from_now) }
24
- end
25
-
26
- When /^I call "([^"]*)"$/ do |code|
27
- @result = eval code
28
- end
29
-
30
- Then /^I should receive the published documents scheduled now$/ do
31
- @result.collect(&:id).sort.should == @published_now.collect(&:id).sort
32
- end
33
-
34
- Then /^I should receive the unpublished documents scheduled now$/ do
35
- @result.collect(&:id).sort.should == @unpublished_now.collect(&:id).sort
36
- end
37
-
38
- When /^I wait till the future$/ do
39
- Timecop.freeze 1.day.from_now
40
- end
41
-
42
- Then /^I should receive the published documents scheduled in the future$/ do
43
- @result.collect(&:id).sort.should == @published_future.collect(&:id).sort
5
+ When /^I call ".*":$/ do |code|
6
+ eval code
44
7
  end
45
-
46
- Then /^I should receive the unpublished documents scheduled in the future$/ do
47
- @result.collect(&:id).sort.should == @unpublished_future.collect(&:id).sort
48
- end
49
-
50
- When /^I create (\d+) published articles scheduled now$/ do |num|
51
- @published_now = []
52
- num.to_i.times { @published_now << Article.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.publish!}}
53
- end
54
-
55
- When /^I create (\d+) published articles schedule in the future$/ do |num|
56
- @published_future = []
57
- num.to_i.times { @published_future << Article.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.publish!}}
58
- end
59
-
60
- When /^I create (\d+) unpublished articles scheduled now$/ do |num|
61
- @unpublished_now = []
62
- num.to_i.times { @unpublished_now << Article.create(:start => Time.now, :end => 1.day.from_now)}
63
- end
64
-
65
- When /^I create (\d+) unpublished articles schedule in the future$/ do |num|
66
- @unpublished_future = []
67
- num.to_i.times { @unpublished_future << Article.create(:start => 1.day.from_now, :end => 2.days.from_now)}
68
- end
69
-
70
- Then /^I should receive (\d+)$/ do |count|
71
- @result.should == count.to_i
72
- end
73
-
74
-