mongoid-history 0.8.0 → 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 +5 -5
  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 -101
  9. data/CHANGELOG.md +173 -144
  10. data/CONTRIBUTING.md +117 -118
  11. data/Dangerfile +1 -1
  12. data/Gemfile +49 -37
  13. data/LICENSE.txt +20 -20
  14. data/README.md +609 -595
  15. data/RELEASING.md +66 -67
  16. data/Rakefile +24 -24
  17. data/UPGRADING.md +53 -34
  18. data/lib/mongoid/history/attributes/base.rb +72 -72
  19. data/lib/mongoid/history/attributes/create.rb +45 -50
  20. data/lib/mongoid/history/attributes/destroy.rb +34 -34
  21. data/lib/mongoid/history/attributes/update.rb +104 -45
  22. data/lib/mongoid/history/options.rb +177 -179
  23. data/lib/mongoid/history/trackable.rb +588 -521
  24. data/lib/mongoid/history/tracker.rb +247 -244
  25. data/lib/mongoid/history/version.rb +5 -5
  26. data/lib/mongoid/history.rb +77 -52
  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 -0
  30. data/perf/gc_suite.rb +21 -0
  31. data/spec/integration/embedded_in_polymorphic_spec.rb +112 -135
  32. data/spec/integration/integration_spec.rb +976 -942
  33. data/spec/integration/multi_relation_spec.rb +47 -53
  34. data/spec/integration/multiple_trackers_spec.rb +68 -71
  35. data/spec/integration/nested_embedded_documents_spec.rb +64 -84
  36. data/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb +124 -0
  37. data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +115 -127
  38. data/spec/integration/subclasses_spec.rb +47 -29
  39. data/spec/integration/track_history_order_spec.rb +84 -52
  40. data/spec/integration/validation_failure_spec.rb +76 -63
  41. data/spec/spec_helper.rb +32 -25
  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 -13
  45. data/spec/unit/attributes/base_spec.rb +141 -150
  46. data/spec/unit/attributes/create_spec.rb +342 -315
  47. data/spec/unit/attributes/destroy_spec.rb +228 -218
  48. data/spec/unit/attributes/update_spec.rb +342 -321
  49. data/spec/unit/callback_options_spec.rb +165 -159
  50. data/spec/unit/embedded_methods_spec.rb +87 -69
  51. data/spec/unit/history_spec.rb +58 -35
  52. data/spec/unit/my_instance_methods_spec.rb +555 -485
  53. data/spec/unit/options_spec.rb +365 -327
  54. data/spec/unit/singleton_methods_spec.rb +406 -338
  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 -689
  58. data/spec/unit/tracker_spec.rb +190 -163
  59. metadata +13 -8
  60. data/.travis.yml +0 -35
@@ -1,338 +1,406 @@
1
- require 'spec_helper'
2
-
3
- describe Mongoid::History::Trackable do
4
- describe 'SingletonMethods' do
5
- before :all do
6
- MyTrackableModel = Class.new do
7
- include Mongoid::Document
8
- include Mongoid::History::Trackable
9
- field :foo
10
- field :b, as: :bar
11
- embeds_one :my_embed_one_model, inverse_class_name: 'MyEmbedOneModel'
12
- embeds_one :my_untracked_embed_one_model, inverse_class_name: 'MyUntrackedEmbedOneModel'
13
- embeds_many :my_embed_many_models, inverse_class_name: 'MyEmbedManyModel'
14
- end
15
-
16
- MyEmbedOneModel = Class.new do
17
- include Mongoid::Document
18
- field :baz
19
- embedded_in :my_trackable_model
20
- end
21
-
22
- MyUntrackedEmbedOneModel = Class.new do
23
- include Mongoid::Document
24
- field :baz
25
- embedded_in :my_trackable_model
26
- end
27
-
28
- MyEmbedManyModel = Class.new do
29
- include Mongoid::Document
30
- field :bla
31
- embedded_in :my_trackable_model
32
- end
33
-
34
- MyTrackableModel.track_history(on: %i[foo my_embed_one_model my_embed_many_models my_dynamic_field])
35
- end
36
-
37
- describe '#tracked?' do
38
- before { allow(MyTrackableModel).to receive(:dynamic_enabled?) { false } }
39
- it { expect(MyTrackableModel.tracked?(:foo)).to be true }
40
- it { expect(MyTrackableModel.tracked?(:bar)).to be false }
41
- it { expect(MyTrackableModel.tracked?(:my_embed_one_model)).to be true }
42
- it { expect(MyTrackableModel.tracked?(:my_untracked_embed_one_model)).to be false }
43
- it { expect(MyTrackableModel.tracked?(:my_embed_many_models)).to be true }
44
- it { expect(MyTrackableModel.tracked?(:my_dynamic_field)).to be true }
45
- end
46
-
47
- describe '#dynamic_field?' do
48
- before(:all) do
49
- class EmbOne
50
- include Mongoid::Document
51
- embedded_in :my_model
52
- end
53
- end
54
-
55
- context 'when dynamic enabled' do
56
- context 'with embeds one relation' do
57
- let(:my_model) do
58
- Class.new do
59
- include Mongoid::Document
60
- include Mongoid::History::Trackable
61
- store_in collection: :my_models
62
- embeds_one :emb_one
63
- track_history
64
- end
65
- end
66
-
67
- it 'should track dynamic field' do
68
- # Using `let` to define class and use that class inside `before` block to stub a method raises following error.
69
- # RuntimeError:
70
- # let declaration `my_model` accessed in a `before(:context)` hook at:
71
- # /Users/vmc/projects/mongoid-history/spec/unit/singleton_methods_spec.rb:51:in `block (6 levels) in <top (required)>'
72
- #
73
- # `let` and `subject` declarations are not intended to be called
74
- # in a `before(:context)` hook, as they exist to define state that
75
- # is reset between each example, while `before(:context)` exists to
76
- # define state that is shared across examples in an example group.
77
- allow(my_model).to receive(:dynamic_enabled?) { true }
78
- expect(my_model.dynamic_field?(:foo)).to be true
79
- end
80
-
81
- it 'should not track embeds_one relation' do
82
- allow(my_model).to receive(:dynamic_enabled?) { true }
83
- expect(my_model.dynamic_field?(:emb_one)).to be false
84
- end
85
- end
86
-
87
- context 'with embeds one relation and alias' do
88
- let(:my_model) do
89
- Class.new do
90
- include Mongoid::Document
91
- include Mongoid::History::Trackable
92
- store_in collection: :my_models
93
- embeds_one :emb_one, inverse_class_name: 'EmbOne', store_as: :emo
94
- track_history
95
- end
96
- end
97
-
98
- it 'should not track embeds_one relation' do
99
- allow(my_model).to receive(:dynamic_enabled?) { true }
100
- expect(my_model.dynamic_field?(:emo)).to be false
101
- end
102
- end
103
-
104
- context 'with embeds many relation' do
105
- let(:my_model) do
106
- Class.new do
107
- include Mongoid::Document
108
- include Mongoid::History::Trackable
109
- store_in collection: :my_models
110
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
111
- track_history
112
- end
113
- end
114
-
115
- it 'should not track embeds_many relation' do
116
- allow(my_model).to receive(:dynamic_enabled?) { true }
117
- expect(my_model.dynamic_field?(:emb_ones)).to be false
118
- end
119
- end
120
-
121
- context 'with embeds many relation and alias' do
122
- let(:my_model) do
123
- Class.new do
124
- include Mongoid::Document
125
- include Mongoid::History::Trackable
126
- store_in collection: :my_models
127
- embeds_many :emb_ones, inverse_class_name: 'EmbOne', store_as: :emos
128
- track_history
129
- end
130
- end
131
-
132
- it 'should not track embeds_many relation' do
133
- allow(my_model).to receive(:dynamic_enabled?) { true }
134
- expect(my_model.dynamic_field?(:emos)).to be false
135
- end
136
- end
137
- end
138
-
139
- after(:all) do
140
- Object.send(:remove_const, :EmbOne)
141
- end
142
- end
143
-
144
- describe '#tracked_fields' do
145
- it 'should include fields and dynamic fields' do
146
- expect(MyTrackableModel.tracked_fields).to eq %w[foo my_dynamic_field]
147
- end
148
- end
149
-
150
- describe '#tracked_relation?' do
151
- it 'should return true if a relation is tracked' do
152
- expect(MyTrackableModel.tracked_relation?(:my_embed_one_model)).to be true
153
- expect(MyTrackableModel.tracked_relation?(:my_untracked_embed_one_model)).to be false
154
- expect(MyTrackableModel.tracked_relation?(:my_embed_many_models)).to be true
155
- end
156
- end
157
-
158
- describe '#tracked_embeds_one?' do
159
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_one_model)).to be true }
160
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_untracked_embed_one_model)).to be false }
161
- it { expect(MyTrackableModel.tracked_embeds_one?(:my_embed_many_models)).to be false }
162
- end
163
-
164
- describe '#tracked_embeds_one' do
165
- it { expect(MyTrackableModel.tracked_embeds_one).to include 'my_embed_one_model' }
166
- it { expect(MyTrackableModel.tracked_embeds_one).to_not include 'my_untracked_embed_one_model' }
167
- end
168
-
169
- describe '#tracked_embeds_one_attributes' do
170
- before(:all) do
171
- ModelOne = Class.new do
172
- include Mongoid::Document
173
- include Mongoid::History::Trackable
174
- embeds_one :emb_one, inverse_class_name: 'EmbOne'
175
- embeds_one :emb_two, store_as: :emt, inverse_class_name: 'EmbTwo'
176
- embeds_one :emb_three, inverse_class_name: 'EmbThree'
177
- end
178
-
179
- EmbOne = Class.new do
180
- include Mongoid::Document
181
- field :em_foo
182
- field :em_bar
183
- embedded_in :model_one
184
- end
185
-
186
- EmbTwo = Class.new do
187
- include Mongoid::Document
188
- field :em_bar
189
- embedded_in :model_one
190
- end
191
-
192
- EmbThree = Class.new do
193
- include Mongoid::Document
194
- field :em_baz
195
- embedded_in :model_one
196
- end
197
- end
198
- before(:each) { ModelOne.instance_variable_set(:@history_trackable_options, nil) }
199
-
200
- context 'when relation tracked' do
201
- before(:each) { ModelOne.track_history(on: :emb_one) }
202
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo em_bar] }
203
- end
204
-
205
- context 'when relation tracked with alias' do
206
- before(:each) { ModelOne.track_history(on: :emb_two) }
207
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_two')).to eq %w[_id em_bar] }
208
- end
209
-
210
- context 'when relation tracked with attributes' do
211
- before(:each) { ModelOne.track_history(on: { emb_one: :em_foo }) }
212
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to eq %w[_id em_foo] }
213
- end
214
-
215
- context 'when relation not tracked' do
216
- before(:each) { ModelOne.track_history(on: :fields) }
217
- it { expect(ModelOne.tracked_embeds_one_attributes('emb_one')).to be_nil }
218
- end
219
-
220
- after(:all) do
221
- Object.send(:remove_const, :ModelOne)
222
- Object.send(:remove_const, :EmbOne)
223
- Object.send(:remove_const, :EmbTwo)
224
- Object.send(:remove_const, :EmbThree)
225
- end
226
- end
227
-
228
- describe '#tracked_embeds_many?' do
229
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_one_model)).to be false }
230
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_untracked_embed_one_model)).to be false }
231
- it { expect(MyTrackableModel.tracked_embeds_many?(:my_embed_many_models)).to be true }
232
- end
233
-
234
- describe '#tracked_embeds_many' do
235
- it { expect(MyTrackableModel.tracked_embeds_many).to eq ['my_embed_many_models'] }
236
- end
237
-
238
- describe '#tracked_embeds_many_attributes' do
239
- before(:all) do
240
- ModelOne = Class.new do
241
- include Mongoid::Document
242
- include Mongoid::History::Trackable
243
- embeds_many :emb_ones, inverse_class_name: 'EmbOne'
244
- embeds_many :emb_twos, store_as: :emts, inverse_class_name: 'EmbTwo'
245
- embeds_many :emb_threes, inverse_class_name: 'EmbThree'
246
- end
247
-
248
- EmbOne = Class.new do
249
- include Mongoid::Document
250
- field :em_foo
251
- field :em_bar
252
- embedded_in :model_one
253
- end
254
-
255
- EmbTwo = Class.new do
256
- include Mongoid::Document
257
- field :em_bar
258
- embedded_in :model_one
259
- end
260
-
261
- EmbThree = Class.new do
262
- include Mongoid::Document
263
- field :em_baz
264
- embedded_in :model_one
265
- end
266
- end
267
- before(:each) { ModelOne.instance_variable_set(:@history_trackable_options, nil) }
268
-
269
- context 'when relation tracked' do
270
- before(:each) { ModelOne.track_history(on: :emb_ones) }
271
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo em_bar] }
272
- end
273
-
274
- context 'when relation tracked with alias' do
275
- before(:each) { ModelOne.track_history(on: :emb_twos) }
276
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_twos')).to eq %w[_id em_bar] }
277
- end
278
-
279
- context 'when relation tracked with attributes' do
280
- before(:each) { ModelOne.track_history(on: { emb_ones: :em_foo }) }
281
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to eq %w[_id em_foo] }
282
- end
283
-
284
- context 'when relation not tracked' do
285
- before(:each) { ModelOne.track_history(on: :fields) }
286
- it { expect(ModelOne.tracked_embeds_many_attributes('emb_ones')).to be_nil }
287
- end
288
-
289
- after(:all) do
290
- Object.send(:remove_const, :ModelOne)
291
- Object.send(:remove_const, :EmbOne)
292
- Object.send(:remove_const, :EmbTwo)
293
- Object.send(:remove_const, :EmbThree)
294
- end
295
- end
296
-
297
- describe '#trackable_scope' do
298
- let(:model_one) do
299
- Class.new do
300
- include Mongoid::Document
301
- include Mongoid::History::Trackable
302
- store_in collection: :model_ones
303
- track_history
304
- end
305
- end
306
-
307
- it { expect(model_one.trackable_scope).to eq(:model_one) }
308
- end
309
-
310
- describe '#clear_trackable_memoization' do
311
- before do
312
- MyTrackableModel.instance_variable_set(:@reserved_tracked_fields, %w[_id _type])
313
- MyTrackableModel.instance_variable_set(:@history_trackable_options, on: %w[fields])
314
- MyTrackableModel.instance_variable_set(:@trackable_settings, paranoia_field: 'deleted_at')
315
- MyTrackableModel.instance_variable_set(:@tracked_fields, %w[foo])
316
- MyTrackableModel.instance_variable_set(:@tracked_embeds_one, %w[my_embed_one_model])
317
- MyTrackableModel.instance_variable_set(:@tracked_embeds_many, %w[my_embed_many_models])
318
- MyTrackableModel.clear_trackable_memoization
319
- end
320
-
321
- it 'should clear all the trackable memoization' do
322
- expect(MyTrackableModel.instance_variable_get(:@reserved_tracked_fields)).to be_nil
323
- expect(MyTrackableModel.instance_variable_get(:@history_trackable_options)).to be_nil
324
- expect(MyTrackableModel.instance_variable_get(:@trackable_settings)).to be_nil
325
- expect(MyTrackableModel.instance_variable_get(:@tracked_fields)).to be_nil
326
- expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_one)).to be_nil
327
- expect(MyTrackableModel.instance_variable_get(:@tracked_embeds_many)).to be_nil
328
- end
329
- end
330
-
331
- after :all do
332
- Object.send(:remove_const, :MyTrackableModel)
333
- Object.send(:remove_const, :MyEmbedOneModel)
334
- Object.send(:remove_const, :MyUntrackedEmbedOneModel)
335
- Object.send(:remove_const, :MyEmbedManyModel)
336
- end
337
- end
338
- 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