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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +22 -18
- data/.travis.yml +1 -0
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +4 -4
- data/Gemfile +8 -6
- data/README.md +2 -12
- data/UPGRADING.md +20 -1
- data/lib/mongoid/history.rb +8 -4
- data/lib/mongoid/history/attributes/base.rb +2 -2
- data/lib/mongoid/history/attributes/create.rb +2 -2
- data/lib/mongoid/history/attributes/update.rb +2 -2
- data/lib/mongoid/history/options.rb +11 -20
- data/lib/mongoid/history/trackable.rb +71 -56
- data/lib/mongoid/history/tracker.rb +8 -5
- data/lib/mongoid/history/version.rb +1 -1
- data/spec/integration/embedded_in_polymorphic_spec.rb +26 -49
- data/spec/integration/integration_spec.rb +132 -120
- data/spec/integration/multi_relation_spec.rb +14 -20
- data/spec/integration/multiple_trackers_spec.rb +35 -38
- data/spec/integration/nested_embedded_documents_spec.rb +31 -51
- data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +64 -76
- data/spec/integration/subclasses_spec.rb +17 -5
- data/spec/integration/track_history_order_spec.rb +59 -27
- data/spec/integration/validation_failure_spec.rb +21 -8
- data/spec/spec_helper.rb +6 -1
- data/spec/unit/attributes/base_spec.rb +17 -26
- data/spec/unit/attributes/create_spec.rb +152 -125
- data/spec/unit/attributes/destroy_spec.rb +68 -58
- data/spec/unit/attributes/update_spec.rb +71 -50
- data/spec/unit/callback_options_spec.rb +36 -30
- data/spec/unit/embedded_methods_spec.rb +42 -24
- data/spec/unit/history_spec.rb +12 -10
- data/spec/unit/my_instance_methods_spec.rb +191 -121
- data/spec/unit/options_spec.rb +49 -26
- data/spec/unit/singleton_methods_spec.rb +156 -88
- data/spec/unit/trackable_spec.rb +254 -156
- data/spec/unit/tracker_spec.rb +81 -54
- metadata +2 -2
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Mongoid::History::Tracker do
|
4
|
-
before :
|
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],
|
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
|
-
|
30
|
-
|
31
|
-
|
24
|
+
after :each do
|
25
|
+
Object.send(:remove_const, :Model)
|
26
|
+
Object.send(:remove_const, :User)
|
27
|
+
end
|
32
28
|
|
33
|
-
|
34
|
-
|
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
|
-
|
39
|
-
model.
|
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
|
36
|
+
expect(model.name).to eq 'Foo'
|
43
37
|
|
44
|
-
model.redo! user,
|
45
|
-
expect(model.name).to eq
|
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 :
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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(
|
46
|
-
expect(
|
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
|
-
|
52
|
-
bar.
|
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
|
58
|
-
|
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 :
|
5
|
-
class
|
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: :
|
11
|
-
embeds_many :
|
12
|
-
|
13
|
-
track_history
|
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
|
16
|
+
class EmbOne
|
22
17
|
include Mongoid::Document
|
23
18
|
include Mongoid::History::Trackable
|
24
19
|
|
25
20
|
field :name
|
26
|
-
embeds_many :
|
27
|
-
embedded_in :
|
28
|
-
|
29
|
-
track_history
|
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
|
27
|
+
class EmbTwo
|
39
28
|
include Mongoid::Document
|
40
29
|
include Mongoid::History::Trackable
|
41
30
|
|
42
31
|
field :name
|
43
|
-
embedded_in :
|
44
|
-
|
45
|
-
track_history
|
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
|
-
|
39
|
+
|
40
|
+
has_many :model_ones, dependent: :destroy, inverse_of: :user
|
57
41
|
end
|
58
42
|
end
|
59
43
|
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
65
|
-
model.user
|
66
|
-
model.
|
67
|
-
|
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
|
71
|
-
embedded2.save!
|
58
|
+
embedded2.update_attributes!(name: 'a new name')
|
72
59
|
|
73
|
-
model.history_tracks.
|
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 :
|
5
|
-
class
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
73
|
-
has_many :
|
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.
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
expect(
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
expect(
|
90
|
-
expect(
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
expect(
|
95
|
-
expect(
|
96
|
-
expect(
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
expect(
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
expect(
|
108
|
-
expect(
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
expect(
|
113
|
-
expect(
|
114
|
-
expect(
|
115
|
-
|
116
|
-
|
117
|
-
expect(
|
118
|
-
expect(
|
119
|
-
expect(
|
120
|
-
expect(
|
121
|
-
|
122
|
-
embedded_one2 =
|
123
|
-
expect(
|
124
|
-
expect(
|
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
|