mongoid-history 0.8.3 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.document +5 -5
  4. data/.github/workflows/test.yml +72 -0
  5. data/.gitignore +46 -46
  6. data/.rspec +2 -2
  7. data/.rubocop.yml +6 -6
  8. data/.rubocop_todo.yml +99 -99
  9. data/CHANGELOG.md +173 -163
  10. data/CONTRIBUTING.md +117 -118
  11. data/Dangerfile +1 -1
  12. data/Gemfile +49 -40
  13. data/LICENSE.txt +20 -20
  14. data/README.md +609 -608
  15. data/RELEASING.md +66 -67
  16. data/Rakefile +24 -24
  17. data/UPGRADING.md +53 -53
  18. data/lib/mongoid/history/attributes/base.rb +72 -72
  19. data/lib/mongoid/history/attributes/create.rb +45 -45
  20. data/lib/mongoid/history/attributes/destroy.rb +34 -34
  21. data/lib/mongoid/history/attributes/update.rb +104 -104
  22. data/lib/mongoid/history/options.rb +177 -177
  23. data/lib/mongoid/history/trackable.rb +588 -583
  24. data/lib/mongoid/history/tracker.rb +247 -247
  25. data/lib/mongoid/history/version.rb +5 -5
  26. data/lib/mongoid/history.rb +77 -77
  27. data/lib/mongoid-history.rb +1 -1
  28. data/mongoid-history.gemspec +25 -25
  29. data/perf/benchmark_modified_attributes_for_create.rb +65 -65
  30. data/perf/gc_suite.rb +21 -21
  31. data/spec/integration/embedded_in_polymorphic_spec.rb +112 -112
  32. data/spec/integration/integration_spec.rb +976 -976
  33. data/spec/integration/multi_relation_spec.rb +47 -47
  34. data/spec/integration/multiple_trackers_spec.rb +68 -68
  35. data/spec/integration/nested_embedded_documents_spec.rb +64 -64
  36. data/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb +124 -124
  37. data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +115 -115
  38. data/spec/integration/subclasses_spec.rb +47 -47
  39. data/spec/integration/track_history_order_spec.rb +84 -84
  40. data/spec/integration/validation_failure_spec.rb +76 -76
  41. data/spec/spec_helper.rb +32 -30
  42. data/spec/support/error_helpers.rb +7 -0
  43. data/spec/support/mongoid.rb +11 -11
  44. data/spec/support/mongoid_history.rb +12 -12
  45. data/spec/unit/attributes/base_spec.rb +141 -141
  46. data/spec/unit/attributes/create_spec.rb +342 -342
  47. data/spec/unit/attributes/destroy_spec.rb +228 -228
  48. data/spec/unit/attributes/update_spec.rb +342 -342
  49. data/spec/unit/callback_options_spec.rb +165 -165
  50. data/spec/unit/embedded_methods_spec.rb +87 -87
  51. data/spec/unit/history_spec.rb +58 -58
  52. data/spec/unit/my_instance_methods_spec.rb +555 -555
  53. data/spec/unit/options_spec.rb +365 -365
  54. data/spec/unit/singleton_methods_spec.rb +406 -406
  55. data/spec/unit/store/default_store_spec.rb +11 -11
  56. data/spec/unit/store/request_store_spec.rb +13 -13
  57. data/spec/unit/trackable_spec.rb +1057 -987
  58. data/spec/unit/tracker_spec.rb +190 -190
  59. metadata +9 -7
  60. data/.travis.yml +0 -36
@@ -1,342 +1,342 @@
1
- require 'spec_helper'
2
-
3
- describe Mongoid::History::Attributes::Update do
4
- describe '#attributes' do
5
- describe '#insert_embeds_one_changes' do
6
- context 'Case: relation without alias' do
7
- before :each do
8
- class ModelOne
9
- include Mongoid::Document
10
- include Mongoid::History::Trackable
11
-
12
- store_in collection: :model_ones
13
- embeds_one :emb_one
14
-
15
- track_history on: :fields
16
- end
17
-
18
- class EmbOne
19
- include Mongoid::Document
20
-
21
- field :em_foo
22
- field :em_bar
23
-
24
- embedded_in :model_one
25
- end
26
- end
27
-
28
- after :each do
29
- Object.send(:remove_const, :ModelOne)
30
- Object.send(:remove_const, :EmbOne)
31
- end
32
-
33
- before :each do
34
- allow(base).to receive(:changes) { changes }
35
- end
36
-
37
- let(:obj_one) { ModelOne.new }
38
- let(:base) { described_class.new(obj_one) }
39
- let(:changes) do
40
- { 'emb_one' => [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
41
- end
42
- subject { base.attributes }
43
-
44
- context 'with permitted attributes' do
45
- before :each do
46
- ModelOne.track_history on: { emb_one: :em_foo }
47
- end
48
- it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new' }] }
49
- end
50
-
51
- context 'without permitted attributes' do
52
- before :each do
53
- ModelOne.track_history on: :emb_one
54
- end
55
- it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
56
- end
57
-
58
- context 'when old value soft-deleted' do
59
- before :each do
60
- ModelOne.track_history on: :emb_one
61
- end
62
- let(:changes) do
63
- { 'emb_one' => [{ 'em_foo' => 'Em-Foo', 'deleted_at' => Time.now }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
64
- end
65
- it { expect(subject['emb_one']).to eq [{}, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
66
- end
67
-
68
- context 'when new value soft-deleted' do
69
- before :each do
70
- ModelOne.track_history on: :emb_one
71
- end
72
- let(:changes) do
73
- { 'emb_one' => [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'deleted_at' => Time.now }] }
74
- end
75
- it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo' }, {}] }
76
- end
77
-
78
- context 'when not tracked' do
79
- before :each do
80
- ModelOne.track_history on: :fields
81
- allow(ModelOne).to receive(:dynamic_enabled?) { false }
82
- end
83
- it { expect(subject['emb_one']).to be_nil }
84
- end
85
- end
86
-
87
- context 'Case: relation with alias' do
88
- before :each do
89
- class ModelOne
90
- include Mongoid::Document
91
- include Mongoid::History::Trackable
92
- store_in collection: :model_ones
93
- embeds_one :emb_one, store_as: :eon
94
- track_history on: :fields
95
- end
96
-
97
- class EmbOne
98
- include Mongoid::Document
99
- field :em_foo
100
- field :em_bar
101
- embedded_in :model_one
102
- end
103
- end
104
-
105
- after :each do
106
- Object.send(:remove_const, :ModelOne)
107
- Object.send(:remove_const, :EmbOne)
108
- end
109
-
110
- before :each do
111
- ModelOne.track_history on: :emb_one
112
- allow(base).to receive(:changes) { changes }
113
- end
114
-
115
- let(:obj_one) { ModelOne.new }
116
- let(:base) { described_class.new(obj_one) }
117
- let(:changes) do
118
- { 'emb_one' => [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
119
- end
120
- subject { base.attributes }
121
- it { expect(subject['eon']).to eq [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
122
- end
123
-
124
- context 'when original and modified value same' do
125
- before :each do
126
- class DummyUpdateModel
127
- include Mongoid::Document
128
- include Mongoid::History::Trackable
129
- store_in collection: :dummy_update_models
130
- embeds_one :dummy_embedded_model
131
- track_history on: :fields
132
- end
133
-
134
- class DummyEmbeddedModel
135
- include Mongoid::Document
136
- field :em_foo
137
- field :em_bar
138
- embedded_in :dummy_update_model
139
- end
140
- end
141
-
142
- after :each do
143
- Object.send(:remove_const, :DummyUpdateModel)
144
- Object.send(:remove_const, :DummyEmbeddedModel)
145
- end
146
-
147
- before :each do
148
- allow(base).to receive(:changes) { changes }
149
- DummyUpdateModel.track_history on: :dummy_embedded_model
150
- end
151
-
152
- let(:obj_one) { DummyUpdateModel.new }
153
- let(:base) { described_class.new(obj_one) }
154
- let(:changes) do
155
- { 'dummy_embedded_model' => [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }] }
156
- end
157
- subject { base.attributes }
158
- it { expect(subject.keys).to_not include 'dummy_embedded_model' }
159
- end
160
- end
161
-
162
- describe '#insert_embeds_many_changes' do
163
- context 'Case: relation without alias' do
164
- before :each do
165
- class ModelOne
166
- include Mongoid::Document
167
- include Mongoid::History::Trackable
168
- store_in collection: :model_ones
169
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
170
- embeds_many :emb_ones
171
- else
172
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
173
- end
174
- track_history on: :fields
175
- end
176
-
177
- class EmbOne
178
- include Mongoid::Document
179
- field :em_foo
180
- field :em_bar
181
- embedded_in :model_one
182
- end
183
- end
184
-
185
- before :each do
186
- allow(base).to receive(:changes) { changes }
187
- end
188
-
189
- let(:obj_one) { ModelOne.new }
190
- let(:base) { described_class.new(obj_one) }
191
- subject { base.attributes }
192
-
193
- context 'with whitelist attributes' do
194
- before :each do
195
- ModelOne.track_history on: { emb_ones: :em_foo }
196
- end
197
- let(:changes) do
198
- { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
199
- end
200
- it 'should track only whitelisted attributes' do
201
- expect(subject['emb_ones']).to eq [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new' }]]
202
- end
203
- end
204
-
205
- context 'without whitelist attributes' do
206
- before :each do
207
- ModelOne.track_history(on: :emb_ones)
208
- end
209
- let(:changes) do
210
- { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'deleted_at' => Time.now }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
211
- end
212
- it 'should ignore soft-deleted objects' do
213
- expect(subject['emb_ones']).to eq [[], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]]
214
- end
215
- end
216
-
217
- after :each do
218
- Object.send(:remove_const, :ModelOne)
219
- Object.send(:remove_const, :EmbOne)
220
- end
221
- end
222
-
223
- context 'Case: relation with alias' do
224
- before :each do
225
- class ModelOne
226
- include Mongoid::Document
227
- include Mongoid::History::Trackable
228
- store_in collection: :model_ones
229
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
230
- embeds_many :emb_ones, store_as: :eons
231
- else
232
- embeds_many :emb_ones, store_as: :eons, inverse_class_name: 'EmbOne'
233
- end
234
- track_history on: :fields
235
- end
236
-
237
- class EmbOne
238
- include Mongoid::Document
239
- field :em_foo
240
- field :em_bar
241
- embedded_in :model_one
242
- end
243
- end
244
-
245
- before :each do
246
- ModelOne.track_history on: :emb_ones
247
- allow(base).to receive(:changes) { changes }
248
- end
249
-
250
- let(:obj_one) { ModelOne.new }
251
- let(:base) { described_class.new(obj_one) }
252
- let(:changes) do
253
- { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
254
- end
255
- subject { base.attributes }
256
- it 'should save audit history under relation alias' do
257
- expect(subject['eons']).to eq [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]]
258
- end
259
-
260
- after :each do
261
- Object.send(:remove_const, :ModelOne)
262
- Object.send(:remove_const, :EmbOne)
263
- end
264
- end
265
-
266
- context 'when original and modified value same' do
267
- before :each do
268
- class ModelOne
269
- include Mongoid::Document
270
- include Mongoid::History::Trackable
271
- store_in collection: :model_ones
272
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
273
- embeds_many :emb_ones
274
- else
275
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
276
- end
277
- track_history on: :fields
278
- end
279
-
280
- class EmbOne
281
- include Mongoid::Document
282
- field :em_foo
283
- field :em_bar
284
- embedded_in :model_one
285
- end
286
- end
287
-
288
- before :each do
289
- allow(base).to receive(:changes) { changes }
290
- ModelOne.track_history on: :emb_ones
291
- end
292
-
293
- let(:obj_one) { ModelOne.new }
294
- let(:base) { described_class.new(obj_one) }
295
- let(:changes) do
296
- { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }], [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }]] }
297
- end
298
- subject { base.attributes }
299
- it { expect(subject.keys).to_not include 'emb_ones' }
300
-
301
- after :each do
302
- Object.send(:remove_const, :ModelOne)
303
- Object.send(:remove_const, :EmbOne)
304
- end
305
- end
306
- end
307
-
308
- context 'when original and modified values blank' do
309
- before :each do
310
- class DummyParent
311
- include Mongoid::Document
312
- include Mongoid::History::Trackable
313
- store_in collection: :dummy_parents
314
- has_and_belongs_to_many :other_dummy_parents
315
- track_history on: :fields
316
- end
317
-
318
- class OtherDummyParent
319
- include Mongoid::Document
320
- has_and_belongs_to_many :dummy_parents
321
- end
322
- end
323
-
324
- before :each do
325
- allow(base).to receive(:changes) { changes }
326
- DummyParent.track_history on: :other_dummy_parent_ids
327
- end
328
-
329
- let(:base) { described_class.new(DummyParent.new) }
330
- let(:changes) do
331
- { 'other_dummy_parent_ids' => [nil, []] }
332
- end
333
- subject { base.attributes }
334
- it { expect(subject.keys).to_not include 'other_dummy_parent_ids' }
335
-
336
- after :each do
337
- Object.send(:remove_const, :DummyParent)
338
- Object.send(:remove_const, :OtherDummyParent)
339
- end
340
- end
341
- end
342
- end
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::History::Attributes::Update do
4
+ describe '#attributes' do
5
+ describe '#insert_embeds_one_changes' do
6
+ context 'Case: relation without alias' do
7
+ before :each do
8
+ class ModelOne
9
+ include Mongoid::Document
10
+ include Mongoid::History::Trackable
11
+
12
+ store_in collection: :model_ones
13
+ embeds_one :emb_one
14
+
15
+ track_history on: :fields
16
+ end
17
+
18
+ class EmbOne
19
+ include Mongoid::Document
20
+
21
+ field :em_foo
22
+ field :em_bar
23
+
24
+ embedded_in :model_one
25
+ end
26
+ end
27
+
28
+ after :each do
29
+ Object.send(:remove_const, :ModelOne)
30
+ Object.send(:remove_const, :EmbOne)
31
+ end
32
+
33
+ before :each do
34
+ allow(base).to receive(:changes) { changes }
35
+ end
36
+
37
+ let(:obj_one) { ModelOne.new }
38
+ let(:base) { described_class.new(obj_one) }
39
+ let(:changes) do
40
+ { 'emb_one' => [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
41
+ end
42
+ subject { base.attributes }
43
+
44
+ context 'with permitted attributes' do
45
+ before :each do
46
+ ModelOne.track_history on: { emb_one: :em_foo }
47
+ end
48
+ it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new' }] }
49
+ end
50
+
51
+ context 'without permitted attributes' do
52
+ before :each do
53
+ ModelOne.track_history on: :emb_one
54
+ end
55
+ it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
56
+ end
57
+
58
+ context 'when old value soft-deleted' do
59
+ before :each do
60
+ ModelOne.track_history on: :emb_one
61
+ end
62
+ let(:changes) do
63
+ { 'emb_one' => [{ 'em_foo' => 'Em-Foo', 'deleted_at' => Time.now }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
64
+ end
65
+ it { expect(subject['emb_one']).to eq [{}, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
66
+ end
67
+
68
+ context 'when new value soft-deleted' do
69
+ before :each do
70
+ ModelOne.track_history on: :emb_one
71
+ end
72
+ let(:changes) do
73
+ { 'emb_one' => [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'deleted_at' => Time.now }] }
74
+ end
75
+ it { expect(subject['emb_one']).to eq [{ 'em_foo' => 'Em-Foo' }, {}] }
76
+ end
77
+
78
+ context 'when not tracked' do
79
+ before :each do
80
+ ModelOne.track_history on: :fields
81
+ allow(ModelOne).to receive(:dynamic_enabled?) { false }
82
+ end
83
+ it { expect(subject['emb_one']).to be_nil }
84
+ end
85
+ end
86
+
87
+ context 'Case: relation with alias' do
88
+ before :each do
89
+ class ModelOne
90
+ include Mongoid::Document
91
+ include Mongoid::History::Trackable
92
+ store_in collection: :model_ones
93
+ embeds_one :emb_one, store_as: :eon
94
+ track_history on: :fields
95
+ end
96
+
97
+ class EmbOne
98
+ include Mongoid::Document
99
+ field :em_foo
100
+ field :em_bar
101
+ embedded_in :model_one
102
+ end
103
+ end
104
+
105
+ after :each do
106
+ Object.send(:remove_const, :ModelOne)
107
+ Object.send(:remove_const, :EmbOne)
108
+ end
109
+
110
+ before :each do
111
+ ModelOne.track_history on: :emb_one
112
+ allow(base).to receive(:changes) { changes }
113
+ end
114
+
115
+ let(:obj_one) { ModelOne.new }
116
+ let(:base) { described_class.new(obj_one) }
117
+ let(:changes) do
118
+ { 'emb_one' => [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
119
+ end
120
+ subject { base.attributes }
121
+ it { expect(subject['eon']).to eq [{ 'em_foo' => 'Em-Foo' }, { 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }] }
122
+ end
123
+
124
+ context 'when original and modified value same' do
125
+ before :each do
126
+ class DummyUpdateModel
127
+ include Mongoid::Document
128
+ include Mongoid::History::Trackable
129
+ store_in collection: :dummy_update_models
130
+ embeds_one :dummy_embedded_model
131
+ track_history on: :fields
132
+ end
133
+
134
+ class DummyEmbeddedModel
135
+ include Mongoid::Document
136
+ field :em_foo
137
+ field :em_bar
138
+ embedded_in :dummy_update_model
139
+ end
140
+ end
141
+
142
+ after :each do
143
+ Object.send(:remove_const, :DummyUpdateModel)
144
+ Object.send(:remove_const, :DummyEmbeddedModel)
145
+ end
146
+
147
+ before :each do
148
+ allow(base).to receive(:changes) { changes }
149
+ DummyUpdateModel.track_history on: :dummy_embedded_model
150
+ end
151
+
152
+ let(:obj_one) { DummyUpdateModel.new }
153
+ let(:base) { described_class.new(obj_one) }
154
+ let(:changes) do
155
+ { 'dummy_embedded_model' => [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }, { 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }] }
156
+ end
157
+ subject { base.attributes }
158
+ it { expect(subject.keys).to_not include 'dummy_embedded_model' }
159
+ end
160
+ end
161
+
162
+ describe '#insert_embeds_many_changes' do
163
+ context 'Case: relation without alias' do
164
+ before :each do
165
+ class ModelOne
166
+ include Mongoid::Document
167
+ include Mongoid::History::Trackable
168
+ store_in collection: :model_ones
169
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
170
+ embeds_many :emb_ones
171
+ else
172
+ embeds_many :emb_ones, inverse_class_name: 'EmbOne'
173
+ end
174
+ track_history on: :fields
175
+ end
176
+
177
+ class EmbOne
178
+ include Mongoid::Document
179
+ field :em_foo
180
+ field :em_bar
181
+ embedded_in :model_one
182
+ end
183
+ end
184
+
185
+ before :each do
186
+ allow(base).to receive(:changes) { changes }
187
+ end
188
+
189
+ let(:obj_one) { ModelOne.new }
190
+ let(:base) { described_class.new(obj_one) }
191
+ subject { base.attributes }
192
+
193
+ context 'with whitelist attributes' do
194
+ before :each do
195
+ ModelOne.track_history on: { emb_ones: :em_foo }
196
+ end
197
+ let(:changes) do
198
+ { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
199
+ end
200
+ it 'should track only whitelisted attributes' do
201
+ expect(subject['emb_ones']).to eq [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new' }]]
202
+ end
203
+ end
204
+
205
+ context 'without whitelist attributes' do
206
+ before :each do
207
+ ModelOne.track_history(on: :emb_ones)
208
+ end
209
+ let(:changes) do
210
+ { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'deleted_at' => Time.now }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
211
+ end
212
+ it 'should ignore soft-deleted objects' do
213
+ expect(subject['emb_ones']).to eq [[], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]]
214
+ end
215
+ end
216
+
217
+ after :each do
218
+ Object.send(:remove_const, :ModelOne)
219
+ Object.send(:remove_const, :EmbOne)
220
+ end
221
+ end
222
+
223
+ context 'Case: relation with alias' do
224
+ before :each do
225
+ class ModelOne
226
+ include Mongoid::Document
227
+ include Mongoid::History::Trackable
228
+ store_in collection: :model_ones
229
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
230
+ embeds_many :emb_ones, store_as: :eons
231
+ else
232
+ embeds_many :emb_ones, store_as: :eons, inverse_class_name: 'EmbOne'
233
+ end
234
+ track_history on: :fields
235
+ end
236
+
237
+ class EmbOne
238
+ include Mongoid::Document
239
+ field :em_foo
240
+ field :em_bar
241
+ embedded_in :model_one
242
+ end
243
+ end
244
+
245
+ before :each do
246
+ ModelOne.track_history on: :emb_ones
247
+ allow(base).to receive(:changes) { changes }
248
+ end
249
+
250
+ let(:obj_one) { ModelOne.new }
251
+ let(:base) { described_class.new(obj_one) }
252
+ let(:changes) do
253
+ { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]] }
254
+ end
255
+ subject { base.attributes }
256
+ it 'should save audit history under relation alias' do
257
+ expect(subject['eons']).to eq [[{ 'em_foo' => 'Em-Foo' }], [{ 'em_foo' => 'Em-Foo-new', 'em_bar' => 'Em-Bar-new' }]]
258
+ end
259
+
260
+ after :each do
261
+ Object.send(:remove_const, :ModelOne)
262
+ Object.send(:remove_const, :EmbOne)
263
+ end
264
+ end
265
+
266
+ context 'when original and modified value same' do
267
+ before :each do
268
+ class ModelOne
269
+ include Mongoid::Document
270
+ include Mongoid::History::Trackable
271
+ store_in collection: :model_ones
272
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
273
+ embeds_many :emb_ones
274
+ else
275
+ embeds_many :emb_ones, inverse_class_name: 'EmbOne'
276
+ end
277
+ track_history on: :fields
278
+ end
279
+
280
+ class EmbOne
281
+ include Mongoid::Document
282
+ field :em_foo
283
+ field :em_bar
284
+ embedded_in :model_one
285
+ end
286
+ end
287
+
288
+ before :each do
289
+ allow(base).to receive(:changes) { changes }
290
+ ModelOne.track_history on: :emb_ones
291
+ end
292
+
293
+ let(:obj_one) { ModelOne.new }
294
+ let(:base) { described_class.new(obj_one) }
295
+ let(:changes) do
296
+ { 'emb_ones' => [[{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }], [{ 'em_foo' => 'Em-Foo', 'em_bar' => 'Em-Bar' }]] }
297
+ end
298
+ subject { base.attributes }
299
+ it { expect(subject.keys).to_not include 'emb_ones' }
300
+
301
+ after :each do
302
+ Object.send(:remove_const, :ModelOne)
303
+ Object.send(:remove_const, :EmbOne)
304
+ end
305
+ end
306
+ end
307
+
308
+ context 'when original and modified values blank' do
309
+ before :each do
310
+ class DummyParent
311
+ include Mongoid::Document
312
+ include Mongoid::History::Trackable
313
+ store_in collection: :dummy_parents
314
+ has_and_belongs_to_many :other_dummy_parents
315
+ track_history on: :fields
316
+ end
317
+
318
+ class OtherDummyParent
319
+ include Mongoid::Document
320
+ has_and_belongs_to_many :dummy_parents
321
+ end
322
+ end
323
+
324
+ before :each do
325
+ allow(base).to receive(:changes) { changes }
326
+ DummyParent.track_history on: :other_dummy_parent_ids
327
+ end
328
+
329
+ let(:base) { described_class.new(DummyParent.new) }
330
+ let(:changes) do
331
+ { 'other_dummy_parent_ids' => [nil, []] }
332
+ end
333
+ subject { base.attributes }
334
+ it { expect(subject.keys).to_not include 'other_dummy_parent_ids' }
335
+
336
+ after :each do
337
+ Object.send(:remove_const, :DummyParent)
338
+ Object.send(:remove_const, :OtherDummyParent)
339
+ end
340
+ end
341
+ end
342
+ end