mongoid-history 0.8.3 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
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