mongoid_paranoia 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
- class Tag
2
- include Mongoid::Document
3
- field :text, type: String
4
- has_and_belongs_to_many :paranoid_posts
5
- has_and_belongs_to_many :related, class_name: "Tag", inverse_of: :related
6
- end
1
+ class Tag
2
+ include Mongoid::Document
3
+ field :text, type: String
4
+ has_and_belongs_to_many :paranoid_posts
5
+ has_and_belongs_to_many :related, class_name: "Tag", inverse_of: :related
6
+ end
@@ -1,4 +1,4 @@
1
- class Title
2
- include Mongoid::Document
3
- belongs_to :paranoid_post
4
- end
1
+ class Title
2
+ include Mongoid::Document
3
+ belongs_to :paranoid_post
4
+ end
@@ -1,19 +1,19 @@
1
- require "spec_helper"
2
-
3
- module Mongoid
4
- module Paranoia
5
- describe Configuration do
6
- describe '#paranoid_field' do
7
- it 'initializes with default value set to :deleted_at' do
8
- expect(Configuration.new.paranoid_field).to eq(:deleted_at)
9
- end
10
-
11
- it 'can be updated' do
12
- config = Configuration.new
13
- config.paranoid_field = :myFieldName
14
- expect(config.paranoid_field).to eq(:myFieldName)
15
- end
16
- end
17
- end
18
- end
19
- end
1
+ require "spec_helper"
2
+
3
+ module Mongoid
4
+ module Paranoia
5
+ describe Configuration do
6
+ describe '#paranoid_field' do
7
+ it 'initializes with default value set to :deleted_at' do
8
+ expect(Configuration.new.paranoid_field).to eq(:deleted_at)
9
+ end
10
+
11
+ it 'can be updated' do
12
+ config = Configuration.new
13
+ config.paranoid_field = :myFieldName
14
+ expect(config.paranoid_field).to eq(:myFieldName)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,21 +1,21 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Document do
4
-
5
- describe ".paranoid?" do
6
-
7
- context "when Mongoid::Paranoia is included" do
8
- subject { ParanoidPost }
9
- it "returns true" do
10
- expect(subject.paranoid?).to be_truthy
11
- end
12
- end
13
-
14
- context "when Mongoid::Paranoia not included" do
15
- subject { Author }
16
- it "returns true" do
17
- expect(subject.paranoid?).to be_falsey
18
- end
19
- end
20
- end
21
- end
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Document do
4
+
5
+ describe ".paranoid?" do
6
+
7
+ context "when Mongoid::Paranoia is included" do
8
+ subject { ParanoidPost }
9
+ it "returns true" do
10
+ expect(subject.paranoid?).to be_truthy
11
+ end
12
+ end
13
+
14
+ context "when Mongoid::Paranoia not included" do
15
+ subject { Author }
16
+ it "returns true" do
17
+ expect(subject.paranoid?).to be_falsey
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,164 +1,164 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Attributes::Nested do
4
- describe "##{name}_attributes=" do
5
- context "when the parent document is new" do
6
- context "when the relation is an embeds many" do
7
- context "when ids are passed" do
8
-
9
- let(:person) do
10
- Person.create
11
- end
12
-
13
- let(:address_one) do
14
- Address.new(street: "Unter den Linden")
15
- end
16
-
17
- let(:address_two) do
18
- Address.new(street: "Kurfeurstendamm")
19
- end
20
-
21
- let(:phone_one) do
22
- ParanoidPhone.new(number: "1")
23
- end
24
-
25
- let(:phone_two) do
26
- ParanoidPhone.new(number: "2")
27
- end
28
-
29
- before do
30
- person.addresses << [ address_one, address_two ]
31
- end
32
-
33
- context "when destroy attributes are passed" do
34
- context "when the ids match" do
35
- context "when allow_destroy is true" do
36
- context "when the child is paranoid" do
37
-
38
- before(:all) do
39
- Person.send(:undef_method, :paranoid_phones_attributes=)
40
- Person.accepts_nested_attributes_for :paranoid_phones,
41
- allow_destroy: true
42
- end
43
-
44
- after(:all) do
45
- Person.send(:undef_method, :paranoid_phones_attributes=)
46
- Person.accepts_nested_attributes_for :paranoid_phones
47
- end
48
-
49
- [ 1, "1", true, "true" ].each do |truth|
50
-
51
- context "when passed a #{truth} with destroy" do
52
- context "when the parent is persisted" do
53
-
54
- let!(:persisted) do
55
- Person.create do |p|
56
- p.paranoid_phones << [ phone_one, phone_two ]
57
- end
58
- end
59
-
60
- context "when setting, pulling, and pushing in one op" do
61
-
62
- before do
63
- persisted.paranoid_phones_attributes =
64
- {
65
- "bar" => { "id" => phone_one.id, "_destroy" => truth },
66
- "foo" => { "id" => phone_two.id, "number" => "3" },
67
- "baz" => { "number" => "4" }
68
- }
69
- end
70
-
71
- it "removes the first document from the relation" do
72
- expect(persisted.paranoid_phones.size).to eq(2)
73
- end
74
-
75
- it "does not delete the unmarked document" do
76
- expect(persisted.paranoid_phones.first.number).to eq("3")
77
- end
78
-
79
- it "adds the new document to the relation" do
80
- expect(persisted.paranoid_phones.last.number).to eq("4")
81
- end
82
-
83
- it "has the proper persisted count" do
84
- expect(persisted.paranoid_phones.count).to eq(1)
85
- end
86
-
87
- it "soft deletes the removed document" do
88
- expect(phone_one).to be_destroyed
89
- end
90
-
91
- context "when saving the parent" do
92
-
93
- before do
94
- persisted.save
95
- end
96
-
97
- it "deletes the marked document from the relation" do
98
- expect(persisted.reload.paranoid_phones.count).to eq(2)
99
- end
100
-
101
- it "does not delete the unmarked document" do
102
- expect(persisted.reload.paranoid_phones.first.number).to eq("3")
103
- end
104
-
105
- it "persists the new document to the relation" do
106
- expect(persisted.reload.paranoid_phones.last.number).to eq("4")
107
- end
108
- end
109
- end
110
- end
111
- end
112
- end
113
- end
114
-
115
- context "when the child has defaults" do
116
-
117
- before(:all) do
118
- Person.accepts_nested_attributes_for :appointments, allow_destroy: true
119
- end
120
-
121
- after(:all) do
122
- Person.send(:undef_method, :appointments_attributes=)
123
- end
124
- context "when the parent is persisted" do
125
- context "when the child returns false in a before callback" do
126
- context "when the child is paranoid" do
127
-
128
- before(:all) do
129
- Person.accepts_nested_attributes_for :paranoid_phones, allow_destroy: true
130
- end
131
-
132
- after(:all) do
133
- Person.send(:undef_method, :paranoid_phones=)
134
- Person.accepts_nested_attributes_for :paranoid_phones
135
- end
136
-
137
- let!(:persisted) do
138
- Person.create(age: 42)
139
- end
140
-
141
- let!(:phone) do
142
- persisted.paranoid_phones.create
143
- end
144
-
145
- before do
146
- persisted.paranoid_phones_attributes =
147
- { "foo" => { "id" => phone.id, "number" => 42, "_destroy" => true }}
148
- end
149
-
150
- it "does not destroy the child" do
151
- expect(persisted.reload.paranoid_phones).not_to be_empty
152
- end
153
- end
154
- end
155
- end
156
- end
157
- end
158
- end
159
- end
160
- end
161
- end
162
- end
163
- end
164
- end
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Attributes::Nested do
4
+ describe "##{name}_attributes=" do
5
+ context "when the parent document is new" do
6
+ context "when the relation is an embeds many" do
7
+ context "when ids are passed" do
8
+
9
+ let(:person) do
10
+ Person.create
11
+ end
12
+
13
+ let(:address_one) do
14
+ Address.new(street: "Unter den Linden")
15
+ end
16
+
17
+ let(:address_two) do
18
+ Address.new(street: "Kurfeurstendamm")
19
+ end
20
+
21
+ let(:phone_one) do
22
+ ParanoidPhone.new(number: "1")
23
+ end
24
+
25
+ let(:phone_two) do
26
+ ParanoidPhone.new(number: "2")
27
+ end
28
+
29
+ before do
30
+ person.addresses << [ address_one, address_two ]
31
+ end
32
+
33
+ context "when destroy attributes are passed" do
34
+ context "when the ids match" do
35
+ context "when allow_destroy is true" do
36
+ context "when the child is paranoid" do
37
+
38
+ before(:all) do
39
+ Person.send(:undef_method, :paranoid_phones_attributes=)
40
+ Person.accepts_nested_attributes_for :paranoid_phones,
41
+ allow_destroy: true
42
+ end
43
+
44
+ after(:all) do
45
+ Person.send(:undef_method, :paranoid_phones_attributes=)
46
+ Person.accepts_nested_attributes_for :paranoid_phones
47
+ end
48
+
49
+ [ 1, "1", true, "true" ].each do |truth|
50
+
51
+ context "when passed a #{truth} with destroy" do
52
+ context "when the parent is persisted" do
53
+
54
+ let!(:persisted) do
55
+ Person.create do |p|
56
+ p.paranoid_phones << [ phone_one, phone_two ]
57
+ end
58
+ end
59
+
60
+ context "when setting, pulling, and pushing in one op" do
61
+
62
+ before do
63
+ persisted.paranoid_phones_attributes =
64
+ {
65
+ "bar" => { "id" => phone_one.id, "_destroy" => truth },
66
+ "foo" => { "id" => phone_two.id, "number" => "3" },
67
+ "baz" => { "number" => "4" }
68
+ }
69
+ end
70
+
71
+ it "removes the first document from the relation" do
72
+ expect(persisted.paranoid_phones.size).to eq(2)
73
+ end
74
+
75
+ it "does not delete the unmarked document" do
76
+ expect(persisted.paranoid_phones.first.number).to eq("3")
77
+ end
78
+
79
+ it "adds the new document to the relation" do
80
+ expect(persisted.paranoid_phones.last.number).to eq("4")
81
+ end
82
+
83
+ it "has the proper persisted count" do
84
+ expect(persisted.paranoid_phones.count).to eq(1)
85
+ end
86
+
87
+ it "soft deletes the removed document" do
88
+ expect(phone_one).to be_destroyed
89
+ end
90
+
91
+ context "when saving the parent" do
92
+
93
+ before do
94
+ persisted.save
95
+ end
96
+
97
+ it "deletes the marked document from the relation" do
98
+ expect(persisted.reload.paranoid_phones.count).to eq(2)
99
+ end
100
+
101
+ it "does not delete the unmarked document" do
102
+ expect(persisted.reload.paranoid_phones.first.number).to eq("3")
103
+ end
104
+
105
+ it "persists the new document to the relation" do
106
+ expect(persisted.reload.paranoid_phones.last.number).to eq("4")
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ context "when the child has defaults" do
116
+
117
+ before(:all) do
118
+ Person.accepts_nested_attributes_for :appointments, allow_destroy: true
119
+ end
120
+
121
+ after(:all) do
122
+ Person.send(:undef_method, :appointments_attributes=)
123
+ end
124
+ context "when the parent is persisted" do
125
+ context "when the child returns false in a before callback" do
126
+ context "when the child is paranoid" do
127
+
128
+ before(:all) do
129
+ Person.accepts_nested_attributes_for :paranoid_phones, allow_destroy: true
130
+ end
131
+
132
+ after(:all) do
133
+ Person.send(:undef_method, :paranoid_phones=)
134
+ Person.accepts_nested_attributes_for :paranoid_phones
135
+ end
136
+
137
+ let!(:persisted) do
138
+ Person.create(age: 42)
139
+ end
140
+
141
+ let!(:phone) do
142
+ persisted.paranoid_phones.create
143
+ end
144
+
145
+ before do
146
+ persisted.paranoid_phones_attributes =
147
+ { "foo" => { "id" => phone.id, "number" => 42, "_destroy" => true }}
148
+ end
149
+
150
+ it "does not destroy the child" do
151
+ expect(persisted.reload.paranoid_phones).not_to be_empty
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -1,887 +1,887 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Paranoia do
4
- context 'configuring the paranoid_field setting' do
5
- before do
6
- Mongoid::Paranoia.configure do |c|
7
- c.paranoid_field = :myFieldName
8
- end
9
- end
10
-
11
- describe '.configure' do
12
- before do
13
- class ParanoidConfigured
14
- include Mongoid::Document
15
- include Mongoid::Paranoia
16
- end
17
- end
18
-
19
- it 'allows custom setting of the paranoid_field' do
20
- paranoid_configured = ParanoidConfigured.new
21
- expect(paranoid_configured.attribute_names).to include('myFieldName')
22
- end
23
-
24
- after(:each) do
25
- Mongoid::Paranoia.reset
26
- end
27
- end
28
-
29
- describe '.reset' do
30
- before do
31
- Mongoid::Paranoia.reset
32
-
33
- # the configuration gets set at include time
34
- # so you need to reset before defining a new class
35
- class ParanoidConfiguredReset
36
- include Mongoid::Document
37
- include Mongoid::Paranoia
38
- end
39
- end
40
-
41
- it 'restores the paranoid_field to the default setting' do
42
- paranoid_configured = ParanoidConfiguredReset.new
43
- expect(paranoid_configured.attribute_names).to include('deleted_at')
44
- end
45
- end
46
- end
47
-
48
- describe ".scoped" do
49
-
50
- it "returns a scoped criteria" do
51
- expect(ParanoidPost.scoped.selector).to eq({ "deleted_at" => nil })
52
- end
53
- end
54
-
55
- describe ".deleted" do
56
-
57
- context "when called on a root document" do
58
-
59
- let(:post) do
60
- ParanoidPost.create(title: "testing")
61
- end
62
-
63
- before do
64
- post.destroy
65
- end
66
-
67
- let(:deleted) do
68
- ParanoidPost.deleted
69
- end
70
-
71
- it "returns the deleted documents" do
72
- expect(deleted).to eq([ post ])
73
- end
74
- end
75
-
76
- context "when called on an embedded document" do
77
-
78
- let(:person) do
79
- Person.create
80
- end
81
-
82
- let(:phone) do
83
- person.paranoid_phones.create
84
- end
85
-
86
- before do
87
- phone.destroy
88
- person.reload
89
- end
90
-
91
- it "returns the deleted documents" do
92
- expect(person.paranoid_phones.deleted.to_a).to eq([ phone ])
93
- end
94
-
95
- it "returns the correct count" do
96
- expect(person.paranoid_phones.deleted.count).to eq(1)
97
- end
98
- end
99
- end
100
-
101
- describe "#destroy!" do
102
-
103
- context "when the document is a root" do
104
-
105
- let(:post) do
106
- ParanoidPost.create(title: "testing")
107
- end
108
-
109
- before do
110
- post.destroy!
111
- end
112
-
113
- let(:raw) do
114
- ParanoidPost.collection.find(_id: post.id).first
115
- end
116
-
117
- it "hard deletes the document" do
118
- expect(raw).to be_nil
119
- end
120
-
121
- it "executes the before destroy callbacks" do
122
- expect(post.before_destroy_called).to be_truthy
123
- end
124
-
125
- it "executes the after destroy callbacks" do
126
- expect(post.after_destroy_called).to be_truthy
127
- end
128
-
129
- it "executes the before remove callbacks" do
130
- expect(post.before_remove_called).to be_truthy
131
- end
132
-
133
- it "executes the after remove callbacks" do
134
- expect(post.after_remove_called).to be_truthy
135
- end
136
- end
137
-
138
- context "when the document is embedded" do
139
-
140
- let(:person) do
141
- Person.create
142
- end
143
-
144
- let(:phone) do
145
- person.paranoid_phones.create(number: "911")
146
- end
147
-
148
- before do
149
- phone.destroy!
150
- end
151
-
152
- let(:raw) do
153
- Person.collection.find(_id: person.id).first
154
- end
155
-
156
- it "hard deletes the document" do
157
- expect(raw["paranoid_phones"]).to be_empty
158
- end
159
-
160
- it "executes the before destroy callbacks" do
161
- expect(phone.before_destroy_called).to be_truthy
162
- end
163
-
164
- it "executes the after destroy callbacks" do
165
- expect(phone.after_destroy_called).to be_truthy
166
- end
167
- end
168
-
169
- context "when the document has a dependent relation" do
170
-
171
- let(:post) do
172
- ParanoidPost.create(title: "test")
173
- end
174
-
175
- let!(:author) do
176
- post.authors.create(name: "poe")
177
- end
178
-
179
- before do
180
- post.destroy!
181
- end
182
-
183
- it "cascades the dependent option" do
184
- expect {
185
- author.reload
186
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
187
- end
188
- end
189
- end
190
-
191
- describe "#destroy" do
192
-
193
- context "when the document is a root" do
194
-
195
- let(:post) do
196
- ParanoidPost.create(title: "testing")
197
- end
198
-
199
- before do
200
- post.destroy
201
- end
202
-
203
- let(:raw) do
204
- ParanoidPost.collection.find(_id: post.id).first
205
- end
206
-
207
- it "soft deletes the document" do
208
- expect(raw["deleted_at"]).to be_within(1).of(Time.now)
209
- end
210
-
211
- it "is still marked as persisted" do
212
- expect(post.persisted?).to eq(true)
213
- end
214
-
215
- it "does not return the document in a find" do
216
- expect {
217
- ParanoidPost.find(post.id)
218
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
219
- end
220
-
221
- it "executes the before destroy callbacks" do
222
- expect(post.before_destroy_called).to be_truthy
223
- end
224
-
225
- it "executes the after destroy callbacks" do
226
- expect(post.after_destroy_called).to be_truthy
227
- end
228
-
229
- it "does not execute the before remove callbacks" do
230
- expect(post.before_remove_called).to be_falsey
231
- end
232
-
233
- it "does not execute the after remove callbacks" do
234
- expect(post.after_remove_called).to be_falsey
235
- end
236
- end
237
-
238
- context "when the document is embedded" do
239
-
240
- let(:person) do
241
- Person.create
242
- end
243
-
244
- let(:phone) do
245
- person.paranoid_phones.create(number: "911")
246
- end
247
-
248
- before do
249
- phone.destroy
250
- end
251
-
252
- let(:raw) do
253
- Person.collection.find(_id: person.id).first
254
- end
255
-
256
- it "soft deletes the document" do
257
- expect(raw["paranoid_phones"].first["deleted_at"]).to be_within(1).of(Time.now)
258
- end
259
-
260
- it "does not return the document in a find" do
261
- expect {
262
- person.paranoid_phones.find(phone.id)
263
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
264
- end
265
-
266
- it "does not include the document in the relation" do
267
- expect(person.paranoid_phones.scoped).to be_empty
268
- end
269
-
270
- it "executes the before destroy callbacks" do
271
- expect(phone.before_destroy_called).to be_truthy
272
- end
273
-
274
- it "executes the after destroy callbacks" do
275
- expect(phone.after_destroy_called).to be_truthy
276
- end
277
- end
278
-
279
- context "when the document has a dependent: :delete relation" do
280
-
281
- let(:post) do
282
- ParanoidPost.create(title: "test")
283
- end
284
-
285
- let!(:author) do
286
- post.authors.create(name: "poe")
287
- end
288
-
289
- before do
290
- post.destroy
291
- end
292
-
293
- it "cascades the dependent option" do
294
- expect {
295
- author.reload
296
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
297
- end
298
- end
299
-
300
- context "when the document has a dependent: :restrict relation" do
301
-
302
- let(:post) do
303
- ParanoidPost.create(title: "test")
304
- end
305
-
306
- let!(:title) do
307
- post.titles.create
308
- end
309
-
310
- before do
311
- begin
312
- post.destroy
313
- rescue Mongoid::Errors::DeleteRestriction
314
- end
315
- end
316
-
317
- it "does not destroy the document" do
318
- expect(post).not_to be_destroyed
319
- end
320
- end
321
- end
322
-
323
- describe "#destroyed?" do
324
-
325
- context "when the document is a root" do
326
-
327
- let(:post) do
328
- ParanoidPost.create(title: "testing")
329
- end
330
-
331
- context "when the document is hard deleted" do
332
-
333
- before do
334
- post.destroy!
335
- end
336
-
337
- it "returns true" do
338
- expect(post).to be_destroyed
339
- end
340
- end
341
-
342
- context "when the document is soft deleted" do
343
-
344
- before do
345
- post.destroy
346
- end
347
-
348
- it "returns true" do
349
- expect(post).to be_destroyed
350
- end
351
-
352
- it "returns true for deleted scope document" do
353
- expect(ParanoidPost.deleted.last).to be_destroyed
354
- end
355
- end
356
- end
357
-
358
- context "when the document is embedded" do
359
-
360
- let(:person) do
361
- Person.create
362
- end
363
-
364
- let(:phone) do
365
- person.paranoid_phones.create(number: "911")
366
- end
367
-
368
- context "when the document is hard deleted" do
369
-
370
- before do
371
- phone.destroy!
372
- end
373
-
374
- it "returns true" do
375
- expect(phone).to be_destroyed
376
- end
377
- end
378
-
379
- context "when the document is soft deleted" do
380
-
381
- before do
382
- phone.destroy
383
- end
384
-
385
- it "returns true" do
386
- expect(phone).to be_destroyed
387
- end
388
- end
389
- end
390
- end
391
-
392
- describe "#deleted?" do
393
-
394
- context "when the document is a root" do
395
-
396
- let(:post) do
397
- ParanoidPost.create(title: "testing")
398
- end
399
-
400
- context "when the document is hard deleted" do
401
-
402
- before do
403
- post.destroy!
404
- end
405
-
406
- it "returns true" do
407
- expect(post).to be_deleted
408
- end
409
- end
410
-
411
- context "when the document is soft deleted" do
412
-
413
- before do
414
- post.destroy
415
- end
416
-
417
- it "returns true" do
418
- expect(post).to be_deleted
419
- end
420
- end
421
- end
422
-
423
- context "when the document is embedded" do
424
-
425
- let(:person) do
426
- Person.create
427
- end
428
-
429
- let(:phone) do
430
- person.paranoid_phones.create(number: "911")
431
- end
432
-
433
- context "when the document is hard deleted" do
434
-
435
- before do
436
- phone.destroy!
437
- end
438
-
439
- it "returns true" do
440
- expect(phone).to be_deleted
441
- end
442
- end
443
-
444
- context "when the document is soft deleted" do
445
-
446
- before do
447
- phone.destroy
448
- end
449
-
450
- it "returns true" do
451
- expect(phone).to be_deleted
452
- end
453
- end
454
-
455
- context "when the document has non-dependent relation" do
456
- let(:post) do
457
- ParanoidPost.create(title: "test")
458
- end
459
-
460
- let!(:tag) do
461
- post.tags.create(text: "tagie")
462
- end
463
-
464
- before do
465
- post.delete
466
- end
467
-
468
- it "doesn't cascades the dependent option" do
469
- expect(tag.reload).to eq(tag)
470
- end
471
-
472
- end
473
- end
474
- end
475
-
476
- describe "#delete!" do
477
-
478
- context "when the document is a root" do
479
-
480
- let(:post) do
481
- ParanoidPost.create(title: "testing")
482
- end
483
-
484
- before do
485
- post.delete!
486
- end
487
-
488
- let(:raw) do
489
- ParanoidPost.collection.find(_id: post.id).first
490
- end
491
-
492
- it "hard deletes the document" do
493
- expect(raw).to be_nil
494
- end
495
- end
496
-
497
- context "when the document is embedded" do
498
-
499
- let(:person) do
500
- Person.create
501
- end
502
-
503
- let(:phone) do
504
- person.paranoid_phones.create(number: "911")
505
- end
506
-
507
- before do
508
- phone.delete!
509
- end
510
-
511
- let(:raw) do
512
- Person.collection.find(_id: person.id).first
513
- end
514
-
515
- it "hard deletes the document" do
516
- expect(raw["paranoid_phones"]).to be_empty
517
- end
518
- end
519
-
520
- context "when the document has a dependent relation" do
521
-
522
- let(:post) do
523
- ParanoidPost.create(title: "test")
524
- end
525
-
526
- let!(:author) do
527
- post.authors.create(name: "poe")
528
- end
529
-
530
- before do
531
- post.delete!
532
- end
533
-
534
- it "cascades the dependent option" do
535
- expect {
536
- author.reload
537
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
538
- end
539
- end
540
- end
541
-
542
- describe "#delete" do
543
-
544
- context "when the document is a root" do
545
-
546
- let(:post) do
547
- ParanoidPost.create(title: "testing")
548
- end
549
-
550
- before do
551
- post.delete
552
- end
553
-
554
- let(:raw) do
555
- ParanoidPost.collection.find(_id: post.id).first
556
- end
557
-
558
- it "soft deletes the document" do
559
- expect(raw["deleted_at"]).to be_within(1).of(Time.now)
560
- end
561
-
562
- it "does not return the document in a find" do
563
- expect {
564
- ParanoidPost.find(post.id)
565
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
566
- end
567
- end
568
-
569
- context "when the document is embedded" do
570
-
571
- let(:person) do
572
- Person.create
573
- end
574
-
575
- let(:phone) do
576
- person.paranoid_phones.create(number: "911")
577
- end
578
-
579
- before do
580
- phone.delete
581
- end
582
-
583
- let(:raw) do
584
- Person.collection.find(_id: person.id).first
585
- end
586
-
587
- it "soft deletes the document" do
588
- expect(raw["paranoid_phones"].first["deleted_at"]).to be_within(1).of(Time.now)
589
- end
590
-
591
- it "does not return the document in a find" do
592
- expect {
593
- person.paranoid_phones.find(phone.id)
594
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
595
- end
596
-
597
- it "does not include the document in the relation" do
598
- expect(person.paranoid_phones.scoped).to be_empty
599
- end
600
- end
601
-
602
- context "when the document has a dependent relation" do
603
-
604
- let(:post) do
605
- ParanoidPost.create(title: "test")
606
- end
607
-
608
- let!(:author) do
609
- post.authors.create(name: "poe")
610
- end
611
-
612
- before do
613
- post.delete
614
- end
615
-
616
- it "cascades the dependent option" do
617
- expect {
618
- author.reload
619
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
620
- end
621
- end
622
-
623
- context "when the document has a dependent: :restrict relation" do
624
-
625
- let(:post) do
626
- ParanoidPost.create(title: "test")
627
- end
628
-
629
- let!(:title) do
630
- post.titles.create
631
- end
632
-
633
- before do
634
- begin
635
- post.delete
636
- rescue Mongoid::Errors::DeleteRestriction
637
- end
638
- end
639
-
640
- it "does not destroy the document" do
641
- expect(post).not_to be_destroyed
642
- end
643
- end
644
- end
645
-
646
- describe "#remove" do
647
-
648
- let(:post) do
649
- ParanoidPost.new
650
- end
651
-
652
- let!(:time) do
653
- Time.now
654
- end
655
-
656
- before do
657
- post.remove
658
- end
659
-
660
- it "sets the deleted flag" do
661
- expect(post).to be_destroyed
662
- end
663
- end
664
-
665
- describe "#restore" do
666
-
667
- context "when the document is a root" do
668
-
669
- let(:post) do
670
- ParanoidPost.create(title: "testing")
671
- end
672
-
673
- before do
674
- post.delete
675
- post.restore
676
- end
677
-
678
- it "removes the deleted at time" do
679
- expect(post.deleted_at).to be_nil
680
- end
681
-
682
- it "persists the change" do
683
- expect(post.reload.deleted_at).to be_nil
684
- end
685
-
686
- it "marks document again as persisted" do
687
- expect(post.persisted?).to be_truthy
688
- end
689
-
690
- context "will run callback" do
691
-
692
- it "before restore" do
693
- expect(post.before_restore_called).to be_truthy
694
- end
695
-
696
- it "after restore" do
697
- expect(post.after_restore_called).to be_truthy
698
- end
699
-
700
- it "around restore" do
701
- expect(post.around_before_restore_called).to be_truthy
702
- expect(post.around_after_restore_called).to be_truthy
703
- end
704
- end
705
- end
706
-
707
- context "when the document is embedded" do
708
-
709
- let(:person) do
710
- Person.create
711
- end
712
-
713
- let(:phone) do
714
- person.paranoid_phones.create(number: "911")
715
- end
716
-
717
- before do
718
- phone.delete
719
- phone.restore
720
- end
721
-
722
- it "removes the deleted at time" do
723
- expect(phone.deleted_at).to be_nil
724
- end
725
-
726
- it "persists the change" do
727
- expect(person.reload.paranoid_phones.first.deleted_at).to be_nil
728
- end
729
- end
730
- end
731
-
732
- describe "#restore_relations" do
733
-
734
- subject { ParaBase.create }
735
-
736
- let!(:para_has_one) { subject.para_has_one = ParaHasOne.create }
737
- let!(:para_has_many) { 2.times.map { subject.para_has_many.create } }
738
- let!(:para_habtm) { 3.times.map { subject.para_habtm.create } }
739
- let!(:para_belongs_to) { subject.para_belongs_to = ParaBelongsTo.create }
740
- let!(:para_embeds_one) { subject.para_embeds_one = ParaEmbedsOne.new }
741
- let!(:para_embeds_many) { 2.times.map { subject.para_embeds_many.build } }
742
-
743
- let!(:norm_has_one) { subject.norm_has_one = NormHasOne.create }
744
- let!(:norm_has_many) { 2.times.map { subject.norm_has_many.create } }
745
- let!(:norm_habtm) { 3.times.map { subject.norm_habtm.create } }
746
- let!(:norm_belongs_to) { subject.norm_belongs_to = NormBelongsTo.create }
747
- let!(:norm_embeds_one) { subject.norm_embeds_one = NormEmbedsOne.new }
748
- let!(:norm_embeds_many) { 2.times.map { subject.norm_embeds_many.build } }
749
-
750
- let(:prepare) do
751
- subject.destroy
752
- subject.restore
753
- end
754
-
755
- context "restores paranoid associations" do
756
- before { prepare }
757
-
758
- it { expect{ subject.restore_relations}.to change{ ParaHasOne.count }.by(1) }
759
- it { expect{ subject.restore_relations}.to change{ ParaHasMany.count }.by(2) }
760
- it { expect{ subject.restore_relations}.to change{ ParaHabtm.count }.by(3) }
761
- it { expect{ subject.restore_relations}.to change{ ParaBelongsTo.count }.by(1) }
762
- end
763
-
764
- context "does not affect embedded paranoid documents" do
765
- before { prepare }
766
-
767
- it { expect{ subject.restore_relations}.to_not change{ subject.para_embeds_one } }
768
- it { expect{ subject.restore_relations}.to_not change{ subject.para_embeds_many.count } }
769
- end
770
-
771
- context "does not affect non-paranoid documents" do
772
- before { prepare }
773
-
774
- it { expect{ subject.restore_relations}.to_not change{ NormHasOne.count } }
775
- it { expect{ subject.restore_relations}.to_not change{ NormHasMany.count } }
776
- it { expect{ subject.restore_relations}.to_not change{ NormHabtm.count } }
777
- it { expect{ subject.restore_relations}.to_not change{ NormBelongsTo.count } }
778
- it { expect{ subject.restore_relations}.to_not change{ subject.norm_embeds_one } }
779
- it { expect{ subject.restore_relations}.to_not change{ subject.norm_embeds_many.count } }
780
- end
781
-
782
- context "recursion" do
783
-
784
- let!(:para_habtm_norm_has_one) { subject.para_habtm.first.norm_has_one = NormHasOne.create } # not restored
785
- let!(:para_habtm_para_has_one) { subject.para_habtm.first.para_has_one = ParaHasOne.create } # restored
786
- let!(:para_habtm_norm_has_many) { 2.times.map { subject.para_habtm.first.norm_has_many = NormHasMany.create } } # not restored
787
- let!(:para_habtm_para_has_many) { 3.times.map { subject.para_habtm.second.para_has_many = ParaHasMany.create } } # restored
788
-
789
- # Untestable due to infinite recursion condition in #destroy
790
- # let!(:para_habtm_norm_habtm) { 3.times.map { subject.para_habtm.second.norm_habtm.create } } # not restored
791
- # let!(:para_habtm_recursive) { 2.times.map { subject.para_habtm.first.recursive.create } } # restored
792
-
793
- before do
794
- subject.destroy
795
- subject.restore
796
- end
797
-
798
- it { expect{ subject.restore_relations}.to change { ParaHasOne.count }.by(2) }
799
- it { expect{ subject.restore_relations}.to change { ParaHasMany.count }.by(3) }
800
-
801
- # Untestable due to infinite recursion condition in #destroy
802
- # it { expect{ ParaHabtm.unscoped.each(&:restore)}.to change { ParaHabtm.count }.by(5) }
803
-
804
- it { expect{ subject.restore_relations}.to_not change { NormHasOne.count } }
805
- it { expect{ subject.restore_relations}.to_not change { NormHasMany.count } }
806
- it { expect{ subject.restore_relations}.to_not change { NormHabtm.count } }
807
- end
808
- end
809
-
810
- describe ".scoped" do
811
-
812
- let(:scoped) do
813
- ParanoidPost.scoped
814
- end
815
-
816
- it "returns a scoped criteria" do
817
- expect(scoped.selector).to eq({ "deleted_at" => nil })
818
- end
819
- end
820
-
821
- describe "#set" do
822
-
823
- let!(:post) do
824
- ParanoidPost.create
825
- end
826
-
827
- let(:time) do
828
- 20.days.ago
829
- end
830
-
831
- let!(:set) do
832
- post.set(:deleted_at => time)
833
- end
834
-
835
- it "persists the change" do
836
- expect(post.reload.deleted_at).to be_within(1).of(time)
837
- end
838
- end
839
-
840
- describe ".unscoped" do
841
-
842
- let(:unscoped) do
843
- ParanoidPost.unscoped
844
- end
845
-
846
- it "returns an unscoped criteria" do
847
- expect(unscoped.selector).to eq({})
848
- end
849
- end
850
-
851
- describe "#to_param" do
852
-
853
- let(:post) do
854
- ParanoidPost.new(title: "testing")
855
- end
856
-
857
- context "when the document is new" do
858
-
859
- it "still returns nil" do
860
- expect(post.to_param).to be_nil
861
- end
862
- end
863
-
864
- context "when the document is not deleted" do
865
-
866
- before do
867
- post.save
868
- end
869
-
870
- it "returns the id as a string" do
871
- expect(post.to_param).to eq(post.id.to_s)
872
- end
873
- end
874
-
875
- context "when the document is deleted" do
876
-
877
- before do
878
- post.save
879
- post.delete
880
- end
881
-
882
- it "returns the id as a string" do
883
- expect(post.to_param).to eq(post.id.to_s)
884
- end
885
- end
886
- end
887
- end
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Paranoia do
4
+ context 'configuring the paranoid_field setting' do
5
+ before do
6
+ Mongoid::Paranoia.configure do |c|
7
+ c.paranoid_field = :myFieldName
8
+ end
9
+ end
10
+
11
+ describe '.configure' do
12
+ before do
13
+ class ParanoidConfigured
14
+ include Mongoid::Document
15
+ include Mongoid::Paranoia
16
+ end
17
+ end
18
+
19
+ it 'allows custom setting of the paranoid_field' do
20
+ paranoid_configured = ParanoidConfigured.new
21
+ expect(paranoid_configured.attribute_names).to include('myFieldName')
22
+ end
23
+
24
+ after(:each) do
25
+ Mongoid::Paranoia.reset
26
+ end
27
+ end
28
+
29
+ describe '.reset' do
30
+ before do
31
+ Mongoid::Paranoia.reset
32
+
33
+ # the configuration gets set at include time
34
+ # so you need to reset before defining a new class
35
+ class ParanoidConfiguredReset
36
+ include Mongoid::Document
37
+ include Mongoid::Paranoia
38
+ end
39
+ end
40
+
41
+ it 'restores the paranoid_field to the default setting' do
42
+ paranoid_configured = ParanoidConfiguredReset.new
43
+ expect(paranoid_configured.attribute_names).to include('deleted_at')
44
+ end
45
+ end
46
+ end
47
+
48
+ describe ".scoped" do
49
+
50
+ it "returns a scoped criteria" do
51
+ expect(ParanoidPost.scoped.selector).to eq({ "deleted_at" => nil })
52
+ end
53
+ end
54
+
55
+ describe ".deleted" do
56
+
57
+ context "when called on a root document" do
58
+
59
+ let(:post) do
60
+ ParanoidPost.create(title: "testing")
61
+ end
62
+
63
+ before do
64
+ post.destroy
65
+ end
66
+
67
+ let(:deleted) do
68
+ ParanoidPost.deleted
69
+ end
70
+
71
+ it "returns the deleted documents" do
72
+ expect(deleted).to eq([ post ])
73
+ end
74
+ end
75
+
76
+ context "when called on an embedded document" do
77
+
78
+ let(:person) do
79
+ Person.create
80
+ end
81
+
82
+ let(:phone) do
83
+ person.paranoid_phones.create
84
+ end
85
+
86
+ before do
87
+ phone.destroy
88
+ person.reload
89
+ end
90
+
91
+ it "returns the deleted documents" do
92
+ expect(person.paranoid_phones.deleted.to_a).to eq([ phone ])
93
+ end
94
+
95
+ it "returns the correct count" do
96
+ expect(person.paranoid_phones.deleted.count).to eq(1)
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#destroy!" do
102
+
103
+ context "when the document is a root" do
104
+
105
+ let(:post) do
106
+ ParanoidPost.create(title: "testing")
107
+ end
108
+
109
+ before do
110
+ post.destroy!
111
+ end
112
+
113
+ let(:raw) do
114
+ ParanoidPost.collection.find(_id: post.id).first
115
+ end
116
+
117
+ it "hard deletes the document" do
118
+ expect(raw).to be_nil
119
+ end
120
+
121
+ it "executes the before destroy callbacks" do
122
+ expect(post.before_destroy_called).to be_truthy
123
+ end
124
+
125
+ it "executes the after destroy callbacks" do
126
+ expect(post.after_destroy_called).to be_truthy
127
+ end
128
+
129
+ it "executes the before remove callbacks" do
130
+ expect(post.before_remove_called).to be_truthy
131
+ end
132
+
133
+ it "executes the after remove callbacks" do
134
+ expect(post.after_remove_called).to be_truthy
135
+ end
136
+ end
137
+
138
+ context "when the document is embedded" do
139
+
140
+ let(:person) do
141
+ Person.create
142
+ end
143
+
144
+ let(:phone) do
145
+ person.paranoid_phones.create(number: "911")
146
+ end
147
+
148
+ before do
149
+ phone.destroy!
150
+ end
151
+
152
+ let(:raw) do
153
+ Person.collection.find(_id: person.id).first
154
+ end
155
+
156
+ it "hard deletes the document" do
157
+ expect(raw["paranoid_phones"]).to be_empty
158
+ end
159
+
160
+ it "executes the before destroy callbacks" do
161
+ expect(phone.before_destroy_called).to be_truthy
162
+ end
163
+
164
+ it "executes the after destroy callbacks" do
165
+ expect(phone.after_destroy_called).to be_truthy
166
+ end
167
+ end
168
+
169
+ context "when the document has a dependent relation" do
170
+
171
+ let(:post) do
172
+ ParanoidPost.create(title: "test")
173
+ end
174
+
175
+ let!(:author) do
176
+ post.authors.create(name: "poe")
177
+ end
178
+
179
+ before do
180
+ post.destroy!
181
+ end
182
+
183
+ it "cascades the dependent option" do
184
+ expect {
185
+ author.reload
186
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
187
+ end
188
+ end
189
+ end
190
+
191
+ describe "#destroy" do
192
+
193
+ context "when the document is a root" do
194
+
195
+ let(:post) do
196
+ ParanoidPost.create(title: "testing")
197
+ end
198
+
199
+ before do
200
+ post.destroy
201
+ end
202
+
203
+ let(:raw) do
204
+ ParanoidPost.collection.find(_id: post.id).first
205
+ end
206
+
207
+ it "soft deletes the document" do
208
+ expect(raw["deleted_at"]).to be_within(1).of(Time.now)
209
+ end
210
+
211
+ it "is still marked as persisted" do
212
+ expect(post.persisted?).to eq(true)
213
+ end
214
+
215
+ it "does not return the document in a find" do
216
+ expect {
217
+ ParanoidPost.find(post.id)
218
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
219
+ end
220
+
221
+ it "executes the before destroy callbacks" do
222
+ expect(post.before_destroy_called).to be_truthy
223
+ end
224
+
225
+ it "executes the after destroy callbacks" do
226
+ expect(post.after_destroy_called).to be_truthy
227
+ end
228
+
229
+ it "does not execute the before remove callbacks" do
230
+ expect(post.before_remove_called).to be_falsey
231
+ end
232
+
233
+ it "does not execute the after remove callbacks" do
234
+ expect(post.after_remove_called).to be_falsey
235
+ end
236
+ end
237
+
238
+ context "when the document is embedded" do
239
+
240
+ let(:person) do
241
+ Person.create
242
+ end
243
+
244
+ let(:phone) do
245
+ person.paranoid_phones.create(number: "911")
246
+ end
247
+
248
+ before do
249
+ phone.destroy
250
+ end
251
+
252
+ let(:raw) do
253
+ Person.collection.find(_id: person.id).first
254
+ end
255
+
256
+ it "soft deletes the document" do
257
+ expect(raw["paranoid_phones"].first["deleted_at"]).to be_within(1).of(Time.now)
258
+ end
259
+
260
+ it "does not return the document in a find" do
261
+ expect {
262
+ person.paranoid_phones.find(phone.id)
263
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
264
+ end
265
+
266
+ it "does not include the document in the relation" do
267
+ expect(person.paranoid_phones.scoped).to be_empty
268
+ end
269
+
270
+ it "executes the before destroy callbacks" do
271
+ expect(phone.before_destroy_called).to be_truthy
272
+ end
273
+
274
+ it "executes the after destroy callbacks" do
275
+ expect(phone.after_destroy_called).to be_truthy
276
+ end
277
+ end
278
+
279
+ context "when the document has a dependent: :delete relation" do
280
+
281
+ let(:post) do
282
+ ParanoidPost.create(title: "test")
283
+ end
284
+
285
+ let!(:author) do
286
+ post.authors.create(name: "poe")
287
+ end
288
+
289
+ before do
290
+ post.destroy
291
+ end
292
+
293
+ it "cascades the dependent option" do
294
+ expect {
295
+ author.reload
296
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
297
+ end
298
+ end
299
+
300
+ context "when the document has a dependent: :restrict relation" do
301
+
302
+ let(:post) do
303
+ ParanoidPost.create(title: "test")
304
+ end
305
+
306
+ let!(:title) do
307
+ post.titles.create
308
+ end
309
+
310
+ before do
311
+ begin
312
+ post.destroy
313
+ rescue Mongoid::Errors::DeleteRestriction
314
+ end
315
+ end
316
+
317
+ it "does not destroy the document" do
318
+ expect(post).not_to be_destroyed
319
+ end
320
+ end
321
+ end
322
+
323
+ describe "#destroyed?" do
324
+
325
+ context "when the document is a root" do
326
+
327
+ let(:post) do
328
+ ParanoidPost.create(title: "testing")
329
+ end
330
+
331
+ context "when the document is hard deleted" do
332
+
333
+ before do
334
+ post.destroy!
335
+ end
336
+
337
+ it "returns true" do
338
+ expect(post).to be_destroyed
339
+ end
340
+ end
341
+
342
+ context "when the document is soft deleted" do
343
+
344
+ before do
345
+ post.destroy
346
+ end
347
+
348
+ it "returns true" do
349
+ expect(post).to be_destroyed
350
+ end
351
+
352
+ it "returns true for deleted scope document" do
353
+ expect(ParanoidPost.deleted.last).to be_destroyed
354
+ end
355
+ end
356
+ end
357
+
358
+ context "when the document is embedded" do
359
+
360
+ let(:person) do
361
+ Person.create
362
+ end
363
+
364
+ let(:phone) do
365
+ person.paranoid_phones.create(number: "911")
366
+ end
367
+
368
+ context "when the document is hard deleted" do
369
+
370
+ before do
371
+ phone.destroy!
372
+ end
373
+
374
+ it "returns true" do
375
+ expect(phone).to be_destroyed
376
+ end
377
+ end
378
+
379
+ context "when the document is soft deleted" do
380
+
381
+ before do
382
+ phone.destroy
383
+ end
384
+
385
+ it "returns true" do
386
+ expect(phone).to be_destroyed
387
+ end
388
+ end
389
+ end
390
+ end
391
+
392
+ describe "#deleted?" do
393
+
394
+ context "when the document is a root" do
395
+
396
+ let(:post) do
397
+ ParanoidPost.create(title: "testing")
398
+ end
399
+
400
+ context "when the document is hard deleted" do
401
+
402
+ before do
403
+ post.destroy!
404
+ end
405
+
406
+ it "returns true" do
407
+ expect(post).to be_deleted
408
+ end
409
+ end
410
+
411
+ context "when the document is soft deleted" do
412
+
413
+ before do
414
+ post.destroy
415
+ end
416
+
417
+ it "returns true" do
418
+ expect(post).to be_deleted
419
+ end
420
+ end
421
+ end
422
+
423
+ context "when the document is embedded" do
424
+
425
+ let(:person) do
426
+ Person.create
427
+ end
428
+
429
+ let(:phone) do
430
+ person.paranoid_phones.create(number: "911")
431
+ end
432
+
433
+ context "when the document is hard deleted" do
434
+
435
+ before do
436
+ phone.destroy!
437
+ end
438
+
439
+ it "returns true" do
440
+ expect(phone).to be_deleted
441
+ end
442
+ end
443
+
444
+ context "when the document is soft deleted" do
445
+
446
+ before do
447
+ phone.destroy
448
+ end
449
+
450
+ it "returns true" do
451
+ expect(phone).to be_deleted
452
+ end
453
+ end
454
+
455
+ context "when the document has non-dependent relation" do
456
+ let(:post) do
457
+ ParanoidPost.create(title: "test")
458
+ end
459
+
460
+ let!(:tag) do
461
+ post.tags.create(text: "tagie")
462
+ end
463
+
464
+ before do
465
+ post.delete
466
+ end
467
+
468
+ it "doesn't cascades the dependent option" do
469
+ expect(tag.reload).to eq(tag)
470
+ end
471
+
472
+ end
473
+ end
474
+ end
475
+
476
+ describe "#delete!" do
477
+
478
+ context "when the document is a root" do
479
+
480
+ let(:post) do
481
+ ParanoidPost.create(title: "testing")
482
+ end
483
+
484
+ before do
485
+ post.delete!
486
+ end
487
+
488
+ let(:raw) do
489
+ ParanoidPost.collection.find(_id: post.id).first
490
+ end
491
+
492
+ it "hard deletes the document" do
493
+ expect(raw).to be_nil
494
+ end
495
+ end
496
+
497
+ context "when the document is embedded" do
498
+
499
+ let(:person) do
500
+ Person.create
501
+ end
502
+
503
+ let(:phone) do
504
+ person.paranoid_phones.create(number: "911")
505
+ end
506
+
507
+ before do
508
+ phone.delete!
509
+ end
510
+
511
+ let(:raw) do
512
+ Person.collection.find(_id: person.id).first
513
+ end
514
+
515
+ it "hard deletes the document" do
516
+ expect(raw["paranoid_phones"]).to be_empty
517
+ end
518
+ end
519
+
520
+ context "when the document has a dependent relation" do
521
+
522
+ let(:post) do
523
+ ParanoidPost.create(title: "test")
524
+ end
525
+
526
+ let!(:author) do
527
+ post.authors.create(name: "poe")
528
+ end
529
+
530
+ before do
531
+ post.delete!
532
+ end
533
+
534
+ it "cascades the dependent option" do
535
+ expect {
536
+ author.reload
537
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
538
+ end
539
+ end
540
+ end
541
+
542
+ describe "#delete" do
543
+
544
+ context "when the document is a root" do
545
+
546
+ let(:post) do
547
+ ParanoidPost.create(title: "testing")
548
+ end
549
+
550
+ before do
551
+ post.delete
552
+ end
553
+
554
+ let(:raw) do
555
+ ParanoidPost.collection.find(_id: post.id).first
556
+ end
557
+
558
+ it "soft deletes the document" do
559
+ expect(raw["deleted_at"]).to be_within(1).of(Time.now)
560
+ end
561
+
562
+ it "does not return the document in a find" do
563
+ expect {
564
+ ParanoidPost.find(post.id)
565
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
566
+ end
567
+ end
568
+
569
+ context "when the document is embedded" do
570
+
571
+ let(:person) do
572
+ Person.create
573
+ end
574
+
575
+ let(:phone) do
576
+ person.paranoid_phones.create(number: "911")
577
+ end
578
+
579
+ before do
580
+ phone.delete
581
+ end
582
+
583
+ let(:raw) do
584
+ Person.collection.find(_id: person.id).first
585
+ end
586
+
587
+ it "soft deletes the document" do
588
+ expect(raw["paranoid_phones"].first["deleted_at"]).to be_within(1).of(Time.now)
589
+ end
590
+
591
+ it "does not return the document in a find" do
592
+ expect {
593
+ person.paranoid_phones.find(phone.id)
594
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
595
+ end
596
+
597
+ it "does not include the document in the relation" do
598
+ expect(person.paranoid_phones.scoped).to be_empty
599
+ end
600
+ end
601
+
602
+ context "when the document has a dependent relation" do
603
+
604
+ let(:post) do
605
+ ParanoidPost.create(title: "test")
606
+ end
607
+
608
+ let!(:author) do
609
+ post.authors.create(name: "poe")
610
+ end
611
+
612
+ before do
613
+ post.delete
614
+ end
615
+
616
+ it "cascades the dependent option" do
617
+ expect {
618
+ author.reload
619
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
620
+ end
621
+ end
622
+
623
+ context "when the document has a dependent: :restrict relation" do
624
+
625
+ let(:post) do
626
+ ParanoidPost.create(title: "test")
627
+ end
628
+
629
+ let!(:title) do
630
+ post.titles.create
631
+ end
632
+
633
+ before do
634
+ begin
635
+ post.delete
636
+ rescue Mongoid::Errors::DeleteRestriction
637
+ end
638
+ end
639
+
640
+ it "does not destroy the document" do
641
+ expect(post).not_to be_destroyed
642
+ end
643
+ end
644
+ end
645
+
646
+ describe "#remove" do
647
+
648
+ let(:post) do
649
+ ParanoidPost.new
650
+ end
651
+
652
+ let!(:time) do
653
+ Time.now
654
+ end
655
+
656
+ before do
657
+ post.remove
658
+ end
659
+
660
+ it "sets the deleted flag" do
661
+ expect(post).to be_destroyed
662
+ end
663
+ end
664
+
665
+ describe "#restore" do
666
+
667
+ context "when the document is a root" do
668
+
669
+ let(:post) do
670
+ ParanoidPost.create(title: "testing")
671
+ end
672
+
673
+ before do
674
+ post.delete
675
+ post.restore
676
+ end
677
+
678
+ it "removes the deleted at time" do
679
+ expect(post.deleted_at).to be_nil
680
+ end
681
+
682
+ it "persists the change" do
683
+ expect(post.reload.deleted_at).to be_nil
684
+ end
685
+
686
+ it "marks document again as persisted" do
687
+ expect(post.persisted?).to be_truthy
688
+ end
689
+
690
+ context "will run callback" do
691
+
692
+ it "before restore" do
693
+ expect(post.before_restore_called).to be_truthy
694
+ end
695
+
696
+ it "after restore" do
697
+ expect(post.after_restore_called).to be_truthy
698
+ end
699
+
700
+ it "around restore" do
701
+ expect(post.around_before_restore_called).to be_truthy
702
+ expect(post.around_after_restore_called).to be_truthy
703
+ end
704
+ end
705
+ end
706
+
707
+ context "when the document is embedded" do
708
+
709
+ let(:person) do
710
+ Person.create
711
+ end
712
+
713
+ let(:phone) do
714
+ person.paranoid_phones.create(number: "911")
715
+ end
716
+
717
+ before do
718
+ phone.delete
719
+ phone.restore
720
+ end
721
+
722
+ it "removes the deleted at time" do
723
+ expect(phone.deleted_at).to be_nil
724
+ end
725
+
726
+ it "persists the change" do
727
+ expect(person.reload.paranoid_phones.first.deleted_at).to be_nil
728
+ end
729
+ end
730
+ end
731
+
732
+ describe "#restore_relations" do
733
+
734
+ subject { ParaBase.create }
735
+
736
+ let!(:para_has_one) { subject.para_has_one = ParaHasOne.create }
737
+ let!(:para_has_many) { 2.times.map { subject.para_has_many.create } }
738
+ let!(:para_habtm) { 3.times.map { subject.para_habtm.create } }
739
+ let!(:para_belongs_to) { subject.para_belongs_to = ParaBelongsTo.create }
740
+ let!(:para_embeds_one) { subject.para_embeds_one = ParaEmbedsOne.new }
741
+ let!(:para_embeds_many) { 2.times.map { subject.para_embeds_many.build } }
742
+
743
+ let!(:norm_has_one) { subject.norm_has_one = NormHasOne.create }
744
+ let!(:norm_has_many) { 2.times.map { subject.norm_has_many.create } }
745
+ let!(:norm_habtm) { 3.times.map { subject.norm_habtm.create } }
746
+ let!(:norm_belongs_to) { subject.norm_belongs_to = NormBelongsTo.create }
747
+ let!(:norm_embeds_one) { subject.norm_embeds_one = NormEmbedsOne.new }
748
+ let!(:norm_embeds_many) { 2.times.map { subject.norm_embeds_many.build } }
749
+
750
+ let(:prepare) do
751
+ subject.destroy
752
+ subject.restore
753
+ end
754
+
755
+ context "restores paranoid associations" do
756
+ before { prepare }
757
+
758
+ it { expect{ subject.restore_relations}.to change{ ParaHasOne.count }.by(1) }
759
+ it { expect{ subject.restore_relations}.to change{ ParaHasMany.count }.by(2) }
760
+ it { expect{ subject.restore_relations}.to change{ ParaHabtm.count }.by(3) }
761
+ it { expect{ subject.restore_relations}.to change{ ParaBelongsTo.count }.by(1) }
762
+ end
763
+
764
+ context "does not affect embedded paranoid documents" do
765
+ before { prepare }
766
+
767
+ it { expect{ subject.restore_relations}.to_not change{ subject.para_embeds_one } }
768
+ it { expect{ subject.restore_relations}.to_not change{ subject.para_embeds_many.count } }
769
+ end
770
+
771
+ context "does not affect non-paranoid documents" do
772
+ before { prepare }
773
+
774
+ it { expect{ subject.restore_relations}.to_not change{ NormHasOne.count } }
775
+ it { expect{ subject.restore_relations}.to_not change{ NormHasMany.count } }
776
+ it { expect{ subject.restore_relations}.to_not change{ NormHabtm.count } }
777
+ it { expect{ subject.restore_relations}.to_not change{ NormBelongsTo.count } }
778
+ it { expect{ subject.restore_relations}.to_not change{ subject.norm_embeds_one } }
779
+ it { expect{ subject.restore_relations}.to_not change{ subject.norm_embeds_many.count } }
780
+ end
781
+
782
+ context "recursion" do
783
+
784
+ let!(:para_habtm_norm_has_one) { subject.para_habtm.first.norm_has_one = NormHasOne.create } # not restored
785
+ let!(:para_habtm_para_has_one) { subject.para_habtm.first.para_has_one = ParaHasOne.create } # restored
786
+ let!(:para_habtm_norm_has_many) { 2.times.map { subject.para_habtm.first.norm_has_many = NormHasMany.create } } # not restored
787
+ let!(:para_habtm_para_has_many) { 3.times.map { subject.para_habtm.second.para_has_many = ParaHasMany.create } } # restored
788
+
789
+ # Untestable due to infinite recursion condition in #destroy
790
+ # let!(:para_habtm_norm_habtm) { 3.times.map { subject.para_habtm.second.norm_habtm.create } } # not restored
791
+ # let!(:para_habtm_recursive) { 2.times.map { subject.para_habtm.first.recursive.create } } # restored
792
+
793
+ before do
794
+ subject.destroy
795
+ subject.restore
796
+ end
797
+
798
+ it { expect{ subject.restore_relations}.to change { ParaHasOne.count }.by(2) }
799
+ it { expect{ subject.restore_relations}.to change { ParaHasMany.count }.by(3) }
800
+
801
+ # Untestable due to infinite recursion condition in #destroy
802
+ # it { expect{ ParaHabtm.unscoped.each(&:restore)}.to change { ParaHabtm.count }.by(5) }
803
+
804
+ it { expect{ subject.restore_relations}.to_not change { NormHasOne.count } }
805
+ it { expect{ subject.restore_relations}.to_not change { NormHasMany.count } }
806
+ it { expect{ subject.restore_relations}.to_not change { NormHabtm.count } }
807
+ end
808
+ end
809
+
810
+ describe ".scoped" do
811
+
812
+ let(:scoped) do
813
+ ParanoidPost.scoped
814
+ end
815
+
816
+ it "returns a scoped criteria" do
817
+ expect(scoped.selector).to eq({ "deleted_at" => nil })
818
+ end
819
+ end
820
+
821
+ describe "#set" do
822
+
823
+ let!(:post) do
824
+ ParanoidPost.create
825
+ end
826
+
827
+ let(:time) do
828
+ 20.days.ago
829
+ end
830
+
831
+ let!(:set) do
832
+ post.set(:deleted_at => time)
833
+ end
834
+
835
+ it "persists the change" do
836
+ expect(post.reload.deleted_at).to be_within(1).of(time)
837
+ end
838
+ end
839
+
840
+ describe ".unscoped" do
841
+
842
+ let(:unscoped) do
843
+ ParanoidPost.unscoped
844
+ end
845
+
846
+ it "returns an unscoped criteria" do
847
+ expect(unscoped.selector).to eq({})
848
+ end
849
+ end
850
+
851
+ describe "#to_param" do
852
+
853
+ let(:post) do
854
+ ParanoidPost.new(title: "testing")
855
+ end
856
+
857
+ context "when the document is new" do
858
+
859
+ it "still returns nil" do
860
+ expect(post.to_param).to be_nil
861
+ end
862
+ end
863
+
864
+ context "when the document is not deleted" do
865
+
866
+ before do
867
+ post.save
868
+ end
869
+
870
+ it "returns the id as a string" do
871
+ expect(post.to_param).to eq(post.id.to_s)
872
+ end
873
+ end
874
+
875
+ context "when the document is deleted" do
876
+
877
+ before do
878
+ post.save
879
+ post.delete
880
+ end
881
+
882
+ it "returns the id as a string" do
883
+ expect(post.to_param).to eq(post.id.to_s)
884
+ end
885
+ end
886
+ end
887
+ end