sequel_bitemporal 0.8.1 → 0.8.2
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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/lib/sequel/plugins/bitemporal.rb +12 -11
- data/sequel_bitemporal.gemspec +3 -3
- data/spec/bitemporal_date_spec.rb +147 -135
- data/spec/bitemporal_date_with_range_spec.rb +127 -127
- data/spec/bitemporal_serialization_spec.rb +7 -7
- data/spec/bitemporal_time_spec.rb +82 -82
- data/spec/bitemporal_time_with_range_spec.rb +85 -85
- data/spec/spec_helper.rb +0 -1
- data/spec/support/bitemporal_matchers.rb +11 -11
- metadata +8 -7
@@ -11,44 +11,44 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
11
11
|
Timecop.return
|
12
12
|
end
|
13
13
|
it "checks version class is given" do
|
14
|
-
|
14
|
+
expect{
|
15
15
|
@version_class.plugin :bitemporal
|
16
|
-
}.
|
16
|
+
}.to raise_error Sequel::Error, "please specify version class to use for bitemporal plugin"
|
17
17
|
end
|
18
18
|
it "checks required columns are present" do
|
19
|
-
|
19
|
+
expect{
|
20
20
|
@version_class.plugin :bitemporal, version_class: @master_class
|
21
|
-
}.
|
21
|
+
}.to raise_error Sequel::Error, "bitemporal plugin requires the following missing columns on version class: master_id, valid_from, valid_to, created_at, expired_at"
|
22
22
|
end
|
23
23
|
it "defines current_versions_dataset" do
|
24
24
|
@master_class.new.
|
25
25
|
update_attributes(name: "Single Standard", price: 98).
|
26
26
|
update_attributes(name: "King Size")
|
27
27
|
versions = @master_class.current_versions_dataset.all
|
28
|
-
versions.
|
29
|
-
versions[0].name.
|
28
|
+
expect(versions.size).to eq(1)
|
29
|
+
expect(versions[0].name).to eq("King Size")
|
30
30
|
end
|
31
31
|
it "propagates errors from version to master" do
|
32
32
|
master = @master_class.new
|
33
|
-
master.
|
33
|
+
expect(master).to be_valid
|
34
34
|
master.attributes = {name: "Single Standard"}
|
35
|
-
master.
|
36
|
-
master.errors.
|
35
|
+
expect(master).not_to be_valid
|
36
|
+
expect(master.errors).to eq({price: ["is required"]})
|
37
37
|
end
|
38
38
|
it "#update_attributes returns false instead of raising errors" do
|
39
39
|
master = @master_class.new
|
40
|
-
master.update_attributes(name: "Single Standard").
|
41
|
-
master.
|
42
|
-
master.errors.
|
43
|
-
master.update_attributes(price: 98).
|
40
|
+
expect(master.update_attributes(name: "Single Standard")).to be_falsey
|
41
|
+
expect(master).to be_new
|
42
|
+
expect(master.errors).to eq({price: ["is required"]})
|
43
|
+
expect(master.update_attributes(price: 98)).to be_truthy
|
44
44
|
end
|
45
45
|
it "allows creating a master and its first version in one step" do
|
46
46
|
master = @master_class.new
|
47
47
|
result = master.update_attributes name: "Single Standard", price: 98
|
48
|
-
result.
|
49
|
-
result.
|
50
|
-
master.
|
51
|
-
master.
|
48
|
+
expect(result).to be_truthy
|
49
|
+
expect(result).to eq(master)
|
50
|
+
expect(master).not_to be_new
|
51
|
+
expect(master).to have_versions %Q{
|
52
52
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
53
53
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
54
54
|
}
|
@@ -56,7 +56,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
56
56
|
it "allows creating a new version in the past" do
|
57
57
|
master = @master_class.new
|
58
58
|
master.update_attributes name: "Single Standard", price: 98, valid_from: Date.today-1
|
59
|
-
master.
|
59
|
+
expect(master).to have_versions %Q{
|
60
60
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
61
61
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-27 | MAX DATE | true |
|
62
62
|
}
|
@@ -64,7 +64,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
64
64
|
it "allows creating a new version in the future" do
|
65
65
|
master = @master_class.new
|
66
66
|
master.update_attributes name: "Single Standard", price: 98, valid_from: Date.today+1
|
67
|
-
master.
|
67
|
+
expect(master).to have_versions %Q{
|
68
68
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
69
69
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-29 | MAX DATE | |
|
70
70
|
}
|
@@ -73,7 +73,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
73
73
|
master = @master_class.new
|
74
74
|
master.update_attributes name: "Single Standard", price: 98
|
75
75
|
master.update_attributes name: "Single Standard", price: 94
|
76
|
-
master.
|
76
|
+
expect(master).to have_versions %Q{
|
77
77
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
78
78
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
79
79
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
@@ -84,7 +84,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
84
84
|
master.update_attributes name: "Single Standard", price: 98
|
85
85
|
master.update_attributes price: 94
|
86
86
|
master.update_attributes name: "King Size"
|
87
|
-
master.
|
87
|
+
expect(master).to have_versions %Q{
|
88
88
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
89
89
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
90
90
|
| Single Standard | 94 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
@@ -96,7 +96,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
96
96
|
master.update_attributes name: "Single Standard", price: 98
|
97
97
|
Timecop.freeze Date.today+1
|
98
98
|
master.update_attributes price: 94
|
99
|
-
master.
|
99
|
+
expect(master).to have_versions %Q{
|
100
100
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
101
101
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | |
|
102
102
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -107,9 +107,9 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
107
107
|
master = @master_class.new
|
108
108
|
master.update_attributes name: "Single Standard", price: 98, valid_to: Date.today+1
|
109
109
|
Timecop.freeze Date.today+1
|
110
|
-
master.update_attributes(price: 94).
|
110
|
+
expect(master.update_attributes(price: 94)).to be_falsey
|
111
111
|
master.update_attributes name: "Single Standard", price: 94
|
112
|
-
master.
|
112
|
+
expect(master).to have_versions %Q{
|
113
113
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
114
114
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | 2009-11-29 | |
|
115
115
|
| Single Standard | 94 | 2009-11-29 | | 2009-11-29 | MAX DATE | true |
|
@@ -120,7 +120,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
120
120
|
master.update_attributes name: "Single Standard", price: 98
|
121
121
|
Timecop.freeze Date.today+1
|
122
122
|
master.update_attributes valid_to: Date.today+10
|
123
|
-
master.
|
123
|
+
expect(master).to have_versions %Q{
|
124
124
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
125
125
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | |
|
126
126
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -135,12 +135,12 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
135
135
|
master = @master_class.new
|
136
136
|
master.update_attributes name: "Single Standard", price: 98, valid_to: Date.today+2
|
137
137
|
Timecop.freeze Date.today+1
|
138
|
-
master.
|
138
|
+
expect(master).to have_versions %Q{
|
139
139
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
140
140
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | 2009-11-30 | true |
|
141
141
|
}
|
142
142
|
master.update_attributes valid_to: nil
|
143
|
-
master.
|
143
|
+
expect(master).to have_versions %Q{
|
144
144
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
145
145
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
146
146
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -156,7 +156,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
156
156
|
master.update_attributes name: "Single Standard", price: 98
|
157
157
|
master.update_attributes price: 98
|
158
158
|
master.update_attributes name: "Single Standard", price: 98
|
159
|
-
master.
|
159
|
+
expect(master).to have_versions %Q{
|
160
160
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
161
161
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
162
162
|
}
|
@@ -167,7 +167,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
167
167
|
Timecop.freeze Date.today+1
|
168
168
|
master.update_attributes price: 98, valid_from: Date.today-2
|
169
169
|
master.update_attributes price: 98, valid_from: Date.today+1
|
170
|
-
master.
|
170
|
+
expect(master).to have_versions %Q{
|
171
171
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
172
172
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
173
173
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-27 | 2009-11-28 | |
|
@@ -184,7 +184,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
184
184
|
master.update_attributes name: "Single Standard", price: 95, valid_from: Date.today+4, valid_to: Date.today+6
|
185
185
|
Timecop.freeze Date.today+1
|
186
186
|
master.update_attributes name: "King Size", valid_to: nil
|
187
|
-
master.
|
187
|
+
expect(master).to have_versions %Q{
|
188
188
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
189
189
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
190
190
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-30 | 2009-12-02 | |
|
@@ -200,7 +200,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
200
200
|
master.update_attributes name: "Single Standard", price: 95, valid_from: Date.today+4, valid_to: Date.today+6
|
201
201
|
Timecop.freeze Date.today+1
|
202
202
|
master.update_attributes name: "King Size", valid_to: Date.today+4
|
203
|
-
master.
|
203
|
+
expect(master).to have_versions %Q{
|
204
204
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
205
205
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
206
206
|
| Single Standard | 94 | 2009-11-28 | 2009-11-29 | 2009-11-30 | 2009-12-02 | |
|
@@ -217,7 +217,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
217
217
|
master.update_attributes name: "Single Standard", price: 95, valid_from: Date.today+4, valid_to: Date.today+6
|
218
218
|
Timecop.freeze Date.today+1
|
219
219
|
master.update_attributes name: "King Size", valid_to: Time.utc(9999)
|
220
|
-
master.
|
220
|
+
expect(master).to have_versions %Q{
|
221
221
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
222
222
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
223
223
|
| Single Standard | 94 | 2009-11-28 | 2009-11-29 | 2009-11-30 | 2009-12-02 | |
|
@@ -232,8 +232,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
232
232
|
master.update_attributes name: "Single Standard", price: 98
|
233
233
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
234
234
|
Timecop.freeze Date.today+1
|
235
|
-
master.current_version.destroy.
|
236
|
-
master.
|
235
|
+
expect(master.current_version.destroy).to be_truthy
|
236
|
+
expect(master).to have_versions %Q{
|
237
237
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
238
238
|
| Single Standard | 92 | 2009-11-28 | | 2009-11-26 | 2009-11-28 | |
|
239
239
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
@@ -241,7 +241,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
241
241
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-30 | MAX DATE | |
|
242
242
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
243
243
|
}
|
244
|
-
master.
|
244
|
+
expect(master).to be_deleted
|
245
245
|
end
|
246
246
|
it "allows deleting current version to restore the previous one" do
|
247
247
|
master = @master_class.new
|
@@ -249,8 +249,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
249
249
|
master.update_attributes name: "Single Standard", price: 98
|
250
250
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
251
251
|
Timecop.freeze Date.today+1
|
252
|
-
master.current_version.destroy(expand_previous_version: true).
|
253
|
-
master.
|
252
|
+
expect(master.current_version.destroy(expand_previous_version: true)).to be_truthy
|
253
|
+
expect(master).to have_versions %Q{
|
254
254
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
255
255
|
| Single Standard | 92 | 2009-11-28 | | 2009-11-26 | 2009-11-28 | |
|
256
256
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
@@ -265,8 +265,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
265
265
|
master.update_attributes name: "Single Standard", price: 98
|
266
266
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
267
267
|
Timecop.freeze Date.today+1
|
268
|
-
master.versions.last.destroy.
|
269
|
-
master.
|
268
|
+
expect(master.versions.last.destroy).to be_truthy
|
269
|
+
expect(master).to have_versions %Q{
|
270
270
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
271
271
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
272
272
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
@@ -279,8 +279,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
279
279
|
master.update_attributes name: "Single Standard", price: 98
|
280
280
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
281
281
|
Timecop.freeze Date.today+1
|
282
|
-
master.versions.last.destroy(expand_previous_version: false).
|
283
|
-
master.
|
282
|
+
expect(master.versions.last.destroy(expand_previous_version: false)).to be_truthy
|
283
|
+
expect(master).to have_versions %Q{
|
284
284
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
285
285
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
286
286
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | 2009-11-30 | true |
|
@@ -292,8 +292,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
292
292
|
master.update_attributes name: "Single Standard", price: 98
|
293
293
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
294
294
|
Timecop.freeze Date.today+1
|
295
|
-
master.destroy.
|
296
|
-
master.
|
295
|
+
expect(master.destroy).to be_truthy
|
296
|
+
expect(master).to have_versions %Q{
|
297
297
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
298
298
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-28 | MAX DATE | |
|
299
299
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | 2009-11-30 | |
|
@@ -307,7 +307,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
307
307
|
master2 = @master_class.find id: master.id
|
308
308
|
master.update_attributes name: "Single Standard", price: 94
|
309
309
|
master2.update_attributes name: "Single Standard", price: 95
|
310
|
-
master.
|
310
|
+
expect(master).to have_versions %Q{
|
311
311
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
312
312
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | |
|
313
313
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -322,7 +322,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
322
322
|
master2 = @master_class.find id: master.id
|
323
323
|
master.update_attributes price: 94
|
324
324
|
master2.update_attributes name: "King Size"
|
325
|
-
master.
|
325
|
+
expect(master).to have_versions %Q{
|
326
326
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
327
327
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | |
|
328
328
|
| Single Standard | 98 | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -333,11 +333,11 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
333
333
|
it "can expire invalid versions" do
|
334
334
|
master = @master_class.new.update_attributes name: "Single Standard", price: 98
|
335
335
|
master.current_version.price = nil
|
336
|
-
master.current_version.
|
336
|
+
expect(master.current_version).not_to be_valid
|
337
337
|
master.current_version.save validate: false
|
338
338
|
Timecop.freeze Date.today+1
|
339
339
|
master.update_attributes price: 94
|
340
|
-
master.
|
340
|
+
expect(master).to have_versions %Q{
|
341
341
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
342
342
|
| Single Standard | | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | |
|
343
343
|
| Single Standard | | 2009-11-29 | | 2009-11-28 | 2009-11-29 | |
|
@@ -353,17 +353,17 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
353
353
|
initial_today = Date.today
|
354
354
|
Timecop.freeze initial_today+1 do
|
355
355
|
master.update_attributes valid_from: initial_today+4, name: "King Size", price: 15, length: 2, width: 2
|
356
|
-
master.propagated_during_last_save.
|
356
|
+
expect(master.propagated_during_last_save.size).to eq(0)
|
357
357
|
end
|
358
358
|
Timecop.freeze initial_today+2 do
|
359
359
|
master.update_attributes valid_from: initial_today+3, length: 1, width: 1
|
360
|
-
master.propagated_during_last_save.
|
360
|
+
expect(master.propagated_during_last_save.size).to eq(0)
|
361
361
|
end
|
362
362
|
Timecop.freeze initial_today+3 do
|
363
363
|
master.update_attributes valid_from: initial_today+2, length: 3, width: 4
|
364
|
-
master.propagated_during_last_save.
|
364
|
+
expect(master.propagated_during_last_save.size).to eq(1)
|
365
365
|
end
|
366
|
-
master.
|
366
|
+
expect(master).to have_versions %Q{
|
367
367
|
| name | price | length | width | created_at | expired_at | valid_from | valid_to | current |
|
368
368
|
| Single Standard | 12 | | 1 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | true |
|
369
369
|
| Single Standard | 12 | | 1 | 2009-11-29 | 2009-11-30 | 2009-11-28 | 2009-12-02 | |
|
@@ -378,14 +378,26 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
378
378
|
@master_class.instance_variable_set :@propagate_per_column, propagate_per_column
|
379
379
|
end
|
380
380
|
end
|
381
|
-
it "allows eager
|
381
|
+
it "allows eager graphing with conditions on current version" do
|
382
382
|
master = @master_class.new
|
383
383
|
master.update_attributes name: "Single Standard", price: 98
|
384
384
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
385
|
-
@master_class.eager_graph(:current_version).where("rooms_current_version.id IS NOT NULL").first.
|
385
|
+
expect(@master_class.eager_graph(:current_version).where("rooms_current_version.id IS NOT NULL").first).to be
|
386
386
|
Timecop.freeze Date.today+1
|
387
387
|
master.destroy
|
388
|
-
@master_class.eager_graph(:current_version).where("rooms_current_version.id IS NOT NULL").first.
|
388
|
+
expect(@master_class.eager_graph(:current_version).where("rooms_current_version.id IS NOT NULL").first).to be_nil
|
389
|
+
end
|
390
|
+
it "allows eager loading via a separate query" do
|
391
|
+
master = @master_class.new
|
392
|
+
master.update_attributes name: "Single Standard", price: 98
|
393
|
+
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
394
|
+
result = @master_class.eager(:current_version).all.first
|
395
|
+
expect(result.associations[:current_version]).not_to be_nil
|
396
|
+
expect(result.current_version.price).to eq(98)
|
397
|
+
::Sequel::Plugins::Bitemporal.as_we_knew_it Date.today-1 do
|
398
|
+
result = @master_class.eager(:current_version).all.first
|
399
|
+
expect(result.associations[:current_version]).to be_nil
|
400
|
+
end
|
389
401
|
end
|
390
402
|
it "allows loading masters with a current version" do
|
391
403
|
master_destroyed = @master_class.new
|
@@ -395,27 +407,27 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
395
407
|
master_with_current.update_attributes name: "Single Standard", price: 94
|
396
408
|
master_with_future = @master_class.new
|
397
409
|
master_with_future.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
398
|
-
@master_class.with_current_version.all.
|
410
|
+
expect(@master_class.with_current_version.all.size).to eq(1)
|
399
411
|
end
|
400
412
|
it "gets pending or current version attributes" do
|
401
413
|
master = @master_class.new
|
402
|
-
master.attributes.
|
403
|
-
master.pending_version.
|
404
|
-
master.current_version.
|
405
|
-
master.name.
|
414
|
+
expect(master.attributes).to eq({})
|
415
|
+
expect(master.pending_version).to be_nil
|
416
|
+
expect(master.current_version).to be_nil
|
417
|
+
expect(master.name).to be_nil
|
406
418
|
|
407
|
-
master.pending_or_current_version.name.
|
419
|
+
expect(master.pending_or_current_version.name).to be_nil
|
408
420
|
master.update_attributes name: "Single Standard", price: 98
|
409
|
-
master.attributes[:name].
|
410
|
-
master.pending_version.
|
411
|
-
master.pending_or_current_version.name.
|
412
|
-
master.name.
|
421
|
+
expect(master.attributes[:name]).to eq("Single Standard")
|
422
|
+
expect(master.pending_version).to be_nil
|
423
|
+
expect(master.pending_or_current_version.name).to eq("Single Standard")
|
424
|
+
expect(master.name).to eq("Single Standard")
|
413
425
|
|
414
426
|
master.attributes = {name: "King Size"}
|
415
|
-
master.attributes[:name].
|
416
|
-
master.pending_version.
|
417
|
-
master.pending_or_current_version.name.
|
418
|
-
master.name.
|
427
|
+
expect(master.attributes[:name]).to eq("King Size")
|
428
|
+
expect(master.pending_version).to be
|
429
|
+
expect(master.pending_or_current_version.name).to eq("King Size")
|
430
|
+
expect(master.name).to eq("King Size")
|
419
431
|
end
|
420
432
|
it "allows creating a new version before all other versions in case of propagation per column" do
|
421
433
|
propagate_per_column = @master_class.propagate_per_column
|
@@ -425,9 +437,9 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
425
437
|
master.update_attributes name: "Single Standard", price: 98
|
426
438
|
Timecop.freeze Date.today - 100 do
|
427
439
|
master.update_attributes name: "Single Standard", price: 95
|
428
|
-
master.propagated_during_last_save.
|
440
|
+
expect(master.propagated_during_last_save.size).to eq(0)
|
429
441
|
end
|
430
|
-
master.
|
442
|
+
expect(master).to have_versions %Q{
|
431
443
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
432
444
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
433
445
|
| Single Standard | 95 | 2009-08-20 | | 2009-08-20 | 2009-11-28 | |
|
@@ -445,7 +457,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
445
457
|
Timecop.freeze Date.today+1
|
446
458
|
master.update_attributes price: 94
|
447
459
|
master.update_attributes price: 96, valid_from: Date.today+2
|
448
|
-
master.
|
460
|
+
expect(master).to have_versions %Q{
|
449
461
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
450
462
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-28 | 2009-11-29 | |
|
451
463
|
| Single Standard | 95 | 2009-11-28 | 2009-11-29 | 2009-11-29 | 2009-11-30 | |
|
@@ -454,44 +466,44 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
454
466
|
| Single Standard | 94 | 2009-11-29 | | 2009-11-29 | 2009-11-30 | true |
|
455
467
|
| Single Standard | 96 | 2009-11-29 | | 2009-12-01 | MAX DATE | |
|
456
468
|
}
|
457
|
-
master.current_version.price.
|
469
|
+
expect(master.current_version.price).to eq(94)
|
458
470
|
Sequel::Plugins::Bitemporal.at(Date.today-1) do
|
459
|
-
master.current_version(true).price.
|
471
|
+
expect(master.current_version(true).price).to eq(98)
|
460
472
|
end
|
461
473
|
Sequel::Plugins::Bitemporal.at(Date.today+1) do
|
462
|
-
master.current_version(true).price.
|
474
|
+
expect(master.current_version(true).price).to eq(93)
|
463
475
|
end
|
464
476
|
Sequel::Plugins::Bitemporal.at(Date.today+2) do
|
465
|
-
master.current_version(true).price.
|
477
|
+
expect(master.current_version(true).price).to eq(96)
|
466
478
|
end
|
467
479
|
Sequel::Plugins::Bitemporal.as_we_knew_it(Date.today-1) do
|
468
|
-
master.current_version(true).price.
|
469
|
-
master.current_version.
|
480
|
+
expect(master.current_version(true).price).to eq(95)
|
481
|
+
expect(master.current_version).to be_current
|
470
482
|
Sequel::Plugins::Bitemporal.at(Date.today-1) do
|
471
|
-
master.current_version(true).price.
|
483
|
+
expect(master.current_version(true).price).to eq(98)
|
472
484
|
end
|
473
485
|
Sequel::Plugins::Bitemporal.at(Date.today+1) do
|
474
|
-
master.current_version(true).price.
|
486
|
+
expect(master.current_version(true).price).to eq(93)
|
475
487
|
end
|
476
488
|
Sequel::Plugins::Bitemporal.at(Date.today+2) do
|
477
|
-
master.current_version(true).price.
|
489
|
+
expect(master.current_version(true).price).to eq(91)
|
478
490
|
end
|
479
491
|
end
|
480
492
|
end
|
481
493
|
it "correctly reset time if failure when going back in time" do
|
482
494
|
before = Sequel::Plugins::Bitemporal.now
|
483
|
-
|
495
|
+
expect do
|
484
496
|
Sequel::Plugins::Bitemporal.at(Date.today+2) do
|
485
497
|
raise StandardError, "error during back in time"
|
486
498
|
end
|
487
|
-
end.
|
488
|
-
Sequel::Plugins::Bitemporal.now.
|
489
|
-
|
499
|
+
end.to raise_error StandardError
|
500
|
+
expect(Sequel::Plugins::Bitemporal.now).to eq(before)
|
501
|
+
expect do
|
490
502
|
Sequel::Plugins::Bitemporal.as_we_knew_it(Date.today+2) do
|
491
503
|
raise StandardError, "error during back in time"
|
492
504
|
end
|
493
|
-
end.
|
494
|
-
Sequel::Plugins::Bitemporal.now.
|
505
|
+
end.to raise_error StandardError
|
506
|
+
expect(Sequel::Plugins::Bitemporal.now).to eq(before)
|
495
507
|
end
|
496
508
|
it "allows eager loading with conditions on current or future versions" do
|
497
509
|
master = @master_class.new
|
@@ -500,16 +512,16 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
500
512
|
master.update_attributes name: "Single Standard", price: 99
|
501
513
|
master.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
502
514
|
res = @master_class.eager_graph(:current_or_future_versions).where(Sequel.negate(current_or_future_versions__id: nil) & {price: 99}).all.first
|
503
|
-
res.
|
504
|
-
res.current_or_future_versions.
|
505
|
-
res.current_or_future_versions.first.price.
|
515
|
+
expect(res).to be
|
516
|
+
expect(res.current_or_future_versions.size).to eq(1)
|
517
|
+
expect(res.current_or_future_versions.first.price).to eq(99)
|
506
518
|
res = @master_class.eager_graph(:current_or_future_versions).where(Sequel.negate(current_or_future_versions__id: nil) & {price: 94}).all.first
|
507
|
-
res.
|
508
|
-
res.current_or_future_versions.
|
509
|
-
res.current_or_future_versions.first.price.
|
519
|
+
expect(res).to be
|
520
|
+
expect(res.current_or_future_versions.size).to eq(1)
|
521
|
+
expect(res.current_or_future_versions.first.price).to eq(94)
|
510
522
|
Timecop.freeze Date.today+1
|
511
523
|
master.destroy
|
512
|
-
@master_class.eager_graph(:current_or_future_versions).where(Sequel.negate(current_or_future_versions__id: nil)).all.
|
524
|
+
expect(@master_class.eager_graph(:current_or_future_versions).where(Sequel.negate(current_or_future_versions__id: nil)).all).to be_empty
|
513
525
|
end
|
514
526
|
it "allows loading masters with current or future versions" do
|
515
527
|
master_destroyed = @master_class.new
|
@@ -519,16 +531,16 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
519
531
|
master_with_current.update_attributes name: "Single Standard", price: 94
|
520
532
|
master_with_future = @master_class.new
|
521
533
|
master_with_future.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+2
|
522
|
-
@master_class.with_current_or_future_versions.all.
|
534
|
+
expect(@master_class.with_current_or_future_versions.all.size).to eq(2)
|
523
535
|
end
|
524
536
|
it "delegates attributes from master to pending_or_current_version" do
|
525
537
|
master = @master_class.new
|
526
|
-
master.name.
|
538
|
+
expect(master.name).to be_nil
|
527
539
|
master.update_attributes name: "Single Standard", price: 98
|
528
|
-
master.name.
|
540
|
+
expect(master.name).to eq("Single Standard")
|
529
541
|
master.attributes = {name: "King Size"}
|
530
|
-
master.name.
|
531
|
-
master.price.
|
542
|
+
expect(master.name).to eq("King Size")
|
543
|
+
expect(master.price).to eq(98)
|
532
544
|
end
|
533
545
|
it "avoids delegation with option delegate: false" do
|
534
546
|
closure = @version_class
|
@@ -550,7 +562,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
550
562
|
master = without_delegation_class.new
|
551
563
|
master.attributes = {name: "Single Standard", price: 98}
|
552
564
|
expect{ master.name }.to raise_error NoMethodError
|
553
|
-
master.price.
|
565
|
+
expect(master.price).to eq(98)
|
554
566
|
end
|
555
567
|
it "avoids delegation of columns which are both in master and version" do
|
556
568
|
closure = @version_class
|
@@ -564,8 +576,8 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
564
576
|
end
|
565
577
|
master = without_delegation_class.new name: "Master Hotel"
|
566
578
|
master.attributes = {name: "Single Standard", price: 98}
|
567
|
-
master.name.
|
568
|
-
master.price.
|
579
|
+
expect(master.name).to eq("Master Hotel")
|
580
|
+
expect(master.price).to eq(98)
|
569
581
|
DB.drop_table :rooms_with_name
|
570
582
|
end
|
571
583
|
it "get current_version association name from class name" do
|
@@ -586,19 +598,19 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
586
598
|
master = @master_class.new.update_attributes name: "Single Standard", price: 98
|
587
599
|
master.disabled = true
|
588
600
|
master.update_attributes price: 94
|
589
|
-
master.reload.disabled.
|
601
|
+
expect(master.reload.disabled).to be_truthy
|
590
602
|
end
|
591
603
|
it "uses current version for partial_update even if valid_from is specified" do
|
592
604
|
master = @master_class.new
|
593
605
|
master.update_attributes name: "Single Standard", price: 98, valid_from: Date.today-2, valid_to: Date.today
|
594
606
|
master.update_attributes name: "Single Standard", price: 94
|
595
|
-
master.
|
607
|
+
expect(master).to have_versions %Q{
|
596
608
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
597
609
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-26 | 2009-11-28 | |
|
598
610
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
599
611
|
}
|
600
612
|
master.update_attributes name: "King Size", valid_from: Date.today-2
|
601
|
-
master.
|
613
|
+
expect(master).to have_versions %Q{
|
602
614
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
603
615
|
| Single Standard | 98 | 2009-11-28 | 2009-11-28 | 2009-11-26 | 2009-11-28 | |
|
604
616
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
@@ -611,7 +623,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
611
623
|
Sequel::Plugins::Bitemporal.as_we_knew_it(Date.today+1) do
|
612
624
|
master.update_attributes name: "King Size"
|
613
625
|
end
|
614
|
-
master.
|
626
|
+
expect(master).to have_versions %Q{
|
615
627
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
616
628
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | true |
|
617
629
|
| King Size | 98 | 2009-11-29 | | 2009-11-28 | MAX DATE | |
|
@@ -619,7 +631,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
619
631
|
Sequel::Plugins::Bitemporal.as_we_knew_it(Date.today+2) do
|
620
632
|
master.current_version(true).destroy
|
621
633
|
end
|
622
|
-
master.
|
634
|
+
expect(master).to have_versions %Q{
|
623
635
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
624
636
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-28 | MAX DATE | true |
|
625
637
|
| King Size | 98 | 2009-11-29 | 2009-11-30 | 2009-11-28 | MAX DATE | |
|
@@ -630,7 +642,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
630
642
|
master = @master_class.new
|
631
643
|
master.update_attributes name: "Single Standard", price: 98, valid_from: Date.today-2, valid_to: Date.today
|
632
644
|
master.update_attributes name: "Single Standard", price: 94
|
633
|
-
master.
|
645
|
+
expect(master).to have_versions %Q{
|
634
646
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
635
647
|
| Single Standard | 98 | 2009-11-28 | | 2009-11-26 | 2009-11-28 | |
|
636
648
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
@@ -640,7 +652,7 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
640
652
|
master.update_attributes name: "King Size"
|
641
653
|
end
|
642
654
|
end
|
643
|
-
master.
|
655
|
+
expect(master).to have_versions %Q{
|
644
656
|
| name | price | created_at | expired_at | valid_from | valid_to | current |
|
645
657
|
| Single Standard | 98 | 2009-11-28 | 2009-11-29 | 2009-11-26 | 2009-11-28 | |
|
646
658
|
| Single Standard | 94 | 2009-11-28 | | 2009-11-28 | MAX DATE | true |
|
@@ -651,32 +663,32 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
651
663
|
context "#deleted?" do
|
652
664
|
subject{ @master_class.new }
|
653
665
|
it "is false unless persisted" do
|
654
|
-
subject.
|
666
|
+
expect(subject).not_to be_deleted
|
655
667
|
end
|
656
668
|
it "is false when persisted with a current version" do
|
657
|
-
subject.update_attributes(name: "Single Standard", price: 94).
|
669
|
+
expect(subject.update_attributes(name: "Single Standard", price: 94)).not_to be_deleted
|
658
670
|
end
|
659
671
|
it "is true when persisted without a current version" do
|
660
|
-
subject.update_attributes(name: "Single Standard", price: 94, valid_from: Date.today+1).
|
672
|
+
expect(subject.update_attributes(name: "Single Standard", price: 94, valid_from: Date.today+1)).to be_deleted
|
661
673
|
end
|
662
674
|
end
|
663
675
|
context "#last_version" do
|
664
676
|
subject{ @master_class.new }
|
665
677
|
it "is nil unless persisted" do
|
666
|
-
subject.last_version.
|
678
|
+
expect(subject.last_version).to be_nil
|
667
679
|
end
|
668
680
|
it "is current version when persisted with a current version" do
|
669
681
|
subject.update_attributes name: "Single Standard", price: 94
|
670
|
-
subject.last_version.
|
682
|
+
expect(subject.last_version).to eq(subject.current_version)
|
671
683
|
end
|
672
684
|
it "is nil with future version but no current version" do
|
673
685
|
subject.update_attributes name: "Single Standard", price: 94, valid_from: Date.today+1
|
674
|
-
subject.last_version.
|
686
|
+
expect(subject.last_version).to be_nil
|
675
687
|
end
|
676
688
|
it "is last version with previous version but no current version" do
|
677
689
|
subject.update_attributes name: "Single Standard", price: 94, valid_from: Date.today-2, valid_to: Date.today-1
|
678
|
-
subject.current_version.
|
679
|
-
subject.last_version.
|
690
|
+
expect(subject.current_version).to be_nil
|
691
|
+
expect(subject.last_version).to eq(subject.versions.last)
|
680
692
|
end
|
681
693
|
end
|
682
694
|
context "#restore" do
|
@@ -684,13 +696,13 @@ describe "Sequel::Plugins::Bitemporal" do
|
|
684
696
|
it "make last version current" do
|
685
697
|
subject.update_attributes name: "Single Standard", price: 94, valid_from: Date.today-2, valid_to: Date.today-1
|
686
698
|
subject.restore
|
687
|
-
subject.current_version.
|
699
|
+
expect(subject.current_version).to eq(subject.last_version)
|
688
700
|
end
|
689
701
|
it "can add additional attributes to apply" do
|
690
702
|
subject.update_attributes name: "Single Standard", price: 94, valid_from: Date.today-2, valid_to: Date.today-1
|
691
703
|
subject.restore name: "New Standard"
|
692
|
-
subject.current_version.name.
|
693
|
-
subject.current_version.price.
|
704
|
+
expect(subject.current_version.name).to eq("New Standard")
|
705
|
+
expect(subject.current_version.price).to eq(94)
|
694
706
|
end
|
695
707
|
end
|
696
708
|
end
|
@@ -711,8 +723,8 @@ describe "Sequel::Plugins::Bitemporal", "with audit" do
|
|
711
723
|
let(:author){ double :author, audit_kind: "user" }
|
712
724
|
it "generates a new audit on creation" do
|
713
725
|
master = @master_class.new
|
714
|
-
master.
|
715
|
-
@audit_class.
|
726
|
+
expect(master).to receive(:updated_by).and_return author
|
727
|
+
expect(@audit_class).to receive(:audit).with(
|
716
728
|
master,
|
717
729
|
{},
|
718
730
|
hash_including({name: "Single Standard", price: 98}),
|
@@ -723,9 +735,9 @@ describe "Sequel::Plugins::Bitemporal", "with audit" do
|
|
723
735
|
end
|
724
736
|
it "generates a new audit on full update" do
|
725
737
|
master = @master_class.new
|
726
|
-
master.
|
738
|
+
expect(master).to receive(:updated_by).twice.and_return author
|
727
739
|
master.update_attributes name: "Single Standard", price: 98
|
728
|
-
@audit_class.
|
740
|
+
expect(@audit_class).to receive(:audit).with(
|
729
741
|
master,
|
730
742
|
hash_including({name: "Single Standard", price: 98}),
|
731
743
|
hash_including({name: "King size", price: 98}),
|
@@ -736,9 +748,9 @@ describe "Sequel::Plugins::Bitemporal", "with audit" do
|
|
736
748
|
end
|
737
749
|
it "generates a new audit on partial update" do
|
738
750
|
master = @master_class.new
|
739
|
-
master.
|
751
|
+
expect(master).to receive(:updated_by).twice.and_return author
|
740
752
|
master.update_attributes name: "Single Standard", price: 98
|
741
|
-
@audit_class.
|
753
|
+
expect(@audit_class).to receive(:audit).with(
|
742
754
|
master,
|
743
755
|
hash_including({name: "Single Standard", price: 98}),
|
744
756
|
hash_including({name: "King size", price: 98}),
|
@@ -752,30 +764,30 @@ describe "Sequel::Plugins::Bitemporal", "with audit" do
|
|
752
764
|
begin
|
753
765
|
@master_class.instance_variable_set :@propagate_per_column, true
|
754
766
|
master = @master_class.new
|
755
|
-
master.
|
767
|
+
expect(master).to receive(:updated_by).exactly(8).times.and_return author
|
756
768
|
|
757
769
|
master.update_attributes name: "Single Standard", price: 12, length: nil, width: 1
|
758
770
|
initial_today = Date.today
|
759
771
|
Timecop.freeze initial_today+1 do
|
760
772
|
Sequel::Plugins::Bitemporal.at initial_today+4 do
|
761
773
|
master.update_attributes valid_from: initial_today+4, name: "King Size", price: 15, length: 2, width: 2
|
762
|
-
master.propagated_during_last_save.
|
774
|
+
expect(master.propagated_during_last_save.size).to eq(0)
|
763
775
|
end
|
764
776
|
end
|
765
777
|
Timecop.freeze initial_today+2 do
|
766
778
|
Sequel::Plugins::Bitemporal.at initial_today+3 do
|
767
779
|
master.update_attributes valid_from: initial_today+3, length: 1, width: 1
|
768
|
-
master.propagated_during_last_save.
|
780
|
+
expect(master.propagated_during_last_save.size).to eq(0)
|
769
781
|
end
|
770
782
|
end
|
771
|
-
@audit_class.
|
783
|
+
expect(@audit_class).to receive(:audit).with(
|
772
784
|
master,
|
773
785
|
hash_including({name: "Single Standard", price: 12, length: nil, width: 1}),
|
774
786
|
hash_including({name: "Single Standard", price: 12, length: 3, width: 4}),
|
775
787
|
initial_today+2,
|
776
788
|
author
|
777
789
|
)
|
778
|
-
@audit_class.
|
790
|
+
expect(@audit_class).to receive(:audit).with(
|
779
791
|
master,
|
780
792
|
hash_including({name: "Single Standard", price: 12, length: 1, width: 1}),
|
781
793
|
hash_including({name: "Single Standard", price: 12, length: 1, width: 4}),
|
@@ -785,7 +797,7 @@ describe "Sequel::Plugins::Bitemporal", "with audit" do
|
|
785
797
|
Timecop.freeze initial_today+3 do
|
786
798
|
Sequel::Plugins::Bitemporal.at initial_today+2 do
|
787
799
|
master.update_attributes valid_from: initial_today+2, length: 3, width: 4
|
788
|
-
master.propagated_during_last_save.
|
800
|
+
expect(master.propagated_during_last_save.size).to eq(1)
|
789
801
|
end
|
790
802
|
end
|
791
803
|
ensure
|
@@ -809,8 +821,8 @@ describe "Sequel::Plugins::Bitemporal", "with audit, specifying how to get the a
|
|
809
821
|
end
|
810
822
|
it "generates a new audit on creation" do
|
811
823
|
master = @master_class.new
|
812
|
-
master.
|
813
|
-
@audit_class.
|
824
|
+
expect(master).to receive(:author).and_return author
|
825
|
+
expect(@audit_class).to receive(:audit).with(
|
814
826
|
master,
|
815
827
|
{},
|
816
828
|
hash_including({name: "Single Standard", price: 98}),
|
@@ -821,9 +833,9 @@ describe "Sequel::Plugins::Bitemporal", "with audit, specifying how to get the a
|
|
821
833
|
end
|
822
834
|
it "generates a new audit on update" do
|
823
835
|
master = @master_class.new
|
824
|
-
master.
|
836
|
+
expect(master).to receive(:author).twice.and_return author
|
825
837
|
master.update_attributes name: "Single Standard", price: 98
|
826
|
-
@audit_class.
|
838
|
+
expect(@audit_class).to receive(:audit).with(
|
827
839
|
master,
|
828
840
|
hash_including({name: "Single Standard", price: 98}),
|
829
841
|
hash_including({name: "King size", price: 98}),
|