by_star 2.2.0 → 4.0.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.
Files changed (66) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/mysql.yml +92 -0
  3. data/.github/workflows/postgresql.yml +99 -0
  4. data/.gitignore +6 -5
  5. data/.travis.yml +92 -35
  6. data/CHANGELOG.md +59 -29
  7. data/Gemfile +18 -25
  8. data/MIT-LICENSE +20 -20
  9. data/README.md +616 -523
  10. data/Rakefile +18 -18
  11. data/UPGRADING +4 -12
  12. data/by_star.gemspec +34 -32
  13. data/cleaner.rb +24 -24
  14. data/lib/by_star/base.rb +69 -68
  15. data/lib/by_star/between.rb +185 -120
  16. data/lib/by_star/directional.rb +35 -21
  17. data/lib/by_star/kernel/date.rb +41 -0
  18. data/lib/by_star/kernel/in_time_zone.rb +20 -0
  19. data/lib/by_star/{kernel.rb → kernel/time.rb} +41 -41
  20. data/lib/by_star/normalization.rb +156 -118
  21. data/lib/by_star/orm/active_record/by_star.rb +75 -59
  22. data/lib/by_star/orm/mongoid/by_star.rb +90 -63
  23. data/lib/by_star/orm/mongoid/reorder.rb +23 -0
  24. data/lib/by_star/version.rb +3 -3
  25. data/lib/by_star.rb +18 -15
  26. data/spec/database.yml +15 -15
  27. data/spec/fixtures/active_record/models.rb +12 -10
  28. data/spec/fixtures/active_record/schema.rb +19 -19
  29. data/spec/fixtures/mongoid/models.rb +31 -29
  30. data/spec/fixtures/shared/seeds.rb +36 -26
  31. data/spec/gemfiles/Gemfile.rails +5 -0
  32. data/spec/gemfiles/Gemfile.rails32 +7 -0
  33. data/spec/gemfiles/Gemfile.rails40 +7 -0
  34. data/spec/gemfiles/Gemfile.rails41 +7 -0
  35. data/spec/gemfiles/Gemfile.rails42 +7 -0
  36. data/spec/gemfiles/Gemfile.rails50 +7 -0
  37. data/spec/gemfiles/Gemfile.rails51 +7 -0
  38. data/spec/gemfiles/Gemfile.rails52 +7 -0
  39. data/spec/gemfiles/Gemfile.rails60 +7 -0
  40. data/spec/gemfiles/Gemfile.rails61 +7 -0
  41. data/spec/integration/active_record/active_record_spec.rb +41 -53
  42. data/spec/integration/mongoid/mongoid_spec.rb +39 -46
  43. data/spec/integration/shared/at_time.rb +53 -0
  44. data/spec/integration/shared/between_dates.rb +99 -0
  45. data/spec/integration/shared/between_times.rb +99 -0
  46. data/spec/integration/shared/by_calendar_month.rb +55 -55
  47. data/spec/integration/shared/by_cweek.rb +54 -0
  48. data/spec/integration/shared/by_day.rb +120 -108
  49. data/spec/integration/shared/by_direction.rb +126 -114
  50. data/spec/integration/shared/by_fortnight.rb +48 -48
  51. data/spec/integration/shared/by_month.rb +50 -50
  52. data/spec/integration/shared/by_quarter.rb +49 -49
  53. data/spec/integration/shared/by_week.rb +54 -54
  54. data/spec/integration/shared/by_weekend.rb +49 -49
  55. data/spec/integration/shared/by_year.rb +48 -48
  56. data/spec/integration/shared/index_scope_parameter.rb +111 -0
  57. data/spec/integration/shared/offset_parameter.rb +32 -31
  58. data/spec/integration/shared/order_parameter.rb +36 -0
  59. data/spec/integration/shared/relative.rb +174 -174
  60. data/spec/spec_helper.rb +33 -29
  61. data/spec/unit/kernel_date_spec.rb +113 -0
  62. data/spec/unit/kernel_time_spec.rb +57 -57
  63. data/spec/unit/normalization_spec.rb +384 -255
  64. data/tmp/.gitignore +1 -1
  65. metadata +82 -68
  66. data/spec/integration/shared/scope_parameter.rb +0 -42
@@ -1,108 +1,120 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by day' do
4
-
5
- describe '#by_day' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_day('2014-01-01') }
9
- its(:count){ should eq 2 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_day(Time.parse '2014-01-01') }
14
- its(:count){ should eq 5 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_day(Date.parse('2014-01-01'), strict: true) }
19
- its(:count){ should eq 0 }
20
- end
21
-
22
- it 'should be able to use an alternative field' do
23
- Event.by_day(:field => 'end_time').count.should eq 0
24
- end
25
-
26
- it 'should support :offset option' do
27
- Post.by_day('2014-01-01', :offset => -16.hours).count.should eq 1
28
- end
29
- end
30
-
31
- describe '#today' do # 2014-01-01
32
-
33
- context 'point-in-time' do
34
- subject { Post.today }
35
- its(:count){ should eq 2 }
36
- end
37
-
38
- context 'timespan' do
39
- subject { Event.today }
40
- its(:count){ should eq 5 }
41
- end
42
-
43
- context 'timespan strict' do
44
- subject { Event.today(strict: true) }
45
- its(:count){ should eq 0 }
46
- end
47
-
48
- it 'should be able to use an alternative field' do
49
- Event.today(:field => 'created_at').count.should eq 2
50
- end
51
-
52
- it 'should support :offset option' do
53
- Post.today(:offset => -24.hours).count.should eq 1
54
- end
55
- end
56
-
57
- describe '#yesterday' do # 2013-12-31
58
-
59
- context 'point-in-time' do
60
- subject { Post.yesterday }
61
- its(:count){ should eq 1 }
62
- end
63
-
64
- context 'timespan' do
65
- subject { Event.yesterday }
66
- its(:count){ should eq 5 }
67
- end
68
-
69
- context 'timespan strict' do
70
- subject { Event.yesterday(strict: true) }
71
- its(:count){ should eq 0 }
72
- end
73
-
74
- it 'should be able to use an alternative field' do
75
- Event.yesterday(:field => 'created_at').count.should eq 1
76
- end
77
-
78
- it 'should support :offset option' do
79
- Post.yesterday(:offset => 24.hours).count.should eq 2
80
- end
81
- end
82
-
83
- describe '#tomorrow' do # 2014-01-02
84
-
85
- context 'point-in-time' do
86
- subject { Post.tomorrow }
87
- its(:count){ should eq 0 }
88
- end
89
-
90
- context 'timespan' do
91
- subject { Event.tomorrow }
92
- its(:count){ should eq 5 }
93
- end
94
-
95
- context 'timespan strict' do
96
- subject { Event.tomorrow(strict: true) }
97
- its(:count){ should eq 0 }
98
- end
99
-
100
- it 'should be able to use an alternative field' do
101
- Event.tomorrow(:field => 'created_at').count.should eq 0
102
- end
103
-
104
- it 'should support :offset option' do
105
- Post.tomorrow(:offset => -24.hours).count.should eq 2
106
- end
107
- end
108
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by day' do
4
+
5
+ describe '#by_day' do
6
+
7
+ context 'point-in-time' do
8
+ it { expect(Post.by_day('2014-01-01').count).to eql(2) }
9
+ end
10
+
11
+ context 'timespan' do
12
+ it { expect(Event.by_day(Time.zone.parse '2014-01-01').count).to eql(5) }
13
+ end
14
+
15
+ context 'timespan strict' do
16
+ it { expect(Event.by_day(Date.parse('2014-01-01'), strict: true).count).to eql(0) }
17
+ end
18
+
19
+ it 'should be able to use an alternative field' do
20
+ expect(Event.by_day(field: 'end_time').count).to eql(0)
21
+ end
22
+
23
+ it 'should support :offset option' do
24
+ expect(Post.by_day('2014-01-01', offset: -16.hours).count).to eq(1)
25
+ end
26
+
27
+ context 'when DST starts (Sydney)', sydney: true do
28
+ context 'day before' do
29
+ subject { Event.by_day('2020-04-04', offset: 5.hours) }
30
+ it { expect(subject.count).to eq(3) }
31
+ end
32
+
33
+ context 'same day' do
34
+ subject { Event.by_day('2020-04-05', offset: 5.hours) }
35
+ it { expect(subject.count).to eq(1) }
36
+ end
37
+ end
38
+
39
+ context 'when DST ends (Sydney)', sydney: true do
40
+ context 'day before' do
41
+ subject { Event.by_day('2020-10-03', offset: 5.hours) }
42
+ it { expect(subject.count).to eq(1) }
43
+ end
44
+
45
+ context 'same day' do
46
+ subject { Event.by_day('2020-10-04', offset: 5.hours) }
47
+ it { expect(subject.count).to eq(3) }
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#today' do # 2014-01-01
53
+
54
+ context 'point-in-time' do
55
+ it { expect(Post.today.count).to eql(2) }
56
+ end
57
+
58
+ context 'timespan' do
59
+ it { expect(Event.today.count).to eql(5) }
60
+ end
61
+
62
+ context 'timespan strict' do
63
+ it { expect(Event.today(strict: true).count).to eql(0) }
64
+ end
65
+
66
+ it 'should be able to use an alternative field' do
67
+ expect(Event.today(field: 'created_at').count).to eql(2)
68
+ end
69
+
70
+ it 'should support :offset option' do
71
+ expect(Post.today(offset: -24.hours).count).to eql(1)
72
+ end
73
+ end
74
+
75
+ describe '#yesterday' do # 2013-12-31
76
+
77
+ context 'point-in-time' do
78
+ it { expect(Post.yesterday.count).to eql(1) }
79
+ end
80
+
81
+ context 'timespan' do
82
+ it { expect(Event.yesterday.count).to eql(5) }
83
+ end
84
+
85
+ context 'timespan strict' do
86
+ it { expect(Event.yesterday(strict: true).count).to eql(0) }
87
+ end
88
+
89
+ it 'should be able to use an alternative field' do
90
+ expect(Event.yesterday(field: 'created_at').count).to eql(1)
91
+ end
92
+
93
+ it 'should support :offset option' do
94
+ expect(Post.yesterday(offset: 24.hours).count).to eql(2)
95
+ end
96
+ end
97
+
98
+ describe '#tomorrow' do # 2014-01-02
99
+
100
+ context 'point-in-time' do
101
+ it { expect(Post.tomorrow.count).to eql(0) }
102
+ end
103
+
104
+ context 'timespan' do
105
+ it { expect(Event.tomorrow.count).to eql(5) }
106
+ end
107
+
108
+ context 'timespan strict' do
109
+ it { expect(Event.tomorrow(strict: true).count).to eql(0) }
110
+ end
111
+
112
+ it 'should be able to use an alternative field' do
113
+ expect(Event.tomorrow(field: 'created_at').count).to eql(0)
114
+ end
115
+
116
+ it 'should support :offset option' do
117
+ expect(Post.tomorrow(offset: -24.hours).count).to eql(2)
118
+ end
119
+ end
120
+ end
@@ -1,114 +1,126 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by direction' do
4
-
5
- describe '#before' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.before(Date.parse '2014-01-05') }
9
- its(:count){ should eq 12 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.before(Time.parse '2014-01-05') }
14
- its(:count){ should eq 13 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.before('2014-01-05', strict: true) }
19
- its(:count){ should eq 13 }
20
- end
21
-
22
- context 'alternative field' do
23
- subject { Event.before('2014-01-05', field: 'created_at') }
24
- its(:count){ should eq 12 }
25
- end
26
-
27
- context 'with default scope' do
28
- subject { Appointment.before('2014-01-05', field: 'created_at') }
29
- its(:count){ should eq 4 }
30
- end
31
-
32
- context 'with scope as a query criteria' do
33
- subject { Post.before('2014-01-05', field: 'created_at', scope: Post.where(day_of_month: 5)) }
34
- its(:count){ should eq 1 }
35
- end
36
-
37
- context 'with scope as a proc' do
38
- subject { Post.before('2014-01-05', field: 'created_at', scope: ->{ where(day_of_month: 5) }) }
39
- its(:count){ should eq 1 }
40
- end
41
- end
42
-
43
- describe '#after' do
44
-
45
- context 'point-in-time' do
46
- subject { Post.after('2014-01-05') }
47
- its(:count){ should eq 10 }
48
- end
49
-
50
- context 'timespan' do
51
- subject { Event.after(Date.parse '2014-01-05') }
52
- its(:count){ should eq 9 }
53
- end
54
-
55
- context 'timespan strict' do
56
- subject { Event.after('2014-01-05', strict: true) }
57
- its(:count){ should eq 9 }
58
- end
59
-
60
- context 'alternative field' do
61
- subject { Event.after('2014-01-05', field: 'created_at') }
62
- its(:count){ should eq 10 }
63
- end
64
-
65
- context 'with default scope' do
66
- subject { Appointment.after('2014-01-05', field: 'created_at') }
67
- its(:count){ should eq 3 }
68
- end
69
-
70
- context 'with scope as a query criteria' do
71
- subject { Post.after('2014-01-05', field: 'created_at', scope: Post.where(day_of_month: 5)) }
72
- its(:count){ should eq 1 }
73
- end
74
-
75
- context 'with scope as a proc' do
76
- subject { Post.after('2014-01-05', field: 'created_at', scope: ->{ where(day_of_month: 5) }) }
77
- its(:count){ should eq 1 }
78
- end
79
- end
80
-
81
- describe '#previous and #next' do
82
-
83
- context 'point-in-time' do
84
- subject { Post.where(created_at: Time.zone.parse('2014-01-10 17:00:00')).first }
85
- it{ subject.previous.created_at.should eq Time.zone.parse('2014-01-05 17:00:00') }
86
- it{ subject.next.created_at.should eq Time.zone.parse('2014-01-12 17:00:00') }
87
- end
88
-
89
- context 'timespan' do
90
- subject { Event.where(start_time: Time.zone.parse('2014-01-05 17:00:00')).first }
91
- it{ subject.previous.start_time.should eq Time.zone.parse('2013-12-31 17:00:00') }
92
- it{ subject.next.start_time.should eq Time.zone.parse('2014-01-07 17:00:00') }
93
- end
94
-
95
- context 'with default scope' do
96
- subject { Appointment.where(created_at: Time.zone.parse('2014-01-05 17:00:00')).first }
97
- it{ subject.previous.created_at.should eq Time.zone.parse('2014-01-01 17:00:00') }
98
- it{ subject.next.created_at.should eq Time.zone.parse('2014-02-01 17:00:00') }
99
- end
100
-
101
- context 'with scope as a query criteria' do
102
- subject { Post.where(created_at: Time.zone.parse('2014-01-05 17:00:00')).first }
103
- it{ subject.previous({ scope: Post.where(day_of_month: 5) }).created_at.should eq Time.zone.parse('2013-12-05 17:00:00') }
104
- it{ subject.next({ scope: Post.where(day_of_month: 1) }).created_at.should eq Time.zone.parse('2014-02-01 17:00:00') }
105
- end
106
-
107
- context 'with scope as a proc' do
108
- subject { Post.where(created_at: Time.zone.parse('2014-01-05 17:00:00')).first }
109
- it{ subject.previous({ scope: Proc.new{ where(day_of_month: 5) } }).created_at.should eq Time.zone.parse('2013-12-05 17:00:00') }
110
- it{ subject.next({ scope: ->{ where(day_of_month: 1) } }).created_at.should eq Time.zone.parse('2014-02-01 17:00:00') }
111
- it{ subject.next({ scope: ->(klass){ klass.where(day_of_month: 1) } }).created_at.should eq Time.zone.parse('2014-02-01 17:00:00') }
112
- end
113
- end
114
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by direction' do
4
+
5
+ describe '#before' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.before(Date.parse '2014-01-05') }
9
+ it { expect(subject.count).to eql(12) }
10
+ end
11
+
12
+ context 'timespan default' do
13
+ subject { Event.before(Time.zone.parse '2014-01-05') }
14
+ it { expect(subject.count).to eql(13) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.before('2014-01-05', strict: true) }
19
+ it { expect(subject.count).to eql(13) }
20
+ end
21
+
22
+ context 'timespan not strict' do
23
+ subject { Event.before('2014-01-05', strict: false) }
24
+ it { expect(subject.count).to eql(13) }
25
+ end
26
+
27
+ context 'alternative field' do
28
+ subject { Event.before('2014-01-05', field: 'created_at') }
29
+ it { expect(subject.count).to eql(20) }
30
+ end
31
+
32
+ context 'with default scope' do
33
+ subject { Appointment.before('2014-01-05', field: 'created_at') }
34
+ it { expect(subject.count).to eql(12) }
35
+ end
36
+ end
37
+
38
+ describe '#after' do
39
+
40
+ context 'point-in-time' do
41
+ subject { Post.after('2014-01-05') }
42
+ it { expect(subject.count).to eql(10) }
43
+ end
44
+
45
+ context 'timespan default' do
46
+ subject { Event.after(Date.parse '2014-01-05') }
47
+ it { expect(subject.count).to eql(17) }
48
+ end
49
+
50
+ context 'timespan strict' do
51
+ subject { Event.after('2014-01-05', strict: true) }
52
+ it { expect(subject.count).to eql(17) }
53
+ end
54
+
55
+ context 'timespan not strict' do
56
+ subject { Event.after('2014-01-05', strict: false) }
57
+ it { expect(subject.count).to eql(17) }
58
+ end
59
+
60
+ context 'alternative field' do
61
+ subject { Event.after('2014-01-05', field: 'created_at') }
62
+ it { expect(subject.count).to eql(10) }
63
+ end
64
+
65
+ context 'with default scope' do
66
+ subject { Appointment.after('2014-01-05', field: 'created_at') }
67
+ it { expect(subject.count).to eql(10) }
68
+ end
69
+ end
70
+
71
+ describe '#oldest and #newest' do
72
+ context 'point-in-time' do
73
+ it { expect(Post.newest.created_at).to eq Time.zone.parse('2014-04-15 17:00:00') }
74
+ it { expect(Post.oldest.created_at).to eq Time.zone.parse('2013-11-01 17:00:00') }
75
+ end
76
+
77
+ context 'timespan' do
78
+ it { expect(Event.newest.created_at).to eq Time.zone.parse('2011-01-01 00:00:00') }
79
+ it { expect(Event.oldest.created_at).to eq Time.zone.parse('2013-11-01 17:00:00') }
80
+ end
81
+
82
+ context 'timespan strict' do
83
+ it { expect(Event.newest(strict: true).created_at).to eq Time.zone.parse('2011-01-01 00:00:00') }
84
+ it { expect(Event.oldest(strict: true).created_at).to eq Time.zone.parse('2013-11-01 17:00:00') }
85
+ end
86
+
87
+ context 'alternative field' do
88
+ it { expect(Event.newest(field: 'created_at').created_at).to eq Time.zone.parse('2014-04-15 17:00:00') }
89
+ it { expect(Event.oldest(field: 'created_at').created_at).to eq Time.zone.parse('2011-01-01 00:00:00') }
90
+ end
91
+
92
+ context 'with default scope' do
93
+ it { expect(Appointment.newest(field: 'created_at').created_at).to eq Time.zone.parse('2014-04-15 17:00:00') }
94
+ it { expect(Appointment.oldest(field: 'created_at').created_at).to eq Time.zone.parse('2013-11-01 17:00:00') }
95
+ end
96
+ end
97
+
98
+ describe '#previous and #next' do
99
+
100
+ context 'point-in-time' do
101
+ subject { Post.where(created_at: Time.zone.parse('2014-01-10 17:00:00')).first }
102
+ it{ expect(subject.previous.created_at).to eq Time.zone.parse('2014-01-05 17:00:00') }
103
+ it{ expect(subject.next.created_at).to eq Time.zone.parse('2014-01-12 17:00:00') }
104
+ end
105
+
106
+ context 'timespan' do
107
+ subject { Event.where(start_time: Time.zone.parse('2014-01-05 17:00:00')).first }
108
+ it{ expect(subject.previous.start_time).to eq Time.zone.parse('2013-12-31 17:00:00') }
109
+ it{ expect(subject.next.start_time).to eq Time.zone.parse('2014-01-07 17:00:00') }
110
+ end
111
+
112
+ context 'with default scope' do
113
+ subject { Appointment.where(created_at: Time.zone.parse('2014-01-05 17:00:00')).first }
114
+ it{ expect(subject.previous.created_at).to eq Time.zone.parse('2014-01-01 17:00:00') }
115
+ it{ expect(subject.next.created_at).to eq Time.zone.parse('2014-01-10 17:00:00') }
116
+ end
117
+
118
+ context 'specify a field' do
119
+ subject { Post.where(created_at: Time.zone.parse('2014-01-01 17:00:00')).first }
120
+ it{ expect(subject.previous.created_at).to eq Time.zone.parse('2013-12-31 17:00:00') }
121
+ it{ expect(subject.next.created_at).to eq Time.zone.parse('2014-01-05 17:00:00') }
122
+ it{ expect(subject.previous(field: 'updated_at').created_at).to eq Time.zone.parse('2013-12-31 17:00:00') }
123
+ it{ expect(subject.next(field: 'updated_at').created_at).to eq Time.zone.parse('2014-01-01 17:00:00') }
124
+ end
125
+ end
126
+ end
@@ -1,48 +1,48 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by fortnight' do
4
-
5
- describe '#by_fortnight' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_fortnight('2014-01-01') }
9
- its(:count){ should eq 5 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_fortnight(0) }
14
- its(:count){ should eq 7 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_fortnight(Date.parse('2014-01-01'), strict: true) }
19
- its(:count){ should eq 0 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_fortnight(26, year: 2013) }
26
- its(:count){ should eq 6 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_fortnight(26, year: 2013) }
31
- its(:count){ should eq 7 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_fortnight(26, year: 2013, strict: true) }
36
- its(:count){ should eq 1 }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- lambda { Post.by_fortnight(27) }.should raise_error(ByStar::ParseError, 'Fortnight number must be between 0 and 26')
42
- end
43
-
44
- it 'should be able to use an alternative field' do
45
- Event.by_fortnight(:field => 'end_time').count.should eq 5
46
- end
47
- end
48
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by fortnight' do
4
+
5
+ describe '#by_fortnight' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_fortnight('2014-01-01') }
9
+ it { expect(subject.count).to eql(5) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_fortnight(0) }
14
+ it { expect(subject.count).to eql(7) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_fortnight(Date.parse('2014-01-01'), strict: true) }
19
+ it { expect(subject.count).to eql(0) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_fortnight(26, year: 2013) }
26
+ it { expect(subject.count).to eql(6) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_fortnight(26, year: 2013) }
31
+ it { expect(subject.count).to eql(7) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_fortnight(26, year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(1) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect { Post.by_fortnight(27) }.to raise_error(ByStar::ParseError, 'Fortnight number must be between 0 and 26')
42
+ end
43
+
44
+ it 'should be able to use an alternative field' do
45
+ expect(Event.by_fortnight(field: 'end_time').count).to eq 5
46
+ end
47
+ end
48
+ end