sandthorn_driver_sequel 2.1.1 → 3.0.0
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/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/README.md +30 -1
- data/lib/sandthorn_driver_sequel/access/aggregate_access.rb +2 -0
- data/lib/sandthorn_driver_sequel/access/event_access.rb +22 -5
- data/lib/sandthorn_driver_sequel/access/snapshot_access.rb +58 -40
- data/lib/sandthorn_driver_sequel/access.rb +0 -4
- data/lib/sandthorn_driver_sequel/event_store.rb +24 -14
- data/lib/sandthorn_driver_sequel/migration.rb +3 -2
- data/lib/sandthorn_driver_sequel/sequel_driver.rb +4 -3
- data/lib/sandthorn_driver_sequel/version.rb +1 -1
- data/lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb +1 -1
- data/lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb +10 -2
- data/lib/sandthorn_driver_sequel.rb +89 -5
- data/sandthorn_driver_sequel.gemspec +0 -2
- data/spec/asking_for_aggregates_to_snapshot_spec.rb +8 -6
- data/spec/benchmark_spec.rb +5 -5
- data/spec/configuration_spec.rb +102 -0
- data/spec/driver_interface_spec.rb +0 -1
- data/spec/event_access_spec.rb +15 -8
- data/spec/event_store_with_context_spec.rb +5 -5
- data/spec/get_events_spec.rb +8 -8
- data/spec/saving_events_spec.rb +13 -30
- data/spec/saving_snapshot_spec.rb +12 -20
- data/spec/snapshot_access_spec.rb +35 -44
- data/spec/spec_helper.rb +5 -2
- metadata +38 -64
@@ -32,8 +32,6 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency "autotest-standalone"
|
33
33
|
spec.add_development_dependency "uuidtools"
|
34
34
|
spec.add_development_dependency "ruby-beautify"
|
35
|
-
spec.add_development_dependency "msgpack"
|
36
|
-
spec.add_development_dependency "snappy"
|
37
35
|
spec.add_development_dependency "guard-rspec"
|
38
36
|
|
39
37
|
spec.add_runtime_dependency "sequel", "~> 4.17"
|
@@ -7,25 +7,27 @@ module SandthornDriverSequel
|
|
7
7
|
|
8
8
|
describe EventStore do
|
9
9
|
before(:each) { prepare_for_test }
|
10
|
+
let(:aggregate) { Struct::AggregateMock.new(aggregate_id, 11) }
|
11
|
+
let(:aggregate_id) { @id ||= UUIDTools::UUID.random_create.to_s }
|
10
12
|
context "when asking for aggregates to snapshot" do
|
11
13
|
let(:aggregates) {
|
12
|
-
[{id: "1", class_name: Foo}, {id:
|
14
|
+
[{id: "1", class_name: Foo}, {id: aggregate_id, class_name: Struct::AggregateMock},{id: "3", class_name: Foo}]}
|
13
15
|
|
14
16
|
before(:each) {save_test_events}
|
15
17
|
|
16
18
|
context "when asking for type 'Bar' and max event count 5" do
|
17
|
-
let(:needs_snapshot) { event_store.obsolete_snapshots aggregate_types: [
|
19
|
+
let(:needs_snapshot) { event_store.obsolete_snapshots aggregate_types: [Struct::AggregateMock], max_event_distance: 5 }
|
18
20
|
context "and no snapshots exist" do
|
19
|
-
it "should return that id 2 with class
|
21
|
+
it "should return that id 2 with class Struct::AggregateMock need to be snapshotted" do
|
20
22
|
expect(needs_snapshot.length).to eql 1
|
21
23
|
expect(needs_snapshot.first[:aggregate_id]).to eql aggregates[1][:id]
|
22
|
-
expect(needs_snapshot.first[:aggregate_type]).to eql "
|
24
|
+
expect(needs_snapshot.first[:aggregate_type]).to eql "Struct::AggregateMock"
|
23
25
|
end
|
24
26
|
end
|
25
27
|
context "and a recent snapshot exists" do
|
26
28
|
before(:each) do
|
27
29
|
snapshot_data = { event_data: "YO MAN", aggregate_version: 11 }
|
28
|
-
event_store.save_snapshot(
|
30
|
+
event_store.save_snapshot(aggregate)
|
29
31
|
end
|
30
32
|
it "should return nil" do
|
31
33
|
expect(needs_snapshot).to be_empty
|
@@ -54,7 +56,7 @@ module SandthornDriverSequel
|
|
54
56
|
events = []
|
55
57
|
i = 0
|
56
58
|
while i < count do
|
57
|
-
events << { aggregate_version: i+start_at,
|
59
|
+
events << { aggregate_version: i+start_at, event_args: nil, event_name: "event_foo_#{i}" }
|
58
60
|
i += 1
|
59
61
|
end
|
60
62
|
events
|
data/spec/benchmark_spec.rb
CHANGED
@@ -10,20 +10,20 @@ module Sandthorn
|
|
10
10
|
before(:each) { prepare_for_test }
|
11
11
|
let(:test_events_20_events) do
|
12
12
|
e = []
|
13
|
-
e << {aggregate_version: 1, event_name: "new",
|
13
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
14
14
|
19.times do |i|
|
15
|
-
e << {aggregate_version: i+2, event_name: "foo",
|
15
|
+
e << {aggregate_version: i+2, event_name: "foo", event_args: "A2"}
|
16
16
|
end
|
17
17
|
e
|
18
18
|
end
|
19
19
|
let(:test_events_one_event) do
|
20
20
|
e = []
|
21
|
-
e << {aggregate_version: 1, event_name: "new",
|
21
|
+
e << {aggregate_version: 1, event_name: "new", event_args: "B1" }
|
22
22
|
end
|
23
23
|
let(:test_events_two_events) do
|
24
24
|
e = []
|
25
|
-
e << {aggregate_version: 1, event_name: "new",
|
26
|
-
e << {aggregate_version: 2, event_name: "foo",
|
25
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
26
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "A2"}
|
27
27
|
end
|
28
28
|
let(:aggregate_id) {"c0456e26-2345-4f67-92fa-130b3a31a39a"}
|
29
29
|
let(:es) { event_store }
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module SandthornDriverSequel
|
4
|
+
describe "Configuration" do
|
5
|
+
|
6
|
+
context "default configuration" do
|
7
|
+
|
8
|
+
let(:driver) { SandthornDriverSequel.driver_from_connection connection: Sequel.sqlite }
|
9
|
+
|
10
|
+
it "should respond_to save_events method" do
|
11
|
+
expect(driver.respond_to?(:save_events)).to be_truthy
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have the default event_serializer" do
|
15
|
+
expect(driver.instance_variable_get "@event_serializer".to_sym).to be_a Proc
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have the default event_deserializer" do
|
19
|
+
expect(driver.instance_variable_get "@event_deserializer".to_sym).to be_a Proc
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have the default snapshot_serializer" do
|
23
|
+
expect(driver.instance_variable_get "@snapshot_serializer".to_sym).to be_a Proc
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should have the default snapshot_deserializer" do
|
27
|
+
expect(driver.instance_variable_get "@snapshot_deserializer".to_sym).to be_a Proc
|
28
|
+
end
|
29
|
+
|
30
|
+
context "change global configuration" do
|
31
|
+
before do
|
32
|
+
SandthornDriverSequel.configure { |conf|
|
33
|
+
conf.event_serializer = :serializer_event_global
|
34
|
+
conf.event_deserializer = :deserializer_event_global
|
35
|
+
conf.snapshot_serializer = :serializer_snapshot_global
|
36
|
+
conf.snapshot_deserializer = :deserializer_snapshot_global
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
after do
|
41
|
+
#Set the default configuration after test
|
42
|
+
SandthornDriverSequel.configure { |conf|
|
43
|
+
conf.event_serializer = -> (data) { YAML.dump(data) }
|
44
|
+
conf.event_deserializer = -> (data) { YAML.load(data) }
|
45
|
+
conf.snapshot_serializer = -> (data) { YAML.dump(data) }
|
46
|
+
conf.snapshot_deserializer = -> (data) { YAML.load(data) }
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should have the new event_serializer" do
|
51
|
+
expect(driver.instance_variable_get "@event_serializer".to_sym).to eql :serializer_event_global
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should have the default event_deserializer" do
|
55
|
+
expect(driver.instance_variable_get "@event_deserializer".to_sym).to eql :deserializer_event_global
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have the new snapshot_serializer" do
|
59
|
+
expect(driver.instance_variable_get "@snapshot_serializer".to_sym).to eql :serializer_snapshot_global
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have the default snapshot_deserializer" do
|
63
|
+
expect(driver.instance_variable_get "@snapshot_deserializer".to_sym).to eql :deserializer_snapshot_global
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "session configuration" do
|
69
|
+
let(:driver) do
|
70
|
+
SandthornDriverSequel.driver_from_connection(connection: Sequel.sqlite) { |conf|
|
71
|
+
conf.event_serializer = :event_serializer
|
72
|
+
conf.event_deserializer = :event_deserializer
|
73
|
+
conf.snapshot_serializer = :snapshot_serializer
|
74
|
+
conf.snapshot_deserializer = :snapshot_deserializer
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should respond_to save_events method" do
|
79
|
+
expect(driver.respond_to?(:save_events)).to be_truthy
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should have a configuration event_serializer" do
|
83
|
+
expect(driver.instance_variable_get "@event_serializer".to_sym).to eql :event_serializer
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should have a configuration event_deserializer" do
|
87
|
+
expect(driver.instance_variable_get "@event_deserializer".to_sym).to eql :event_deserializer
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should have a configuration snapshot_serializer" do
|
91
|
+
expect(driver.instance_variable_get "@snapshot_serializer".to_sym).to eql :snapshot_serializer
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should have a configuration snapshot_deserializer" do
|
95
|
+
expect(driver.instance_variable_get "@snapshot_deserializer".to_sym).to eql :snapshot_deserializer
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
data/spec/event_access_spec.rb
CHANGED
@@ -12,23 +12,28 @@ module SandthornDriverSequel
|
|
12
12
|
let(:db) { Sequel.connect(event_store_url)}
|
13
13
|
let(:aggregate_id) { SecureRandom.uuid }
|
14
14
|
let(:aggregate) do
|
15
|
-
aggregate_access.register_aggregate(aggregate_id, "
|
15
|
+
aggregate_access.register_aggregate(aggregate_id, "AggregateMock")
|
16
16
|
end
|
17
17
|
let(:storage) { Storage.new(db, :test) }
|
18
|
+
let(:event_serializer) { -> (data) { YAML.dump(data) } }
|
19
|
+
let(:event_deserializer) { -> (data) { YAML.load(data) } }
|
20
|
+
let(:snapshot_serializer) { -> (data) { YAML.dump(data) } }
|
21
|
+
let(:snapshot_deserializer) { -> (data) { YAML.load(data) } }
|
18
22
|
let(:aggregate_access) { AggregateAccess.new(storage) }
|
19
|
-
let(:snapshot_access) { SnapshotAccess.new(storage)}
|
20
|
-
let(:access) { EventAccess.new(storage) }
|
23
|
+
let(:snapshot_access) { SnapshotAccess.new(storage, snapshot_serializer, snapshot_deserializer)}
|
24
|
+
let(:access) { EventAccess.new(storage, event_serializer, event_deserializer) }
|
25
|
+
|
21
26
|
|
22
27
|
let(:events) do
|
23
28
|
[
|
24
29
|
{
|
25
30
|
aggregate_version: 1,
|
26
31
|
event_name: "new",
|
27
|
-
|
32
|
+
event_args: "new_data"
|
28
33
|
},{
|
29
34
|
aggregate_version: 2,
|
30
35
|
event_name: "foo",
|
31
|
-
|
36
|
+
event_args: "foo_data"
|
32
37
|
}
|
33
38
|
]
|
34
39
|
end
|
@@ -87,14 +92,16 @@ module SandthornDriverSequel
|
|
87
92
|
it "returns events after the given snapshot" do
|
88
93
|
access.store_events(aggregate, events.first)
|
89
94
|
|
90
|
-
|
95
|
+
aggregate_struct = Struct::AggregateMock.new aggregate_id, events.first[:aggregate_version]
|
96
|
+
|
97
|
+
snapshot_id = snapshot_access.record_snapshot(aggregate_struct)
|
91
98
|
snapshot = snapshot_access.find(snapshot_id)
|
92
99
|
|
93
100
|
access.store_events(aggregate, events.last)
|
94
|
-
|
101
|
+
|
95
102
|
events = access.after_snapshot(snapshot)
|
96
103
|
expect(events.count).to eq(1)
|
97
|
-
expect(events.first[:
|
104
|
+
expect(events.first[:event_args]).to eq("foo_data")
|
98
105
|
end
|
99
106
|
end
|
100
107
|
|
@@ -3,14 +3,14 @@ module SandthornDriverSequel
|
|
3
3
|
describe EventStore do
|
4
4
|
let(:context) { :event_store_spec }
|
5
5
|
before(:each) { prepare_for_test context: context; prepare_for_test context: nil; }
|
6
|
-
let(:event_store_with_context) {
|
7
|
-
let(:event_store_without_context) {
|
6
|
+
let(:event_store_with_context) { SandthornDriverSequel.driver_from_url url: event_store_url, context: context }
|
7
|
+
let(:event_store_without_context) { SandthornDriverSequel.driver_from_url url: event_store_url }
|
8
8
|
context("when saving in one context and retrieving in another") do
|
9
9
|
let(:test_events) do
|
10
10
|
e = []
|
11
|
-
e << {aggregate_version: 1, event_name: "new",
|
12
|
-
e << {aggregate_version: 2, event_name: "foo",
|
13
|
-
e << {aggregate_version: 3, event_name: "flubber",
|
11
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
12
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
|
13
|
+
e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
|
14
14
|
end
|
15
15
|
let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
16
16
|
it "should not find them" do
|
data/spec/get_events_spec.rb
CHANGED
@@ -5,25 +5,25 @@ module SandthornDriverSequel
|
|
5
5
|
before(:each) { prepare_for_test }
|
6
6
|
let(:test_events_a) do
|
7
7
|
e = []
|
8
|
-
e << {aggregate_version: 1, event_name: "new",
|
9
|
-
e << {aggregate_version: 2, event_name: "foo",
|
10
|
-
e << {aggregate_version: 3, event_name: "bard",
|
8
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
9
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "A2"}
|
10
|
+
e << {aggregate_version: 3, event_name: "bard", event_args: "A3"}
|
11
11
|
end
|
12
12
|
let(:aggregate_id_a) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
13
13
|
let(:test_events_b) do
|
14
14
|
e = []
|
15
|
-
e << {aggregate_version: 1, event_name: "new",
|
16
|
-
e << {aggregate_version: 2, event_name: "foo",
|
17
|
-
e << {aggregate_version: 3, event_name: "bar",
|
15
|
+
e << {aggregate_version: 1, event_name: "new", event_args: "B1" }
|
16
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "B2"}
|
17
|
+
e << {aggregate_version: 3, event_name: "bar", event_args: "B3"}
|
18
18
|
end
|
19
19
|
let(:aggregate_id_b) {"c0456e26-1234-4f67-92fa-130b3a31a39a"}
|
20
20
|
let(:test_events_c) do
|
21
21
|
e = []
|
22
|
-
e << {aggregate_version: 1, event_name: "new",
|
22
|
+
e << {aggregate_version: 1, event_name: "new", event_args: "C1" }
|
23
23
|
end
|
24
24
|
let(:test_events_c_2) do
|
25
25
|
e = []
|
26
|
-
e << {aggregate_version: 2, event_name: "flubber",
|
26
|
+
e << {aggregate_version: 2, event_name: "flubber", event_args: "C2" }
|
27
27
|
end
|
28
28
|
let(:aggregate_id_c) {"c0456e26-2345-4f67-92fa-130b3a31a39a"}
|
29
29
|
before(:each) do
|
data/spec/saving_events_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'msgpack'
|
3
2
|
|
4
3
|
module SandthornDriverSequel
|
5
4
|
describe EventStore do
|
@@ -7,9 +6,9 @@ module SandthornDriverSequel
|
|
7
6
|
context "when saving a prefectly sane event stream" do
|
8
7
|
let(:test_events) do
|
9
8
|
e = []
|
10
|
-
e << {aggregate_version: 1, event_name: "new", event_args:
|
11
|
-
e << {aggregate_version: 2, event_name: "foo", event_args:
|
12
|
-
e << {aggregate_version: 3, event_name: "flubber", event_args:
|
9
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
10
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
|
11
|
+
e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
|
13
12
|
end
|
14
13
|
|
15
14
|
let(:aggregate_id) { "c0456e26-e29a-4f67-92fa-130b3a31a39a" }
|
@@ -24,7 +23,7 @@ module SandthornDriverSequel
|
|
24
23
|
event_store.save_events test_events, aggregate_id, String
|
25
24
|
events = event_store.get_aggregate aggregate_id, String
|
26
25
|
event = events.first
|
27
|
-
expect(event[:
|
26
|
+
expect(event[:event_args]).to eql(test_events.first[:event_args])
|
28
27
|
expect(event[:event_name]).to eql("new")
|
29
28
|
expect(event[:aggregate_id]).to eql aggregate_id
|
30
29
|
expect(event[:aggregate_version]).to eql 1
|
@@ -36,13 +35,13 @@ module SandthornDriverSequel
|
|
36
35
|
context "when saving two aggregate types" do
|
37
36
|
let(:test_events_1) do
|
38
37
|
e = []
|
39
|
-
e << {aggregate_version: 1, event_name: "new", event_args:
|
40
|
-
e << {aggregate_version: 2, event_name: "foo", event_args: "
|
41
|
-
e << {aggregate_version: 3, event_name: "flubber", event_args: "
|
38
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
39
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
|
40
|
+
e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
|
42
41
|
end
|
43
42
|
let(:test_events_2) do
|
44
43
|
e = []
|
45
|
-
e << {aggregate_version: 1, event_name: "new", event_args:
|
44
|
+
e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
46
45
|
end
|
47
46
|
let(:aggregate_id_1) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
48
47
|
let(:aggregate_id_2) {"c0456e26-e92b-4f67-92fa-130b3a31b93b"}
|
@@ -69,29 +68,12 @@ module SandthornDriverSequel
|
|
69
68
|
end
|
70
69
|
end
|
71
70
|
|
72
|
-
context "when saving events that are serilized with msgpack" do
|
73
|
-
let(:test_data) { {name: "test", hash: {t: 123}} }
|
74
|
-
let(:test_events) do
|
75
|
-
e = []
|
76
|
-
data = MessagePack.pack(test_data, symbolize_keys: true)
|
77
|
-
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: data}
|
78
|
-
end
|
79
|
-
let(:aggregate_id_1) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
80
|
-
|
81
|
-
it "should save and get events that are serialized with msgpack" do
|
82
|
-
event_store.save_events test_events, aggregate_id_1, String
|
83
|
-
events = event_store.get_aggregate aggregate_id_1, String
|
84
|
-
expect(MessagePack.unpack(events.first[:event_data], symbolize_keys: true)).to eql test_data
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
71
|
context "when saving events that have no aggregate_version" do
|
90
72
|
let(:test_events) do
|
91
73
|
e = []
|
92
|
-
e << {aggregate_version: nil, event_name: "new", event_args:
|
93
|
-
e << {aggregate_version: nil, event_name: "foo", event_args:
|
94
|
-
e << {aggregate_version: nil, event_name: "flubber", event_args:
|
74
|
+
e << {aggregate_version: nil, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
|
75
|
+
e << {aggregate_version: nil, event_name: "foo", event_args: "noop"}
|
76
|
+
e << {aggregate_version: nil, event_name: "flubber", event_args: "noop"}
|
95
77
|
end
|
96
78
|
|
97
79
|
let(:aggregate_id) { "c0456e26-e29a-4f67-92fa-130b3a31a39a" }
|
@@ -106,7 +88,8 @@ module SandthornDriverSequel
|
|
106
88
|
event_store.save_events test_events, aggregate_id, String
|
107
89
|
events = event_store.get_aggregate aggregate_id, String
|
108
90
|
event = events.first
|
109
|
-
|
91
|
+
|
92
|
+
expect(event[:event_args]).to eql(test_events.first[:event_args])
|
110
93
|
expect(event[:event_name]).to eql("new")
|
111
94
|
expect(event[:aggregate_id]).to eql aggregate_id
|
112
95
|
expect(event[:aggregate_version]).to eql 1
|
@@ -5,12 +5,12 @@ module SandthornDriverSequel
|
|
5
5
|
describe EventStore do
|
6
6
|
before(:each) { prepare_for_test }
|
7
7
|
let(:aggregate_id) { @id ||= UUIDTools::UUID.random_create.to_s }
|
8
|
-
let(:test_events) { [{aggregate_version: 1,
|
9
|
-
let(:additional_events) { [{aggregate_version: 3,
|
10
|
-
let(:
|
11
|
-
let(:save_snapshot) { event_store.save_snapshot
|
12
|
-
let(:save_events) { event_store.save_events test_events, aggregate_id,
|
13
|
-
let(:save_additional_events) { event_store.save_events additional_events, aggregate_id,
|
8
|
+
let(:test_events) { [{aggregate_version: 1, event_args: nil, event_name: "new"},{aggregate_version: 2, event_args: nil, event_name: "foo"}] }
|
9
|
+
let(:additional_events) { [{aggregate_version: 3, event_args: nil, event_name: "klopp"},{aggregate_version: 4, event_args: nil, event_name: "flipp"}] }
|
10
|
+
let(:aggregate) { Struct::AggregateMock.new aggregate_id, 2 }
|
11
|
+
let(:save_snapshot) { event_store.save_snapshot aggregate }
|
12
|
+
let(:save_events) { event_store.save_events test_events, aggregate_id, Struct::AggregateMock }
|
13
|
+
let(:save_additional_events) { event_store.save_events additional_events, aggregate_id, Struct::AggregateMock }
|
14
14
|
context "when loading an aggregate using get_aggregate" do
|
15
15
|
context "and it has a snapshot" do
|
16
16
|
before(:each) do
|
@@ -18,9 +18,9 @@ module SandthornDriverSequel
|
|
18
18
|
save_snapshot
|
19
19
|
save_additional_events
|
20
20
|
end
|
21
|
-
let(:events) { event_store.get_aggregate aggregate_id,
|
21
|
+
let(:events) { event_store.get_aggregate aggregate_id, Struct::AggregateMock }
|
22
22
|
it "should have the first event as :aggregate_set_from_snapshot" do
|
23
|
-
expect(events.first[:
|
23
|
+
expect(events.first[:aggregate]).to eql aggregate
|
24
24
|
end
|
25
25
|
it "should have additional events after first snapshot-event" do
|
26
26
|
expect(events.length).to eql 1+additional_events.length
|
@@ -40,7 +40,7 @@ module SandthornDriverSequel
|
|
40
40
|
it "should be able to save and get snapshot" do
|
41
41
|
save_snapshot
|
42
42
|
snap = event_store.get_snapshot(aggregate_id)
|
43
|
-
expect(snap).to eql
|
43
|
+
expect(snap).to eql aggregate
|
44
44
|
end
|
45
45
|
end
|
46
46
|
context "when trying to save a snapshot on a non-existing aggregate" do
|
@@ -48,14 +48,7 @@ module SandthornDriverSequel
|
|
48
48
|
expect { save_snapshot }.to raise_error SandthornDriverSequel::Errors::NoAggregateError
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
52
|
-
before(:each) { save_events }
|
53
|
-
it "should raise a WrongAggregateVersion error" do
|
54
|
-
data = snapshot_data
|
55
|
-
data[:aggregate_version] = 100
|
56
|
-
expect { event_store.save_snapshot data, aggregate_id }.to raise_error SandthornDriverSequel::Errors::WrongSnapshotVersionError
|
57
|
-
end
|
58
|
-
end
|
51
|
+
|
59
52
|
context "when saving a snapshot twice" do
|
60
53
|
before(:each) { save_events; save_snapshot }
|
61
54
|
it "should not raise error" do
|
@@ -65,9 +58,8 @@ module SandthornDriverSequel
|
|
65
58
|
context "when saving a snapshot on a version less than current version" do
|
66
59
|
before(:each) { save_events; }
|
67
60
|
it "should save without protesting" do
|
68
|
-
data =
|
69
|
-
data
|
70
|
-
event_store.save_snapshot(data, aggregate_id)
|
61
|
+
data = Struct::AggregateMock.new aggregate_id, 1
|
62
|
+
event_store.save_snapshot(data)
|
71
63
|
snap = event_store.get_snapshot(aggregate_id)
|
72
64
|
expect(snap).to eql data
|
73
65
|
end
|