acts_as_span 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+ require 'has_siblings'
3
+
4
+ RSpec.describe ActsAsSpan::NoOverlapValidator do
5
+ let!(:brother) do
6
+ child_class.create(
7
+ start_date: brother_start_date,
8
+ end_date: brother_end_date,
9
+ mama: mama)
10
+ end
11
+
12
+ let!(:sister) do
13
+ child_class.create(
14
+ start_date: sister_start_date,
15
+ end_date: sister_end_date,
16
+ mama: mama)
17
+ end
18
+
19
+ let!(:brother_from_another_mother) do
20
+ child_class.create(
21
+ start_date: new_child_start_date,
22
+ end_date: new_child_end_date,
23
+ mama: other_mama)
24
+ end
25
+
26
+ let(:new_child) do
27
+ child_class.new(
28
+ start_date: new_child_start_date,
29
+ end_date: new_child_end_date,
30
+ mama: mama)
31
+ end
32
+
33
+ let(:mama) { Mama.create }
34
+ let(:other_mama) { Mama.create }
35
+ let(:papa) { Papa.create }
36
+
37
+ let(:brother_start_date) { Date.current - 2 }
38
+ let(:brother_end_date) { Date.current - 1 }
39
+
40
+ let(:sister_start_date) { Date.current + 2 }
41
+ let(:sister_end_date) { Date.current + 3 }
42
+
43
+ let(:all_siblings) { [brother, sister, brother_from_another_mother] }
44
+
45
+ describe 'an object with a single parent' do
46
+ let(:child_class) { OneParentChild }
47
+
48
+ context 'valid cases' do
49
+ let(:new_child_start_date) { Date.current }
50
+ let(:new_child_end_date) { Date.current + 1 }
51
+
52
+ it 'allows overlapping spans on for associated records with different parents' do
53
+ expect(new_child).to be_valid
54
+ end
55
+ end
56
+
57
+ context 'invalid cases' do
58
+ let(:new_child_start_date) { Date.current - 2 }
59
+ let(:new_child_end_date) { Date.current + 3 }
60
+
61
+ it 'does not allow overlapping spans siblings with same parents' do
62
+ expect(new_child).not_to be_valid
63
+ end
64
+ end
65
+ end
66
+
67
+ describe 'an object with multiple parents' do
68
+ let(:child_class) { TwoParentChild }
69
+
70
+ before do
71
+ all_siblings.each do |sibling|
72
+ sibling.update_attributes(papa: papa)
73
+ end
74
+
75
+ new_child.papa = papa
76
+ end
77
+
78
+ context 'valid cases' do
79
+ let(:new_child_start_date) { brother_end_date + 1 }
80
+ let(:new_child_end_date) { sister_start_date - 1 }
81
+
82
+ it 'allows overlapping spans on for associated records with different parents' do
83
+ expect(new_child).to be_valid
84
+ end
85
+ end
86
+
87
+ context 'invalid cases' do
88
+ let(:new_child_start_date) { brother_start_date }
89
+ let(:new_child_end_date) { sister_end_date }
90
+
91
+ it 'does not allow overlapping spans siblings with same parents' do
92
+ expect(new_child).not_to be_valid
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,304 +1,304 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "a basic model using acts_as_span" do
4
- before(:all) do
5
- build_model :span_model do
6
- string :description
7
- date :start_date
8
- date :end_date
9
-
10
- acts_as_span
11
- end
12
-
13
- @query_date = Date.today + 1.month
14
- end
15
-
3
+ RSpec.describe "a basic model using acts_as_span" do
16
4
  context "named_scopes and current_on?, expired_on?, and future_on?" do
17
5
  # -2 -1 Q +1 +2 C F E
18
6
  # A |---| E
19
- # B |-------| C
20
- # C |--------------| C
21
- # D | C
22
- # E |------| C
23
- # F |--| F
24
- # G |-> C
25
- # H |-> C
26
- # I |-> F
7
+ # B |-------| C
8
+ # C |--------------| C
9
+ # D | C
10
+ # E |------| C
11
+ # F |--| F
12
+ # G |-> C
13
+ # H |-> C
14
+ # I |-> F
27
15
  # J <-| E
28
- # K <-| C
29
- # L <-| C
30
- # M <-> C
16
+ # K <-| C
17
+ # L <-| C
18
+ # M <-> C
19
+ let(:span_a) {[ - 2.days, - 1.day ]}
20
+ let(:span_b) {[ - 2.days, 0.days ]}
21
+ let(:span_c) {[ - 2.days, 2.days ]}
22
+ let(:span_d) {[ 0.days, 0.days ]}
23
+ let(:span_e) {[ 0.days, 2.days ]}
24
+ let(:span_f) {[ 1.day, 2.days ]}
25
+ let(:span_g) {[ - 2.days, nil ]}
26
+ let(:span_h) {[ 0.days, nil ]}
27
+ let(:span_i) {[ 1.day, nil ]}
28
+ let(:span_j) {[ nil, - 1.day ]}
29
+ let(:span_k) {[ nil, 0.days ]}
30
+ let(:span_l) {[ nil, 2.days ]}
31
+ let(:span_m) {[ nil, nil ]}
32
+
33
+ let(:query_date) { Date.current + (-24..24).to_a.sample.month }
34
+
35
+ let!(:span_model) do
36
+ current_start_date = start_date.nil? ? nil : query_date + start_date
37
+ current_end_date = end_date.nil? ? nil : query_date + end_date
38
+
39
+ SpanModel.create!(
40
+ start_date: current_start_date,
41
+ end_date: current_end_date)
42
+ end
43
+
31
44
  context "A) start_date < query_date & end_date < query_date" do
32
- before(:all) do
33
- @span_model = SpanModel.create!(:start_date => @query_date - 2.days, :end_date => @query_date - 1.day)
34
- end
35
-
45
+ let(:start_date) { span_a[0] }
46
+ let(:end_date) { span_a[1] }
47
+
36
48
  it "should NOT be included in #current" do
37
- SpanModel.current_on(@query_date).should_not include(@span_model)
38
- @span_model.current_on?(@query_date).should be_false
49
+ expect(SpanModel.current_on(query_date)).not_to include(span_model)
50
+ expect(span_model.current_on?(query_date)).to be_falsey
39
51
  end
40
-
52
+
41
53
  it "should NOT be included in #future" do
42
- SpanModel.future_on(@query_date).should_not include(@span_model)
43
- @span_model.future_on?(@query_date).should be_false
54
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
55
+ expect(span_model.future_on?(query_date)).to be_falsey
44
56
  end
45
-
57
+
46
58
  it "should be included in #expired" do
47
- SpanModel.expired_on(@query_date).should include(@span_model)
48
- @span_model.expired_on?(@query_date).should be_true
59
+ expect(SpanModel.expired_on(query_date)).to include(span_model)
60
+ expect(span_model.expired_on?(query_date)).to be_truthy
49
61
  end
50
62
  end
51
-
63
+
52
64
  context "B) start_date < query_date & end_date == query_date" do
53
- before(:all) do
54
- @span_model = SpanModel.create!(:start_date => @query_date - 2.day, :end_date => @query_date)
55
- end
56
-
65
+ let(:start_date) { span_b[0] }
66
+ let(:end_date) { span_b[1] }
67
+
57
68
  it "should be included in #current" do
58
- SpanModel.current_on(@query_date).should include(@span_model)
59
- @span_model.current_on?(@query_date).should be_true
69
+ expect(SpanModel.current_on(query_date)).to include(span_model)
70
+ expect(span_model.current_on?(query_date)).to be_truthy
60
71
  end
61
-
72
+
62
73
  it "should NOT be included in #future" do
63
- SpanModel.future_on(@query_date).should_not include(@span_model)
64
- @span_model.future_on?(@query_date).should be_false
74
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
75
+ expect(span_model.future_on?(query_date)).to be_falsey
65
76
  end
66
-
77
+
67
78
  it "should NOT be included in #expired" do
68
- SpanModel.expired_on(@query_date).should_not include(@span_model)
69
- @span_model.expired_on?(@query_date).should be_false
79
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
80
+ expect(span_model.expired_on?(query_date)).to be_falsey
70
81
  end
71
82
  end
72
-
83
+
73
84
  context "C) start_date < query_date & end_date > query_date" do
74
- before(:all) do
75
- @span_model = SpanModel.create!(:start_date => @query_date - 2.day, :end_date => @query_date + 2.day)
76
- end
77
-
85
+ let(:start_date) { span_c[0] }
86
+ let(:end_date) { span_c[1] }
87
+
78
88
  it "should be included in #current" do
79
- SpanModel.current_on(@query_date).should include(@span_model)
80
- @span_model.current_on?(@query_date).should be_true
89
+ expect(SpanModel.current_on(query_date)).to include(span_model)
90
+ expect(span_model.current_on?(query_date)).to be_truthy
81
91
  end
82
-
92
+
83
93
  it "should NOT be included in #future" do
84
- SpanModel.future_on(@query_date).should_not include(@span_model)
85
- @span_model.future_on?(@query_date).should be_false
94
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
95
+ expect(span_model.future_on?(query_date)).to be_falsey
86
96
  end
87
-
97
+
88
98
  it "should NOT be included in #expired" do
89
- SpanModel.expired_on(@query_date).should_not include(@span_model)
90
- @span_model.expired_on?(@query_date).should be_false
99
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
100
+ expect(span_model.expired_on?(query_date)).to be_falsey
91
101
  end
92
102
  end
93
-
103
+
94
104
  context "D) start_date == query_date & end_date == query_date" do
95
- before(:all) do
96
- @span_model = SpanModel.create!(:start_date => @query_date, :end_date => @query_date)
97
- end
98
-
105
+ let(:start_date) { span_d[0] }
106
+ let(:end_date) { span_d[1] }
107
+
99
108
  it "should be included in #current" do
100
- SpanModel.current_on(@query_date).should include(@span_model)
101
- @span_model.current_on?(@query_date).should be_true
109
+ expect(SpanModel.current_on(query_date)).to include(span_model)
110
+ expect(span_model.current_on?(query_date)).to be_truthy
102
111
  end
103
-
112
+
104
113
  it "should NOT be included in #future" do
105
- SpanModel.future_on(@query_date).should_not include(@span_model)
106
- @span_model.future_on?(@query_date).should be_false
114
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
115
+ expect(span_model.future_on?(query_date)).to be_falsey
107
116
  end
108
-
117
+
109
118
  it "should NOT be included in #expired" do
110
- SpanModel.expired_on(@query_date).should_not include(@span_model)
111
- @span_model.expired_on?(@query_date).should be_false
119
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
120
+ expect(span_model.expired_on?(query_date)).to be_falsey
112
121
  end
113
122
  end
114
-
123
+
115
124
  context "E) start_date == query_date & end_date > query_date" do
116
- before(:all) do
117
- @span_model = SpanModel.create!(:start_date => @query_date, :end_date => @query_date + 2.day)
118
- end
119
-
125
+ let(:start_date) { span_e[0] }
126
+ let(:end_date) { span_e[1] }
127
+
120
128
  it "should be included in #current" do
121
- SpanModel.current_on(@query_date).should include(@span_model)
122
- @span_model.current_on?(@query_date).should be_true
129
+ expect(SpanModel.current_on(query_date)).to include(span_model)
130
+ expect(span_model.current_on?(query_date)).to be_truthy
123
131
  end
124
-
132
+
125
133
  it "should NOT be included in #future" do
126
- SpanModel.future_on(@query_date).should_not include(@span_model)
127
- @span_model.future_on?(@query_date).should be_false
134
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
135
+ expect(span_model.future_on?(query_date)).to be_falsey
128
136
  end
129
-
137
+
130
138
  it "should NOT be included in #expired" do
131
- SpanModel.expired_on(@query_date).should_not include(@span_model)
132
- @span_model.expired_on?(@query_date).should be_false
139
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
140
+ expect(span_model.expired_on?(query_date)).to be_falsey
133
141
  end
134
142
  end
135
-
143
+
136
144
  context "F) start_date > query_date & end_date > query_date" do
137
- before(:all) do
138
- @span_model = SpanModel.create!(:start_date => @query_date + 1.day, :end_date => @query_date + 2.days)
139
- end
140
-
145
+ let(:start_date) { span_f[0] }
146
+ let(:end_date) { span_f[1] }
147
+
141
148
  it "should NOT be included in #current" do
142
- SpanModel.current_on(@query_date).should_not include(@span_model)
143
- @span_model.current_on?(@query_date).should be_false
149
+ expect(SpanModel.current_on(query_date)).not_to include(span_model)
150
+ expect(span_model.current_on?(query_date)).to be_falsey
144
151
  end
145
-
152
+
146
153
  it "should be included in #future" do
147
- SpanModel.future_on(@query_date).should include(@span_model)
148
- @span_model.future_on?(@query_date).should be_true
154
+ expect(SpanModel.future_on(query_date)).to include(span_model)
155
+ expect(span_model.future_on?(query_date)).to be_truthy
149
156
  end
150
-
157
+
151
158
  it "should NOT be included in #expired" do
152
- SpanModel.expired_on(@query_date).should_not include(@span_model)
153
- @span_model.expired_on?(@query_date).should be_false
159
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
160
+ expect(span_model.expired_on?(query_date)).to be_falsey
154
161
  end
155
162
  end
156
-
163
+
157
164
  context "G) start_date < query_date & end_date == nil" do
158
- before(:all) do
159
- @span_model = SpanModel.create!(:start_date => @query_date - 2.day, :end_date => nil)
160
- end
161
-
165
+ let(:start_date) { span_g[0] }
166
+ let(:end_date) { span_g[1] }
167
+
162
168
  it "should be included in #current" do
163
- SpanModel.current_on(@query_date).should include(@span_model)
164
- @span_model.current_on?(@query_date).should be_true
169
+ expect(SpanModel.current_on(query_date)).to include(span_model)
170
+ expect(span_model.current_on?(query_date)).to be_truthy
165
171
  end
166
-
172
+
167
173
  it "should NOT be included in #future" do
168
- SpanModel.future_on(@query_date).should_not include(@span_model)
169
- @span_model.future_on?(@query_date).should be_false
174
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
175
+ expect(span_model.future_on?(query_date)).to be_falsey
170
176
  end
171
-
177
+
172
178
  it "should NOT be included in #expired" do
173
- SpanModel.expired_on(@query_date).should_not include(@span_model)
174
- @span_model.expired_on?(@query_date).should be_false
179
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
180
+ expect(span_model.expired_on?(query_date)).to be_falsey
175
181
  end
176
182
  end
177
-
183
+
178
184
  context "H) start_date == query_date & end_date == nil" do
179
- before(:all) do
180
- @span_model = SpanModel.create!(:start_date => @query_date, :end_date => nil)
181
- end
182
-
185
+ let(:start_date) { span_h[0] }
186
+ let(:end_date) { span_h[1] }
187
+
183
188
  it "should be included in #current" do
184
- SpanModel.current_on(@query_date).should include(@span_model)
185
- @span_model.current_on?(@query_date).should be_true
189
+ expect(SpanModel.current_on(query_date)).to include(span_model)
190
+ expect(span_model.current_on?(query_date)).to be_truthy
186
191
  end
187
-
192
+
188
193
  it "should NOT be included in #future" do
189
- SpanModel.future_on(@query_date).should_not include(@span_model)
190
- @span_model.future_on?(@query_date).should be_false
194
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
195
+ expect(span_model.future_on?(query_date)).to be_falsey
191
196
  end
192
-
197
+
193
198
  it "should NOT be included in #expired" do
194
- SpanModel.expired_on(@query_date).should_not include(@span_model)
195
- @span_model.expired_on?(@query_date).should be_false
199
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
200
+ expect(span_model.expired_on?(query_date)).to be_falsey
196
201
  end
197
202
  end
198
-
203
+
199
204
  context "I) start_date > query_date & end_date == nil" do
200
- before(:all) do
201
- @span_model = SpanModel.create!(:start_date => @query_date + 1.day, :end_date => nil)
202
- end
203
-
205
+ let(:start_date) { span_i[0] }
206
+ let(:end_date) { span_i[1] }
207
+
204
208
  it "should NOT be included in #current" do
205
- SpanModel.current_on(@query_date).should_not include(@span_model)
206
- @span_model.current_on?(@query_date).should be_false
209
+ expect(SpanModel.current_on(query_date)).not_to include(span_model)
210
+ expect(span_model.current_on?(query_date)).to be_falsey
207
211
  end
208
-
212
+
209
213
  it "should be included in #future" do
210
- SpanModel.future_on(@query_date).should include(@span_model)
211
- @span_model.future_on?(@query_date).should be_true
214
+ expect(SpanModel.future_on(query_date)).to include(span_model)
215
+ expect(span_model.future_on?(query_date)).to be_truthy
212
216
  end
213
-
217
+
214
218
  it "should NOT be included in #expired" do
215
- SpanModel.expired_on(@query_date).should_not include(@span_model)
216
- @span_model.expired_on?(@query_date).should be_false
219
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
220
+ expect(span_model.expired_on?(query_date)).to be_falsey
217
221
  end
218
222
  end
219
-
223
+
220
224
  context "J) start_date == nil & end_date < query_date" do
221
- before(:all) do
222
- @span_model = SpanModel.create!(:start_date => nil, :end_date => @query_date - 1.day)
223
- end
224
-
225
+ let(:start_date) { span_j[0] }
226
+ let(:end_date) { span_j[1] }
227
+
225
228
  it "should NOT be included in #current" do
226
- SpanModel.current_on(@query_date).should_not include(@span_model)
227
- @span_model.current_on?(@query_date).should be_false
229
+ expect(SpanModel.current_on(query_date)).not_to include(span_model)
230
+ expect(span_model.current_on?(query_date)).to be_falsey
228
231
  end
229
-
232
+
230
233
  it "should NOT be included in #future" do
231
- SpanModel.future_on(@query_date).should_not include(@span_model)
232
- @span_model.future_on?(@query_date).should be_false
234
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
235
+ expect(span_model.future_on?(query_date)).to be_falsey
233
236
  end
234
-
237
+
235
238
  it "should be included in #expired" do
236
- SpanModel.expired_on(@query_date).should include(@span_model)
237
- @span_model.expired_on?(@query_date).should be_true
239
+ expect(SpanModel.expired_on(query_date)).to include(span_model)
240
+ expect(span_model.expired_on?(query_date)).to be_truthy
238
241
  end
239
242
  end
240
-
243
+
241
244
  context "K) start_date == nil & end_date == query_date" do
242
- before(:all) do
243
- @span_model = SpanModel.create!(:start_date => nil, :end_date => @query_date)
244
- end
245
-
245
+ let(:start_date) { span_k[0] }
246
+ let(:end_date) { span_k[1] }
247
+
246
248
  it "should be included in #current" do
247
- SpanModel.current_on(@query_date).should include(@span_model)
248
- @span_model.current_on?(@query_date).should be_true
249
+ expect(SpanModel.current_on(query_date)).to include(span_model)
250
+ expect(span_model.current_on?(query_date)).to be_truthy
249
251
  end
250
-
252
+
251
253
  it "should NOT be included in #future" do
252
- SpanModel.future_on(@query_date).should_not include(@span_model)
253
- @span_model.future_on?(@query_date).should be_false
254
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
255
+ expect(span_model.future_on?(query_date)).to be_falsey
254
256
  end
255
-
257
+
256
258
  it "should NOT be included in #expired" do
257
- SpanModel.expired_on(@query_date).should_not include(@span_model)
258
- @span_model.expired_on?(@query_date).should be_false
259
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
260
+ expect(span_model.expired_on?(query_date)).to be_falsey
259
261
  end
260
262
  end
261
-
263
+
262
264
  context "L) start_date == nil & end_date > query_date" do
263
- before(:all) do
264
- @span_model = SpanModel.create!(:start_date => nil, :end_date => @query_date + 2.day)
265
- end
266
-
265
+ let(:start_date) { span_l[0] }
266
+ let(:end_date) { span_l[1] }
267
+
267
268
  it "should be included in #current" do
268
- SpanModel.current_on(@query_date).should include(@span_model)
269
- @span_model.current_on?(@query_date).should be_true
269
+ expect(SpanModel.current_on(query_date)).to include(span_model)
270
+ expect(span_model.current_on?(query_date)).to be_truthy
270
271
  end
271
-
272
+
272
273
  it "should NOT be included in #future" do
273
- SpanModel.future_on(@query_date).should_not include(@span_model)
274
- @span_model.future_on?(@query_date).should be_false
274
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
275
+ expect(span_model.future_on?(query_date)).to be_falsey
275
276
  end
276
-
277
+
277
278
  it "should NOT be included in #expired" do
278
- SpanModel.expired_on(@query_date).should_not include(@span_model)
279
- @span_model.expired_on?(@query_date).should be_false
279
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
280
+ expect(span_model.expired_on?(query_date)).to be_falsey
280
281
  end
281
282
  end
282
-
283
+
283
284
  context "M) start_date == nil & end_date == nil" do
284
- before(:all) do
285
- @span_model = SpanModel.create!(:start_date => nil, :end_date => nil)
286
- end
287
-
285
+ let(:start_date) { span_m[0] }
286
+ let(:end_date) { span_m[1] }
287
+
288
288
  it "should be included in #current" do
289
- SpanModel.current_on(@query_date).should include(@span_model)
290
- @span_model.current_on?(@query_date).should be_true
289
+ expect(SpanModel.current_on(query_date)).to include(span_model)
290
+ expect(span_model.current_on?(query_date)).to be_truthy
291
291
  end
292
-
292
+
293
293
  it "should NOT be included in #future" do
294
- SpanModel.future_on(@query_date).should_not include(@span_model)
295
- @span_model.future_on?(@query_date).should be_false
294
+ expect(SpanModel.future_on(query_date)).not_to include(span_model)
295
+ expect(span_model.future_on?(query_date)).to be_falsey
296
296
  end
297
-
297
+
298
298
  it "should NOT be included in #expired" do
299
- SpanModel.expired_on(@query_date).should_not include(@span_model)
300
- @span_model.expired_on?(@query_date).should be_false
299
+ expect(SpanModel.expired_on(query_date)).not_to include(span_model)
300
+ expect(span_model.expired_on?(query_date)).to be_falsey
301
301
  end
302
302
  end
303
303
  end
304
- end
304
+ end