mongoid-history 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +22 -18
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +4 -0
  5. data/CONTRIBUTING.md +4 -4
  6. data/Gemfile +8 -6
  7. data/README.md +2 -12
  8. data/UPGRADING.md +20 -1
  9. data/lib/mongoid/history.rb +8 -4
  10. data/lib/mongoid/history/attributes/base.rb +2 -2
  11. data/lib/mongoid/history/attributes/create.rb +2 -2
  12. data/lib/mongoid/history/attributes/update.rb +2 -2
  13. data/lib/mongoid/history/options.rb +11 -20
  14. data/lib/mongoid/history/trackable.rb +71 -56
  15. data/lib/mongoid/history/tracker.rb +8 -5
  16. data/lib/mongoid/history/version.rb +1 -1
  17. data/spec/integration/embedded_in_polymorphic_spec.rb +26 -49
  18. data/spec/integration/integration_spec.rb +132 -120
  19. data/spec/integration/multi_relation_spec.rb +14 -20
  20. data/spec/integration/multiple_trackers_spec.rb +35 -38
  21. data/spec/integration/nested_embedded_documents_spec.rb +31 -51
  22. data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +64 -76
  23. data/spec/integration/subclasses_spec.rb +17 -5
  24. data/spec/integration/track_history_order_spec.rb +59 -27
  25. data/spec/integration/validation_failure_spec.rb +21 -8
  26. data/spec/spec_helper.rb +6 -1
  27. data/spec/unit/attributes/base_spec.rb +17 -26
  28. data/spec/unit/attributes/create_spec.rb +152 -125
  29. data/spec/unit/attributes/destroy_spec.rb +68 -58
  30. data/spec/unit/attributes/update_spec.rb +71 -50
  31. data/spec/unit/callback_options_spec.rb +36 -30
  32. data/spec/unit/embedded_methods_spec.rb +42 -24
  33. data/spec/unit/history_spec.rb +12 -10
  34. data/spec/unit/my_instance_methods_spec.rb +191 -121
  35. data/spec/unit/options_spec.rb +49 -26
  36. data/spec/unit/singleton_methods_spec.rb +156 -88
  37. data/spec/unit/trackable_spec.rb +254 -156
  38. data/spec/unit/tracker_spec.rb +81 -54
  39. metadata +2 -2
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::History::Tracker do
4
- before :all do
4
+ before :each do
5
5
  class Model
6
6
  include Mongoid::Document
7
7
  include Mongoid::History::Trackable
@@ -10,39 +10,33 @@ describe Mongoid::History::Tracker do
10
10
  belongs_to :user, inverse_of: :models
11
11
  has_and_belongs_to_many :external_users, class_name: 'User', inverse_of: :external_models
12
12
 
13
- track_history on: %i[name user external_user_ids], # track title and body fields only, default is :all
14
- modifier_field: :modifier, # adds "referenced_in :modifier" to track who made the change, default is :modifier
15
- modifier_field_inverse_of: nil, # no inverse modifier relationship
16
- version_field: :version, # adds "field :version, :type => Integer" to track current version, default is :version
17
- track_create: false, # track document creation, default is false
18
- track_update: true, # track document updates, default is true
19
- track_destroy: false # track document destruction, default is false
13
+ track_history on: %i[name user external_user_ids], modifier_field_inverse_of: nil
20
14
  end
21
15
 
22
16
  class User
23
17
  include Mongoid::Document
18
+
24
19
  has_many :models, dependent: :destroy, inverse_of: :user
25
20
  has_and_belongs_to_many :external_model, class_name: 'Model', inverse_of: :external_users
26
21
  end
27
22
  end
28
23
 
29
- it 'should be possible to undo when having multiple relations to modifier class' do
30
- user = User.new
31
- user.save
24
+ after :each do
25
+ Object.send(:remove_const, :Model)
26
+ Object.send(:remove_const, :User)
27
+ end
32
28
 
33
- model = Model.new
34
- model.name = 'Foo'
35
- model.user = user
36
- model.save!
29
+ let(:user) { User.create! }
30
+ let(:model) { Model.create!(name: 'Foo', user: user, modifier: user) }
37
31
 
38
- model.name = 'Bar'
39
- model.save!
32
+ it 'should be possible to undo when having multiple relations to modifier class' do
33
+ model.update_attributes!(name: 'Bar', modifier: user)
40
34
 
41
35
  model.undo! user
42
- expect(model.name).to eq('Foo')
36
+ expect(model.name).to eq 'Foo'
43
37
 
44
- model.redo! user, 1
45
- expect(model.name).to eq('Bar')
38
+ model.redo! user, 2
39
+ expect(model.name).to eq 'Bar'
46
40
  end
47
41
 
48
42
  it 'should track foreign key relations' do
@@ -1,33 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::History do
4
- before :all do
5
- Mongoid::History.tracker_class_name = nil
6
-
7
- module MultipleTrackersSpec
8
- class First
9
- include Mongoid::Document
10
- include Mongoid::History::Trackable
11
-
12
- field :text, type: String
13
- track_history on: [:text],
14
- track_create: true,
15
- track_update: true,
16
- track_destroy: true,
17
- tracker_class_name: :first_history_tracker
18
- end
19
-
20
- class Second
21
- include Mongoid::Document
22
- include Mongoid::History::Trackable
23
-
24
- field :text, type: String
25
- track_history on: [:text],
26
- track_create: true,
27
- track_update: true,
28
- track_destroy: true,
29
- tracker_class_name: :second_history_tracker
30
- end
4
+ before :each do
5
+ class First
6
+ include Mongoid::Document
7
+ include Mongoid::History::Trackable
8
+
9
+ field :text, type: String
10
+ track_history on: [:text], tracker_class_name: :first_history_tracker
11
+ end
12
+
13
+ class Second
14
+ include Mongoid::Document
15
+ include Mongoid::History::Trackable
16
+
17
+ field :text, type: String
18
+ track_history on: [:text], tracker_class_name: :second_history_tracker
19
+ end
20
+
21
+ class User
22
+ include Mongoid::Document
31
23
  end
32
24
 
33
25
  class FirstHistoryTracker
@@ -39,25 +31,30 @@ describe Mongoid::History do
39
31
  end
40
32
  end
41
33
 
34
+ after :each do
35
+ Object.send(:remove_const, :First)
36
+ Object.send(:remove_const, :Second)
37
+ Object.send(:remove_const, :User)
38
+ Object.send(:remove_const, :FirstHistoryTracker)
39
+ Object.send(:remove_const, :SecondHistoryTracker)
40
+ end
41
+
42
+ let(:user) { User.create! }
43
+
42
44
  it 'should be possible to have different trackers for each class' do
43
45
  expect(FirstHistoryTracker.count).to eq(0)
44
46
  expect(SecondHistoryTracker.count).to eq(0)
45
- expect(MultipleTrackersSpec::First.tracker_class).to be FirstHistoryTracker
46
- expect(MultipleTrackersSpec::Second.tracker_class).to be SecondHistoryTracker
47
-
48
- foo = MultipleTrackersSpec::First.new
49
- foo.save
47
+ expect(First.tracker_class).to be FirstHistoryTracker
48
+ expect(Second.tracker_class).to be SecondHistoryTracker
50
49
 
51
- bar = MultipleTrackersSpec::Second.new
52
- bar.save
50
+ foo = First.create!(modifier: user)
51
+ bar = Second.create!(modifier: user)
53
52
 
54
53
  expect(FirstHistoryTracker.count).to eq 1
55
54
  expect(SecondHistoryTracker.count).to eq 1
56
55
 
57
- foo.text = "I'm foo"
58
- foo.save
59
- bar.text = "I'm bar"
60
- bar.save
56
+ foo.update_attributes!(text: "I'm foo")
57
+ bar.update_attributes!(text: "I'm bar")
61
58
 
62
59
  expect(FirstHistoryTracker.count).to eq 2
63
60
  expect(SecondHistoryTracker.count).to eq 2
@@ -1,84 +1,64 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::History::Tracker do
4
- before :all do
5
- class Modelone
4
+ before :each do
5
+ class ModelOne
6
6
  include Mongoid::Document
7
7
  include Mongoid::History::Trackable
8
8
 
9
9
  field :name, type: String
10
- belongs_to :user, inverse_of: :modelones
11
- embeds_many :embones
12
-
13
- track_history on: :all, # track title and body fields only, default is :all
14
- modifier_field: :modifier, # adds "referenced_in :modifier" to track who made the change, default is :modifier
15
- version_field: :version, # adds "field :version, :type => Integer" to track current version, default is :version
16
- track_create: false, # track document creation, default is false
17
- track_update: true, # track document updates, default is true
18
- track_destroy: false # track document destruction, default is false
10
+ belongs_to :user, inverse_of: :model_ones
11
+ embeds_many :emb_ones
12
+
13
+ track_history
19
14
  end
20
15
 
21
- class Embone
16
+ class EmbOne
22
17
  include Mongoid::Document
23
18
  include Mongoid::History::Trackable
24
19
 
25
20
  field :name
26
- embeds_many :embtwos, store_as: :ems
27
- embedded_in :modelone
28
-
29
- track_history on: :all, # track title and body fields only, default is :all
30
- modifier_field: :modifier, # adds "referenced_in :modifier" to track who made the change, default is :modifier
31
- version_field: :version, # adds "field :version, :type => Integer" to track current version, default is :version
32
- track_create: false, # track document creation, default is false
33
- track_update: true, # track document updates, default is true
34
- track_destroy: false, # track document destruction, default is false
35
- scope: :model
21
+ embeds_many :emb_twos, store_as: :ems
22
+ embedded_in :model_one
23
+
24
+ track_history
36
25
  end
37
26
 
38
- class Embtwo
27
+ class EmbTwo
39
28
  include Mongoid::Document
40
29
  include Mongoid::History::Trackable
41
30
 
42
31
  field :name
43
- embedded_in :embone
44
-
45
- track_history on: :all, # track title and body fields only, default is :all
46
- modifier_field: :modifier, # adds "referenced_in :modifier" to track who made the change, default is :modifier
47
- version_field: :version, # adds "field :version, :type => Integer" to track current version, default is :version
48
- track_create: false, # track document creation, default is false
49
- track_update: true, # track document updates, default is true
50
- track_destroy: false, # track document destruction, default is false
51
- scope: :modelone
32
+ embedded_in :emb_one
33
+
34
+ track_history scope: :model_one
52
35
  end
53
36
 
54
37
  class User
55
38
  include Mongoid::Document
56
- has_many :modelones, dependent: :destroy, inverse_of: :user
39
+
40
+ has_many :model_ones, dependent: :destroy, inverse_of: :user
57
41
  end
58
42
  end
59
43
 
60
- it 'should be able to track history for nested embedded documents' do
61
- user = User.new
62
- user.save!
44
+ after :each do
45
+ Object.send(:remove_const, :ModelOne)
46
+ Object.send(:remove_const, :EmbOne)
47
+ Object.send(:remove_const, :EmbTwo)
48
+ Object.send(:remove_const, :User)
49
+ end
50
+
51
+ let(:user) { User.create! }
63
52
 
64
- model = Modelone.new(name: 'm1name')
65
- model.user = user
66
- model.save!
67
- embedded1 = model.embones.create(name: 'e1name')
68
- embedded2 = embedded1.embtwos.create(name: 'e2name')
53
+ it 'should be able to track history for nested embedded documents' do
54
+ model = ModelOne.create!(name: 'm1name', user: user, modifier: user)
55
+ embedded1 = model.emb_ones.create!(name: 'e1name', modifier: user)
56
+ embedded2 = embedded1.emb_twos.create!(name: 'e2name', modifier: user)
69
57
 
70
- embedded2.name = 'a new name'
71
- embedded2.save!
58
+ embedded2.update_attributes!(name: 'a new name')
72
59
 
73
- model.history_tracks.first.undo! user
60
+ model.history_tracks[-1].undo! user
74
61
  expect(embedded1.reload.name).to eq('e1name')
75
62
  expect(embedded2.reload.name).to eq('e2name')
76
63
  end
77
-
78
- after :all do
79
- Object.send(:remove_const, :Modelone)
80
- Object.send(:remove_const, :Embone)
81
- Object.send(:remove_const, :Embtwo)
82
- Object.send(:remove_const, :User)
83
- end
84
64
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::History::Tracker do
4
- before :all do
5
- class Modelone
4
+ before :each do
5
+ class ModelOne
6
6
  include Mongoid::Document
7
7
  include Mongoid::History::Trackable
8
8
 
@@ -10,15 +10,10 @@ describe Mongoid::History::Tracker do
10
10
  belongs_to :user
11
11
  embeds_one :one_embedded, as: :embedable
12
12
 
13
- track_history on: :all,
14
- modifier_field: :modifier,
15
- version_field: :version,
16
- track_create: true,
17
- track_update: true,
18
- track_destroy: true
13
+ track_history
19
14
  end
20
15
 
21
- class Modeltwo
16
+ class ModelTwo
22
17
  include Mongoid::Document
23
18
  include Mongoid::History::Trackable
24
19
 
@@ -26,12 +21,7 @@ describe Mongoid::History::Tracker do
26
21
  belongs_to :user
27
22
  embeds_one :one_embedded, as: :embedable
28
23
 
29
- track_history on: :all,
30
- modifier_field: :modifier,
31
- version_field: :version,
32
- track_create: true,
33
- track_update: true,
34
- track_destroy: true
24
+ track_history
35
25
  end
36
26
 
37
27
  class OneEmbedded
@@ -42,13 +32,7 @@ describe Mongoid::History::Tracker do
42
32
  embeds_many :embedded_twos, store_as: :ems
43
33
  embedded_in :embedable, polymorphic: true
44
34
 
45
- track_history on: :all,
46
- modifier_field: :modifier,
47
- version_field: :version,
48
- track_create: true,
49
- track_update: true,
50
- track_destroy: true,
51
- scope: %i[modelone modeltwo]
35
+ track_history scope: %i[model_one model_two]
52
36
  end
53
37
 
54
38
  class EmbeddedTwo
@@ -58,70 +42,74 @@ describe Mongoid::History::Tracker do
58
42
  field :name
59
43
  embedded_in :one_embedded
60
44
 
61
- track_history on: :all,
62
- modifier_field: :modifier,
63
- version_field: :version,
64
- track_create: true,
65
- track_update: true,
66
- track_destroy: true,
67
- scope: %i[modelone modeltwo]
45
+ track_history scope: %i[model_one model_two]
68
46
  end
69
47
 
70
48
  class User
71
49
  include Mongoid::Document
72
- has_many :modelones
73
- has_many :modeltwos
50
+
51
+ has_many :model_ones
52
+ has_many :model_twos
74
53
  end
75
54
  end
76
55
 
56
+ after :each do
57
+ Object.send(:remove_const, :ModelOne)
58
+ Object.send(:remove_const, :ModelTwo)
59
+ Object.send(:remove_const, :OneEmbedded)
60
+ Object.send(:remove_const, :EmbeddedTwo)
61
+ Object.send(:remove_const, :User)
62
+ end
63
+
64
+ let (:user) { User.create! }
65
+
77
66
  it 'tracks history for nested embedded documents with polymorphic relations' do
78
- user = User.new
79
- user.save!
80
-
81
- modelone = user.modelones.build(name: 'modelone')
82
- modelone.save!
83
- modelone.build_one_embedded(name: 'modelone_one_embedded').save!
84
- expect(modelone.history_tracks.count).to eq(2)
85
- expect(modelone.one_embedded.history_tracks.count).to eq(1)
86
-
87
- modelone.reload
88
- modelone.one_embedded.update_attribute(:name, 'modelone_embedded_one!')
89
- expect(modelone.history_tracks.count).to eq(3)
90
- expect(modelone.one_embedded.history_tracks.count).to eq(2)
91
- expect(modelone.history_tracks.last.action).to eq('update')
92
-
93
- modelone.build_one_embedded(name: 'Lorem ipsum').save!
94
- expect(modelone.history_tracks.count).to eq(4)
95
- expect(modelone.one_embedded.history_tracks.count).to eq(1)
96
- expect(modelone.one_embedded.history_tracks.last.action).to eq('create')
97
- expect(modelone.one_embedded.history_tracks.last.association_chain.last['name']).to eq('one_embedded')
98
-
99
- embedded_one1 = modelone.one_embedded.embedded_twos.create(name: 'modelone_one_embedded_1')
100
- expect(modelone.history_tracks.count).to eq(5)
101
- expect(modelone.one_embedded.history_tracks.count).to eq(2)
67
+ user = User.create!
68
+
69
+ model_one = user.model_ones.build(name: 'model_one', modifier: user)
70
+ model_one.save!
71
+ model_one.build_one_embedded(name: 'model_one_one_embedded', modifier: user).save!
72
+ expect(model_one.history_tracks.count).to eq(2)
73
+ expect(model_one.one_embedded.history_tracks.count).to eq(1)
74
+
75
+ model_one.reload
76
+ model_one.one_embedded.update_attributes!(name: 'model_one_embedded_one!')
77
+ expect(model_one.history_tracks.count).to eq(3)
78
+ expect(model_one.one_embedded.history_tracks.count).to eq(2)
79
+ expect(model_one.history_tracks.last.action).to eq('update')
80
+
81
+ model_one.build_one_embedded(name: 'Lorem ipsum', modifier: user).save!
82
+ expect(model_one.history_tracks.count).to eq(4)
83
+ expect(model_one.one_embedded.history_tracks.count).to eq(1)
84
+ expect(model_one.one_embedded.history_tracks.last.action).to eq('create')
85
+ expect(model_one.one_embedded.history_tracks.last.association_chain.last['name']).to eq('one_embedded')
86
+
87
+ embedded_one1 = model_one.one_embedded.embedded_twos.create!(name: 'model_one_one_embedded_1', modifier: user)
88
+ expect(model_one.history_tracks.count).to eq(5)
89
+ expect(model_one.one_embedded.history_tracks.count).to eq(2)
102
90
  expect(embedded_one1.history_tracks.count).to eq(1)
103
91
 
104
- modeltwo = user.modeltwos.build(name: 'modeltwo')
105
- modeltwo.save!
106
- modeltwo.build_one_embedded(name: 'modeltwo_one_embedded').save!
107
- expect(modeltwo.history_tracks.count).to eq(2)
108
- expect(modeltwo.one_embedded.history_tracks.count).to eq(1)
109
-
110
- modeltwo.reload
111
- modeltwo.one_embedded.update_attribute(:name, 'modeltwo_one_embedded!')
112
- expect(modeltwo.history_tracks.count).to eq(3)
113
- expect(modeltwo.one_embedded.history_tracks.count).to eq(2)
114
- expect(modeltwo.history_tracks.last.action).to eq('update')
115
-
116
- modeltwo.build_one_embedded(name: 'Lorem ipsum').save!
117
- expect(modeltwo.history_tracks.count).to eq(4)
118
- expect(modeltwo.one_embedded.history_tracks.count).to eq(1)
119
- expect(modeltwo.one_embedded.history_tracks.last.action).to eq('create')
120
- expect(modeltwo.one_embedded.history_tracks.last.association_chain.last['name']).to eq('one_embedded')
121
-
122
- embedded_one2 = modeltwo.one_embedded.embedded_twos.create(name: 'modeltwo_one_embedded_1')
123
- expect(modeltwo.history_tracks.count).to eq(5)
124
- expect(modeltwo.one_embedded.history_tracks.count).to eq(2)
92
+ model_two = user.model_twos.build(name: 'model_two', modifier: user)
93
+ model_two.save!
94
+ model_two.build_one_embedded(name: 'model_two_one_embedded', modifier: user).save!
95
+ expect(model_two.history_tracks.count).to eq(2)
96
+ expect(model_two.one_embedded.history_tracks.count).to eq(1)
97
+
98
+ model_two.reload
99
+ model_two.one_embedded.update_attributes!(name: 'model_two_one_embedded!')
100
+ expect(model_two.history_tracks.count).to eq(3)
101
+ expect(model_two.one_embedded.history_tracks.count).to eq(2)
102
+ expect(model_two.history_tracks.last.action).to eq('update')
103
+
104
+ model_two.build_one_embedded(name: 'Lorem ipsum', modifier: user).save!
105
+ expect(model_two.history_tracks.count).to eq(4)
106
+ expect(model_two.one_embedded.history_tracks.count).to eq(1)
107
+ expect(model_two.one_embedded.history_tracks.last.action).to eq('create')
108
+ expect(model_two.one_embedded.history_tracks.last.association_chain.last['name']).to eq('one_embedded')
109
+
110
+ embedded_one2 = model_two.one_embedded.embedded_twos.create!(name: 'model_two_one_embedded_1', modifier: user)
111
+ expect(model_two.history_tracks.count).to eq(5)
112
+ expect(model_two.one_embedded.history_tracks.count).to eq(2)
125
113
  expect(embedded_one2.history_tracks.count).to eq(1)
126
114
  end
127
115
  end