sandthorn_driver_sequel 2.1.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|