mongoid_paranoia 0.2.0 → 0.4.1
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 +5 -5
- data/LICENSE +21 -21
- data/README.md +117 -124
- data/lib/mongoid-paranoia.rb +3 -1
- data/lib/mongoid/paranoia.rb +206 -208
- data/lib/mongoid/paranoia/configuration.rb +13 -11
- data/lib/mongoid/paranoia/monkey_patches.rb +114 -113
- data/lib/mongoid/paranoia/version.rb +7 -5
- data/lib/mongoid_paranoia.rb +3 -1
- data/perf/scope.rb +65 -64
- data/spec/app/models/address.rb +71 -71
- data/spec/app/models/appointment.rb +7 -7
- data/spec/app/models/author.rb +6 -6
- data/spec/app/models/fish.rb +8 -8
- data/spec/app/models/paranoid_phone.rb +25 -25
- data/spec/app/models/paranoid_post.rb +65 -65
- data/spec/app/models/person.rb +21 -21
- data/spec/app/models/phone.rb +11 -11
- data/spec/app/models/relations.rb +247 -247
- data/spec/app/models/tag.rb +6 -6
- data/spec/app/models/title.rb +4 -4
- data/spec/mongoid/configuration_spec.rb +19 -19
- data/spec/mongoid/document_spec.rb +21 -21
- data/spec/mongoid/nested_attributes_spec.rb +164 -164
- data/spec/mongoid/paranoia_spec.rb +887 -887
- data/spec/mongoid/scoping_spec.rb +55 -55
- data/spec/mongoid/validatable/uniqueness_spec.rb +74 -74
- data/spec/spec_helper.rb +43 -73
- metadata +30 -27
data/spec/app/models/tag.rb
CHANGED
@@ -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
|
data/spec/app/models/title.rb
CHANGED
@@ -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.
|
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
|