activehistory 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -2
- data/activehistory.gemspec +2 -1
- data/lib/activehistory.rb +17 -4
- data/lib/activehistory/action.rb +5 -3
- data/lib/activehistory/adapters/active_record.rb +329 -105
- data/lib/activehistory/connection.rb +11 -23
- data/lib/activehistory/event.rb +79 -25
- data/lib/activehistory/version.rb +2 -2
- data/test/active_record_adapter/association_test/belongs_to_association_test.rb +46 -38
- data/test/active_record_adapter/association_test/has_and_belongs_to_many_test.rb +96 -63
- data/test/active_record_adapter/association_test/has_many_association_test.rb +166 -27
- data/test/active_record_adapter/association_test/has_one_association_test.rb +36 -40
- data/test/active_record_adapter/create_test.rb +10 -14
- data/test/active_record_adapter/destroy_test.rb +4 -6
- data/test/active_record_adapter/event_test.rb +33 -7
- data/test/active_record_adapter/save_test.rb +8 -12
- data/test/activehistory_test.rb +96 -0
- data/test/models.rb +1 -1
- data/test/test_helper.rb +12 -1
- metadata +17 -2
@@ -10,12 +10,12 @@ class EventTest < ActiveSupport::TestCase
|
|
10
10
|
test 'Data captured from Event encalpsulation' do
|
11
11
|
data = {
|
12
12
|
ip: '127.0.0.1',
|
13
|
-
user_agent:
|
14
|
-
session_id:
|
15
|
-
|
16
|
-
|
17
|
-
metadata:
|
18
|
-
timestamp:
|
13
|
+
user_agent: 'user-agent',
|
14
|
+
session_id: 'session-id',
|
15
|
+
performed_by_type: 'model',
|
16
|
+
performed_by_id: 'id',
|
17
|
+
metadata: {random: 'stuff'},
|
18
|
+
timestamp: Time.now
|
19
19
|
}
|
20
20
|
|
21
21
|
# TODO: timestamp: @attrs[:timestamp].iso8601(3),
|
@@ -24,13 +24,22 @@ class EventTest < ActiveSupport::TestCase
|
|
24
24
|
create(:property)
|
25
25
|
end
|
26
26
|
|
27
|
+
eid = nil
|
27
28
|
assert_requested(:post, "http://activehistory.com/events", times: 1) do |req|
|
28
29
|
req_data = JSON.parse(req.body)
|
29
30
|
data.each do |k, v|
|
30
31
|
assert_equal v.is_a?(Time) ? v.utc.iso8601(3) : v.as_json, req_data[k.to_s]
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
+
eid = req_data['id']
|
35
|
+
assert_equal 1, req_data['actions'].size
|
36
|
+
end
|
37
|
+
|
38
|
+
assert_requested(:post, "http://activehistory.com/actions", times: 1) do |req|
|
39
|
+
req_data = JSON.parse(req.body)
|
40
|
+
|
41
|
+
assert_equal 1, req_data['actions'].size
|
42
|
+
assert_equal eid, req_data['actions'].first['event_id']
|
34
43
|
end
|
35
44
|
end
|
36
45
|
|
@@ -56,4 +65,21 @@ class EventTest < ActiveSupport::TestCase
|
|
56
65
|
assert_not_requested :any, /^http:\/\/activehistory.com\/.*/
|
57
66
|
end
|
58
67
|
|
68
|
+
test 'Appending actions to an existing event' do
|
69
|
+
property = nil
|
70
|
+
ActiveHistory.encapsulate(id: "ddb666bd-73c8-4952-ab07-3a45e88f701b") {
|
71
|
+
property = create(:property)
|
72
|
+
}
|
73
|
+
|
74
|
+
assert_requested(:post, "http://activehistory.com/actions", times: 1) do |req|
|
75
|
+
req_data = JSON.parse(req.body)
|
76
|
+
|
77
|
+
assert_equal 1, req_data['actions'].size
|
78
|
+
req_data['actions'][0]['diff'].each do |k, v|
|
79
|
+
assert_equal property.send(k).is_a?(Time) ? property.send(k).utc.iso8601(3) : property.send(k).as_json, v[1]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
59
85
|
end
|
@@ -14,14 +14,12 @@ class SaveTest < ActiveSupport::TestCase
|
|
14
14
|
@property.name = 'Empire State Building'
|
15
15
|
travel_to(@time) { @property.save }
|
16
16
|
|
17
|
-
assert_posted("/events") do
|
18
|
-
|
19
|
-
assert_equal 1, req_data['actions'].size
|
20
|
-
|
21
|
-
assert_equal req_data['actions'][0], {
|
17
|
+
assert_posted("/events") do
|
18
|
+
assert_action_for @property, {
|
22
19
|
timestamp: @time.iso8601(3),
|
23
20
|
type: 'update',
|
24
|
-
|
21
|
+
subject_type: "Property",
|
22
|
+
subject_id: @property.id,
|
25
23
|
diff: {
|
26
24
|
name: ['unkown', 'Empire State Building']
|
27
25
|
}
|
@@ -37,14 +35,12 @@ class SaveTest < ActiveSupport::TestCase
|
|
37
35
|
@comment.body = 'new body'
|
38
36
|
travel_to(@time) { @comment.save }
|
39
37
|
|
40
|
-
assert_posted("/events") do
|
41
|
-
|
42
|
-
assert_equal 1, req_data['actions'].size
|
43
|
-
|
44
|
-
assert_equal req_data['actions'][0], {
|
38
|
+
assert_posted("/events") do
|
39
|
+
assert_action_for @comment, {
|
45
40
|
timestamp: @time.iso8601(3),
|
46
41
|
type: 'update',
|
47
|
-
|
42
|
+
subject_type: "Comment",
|
43
|
+
subject_id: @comment.id,
|
48
44
|
diff: {
|
49
45
|
body: ['body', 'new body']
|
50
46
|
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ActiveHistoryTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@time = (Time.now.utc + 2).change(usec: 0)
|
8
|
+
end
|
9
|
+
|
10
|
+
test '::encapsulate(EVENT_ID) appends action to EVENT_ID'
|
11
|
+
|
12
|
+
test '::encapsulate(event) appends actions to the given event' do
|
13
|
+
@property = create(:property, name: 'unkown')
|
14
|
+
WebMock::RequestRegistry.instance.reset!
|
15
|
+
|
16
|
+
event = ActiveHistory::Event.create!
|
17
|
+
|
18
|
+
ActiveHistory.encapsulate(event) do
|
19
|
+
@property.name = 'Empire State Building'
|
20
|
+
travel_to(@time) { @property.save }
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_posted('/actions') do |req|
|
24
|
+
assert_action_for @property, {
|
25
|
+
timestamp: @time.iso8601(3),
|
26
|
+
type: 'update',
|
27
|
+
event_id: event.id,
|
28
|
+
subject_type: 'Property',
|
29
|
+
subject_id: @property.id,
|
30
|
+
diff: { name: ['unkown', 'Empire State Building'] }
|
31
|
+
}.as_json
|
32
|
+
end
|
33
|
+
|
34
|
+
WebMock::RequestRegistry.instance.reset!
|
35
|
+
|
36
|
+
ActiveHistory.encapsulate(event) do
|
37
|
+
@property.name = 'Empire State'
|
38
|
+
travel_to(@time) { @property.save }
|
39
|
+
end
|
40
|
+
|
41
|
+
assert_posted('/actions') do |req|
|
42
|
+
assert_action_for @property, {
|
43
|
+
timestamp: @time.iso8601(3),
|
44
|
+
type: 'update',
|
45
|
+
event_id: event.id,
|
46
|
+
subject_type: 'Property',
|
47
|
+
subject_id: @property.id,
|
48
|
+
diff: { name: ['Empire State Building', 'Empire State'] }
|
49
|
+
}.as_json
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
test '::encapsulate' do
|
55
|
+
@property = create(:property, name: 'unkown')
|
56
|
+
WebMock::RequestRegistry.instance.reset!
|
57
|
+
|
58
|
+
ActiveHistory.encapsulate do
|
59
|
+
@property.name = 'Empire State Building'
|
60
|
+
travel_to(@time) { @property.save }
|
61
|
+
|
62
|
+
eid = nil
|
63
|
+
assert_posted("/events") do
|
64
|
+
eid = @req['id']
|
65
|
+
assert_action_for @property, {
|
66
|
+
timestamp: @time.iso8601(3),
|
67
|
+
type: 'update',
|
68
|
+
subject_type: "Property",
|
69
|
+
subject_id: @property.id,
|
70
|
+
diff: {
|
71
|
+
name: ['unkown', 'Empire State Building']
|
72
|
+
}
|
73
|
+
}.as_json
|
74
|
+
end
|
75
|
+
|
76
|
+
WebMock::RequestRegistry.instance.reset!
|
77
|
+
@property.name = "Crysler Building"
|
78
|
+
travel_to(@time + 1) { @property.save }
|
79
|
+
|
80
|
+
assert_posted("/actions") do
|
81
|
+
assert_action_for @property, {
|
82
|
+
event_id: eid,
|
83
|
+
timestamp: (@time + 1).iso8601(3),
|
84
|
+
type: 'update',
|
85
|
+
subject_type: "Property",
|
86
|
+
subject_id: @property.id,
|
87
|
+
diff: {
|
88
|
+
name: ['Empire State Building', 'Crysler Building']
|
89
|
+
}
|
90
|
+
}.as_json
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/test/models.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -41,7 +41,18 @@ class ActiveSupport::TestCase
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def assert_posted(path, &block)
|
44
|
-
assert_requested(:post, "#{ActiveHistory.url}#{path}", times: 1
|
44
|
+
assert_requested(:post, "#{ActiveHistory.url}#{path}", times: 1) do |req|
|
45
|
+
@req = JSON.parse(req.body)
|
46
|
+
block.call @req
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def assert_action_for(model, expected)
|
51
|
+
action = @req['actions'].find do |action|
|
52
|
+
action['subject_type'] == model.class.base_class.model_name.name && action['subject_id'] == model.id
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_equal(expected.as_json, action)
|
45
56
|
end
|
46
57
|
|
47
58
|
def assert_not_posted(path)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activehistory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -220,6 +220,20 @@ dependencies:
|
|
220
220
|
- - '='
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: 5.0.0.1
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: globalid
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: 0.3.7
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - "~>"
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: 0.3.7
|
223
237
|
description: |
|
224
238
|
ActiveHistory tracks and logs changes to your ActiveRecord models and
|
225
239
|
relationships for auditing in the future.
|
@@ -252,6 +266,7 @@ files:
|
|
252
266
|
- test/active_record_adapter/destroy_test.rb
|
253
267
|
- test/active_record_adapter/event_test.rb
|
254
268
|
- test/active_record_adapter/save_test.rb
|
269
|
+
- test/activehistory_test.rb
|
255
270
|
- test/factories.rb
|
256
271
|
- test/models.rb
|
257
272
|
- test/schema.rb
|