mongoid-history 0.5.0 → 0.6.0

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +16 -3
  3. data/.travis.yml +23 -8
  4. data/CHANGELOG.md +20 -6
  5. data/Dangerfile +1 -0
  6. data/Gemfile +22 -1
  7. data/LICENSE.txt +1 -1
  8. data/README.md +130 -18
  9. data/lib/mongoid/history.rb +32 -15
  10. data/lib/mongoid/history/attributes/base.rb +31 -0
  11. data/lib/mongoid/history/attributes/create.rb +52 -0
  12. data/lib/mongoid/history/attributes/destroy.rb +36 -0
  13. data/lib/mongoid/history/attributes/update.rb +43 -0
  14. data/lib/mongoid/history/options.rb +153 -0
  15. data/lib/mongoid/history/trackable.rb +170 -72
  16. data/lib/mongoid/history/tracker.rb +39 -23
  17. data/lib/mongoid/history/version.rb +1 -1
  18. data/mongoid-history.gemspec +0 -8
  19. data/spec/integration/embedded_in_polymorphic_spec.rb +8 -0
  20. data/spec/integration/integration_spec.rb +4 -0
  21. data/spec/integration/nested_embedded_documents_spec.rb +13 -6
  22. data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +24 -24
  23. data/spec/spec_helper.rb +6 -0
  24. data/spec/unit/attributes/base_spec.rb +54 -0
  25. data/spec/unit/attributes/create_spec.rb +315 -0
  26. data/spec/unit/attributes/destroy_spec.rb +218 -0
  27. data/spec/unit/attributes/update_spec.rb +210 -0
  28. data/spec/unit/embedded_methods_spec.rb +69 -0
  29. data/spec/unit/history_spec.rb +35 -0
  30. data/spec/unit/my_instance_methods_spec.rb +485 -0
  31. data/spec/unit/options_spec.rb +294 -0
  32. data/spec/unit/singleton_methods_spec.rb +338 -0
  33. data/spec/unit/store/default_store_spec.rb +11 -0
  34. data/spec/unit/store/request_store_spec.rb +13 -0
  35. data/spec/unit/trackable_spec.rb +335 -68
  36. data/spec/unit/tracker_spec.rb +153 -0
  37. metadata +31 -102
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::History do
4
+ it { is_expected.to respond_to(:trackable_settings) }
5
+ it { is_expected.to respond_to(:trackable_settings=) }
6
+
7
+ describe '#default_settings' do
8
+ let(:default_settings) { { paranoia_field: 'deleted_at' } }
9
+ it { expect(described_class.default_settings).to eq(default_settings) }
10
+ end
11
+
12
+ describe '#trackable_class_settings' do
13
+ before(:each) { Mongoid::History.trackable_settings = {} }
14
+ let(:model_one) do
15
+ Class.new do
16
+ include Mongoid::Document
17
+ include Mongoid::History::Trackable
18
+ store_in collection: :model_ones
19
+
20
+ def self.name
21
+ 'ModelOne'
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'when present' do
27
+ before(:each) { model_one.history_settings paranoia_field: :annuled_at }
28
+ it { expect(described_class.trackable_class_settings(model_one)).to eq(paranoia_field: 'annuled_at') }
29
+ end
30
+
31
+ context 'when not present' do
32
+ it { expect(described_class.trackable_class_settings(model_one)).to eq(paranoia_field: 'deleted_at') }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,485 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::History::Trackable do
4
+ describe 'MyInstanceMethods' do
5
+ before :all do
6
+ ModelOne = Class.new do
7
+ include Mongoid::Document
8
+ include Mongoid::History::Trackable
9
+ store_in collection: :model_ones
10
+ field :foo
11
+ field :b, as: :bar
12
+ embeds_one :emb_one, inverse_class_name: 'EmbOne'
13
+ embeds_one :emb_two, store_as: :emt, inverse_class_name: 'EmbTwo'
14
+ embeds_many :emb_threes, inverse_class_name: 'EmbThree'
15
+ embeds_many :emb_fours, store_as: :emfs, inverse_class_name: 'EmbFour'
16
+ end
17
+
18
+ EmbOne = Class.new do
19
+ include Mongoid::Document
20
+ include Mongoid::History::Trackable
21
+ field :f_em_foo
22
+ field :fmb, as: :f_em_bar
23
+ embedded_in :model_one
24
+ end
25
+
26
+ EmbTwo = Class.new do
27
+ include Mongoid::Document
28
+ include Mongoid::History::Trackable
29
+ field :baz
30
+ embedded_in :model_one
31
+ end
32
+
33
+ EmbThree = Class.new do
34
+ include Mongoid::Document
35
+ include Mongoid::History::Trackable
36
+ field :f_em_foo
37
+ field :fmb, as: :f_em_bar
38
+ embedded_in :model_one
39
+ end
40
+
41
+ EmbFour = Class.new do
42
+ include Mongoid::Document
43
+ include Mongoid::History::Trackable
44
+ field :baz
45
+ embedded_in :model_one
46
+ end
47
+
48
+ ModelOne.track_history(on: %i(foo emb_one emb_threes))
49
+ @persisted_history_options = Mongoid::History.trackable_class_options
50
+ end
51
+ before(:each) { Mongoid::History.trackable_class_options = @persisted_history_options }
52
+
53
+ let(:bson_class) { defined?(BSON::ObjectId) ? BSON::ObjectId : Moped::BSON::ObjectId }
54
+
55
+ let(:emb_one) { EmbOne.new(f_em_foo: 'Foo', f_em_bar: 'Bar') }
56
+ let(:emb_threes) { [EmbThree.new(f_em_foo: 'Foo', f_em_bar: 'Bar')] }
57
+ let(:model_one) do
58
+ ModelOne.new(foo: 'Foo',
59
+ bar: 'Bar',
60
+ emb_one: emb_one,
61
+ emb_threes: emb_threes)
62
+ end
63
+
64
+ describe '#modified_attributes_for_create' do
65
+ before(:each) { ModelOne.clear_trackable_memoization }
66
+ subject { model_one.send(:modified_attributes_for_create) }
67
+
68
+ context 'with tracked embeds_one object' do
69
+ before(:each) { ModelOne.track_history(on: { emb_one: :f_em_foo }) }
70
+ it 'should include tracked attributes only' do
71
+ expect(subject['emb_one'][0]).to be_nil
72
+
73
+ expect(subject['emb_one'][1].keys.size).to eq 2
74
+ expect(subject['emb_one'][1]['_id']).to eq emb_one._id
75
+ expect(subject['emb_one'][1]['f_em_foo']).to eq 'Foo'
76
+ end
77
+ end
78
+
79
+ context 'with untracked embeds_one object' do
80
+ before(:each) { ModelOne.track_history(on: :fields) }
81
+ it 'should not include embeds_one attributes' do
82
+ expect(subject['emb_one']).to be_nil
83
+ end
84
+ end
85
+
86
+ context 'with tracked embeds_many objects' do
87
+ before(:each) { ModelOne.track_history(on: { emb_threes: :f_em_foo }) }
88
+ it 'should include tracked attributes only' do
89
+ expect(subject['emb_threes'][0]).to be_nil
90
+
91
+ expect(subject['emb_threes'][1][0].keys.count).to eq 2
92
+ expect(subject['emb_threes'][1][0]['_id']).to eq emb_threes.first._id
93
+ expect(subject['emb_threes'][1][0]['f_em_foo']).to eq 'Foo'
94
+ end
95
+ end
96
+
97
+ context 'with untracked embeds_many objects' do
98
+ before(:each) { ModelOne.track_history(on: :fields) }
99
+ it 'should include not tracked embeds_many attributes' do
100
+ expect(subject['emb_threes']).to be_nil
101
+ end
102
+ end
103
+
104
+ context 'when embeds_one object blank' do
105
+ let(:emb_one) { nil }
106
+
107
+ it 'should not include embeds_one model key' do
108
+ expect(subject.keys).to_not include 'emb_one'
109
+ end
110
+ end
111
+
112
+ describe 'embeds_one' do
113
+ before(:all) do
114
+ Mail = Class.new do
115
+ include Mongoid::Document
116
+ include Mongoid::History::Trackable
117
+ store_in collection: :mails
118
+ field :provider
119
+ embeds_one :mail_subject, inverse_class_name: 'MailSubject'
120
+ end
121
+
122
+ MailSubject = Class.new do
123
+ include Mongoid::Document
124
+ field :content
125
+ embedded_in :mail
126
+ end
127
+ end
128
+
129
+ before(:each) do
130
+ Mail.instance_variable_set(:@history_trackable_options, nil)
131
+ Mail.track_history(on: :mail_subject)
132
+ end
133
+
134
+ let(:mail) { Mail.new(mail_subject: mail_subject) }
135
+ let(:mail_subject) { nil }
136
+ subject { mail.send(:modified_attributes_for_create)['mail_subject'] }
137
+
138
+ context 'when obj not built' do
139
+ it { is_expected.to be_nil }
140
+ end
141
+
142
+ context 'when obj does not respond to paranoia_field' do
143
+ let(:mail_subject) { MailSubject.new(content: 'Content') }
144
+ it { is_expected.to eq [nil, { '_id' => mail_subject._id, 'content' => 'Content' }] }
145
+ end
146
+
147
+ context 'when obj not soft-deleted' do
148
+ before(:each) { allow(mail_subject).to receive(:deleted_at) { nil } }
149
+ let(:mail_subject) { MailSubject.new(content: 'Content') }
150
+ it { is_expected.to eq [nil, { '_id' => mail_subject._id, 'content' => 'Content' }] }
151
+ end
152
+
153
+ context 'when obj soft-deleted' do
154
+ before(:each) { allow(mail_subject).to receive(:deleted_at) { Time.now } }
155
+ let(:mail_subject) { MailSubject.new(content: 'Content') }
156
+ it { is_expected.to be_nil }
157
+ end
158
+
159
+ after(:all) do
160
+ Object.send(:remove_const, :MailSubject)
161
+ Object.send(:remove_const, :Mail)
162
+ end
163
+ end
164
+
165
+ describe 'paranoia' do
166
+ before(:all) do
167
+ ModelParanoia = Class.new do
168
+ include Mongoid::Document
169
+ include Mongoid::History::Trackable
170
+ store_in collection: :model_paranoias
171
+ embeds_many :emb_para_ones, inverse_class_name: 'EmbParaOne'
172
+ end
173
+
174
+ EmbParaOne = Class.new do
175
+ include Mongoid::Document
176
+ field :em_foo
177
+ field :deleted_at
178
+ embedded_in :model_paranoia
179
+ end
180
+ end
181
+
182
+ let(:emb_para_one) { EmbParaOne.new(em_foo: 'Em-Foo') }
183
+ let(:model_paranoia) { ModelParanoia.new(emb_para_ones: [emb_para_one]) }
184
+
185
+ context 'when does not respond to paranoia_field' do
186
+ before(:each) do
187
+ ModelParanoia.instance_variable_set(:@history_trackable_options, nil)
188
+ ModelParanoia.track_history(on: :emb_para_ones)
189
+ end
190
+
191
+ subject { model_paranoia.send(:modified_attributes_for_create) }
192
+
193
+ it 'should include tracked embeds_many objects attributes' do
194
+ expect(subject['emb_para_ones'][0]).to be_nil
195
+ expect(subject['emb_para_ones'][1].size).to eq 1
196
+ expect(subject['emb_para_ones'][1][0]['_id']).to be_a bson_class
197
+ expect(subject['emb_para_ones'][1][0]['em_foo']).to eq 'Em-Foo'
198
+ end
199
+ end
200
+
201
+ context 'when responds to paranoia_field' do
202
+ before(:each) do
203
+ ModelParanoia.instance_variable_set(:@history_trackable_options, nil)
204
+ ModelParanoia.track_history(on: :emb_para_ones)
205
+ allow(emb_para_one).to receive(:deleted_at) { Time.now }
206
+ allow(emb_para_one_2).to receive(:deleted_at) { nil }
207
+ end
208
+
209
+ let(:model_paranoia) { ModelParanoia.new(emb_para_ones: [emb_para_one, emb_para_one_2]) }
210
+ let(:emb_para_one) { EmbParaOne.new(em_foo: 'Em-Foo') }
211
+ let(:emb_para_one_2) { EmbParaOne.new(em_foo: 'Em-Foo-2') }
212
+
213
+ subject { model_paranoia.send(:modified_attributes_for_create) }
214
+
215
+ it 'should not include deleted objects attributes' do
216
+ expect(subject['emb_para_ones'][0]).to be_nil
217
+ expect(subject['emb_para_ones'][1]).to eq [{ '_id' => emb_para_one_2._id, 'em_foo' => 'Em-Foo-2' }]
218
+ end
219
+ end
220
+
221
+ after(:all) do
222
+ Object.send(:remove_const, :ModelParanoia)
223
+ Object.send(:remove_const, :EmbParaOne)
224
+ end
225
+ end
226
+ end
227
+
228
+ describe '#modified_attributes_for_update' do
229
+ before(:each) do
230
+ model_one.save!
231
+ ModelOne.clear_trackable_memoization
232
+ allow(ModelOne).to receive(:dynamic_enabled?) { false }
233
+ allow(model_one).to receive(:changes) { changes }
234
+ end
235
+ let(:changes) { {} }
236
+ subject { model_one.send(:modified_attributes_for_update) }
237
+
238
+ context 'when embeds_one attributes passed in options' do
239
+ before(:each) { ModelOne.track_history(on: { emb_one: :f_em_foo }) }
240
+ let(:changes) { { 'emb_one' => [{ 'f_em_foo' => 'Foo', 'fmb' => 'Bar' }, { 'f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new' }] } }
241
+ it { expect(subject['emb_one'][0]).to eq('f_em_foo' => 'Foo') }
242
+ it { expect(subject['emb_one'][1]).to eq('f_em_foo' => 'Foo-new') }
243
+ end
244
+
245
+ context 'when embeds_one relation passed in options' do
246
+ before(:each) { ModelOne.track_history(on: :emb_one) }
247
+ let(:changes) { { 'emb_one' => [{ 'f_em_foo' => 'Foo', 'fmb' => 'Bar' }, { 'f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new' }] } }
248
+ it { expect(subject['emb_one'][0]).to eq('f_em_foo' => 'Foo', 'fmb' => 'Bar') }
249
+ it { expect(subject['emb_one'][1]).to eq('f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new') }
250
+ end
251
+
252
+ context 'when embeds_one relation not tracked' do
253
+ before(:each) { ModelOne.track_history(on: :fields) }
254
+ let(:changes) { { 'emb_one' => [{ 'f_em_foo' => 'Foo' }, { 'f_em_foo' => 'Foo-new' }] } }
255
+ it { expect(subject['emb_one']).to be_nil }
256
+ end
257
+
258
+ context 'when embeds_many attributes passed in options' do
259
+ before(:each) { ModelOne.track_history(on: { emb_threes: :f_em_foo }) }
260
+ let(:changes) { { 'emb_threes' => [[{ 'f_em_foo' => 'Foo', 'fmb' => 'Bar' }], [{ 'f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new' }]] } }
261
+ it { expect(subject['emb_threes']).to eq [[{ 'f_em_foo' => 'Foo' }], [{ 'f_em_foo' => 'Foo-new' }]] }
262
+ end
263
+
264
+ context 'when embeds_many relation passed in options' do
265
+ before(:each) { ModelOne.track_history(on: :emb_threes) }
266
+ let(:changes) { { 'emb_threes' => [[{ 'f_em_foo' => 'Foo', 'fmb' => 'Bar' }], [{ 'f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new' }]] } }
267
+ it { expect(subject['emb_threes']).to eq [[{ 'f_em_foo' => 'Foo', 'fmb' => 'Bar' }], [{ 'f_em_foo' => 'Foo-new', 'fmb' => 'Bar-new' }]] }
268
+ end
269
+
270
+ context 'when embeds_many relation not tracked' do
271
+ before(:each) { ModelOne.track_history(on: :fields) }
272
+ let(:changes) { { 'emb_threes' => [[{ 'f_em_foo' => 'Foo' }], [{ 'f_em_foo' => 'Foo-new' }]] } }
273
+ it { expect(subject['emb_threes']).to be_nil }
274
+ end
275
+
276
+ context 'when field tracked' do
277
+ before(:each) { ModelOne.track_history(on: :foo) }
278
+ let(:changes) { { 'foo' => ['Foo', 'Foo-new'], 'b' => ['Bar', 'Bar-new'] } }
279
+ it { is_expected.to eq('foo' => ['Foo', 'Foo-new']) }
280
+ end
281
+
282
+ context 'when field not tracked' do
283
+ before(:each) { ModelOne.track_history(on: []) }
284
+ let(:changes) { { 'foo' => ['Foo', 'Foo-new'] } }
285
+ it { is_expected.to eq({}) }
286
+ end
287
+
288
+ describe 'embeds_one' do
289
+ before(:all) do
290
+ Email = Class.new do
291
+ include Mongoid::Document
292
+ include Mongoid::History::Trackable
293
+ store_in collection: :emails
294
+ field :provider
295
+ embeds_one :email_subject, inverse_class_name: 'EmailSubject'
296
+ end
297
+
298
+ EmailSubject = Class.new do
299
+ include Mongoid::Document
300
+ include Mongoid::History::Trackable
301
+ field :content
302
+ embedded_in :email_subject
303
+ end
304
+ end
305
+
306
+ before(:each) do
307
+ Email.instance_variable_set(:@history_trackable_options, nil)
308
+ Email.track_history(on: :email_subject)
309
+ allow(Email).to receive(:dynamic_enabled?) { false }
310
+ allow(email).to receive(:changes) { changes }
311
+ end
312
+
313
+ let(:email) { Email.new }
314
+ let(:changes) { {} }
315
+ subject { email.send(:modified_attributes_for_update)['email_subject'] }
316
+
317
+ context 'when paranoia_field not present' do
318
+ let(:changes) { { 'email_subject' => [{ 'content' => 'Content' }, { 'content' => 'Content-new' }] } }
319
+ it { is_expected.to eq [{ 'content' => 'Content' }, { 'content' => 'Content-new' }] }
320
+ end
321
+
322
+ context 'when older soft-deleted' do
323
+ let(:changes) { { 'email_subject' => [{ 'content' => 'Content', 'deleted_at' => Time.now }, { 'content' => 'Content-new' }] } }
324
+ it { is_expected.to eq [{}, { 'content' => 'Content-new' }] }
325
+ end
326
+
327
+ context 'when new soft-deleted' do
328
+ let(:changes) { { 'email_subject' => [{ 'content' => 'Content' }, { 'content' => 'Content-new', 'deleted_at' => Time.now }] } }
329
+ it { is_expected.to eq [{ 'content' => 'Content' }, {}] }
330
+ end
331
+
332
+ context 'when not soft-deleted' do
333
+ let(:changes) do
334
+ { 'email_subject' => [{ 'content' => 'Content', 'deleted_at' => nil }, { 'content' => 'Content-new', 'deleted_at' => nil }] }
335
+ end
336
+ it { is_expected.to eq [{ 'content' => 'Content' }, { 'content' => 'Content-new' }] }
337
+ end
338
+
339
+ after(:all) do
340
+ Object.send(:remove_const, :EmailSubject)
341
+ Object.send(:remove_const, :Email)
342
+ end
343
+ end
344
+
345
+ describe 'paranoia_field' do
346
+ context 'when embeds_one has alias' do
347
+ before(:all) do
348
+ # Here i need class name constant in trackable.rb. So, not using `let` to define classes
349
+ ModelTwo = Class.new do
350
+ include Mongoid::Document
351
+ include Mongoid::History::Trackable
352
+ store_in collection: :model_twos
353
+ embeds_one :emb_two_one, inverse_class_name: 'EmbTwoOne'
354
+ end
355
+
356
+ EmbTwoOne = Class.new do
357
+ include Mongoid::Document
358
+ include Mongoid::History::Trackable
359
+ field :foo
360
+ field :cncl, as: :cancelled_at
361
+ embedded_in :model_two
362
+ end
363
+ end
364
+
365
+ before(:each) do
366
+ ModelTwo.instance_variable_set(:@history_trackable_options, nil)
367
+ ModelTwo.instance_variable_set(:@trackable_settings, nil)
368
+ EmbTwoOne.instance_variable_set(:@trackable_settings, nil)
369
+
370
+ ModelTwo.track_history on: :emb_two_one
371
+ EmbTwoOne.history_settings paranoia_field: :cancelled_at
372
+
373
+ allow(ModelTwo).to receive(:dynamic_enabled?) { false }
374
+ allow(model_two_obj).to receive(:changes) { changes }
375
+ end
376
+
377
+ let(:model_two_obj) { ModelTwo.new }
378
+ let(:changes) { { 'emb_two_one' => [{ 'foo' => 'Foo', 'cncl' => Time.now }, { 'foo' => 'Foo-new' }] } }
379
+ subject { model_two_obj.send(:modified_attributes_for_update)['emb_two_one'] }
380
+ it { is_expected.to eq [{}, { 'foo' => 'Foo-new' }] }
381
+
382
+ after(:all) do
383
+ Object.send(:remove_const, :ModelTwo)
384
+ Object.send(:remove_const, :EmbTwoOne)
385
+ end
386
+ end
387
+
388
+ context 'when embeds_many has alias' do
389
+ before(:all) do
390
+ # Here i need class name constant in trackable.rb. So, not using `let` to define classes
391
+ ModelTwo = Class.new do
392
+ include Mongoid::Document
393
+ include Mongoid::History::Trackable
394
+ store_in collection: :model_twos
395
+ embeds_many :emb_two_ones, inverse_class_name: 'EmbTwoOne'
396
+ end
397
+
398
+ EmbTwoOne = Class.new do
399
+ include Mongoid::Document
400
+ include Mongoid::History::Trackable
401
+ field :foo
402
+ field :cncl, as: :cancelled_at
403
+ embedded_in :model_two
404
+ end
405
+ end
406
+
407
+ before(:each) do
408
+ ModelTwo.instance_variable_set(:@history_trackable_options, nil)
409
+ ModelTwo.instance_variable_set(:@trackable_settings, nil)
410
+ EmbTwoOne.instance_variable_set(:@trackable_settings, nil)
411
+
412
+ ModelTwo.track_history on: :emb_two_ones
413
+ EmbTwoOne.history_settings paranoia_field: :cancelled_at
414
+
415
+ allow(ModelTwo).to receive(:dynamic_enabled?) { false }
416
+ allow(model_two_obj).to receive(:changes) { changes }
417
+ end
418
+
419
+ let(:model_two_obj) { ModelTwo.new }
420
+ let(:changes) { { 'emb_two_ones' => [[{ 'foo' => 'Foo', 'cncl' => Time.now }], [{ 'foo' => 'Foo-new' }]] } }
421
+ subject { model_two_obj.send(:modified_attributes_for_update)['emb_two_ones'] }
422
+ it { is_expected.to eq [[], [{ 'foo' => 'Foo-new' }]] }
423
+
424
+ after(:all) do
425
+ Object.send(:remove_const, :ModelTwo)
426
+ Object.send(:remove_const, :EmbTwoOne)
427
+ end
428
+ end
429
+ end
430
+ end
431
+
432
+ describe '#modified_attributes_for_destroy' do
433
+ before(:each) do
434
+ allow(ModelOne).to receive(:dynamic_enabled?) { false }
435
+ model_one.save!
436
+ ModelOne.clear_trackable_memoization
437
+ end
438
+ subject { model_one.send(:modified_attributes_for_destroy) }
439
+
440
+ context 'with tracked embeds_one object' do
441
+ before(:each) { ModelOne.track_history(on: { emb_one: :f_em_foo }) }
442
+ it 'should include tracked attributes only' do
443
+ expect(subject['emb_one'][0].keys.size).to eq 2
444
+ expect(subject['emb_one'][0]['_id']).to eq emb_one._id
445
+ expect(subject['emb_one'][0]['f_em_foo']).to eq 'Foo'
446
+
447
+ expect(subject['emb_one'][1]).to be_nil
448
+ end
449
+ end
450
+
451
+ context 'with untracked embeds_one object' do
452
+ before(:each) { ModelOne.track_history(on: :fields) }
453
+ it 'should not include embeds_one attributes' do
454
+ expect(subject['emb_one']).to be_nil
455
+ end
456
+ end
457
+
458
+ context 'with tracked embeds_many objects' do
459
+ before(:each) { ModelOne.track_history(on: { emb_threes: :f_em_foo }) }
460
+ it 'should include tracked attributes only' do
461
+ expect(subject['emb_threes'][0][0].keys.count).to eq 2
462
+ expect(subject['emb_threes'][0][0]['_id']).to eq emb_threes.first._id
463
+ expect(subject['emb_threes'][0][0]['f_em_foo']).to eq 'Foo'
464
+
465
+ expect(subject['emb_threes'][1]).to be_nil
466
+ end
467
+ end
468
+
469
+ context 'with untracked embeds_many objects' do
470
+ before(:each) { ModelOne.track_history(on: :fields) }
471
+ it 'should include not tracked embeds_many attributes' do
472
+ expect(subject['emb_threes']).to be_nil
473
+ end
474
+ end
475
+ end
476
+
477
+ after :all do
478
+ Object.send(:remove_const, :ModelOne)
479
+ Object.send(:remove_const, :EmbOne)
480
+ Object.send(:remove_const, :EmbTwo)
481
+ Object.send(:remove_const, :EmbThree)
482
+ Object.send(:remove_const, :EmbFour)
483
+ end
484
+ end
485
+ end