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,406 +1,406 @@
1
- require 'spec_helper'
2
-
3
- describe Mongoid::History::Trackable do
4
- describe 'SingletonMethods' do
5
- before :each do
6
- class MyTrackableModel
7
- include Mongoid::Document
8
- include Mongoid::History::Trackable
9
-
10
- field :foo
11
- field :b, as: :bar
12
-
13
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
14
- embeds_one :my_embed_one_model
15
- embeds_one :my_untracked_embed_one_model
16
- embeds_many :my_embed_many_models
17
- else
18
- embeds_one :my_embed_one_model, inverse_class_name: 'MyEmbedOneModel'
19
- embeds_one :my_untracked_embed_one_model, inverse_class_name: 'MyUntrackedEmbedOneModel'
20
- embeds_many :my_embed_many_models, inverse_class_name: 'MyEmbedManyModel'
21
- end
22
-
23
- track_history on: %i[foo my_embed_one_model my_embed_many_models my_dynamic_field]
24
- end
25
-
26
- class MyEmbedOneModel
27
- include Mongoid::Document
28
-
29
- field :baz
30
- embedded_in :my_trackable_model
31
- end
32
-
33
- class MyUntrackedEmbedOneModel
34
- include Mongoid::Document
35
-
36
- field :baz
37
- embedded_in :my_trackable_model
38
- end
39
-
40
- class MyEmbedManyModel
41
- include Mongoid::Document
42
-
43
- field :bla
44
- embedded_in :my_trackable_model
45
- end
46
- end
47
-
48
- after :each do
49
- Object.send(:remove_const, :MyTrackableModel)
50
- Object.send(:remove_const, :MyEmbedOneModel)
51
- Object.send(:remove_const, :MyUntrackedEmbedOneModel)
52
- Object.send(:remove_const, :MyEmbedManyModel)
53
- end
54
-
55
- describe '#tracked?' do
56
- before { allow(MyTrackableModel).to receive(:dynamic_enabled?) { false } }
57
- it { expect(MyTrackableModel.tracked?(:foo)).to be true }
58
- it { expect(MyTrackableModel.tracked?(:bar)).to be false }
59
- it { expect(MyTrackableModel.tracked?(:my_embed_one_model)).to be true }
60
- it { expect(MyTrackableModel.tracked?(:my_untracked_embed_one_model)).to be false }
61
- it { expect(MyTrackableModel.tracked?(:my_embed_many_models)).to be true }
62
- it { expect(MyTrackableModel.tracked?(:my_dynamic_field)).to be true }
63
- end
64
-
65
- describe '#dynamic_field?' do
66
- before :each do
67
- class EmbOne
68
- include Mongoid::Document
69
-
70
- embedded_in :my_model
71
- end
72
- end
73
-
74
- after :each do
75
- Object.send(:remove_const, :EmbOne)
76
- end
77
-
78
- context 'when dynamic enabled' do
79
- context 'with embeds one relation' do
80
- before :each do
81
- class MyModel
82
- include Mongoid::Document
83
- include Mongoid::History::Trackable
84
-
85
- store_in collection: :my_models
86
-
87
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
88
- embeds_one :emb_one
89
- else
90
- embeds_one :emb_one, inverse_class_name: 'EmbOne'
91
- end
92
-
93
- track_history
94
- end
95
- end
96
-
97
- after :each do
98
- Object.send(:remove_const, :MyModel)
99
- end
100
-
101
- it 'should track dynamic field' do
102
- allow(MyModel).to receive(:dynamic_enabled?) { true }
103
- expect(MyModel.dynamic_field?(:foo)).to be true
104
- end
105
-
106
- it 'should not track embeds_one relation' do
107
- allow(MyModel).to receive(:dynamic_enabled?) { true }
108
- expect(MyModel.dynamic_field?(:emb_one)).to be false
109
- end
110
- end
111
-
112
- context 'with embeds one relation and alias' do
113
- before :each do
114
- class MyModel
115
- include Mongoid::Document
116
- include Mongoid::History::Trackable
117
-
118
- store_in collection: :my_models
119
-
120
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
121
- embeds_one :emb_one, store_as: :emo
122
- else
123
- embeds_one :emb_one, inverse_class_name: 'EmbOne', store_as: :emo
124
- end
125
-
126
- track_history
127
- end
128
- end
129
-
130
- after :each do
131
- Object.send(:remove_const, :MyModel)
132
- end
133
-
134
- it 'should not track embeds_one relation' do
135
- allow(MyModel).to receive(:dynamic_enabled?) { true }
136
- expect(MyModel.dynamic_field?(:emo)).to be false
137
- end
138
- end
139
-
140
- context 'with embeds many relation' do
141
- before :each do
142
- class MyModel
143
- include Mongoid::Document
144
- include Mongoid::History::Trackable
145
-
146
- store_in collection: :my_models
147
-
148
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
149
- embeds_many :emb_ones
150
- else
151
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
152
- end
153
-
154
- track_history
155
- end
156
- end
157
-
158
- after :each do
159
- Object.send(:remove_const, :MyModel)
160
- end
161
-
162
- it 'should not track embeds_many relation' do
163
- allow(MyModel).to receive(:dynamic_enabled?) { true }
164
- expect(MyModel.dynamic_field?(:emb_ones)).to be false
165
- end
166
- end
167
-
168
- context 'with embeds many relation and alias' do
169
- before :each do
170
- class MyModel
171
- include Mongoid::Document
172
- include Mongoid::History::Trackable
173
-
174
- store_in collection: :my_models
175
-
176
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
177
- embeds_many :emb_ones, store_as: :emos
178
- else
179
- embeds_many :emb_ones, store_as: :emos, inverse_class_name: 'EmbOne'
180
- end
181
- track_history
182
- end
183
- end
184
-
185
- after :each do
186
- Object.send(:remove_const, :MyModel)
187
- end
188
-
189
- it 'should not track embeds_many relation' do
190
- allow(MyModel).to receive(:dynamic_enabled?) { true }
191
- expect(MyModel.dynamic_field?(:emos)).to be false
192
- end
193
- end
194
- end
195
- end
196
-
197
- describe '#tracked_fields' do
198
- it 'should include fields and dynamic fields' do
199
- expect(MyTrackableModel.tracked_fields).to eq %w[foo my_dynamic_field]
200
- end
201
- end
202
-
203
- describe '#tracked_relation?' do
204
- it 'should return true if a relation is tracked' do
205
- expect(MyTrackableModel.tracked_relation?(:my_embed_one_model)).to be true
206
- expect(MyTrackableModel.tracked_relation?(:my_untracked_embed_one_model)).to be false
207
- expect(MyTrackableModel.tracked_relation?(:my_embed_many_models)).to be true
208
- end
209
- end
210
-
211
- describe '#tracked_embeds_one?' do
212
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_one_model)).to be true }
213
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_untracked_embed_one_model)).to be false }
214
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_many_models)).to be false }
215
- end
216
-
217
- describe '#tracked_embeds_one' do
218
- it { expect(MyTrackableModel.tracked_embeds_one).to include 'my_embed_one_model' }
219
- it { expect(MyTrackableModel.tracked_embeds_one).to_not include 'my_untracked_embed_one_model' }
220
- end
221
-
222
- describe '#tracked_embeds_one_attributes' do
223
- before :each do
224
- class ModelOne
225
- include Mongoid::Document
226
- include Mongoid::History::Trackable
227
-
228
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
229
- embeds_one :emb_one
230
- embeds_one :emb_two, store_as: :emt
231
- embeds_one :emb_three
232
- else
233
- embeds_one :emb_one, inverse_class_name: 'EmbOne'
234
- embeds_one :emb_two, store_as: :emt, inverse_class_name: 'EmbTwo'
235
- embeds_one :emb_three, inverse_class_name: 'EmbThree'
236
- end
237
- end
238
-
239
- class EmbOne
240
- include Mongoid::Document
241
-
242
- field :em_foo
243
- field :em_bar
244
-
245
- embedded_in :model_one
246
- end
247
-
248
- class EmbTwo
249
- include Mongoid::Document
250
-
251
- field :em_bar
252
- embedded_in :model_one
253
- end
254
-
255
- class EmbThree
256
- include Mongoid::Document
257
-
258
- field :em_baz
259
- embedded_in :model_one
260
- end
261
- end
262
-
263
- after :each do
264
- Object.send(:remove_const, :ModelOne)
265
- Object.send(:remove_const, :EmbOne)
266
- Object.send(:remove_const, :EmbTwo)
267
- Object.send(:remove_const, :EmbThree)
268
- end
269
-
270
- context 'when relation tracked' do
271
- before(:each) { ModelOne.track_history(on: :emb_one) }
272
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo em_bar] }
273
- end
274
-
275
- context 'when relation tracked with alias' do
276
- before(:each) { ModelOne.track_history(on: :emb_two) }
277
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_two')).to eq %w[_id em_bar] }
278
- end
279
-
280
- context 'when relation tracked with attributes' do
281
- before(:each) { ModelOne.track_history(on: { emb_one: :em_foo }) }
282
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo] }
283
- end
284
-
285
- context 'when relation not tracked' do
286
- before(:each) { ModelOne.track_history(on: :fields) }
287
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to be_nil }
288
- end
289
- end
290
-
291
- describe '#tracked_embeds_many?' do
292
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_one_model)).to be false }
293
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_untracked_embed_one_model)).to be false }
294
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_many_models)).to be true }
295
- end
296
-
297
- describe '#tracked_embeds_many' do
298
- it { expect(MyTrackableModel.tracked_embeds_many).to eq ['my_embed_many_models'] }
299
- end
300
-
301
- describe '#tracked_embeds_many_attributes' do
302
- before :each do
303
- class ModelOne
304
- include Mongoid::Document
305
- include Mongoid::History::Trackable
306
-
307
- if Mongoid::Compatibility::Version.mongoid7_or_newer?
308
- embeds_many :emb_ones
309
- embeds_many :emb_twos, store_as: :emts
310
- embeds_many :emb_threes
311
- else
312
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
313
- embeds_many :emb_twos, store_as: :emts, inverse_class_name: 'EmbTwo'
314
- embeds_many :emb_threes, inverse_class_name: 'EmbThree'
315
- end
316
- end
317
-
318
- class EmbOne
319
- include Mongoid::Document
320
-
321
- field :em_foo
322
- field :em_bar
323
-
324
- embedded_in :model_one
325
- end
326
-
327
- class EmbTwo
328
- include Mongoid::Document
329
-
330
- field :em_bar
331
- embedded_in :model_one
332
- end
333
-
334
- class EmbThree
335
- include Mongoid::Document
336
-
337
- field :em_baz
338
- embedded_in :model_one
339
- end
340
- end
341
-
342
- after :each do
343
- Object.send(:remove_const, :ModelOne)
344
- Object.send(:remove_const, :EmbOne)
345
- Object.send(:remove_const, :EmbTwo)
346
- Object.send(:remove_const, :EmbThree)
347
- end
348
-
349
- context 'when relation tracked' do
350
- before(:each) { ModelOne.track_history(on: :emb_ones) }
351
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo em_bar] }
352
- end
353
-
354
- context 'when relation tracked with alias' do
355
- before(:each) { ModelOne.track_history(on: :emb_twos) }
356
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_twos')).to eq %w[_id em_bar] }
357
- end
358
-
359
- context 'when relation tracked with attributes' do
360
- before(:each) { ModelOne.track_history(on: { emb_ones: :em_foo }) }
361
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo] }
362
- end
363
-
364
- context 'when relation not tracked' do
365
- before(:each) { ModelOne.track_history(on: :fields) }
366
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to be_nil }
367
- end
368
- end
369
-
370
- describe '#trackable_scope' do
371
- before :each do
372
- class ModelOne
373
- include Mongoid::Document
374
- include Mongoid::History::Trackable
375
-
376
- store_in collection: :model_ones
377
-
378
- track_history
379
- end
380
- end
381
-
382
- it { expect(ModelOne.trackable_scope).to eq(:model_one) }
383
- end
384
-
385
- describe '#clear_trackable_memoization' do
386
- before :each do
387
- MyTrackableModel.instance_variable_set(:@reserved_tracked_fields, %w[_id _type])
388
- MyTrackableModel.instance_variable_set(:@history_trackable_options, on: %w[fields])
389
- MyTrackableModel.instance_variable_set(:@trackable_settings, paranoia_field: 'deleted_at')
390
- MyTrackableModel.instance_variable_set(:@tracked_fields, %w[foo])
391
- MyTrackableModel.instance_variable_set(:@tracked_embeds_one, %w[my_embed_one_model])
392
- MyTrackableModel.instance_variable_set(:@tracked_embeds_many, %w[my_embed_many_models])
393
- MyTrackableModel.clear_trackable_memoization
394
- end
395
-
396
- it 'should clear all the trackable memoization' do
397
- expect(MyTrackableModel.instance_variable_get(:@reserved_tracked_fields)).to be_nil
398
- expect(MyTrackableModel.instance_variable_get(:@history_trackable_options)).to be_nil
399
- expect(MyTrackableModel.instance_variable_get(:@trackable_settings)).to be_nil
400
- expect(MyTrackableModel.instance_variable_get(:@tracked_fields)).to be_nil
401
- expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_one)).to be_nil
402
- expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_many)).to be_nil
403
- end
404
- end
405
- end
406
- end
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::History::Trackable do
4
+ describe 'SingletonMethods' do
5
+ before :each do
6
+ class MyTrackableModel
7
+ include Mongoid::Document
8
+ include Mongoid::History::Trackable
9
+
10
+ field :foo
11
+ field :b, as: :bar
12
+
13
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
14
+ embeds_one :my_embed_one_model
15
+ embeds_one :my_untracked_embed_one_model
16
+ embeds_many :my_embed_many_models
17
+ else
18
+ embeds_one :my_embed_one_model, inverse_class_name: 'MyEmbedOneModel'
19
+ embeds_one :my_untracked_embed_one_model, inverse_class_name: 'MyUntrackedEmbedOneModel'
20
+ embeds_many :my_embed_many_models, inverse_class_name: 'MyEmbedManyModel'
21
+ end
22
+
23
+ track_history on: %i[foo my_embed_one_model my_embed_many_models my_dynamic_field]
24
+ end
25
+
26
+ class MyEmbedOneModel
27
+ include Mongoid::Document
28
+
29
+ field :baz
30
+ embedded_in :my_trackable_model
31
+ end
32
+
33
+ class MyUntrackedEmbedOneModel
34
+ include Mongoid::Document
35
+
36
+ field :baz
37
+ embedded_in :my_trackable_model
38
+ end
39
+
40
+ class MyEmbedManyModel
41
+ include Mongoid::Document
42
+
43
+ field :bla
44
+ embedded_in :my_trackable_model
45
+ end
46
+ end
47
+
48
+ after :each do
49
+ Object.send(:remove_const, :MyTrackableModel)
50
+ Object.send(:remove_const, :MyEmbedOneModel)
51
+ Object.send(:remove_const, :MyUntrackedEmbedOneModel)
52
+ Object.send(:remove_const, :MyEmbedManyModel)
53
+ end
54
+
55
+ describe '#tracked?' do
56
+ before { allow(MyTrackableModel).to receive(:dynamic_enabled?) { false } }
57
+ it { expect(MyTrackableModel.tracked?(:foo)).to be true }
58
+ it { expect(MyTrackableModel.tracked?(:bar)).to be false }
59
+ it { expect(MyTrackableModel.tracked?(:my_embed_one_model)).to be true }
60
+ it { expect(MyTrackableModel.tracked?(:my_untracked_embed_one_model)).to be false }
61
+ it { expect(MyTrackableModel.tracked?(:my_embed_many_models)).to be true }
62
+ it { expect(MyTrackableModel.tracked?(:my_dynamic_field)).to be true }
63
+ end
64
+
65
+ describe '#dynamic_field?' do
66
+ before :each do
67
+ class EmbOne
68
+ include Mongoid::Document
69
+
70
+ embedded_in :my_model
71
+ end
72
+ end
73
+
74
+ after :each do
75
+ Object.send(:remove_const, :EmbOne)
76
+ end
77
+
78
+ context 'when dynamic enabled' do
79
+ context 'with embeds one relation' do
80
+ before :each do
81
+ class MyModel
82
+ include Mongoid::Document
83
+ include Mongoid::History::Trackable
84
+
85
+ store_in collection: :my_models
86
+
87
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
88
+ embeds_one :emb_one
89
+ else
90
+ embeds_one :emb_one, inverse_class_name: 'EmbOne'
91
+ end
92
+
93
+ track_history
94
+ end
95
+ end
96
+
97
+ after :each do
98
+ Object.send(:remove_const, :MyModel)
99
+ end
100
+
101
+ it 'should track dynamic field' do
102
+ allow(MyModel).to receive(:dynamic_enabled?) { true }
103
+ expect(MyModel.dynamic_field?(:foo)).to be true
104
+ end
105
+
106
+ it 'should not track embeds_one relation' do
107
+ allow(MyModel).to receive(:dynamic_enabled?) { true }
108
+ expect(MyModel.dynamic_field?(:emb_one)).to be false
109
+ end
110
+ end
111
+
112
+ context 'with embeds one relation and alias' do
113
+ before :each do
114
+ class MyModel
115
+ include Mongoid::Document
116
+ include Mongoid::History::Trackable
117
+
118
+ store_in collection: :my_models
119
+
120
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
121
+ embeds_one :emb_one, store_as: :emo
122
+ else
123
+ embeds_one :emb_one, inverse_class_name: 'EmbOne', store_as: :emo
124
+ end
125
+
126
+ track_history
127
+ end
128
+ end
129
+
130
+ after :each do
131
+ Object.send(:remove_const, :MyModel)
132
+ end
133
+
134
+ it 'should not track embeds_one relation' do
135
+ allow(MyModel).to receive(:dynamic_enabled?) { true }
136
+ expect(MyModel.dynamic_field?(:emo)).to be false
137
+ end
138
+ end
139
+
140
+ context 'with embeds many relation' do
141
+ before :each do
142
+ class MyModel
143
+ include Mongoid::Document
144
+ include Mongoid::History::Trackable
145
+
146
+ store_in collection: :my_models
147
+
148
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
149
+ embeds_many :emb_ones
150
+ else
151
+ embeds_many :emb_ones, inverse_class_name: 'EmbOne'
152
+ end
153
+
154
+ track_history
155
+ end
156
+ end
157
+
158
+ after :each do
159
+ Object.send(:remove_const, :MyModel)
160
+ end
161
+
162
+ it 'should not track embeds_many relation' do
163
+ allow(MyModel).to receive(:dynamic_enabled?) { true }
164
+ expect(MyModel.dynamic_field?(:emb_ones)).to be false
165
+ end
166
+ end
167
+
168
+ context 'with embeds many relation and alias' do
169
+ before :each do
170
+ class MyModel
171
+ include Mongoid::Document
172
+ include Mongoid::History::Trackable
173
+
174
+ store_in collection: :my_models
175
+
176
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
177
+ embeds_many :emb_ones, store_as: :emos
178
+ else
179
+ embeds_many :emb_ones, store_as: :emos, inverse_class_name: 'EmbOne'
180
+ end
181
+ track_history
182
+ end
183
+ end
184
+
185
+ after :each do
186
+ Object.send(:remove_const, :MyModel)
187
+ end
188
+
189
+ it 'should not track embeds_many relation' do
190
+ allow(MyModel).to receive(:dynamic_enabled?) { true }
191
+ expect(MyModel.dynamic_field?(:emos)).to be false
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#tracked_fields' do
198
+ it 'should include fields and dynamic fields' do
199
+ expect(MyTrackableModel.tracked_fields).to eq %w[foo my_dynamic_field]
200
+ end
201
+ end
202
+
203
+ describe '#tracked_relation?' do
204
+ it 'should return true if a relation is tracked' do
205
+ expect(MyTrackableModel.tracked_relation?(:my_embed_one_model)).to be true
206
+ expect(MyTrackableModel.tracked_relation?(:my_untracked_embed_one_model)).to be false
207
+ expect(MyTrackableModel.tracked_relation?(:my_embed_many_models)).to be true
208
+ end
209
+ end
210
+
211
+ describe '#tracked_embeds_one?' do
212
+ it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_one_model)).to be true }
213
+ it { expect(MyTrackableModel.tracked_embeds_one?(:my_untracked_embed_one_model)).to be false }
214
+ it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_many_models)).to be false }
215
+ end
216
+
217
+ describe '#tracked_embeds_one' do
218
+ it { expect(MyTrackableModel.tracked_embeds_one).to include 'my_embed_one_model' }
219
+ it { expect(MyTrackableModel.tracked_embeds_one).to_not include 'my_untracked_embed_one_model' }
220
+ end
221
+
222
+ describe '#tracked_embeds_one_attributes' do
223
+ before :each do
224
+ class ModelOne
225
+ include Mongoid::Document
226
+ include Mongoid::History::Trackable
227
+
228
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
229
+ embeds_one :emb_one
230
+ embeds_one :emb_two, store_as: :emt
231
+ embeds_one :emb_three
232
+ else
233
+ embeds_one :emb_one, inverse_class_name: 'EmbOne'
234
+ embeds_one :emb_two, store_as: :emt, inverse_class_name: 'EmbTwo'
235
+ embeds_one :emb_three, inverse_class_name: 'EmbThree'
236
+ end
237
+ end
238
+
239
+ class EmbOne
240
+ include Mongoid::Document
241
+
242
+ field :em_foo
243
+ field :em_bar
244
+
245
+ embedded_in :model_one
246
+ end
247
+
248
+ class EmbTwo
249
+ include Mongoid::Document
250
+
251
+ field :em_bar
252
+ embedded_in :model_one
253
+ end
254
+
255
+ class EmbThree
256
+ include Mongoid::Document
257
+
258
+ field :em_baz
259
+ embedded_in :model_one
260
+ end
261
+ end
262
+
263
+ after :each do
264
+ Object.send(:remove_const, :ModelOne)
265
+ Object.send(:remove_const, :EmbOne)
266
+ Object.send(:remove_const, :EmbTwo)
267
+ Object.send(:remove_const, :EmbThree)
268
+ end
269
+
270
+ context 'when relation tracked' do
271
+ before(:each) { ModelOne.track_history(on: :emb_one) }
272
+ it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo em_bar] }
273
+ end
274
+
275
+ context 'when relation tracked with alias' do
276
+ before(:each) { ModelOne.track_history(on: :emb_two) }
277
+ it { expect(ModelOne.tracked_embeds_one_attributes('emb_two')).to eq %w[_id em_bar] }
278
+ end
279
+
280
+ context 'when relation tracked with attributes' do
281
+ before(:each) { ModelOne.track_history(on: { emb_one: :em_foo }) }
282
+ it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo] }
283
+ end
284
+
285
+ context 'when relation not tracked' do
286
+ before(:each) { ModelOne.track_history(on: :fields) }
287
+ it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to be_nil }
288
+ end
289
+ end
290
+
291
+ describe '#tracked_embeds_many?' do
292
+ it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_one_model)).to be false }
293
+ it { expect(MyTrackableModel.tracked_embeds_many?(:my_untracked_embed_one_model)).to be false }
294
+ it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_many_models)).to be true }
295
+ end
296
+
297
+ describe '#tracked_embeds_many' do
298
+ it { expect(MyTrackableModel.tracked_embeds_many).to eq ['my_embed_many_models'] }
299
+ end
300
+
301
+ describe '#tracked_embeds_many_attributes' do
302
+ before :each do
303
+ class ModelOne
304
+ include Mongoid::Document
305
+ include Mongoid::History::Trackable
306
+
307
+ if Mongoid::Compatibility::Version.mongoid7_or_newer?
308
+ embeds_many :emb_ones
309
+ embeds_many :emb_twos, store_as: :emts
310
+ embeds_many :emb_threes
311
+ else
312
+ embeds_many :emb_ones, inverse_class_name: 'EmbOne'
313
+ embeds_many :emb_twos, store_as: :emts, inverse_class_name: 'EmbTwo'
314
+ embeds_many :emb_threes, inverse_class_name: 'EmbThree'
315
+ end
316
+ end
317
+
318
+ class EmbOne
319
+ include Mongoid::Document
320
+
321
+ field :em_foo
322
+ field :em_bar
323
+
324
+ embedded_in :model_one
325
+ end
326
+
327
+ class EmbTwo
328
+ include Mongoid::Document
329
+
330
+ field :em_bar
331
+ embedded_in :model_one
332
+ end
333
+
334
+ class EmbThree
335
+ include Mongoid::Document
336
+
337
+ field :em_baz
338
+ embedded_in :model_one
339
+ end
340
+ end
341
+
342
+ after :each do
343
+ Object.send(:remove_const, :ModelOne)
344
+ Object.send(:remove_const, :EmbOne)
345
+ Object.send(:remove_const, :EmbTwo)
346
+ Object.send(:remove_const, :EmbThree)
347
+ end
348
+
349
+ context 'when relation tracked' do
350
+ before(:each) { ModelOne.track_history(on: :emb_ones) }
351
+ it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo em_bar] }
352
+ end
353
+
354
+ context 'when relation tracked with alias' do
355
+ before(:each) { ModelOne.track_history(on: :emb_twos) }
356
+ it { expect(ModelOne.tracked_embeds_many_attributes('emb_twos')).to eq %w[_id em_bar] }
357
+ end
358
+
359
+ context 'when relation tracked with attributes' do
360
+ before(:each) { ModelOne.track_history(on: { emb_ones: :em_foo }) }
361
+ it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo] }
362
+ end
363
+
364
+ context 'when relation not tracked' do
365
+ before(:each) { ModelOne.track_history(on: :fields) }
366
+ it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to be_nil }
367
+ end
368
+ end
369
+
370
+ describe '#trackable_scope' do
371
+ before :each do
372
+ class ModelOne
373
+ include Mongoid::Document
374
+ include Mongoid::History::Trackable
375
+
376
+ store_in collection: :model_ones
377
+
378
+ track_history
379
+ end
380
+ end
381
+
382
+ it { expect(ModelOne.trackable_scope).to eq(:model_one) }
383
+ end
384
+
385
+ describe '#clear_trackable_memoization' do
386
+ before :each do
387
+ MyTrackableModel.instance_variable_set(:@reserved_tracked_fields, %w[_id _type])
388
+ MyTrackableModel.instance_variable_set(:@history_trackable_options, on: %w[fields])
389
+ MyTrackableModel.instance_variable_set(:@trackable_settings, paranoia_field: 'deleted_at')
390
+ MyTrackableModel.instance_variable_set(:@tracked_fields, %w[foo])
391
+ MyTrackableModel.instance_variable_set(:@tracked_embeds_one, %w[my_embed_one_model])
392
+ MyTrackableModel.instance_variable_set(:@tracked_embeds_many, %w[my_embed_many_models])
393
+ MyTrackableModel.clear_trackable_memoization
394
+ end
395
+
396
+ it 'should clear all the trackable memoization' do
397
+ expect(MyTrackableModel.instance_variable_get(:@reserved_tracked_fields)).to be_nil
398
+ expect(MyTrackableModel.instance_variable_get(:@history_trackable_options)).to be_nil
399
+ expect(MyTrackableModel.instance_variable_get(:@trackable_settings)).to be_nil
400
+ expect(MyTrackableModel.instance_variable_get(:@tracked_fields)).to be_nil
401
+ expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_one)).to be_nil
402
+ expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_many)).to be_nil
403
+ end
404
+ end
405
+ end
406
+ end