sandthorn_driver_sequel 1.1.0 → 2.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/.gitignore +2 -1
- data/Guardfile +7 -0
- data/lib/sandthorn_driver_sequel/access/aggregate_access.rb +50 -0
- data/lib/sandthorn_driver_sequel/access/event_access.rb +81 -0
- data/lib/sandthorn_driver_sequel/access/snapshot_access.rb +87 -0
- data/lib/sandthorn_driver_sequel/access.rb +20 -0
- data/lib/sandthorn_driver_sequel/errors.rb +47 -5
- data/lib/sandthorn_driver_sequel/event_query.rb +90 -0
- data/lib/sandthorn_driver_sequel/event_store.rb +90 -153
- data/lib/sandthorn_driver_sequel/event_store_context.rb +1 -0
- data/lib/sandthorn_driver_sequel/migration.rb +9 -1
- data/lib/sandthorn_driver_sequel/old_event_store.rb +228 -0
- data/lib/sandthorn_driver_sequel/sequel_driver.rb +8 -25
- data/lib/sandthorn_driver_sequel/storage.rb +46 -0
- data/lib/sandthorn_driver_sequel/utilities/array.rb +13 -0
- data/lib/sandthorn_driver_sequel/utilities.rb +1 -0
- data/lib/sandthorn_driver_sequel/version.rb +1 -1
- data/lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb +12 -0
- data/lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb +11 -0
- data/lib/sandthorn_driver_sequel/wrappers.rb +2 -0
- data/lib/sandthorn_driver_sequel.rb +5 -0
- data/sandthorn_driver_sequel.gemspec +2 -2
- data/spec/aggregate_access_spec.rb +97 -0
- data/spec/asking_for_aggregates_to_snapshot_spec.rb +7 -4
- data/spec/driver_interface_spec.rb +23 -40
- data/spec/event_access_spec.rb +96 -0
- data/spec/event_store_with_context_spec.rb +4 -4
- data/spec/get_events_spec.rb +20 -13
- data/spec/migration_specifying_domain_spec.rb +10 -10
- data/spec/saving_events_spec.rb +42 -39
- data/spec/saving_snapshot_spec.rb +7 -7
- data/spec/snapshot_access_spec.rb +119 -0
- data/spec/spec_helper.rb +0 -4
- data/spec/storage_spec.rb +66 -0
- metadata +39 -18
@@ -14,7 +14,7 @@ module SandthornDriverSequel
|
|
14
14
|
before(:each) {save_test_events}
|
15
15
|
|
16
16
|
context "when asking for type 'Bar' and max event count 5" do
|
17
|
-
let(:needs_snapshot) { event_store.obsolete_snapshots
|
17
|
+
let(:needs_snapshot) { event_store.obsolete_snapshots aggregate_types: [Bar], max_event_distance: 5 }
|
18
18
|
context "and no snapshots exist" do
|
19
19
|
it "should return that id 2 with class Bar need to be snapshotted" do
|
20
20
|
expect(needs_snapshot.length).to eql 1
|
@@ -23,8 +23,11 @@ module SandthornDriverSequel
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
context "and a recent snapshot exists" do
|
26
|
-
before(:each)
|
27
|
-
|
26
|
+
before(:each) do
|
27
|
+
snapshot_data = { event_data: "YO MAN", aggregate_version: 11 }
|
28
|
+
event_store.save_snapshot(snapshot_data, aggregates[1][:id])
|
29
|
+
end
|
30
|
+
it "should return nil" do
|
28
31
|
expect(needs_snapshot).to be_empty
|
29
32
|
end
|
30
33
|
end
|
@@ -44,7 +47,7 @@ module SandthornDriverSequel
|
|
44
47
|
save_events for_2_2, 1
|
45
48
|
end
|
46
49
|
def save_events events, aggregate_index
|
47
|
-
event_store.save_events events,
|
50
|
+
event_store.save_events events, aggregates[aggregate_index][:id], aggregates[aggregate_index][:class_name]
|
48
51
|
end
|
49
52
|
|
50
53
|
def event_generator count: 1, start_at: 1
|
@@ -4,45 +4,28 @@ module SandthornDriverSequel
|
|
4
4
|
describe EventStore do
|
5
5
|
before(:each) { prepare_for_test }
|
6
6
|
context "interface structure" do
|
7
|
-
let(:subject) {event_store}
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should respond to get_snapshot" do
|
33
|
-
subject.should respond_to("get_snapshot")
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should respond to get_new_events_after_event_id_matching_classname" do
|
37
|
-
subject.should respond_to("get_new_events_after_event_id_matching_classname")
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should respond to get_events_after_sequence_id" do
|
41
|
-
subject.should respond_to(:get_events)
|
42
|
-
end
|
43
|
-
it("should respond to url"){ expect(subject).to respond_to :url }
|
44
|
-
it("should respond to context"){ expect(subject).to respond_to :context }
|
45
|
-
it("should respond to driver"){ expect(subject).to respond_to :driver }
|
46
|
-
end
|
7
|
+
let(:subject) { event_store }
|
8
|
+
methods = [
|
9
|
+
:save_events,
|
10
|
+
:save_snapshot,
|
11
|
+
:get_aggregate_events_from_snapshot,
|
12
|
+
:get_aggregate,
|
13
|
+
:get_aggregate_events,
|
14
|
+
:get_aggregate_ids,
|
15
|
+
:get_all_types,
|
16
|
+
:get_snapshot,
|
17
|
+
:get_events,
|
18
|
+
:url,
|
19
|
+
:context,
|
20
|
+
:driver
|
21
|
+
]
|
22
|
+
|
23
|
+
methods.each do |method|
|
24
|
+
it "responds to #{method}" do
|
25
|
+
expect(subject).to respond_to(method)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
47
30
|
end
|
48
31
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module SandthornDriverSequel
|
4
|
+
describe EventAccess do
|
5
|
+
include EventStoreContext
|
6
|
+
|
7
|
+
before do
|
8
|
+
prepare_for_test
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:context) { :test }
|
12
|
+
let(:db) { Sequel.connect(event_store_url)}
|
13
|
+
let(:aggregate_id) { SecureRandom.uuid }
|
14
|
+
let(:aggregate) do
|
15
|
+
aggregate_access.register_aggregate(aggregate_id, "foo")
|
16
|
+
end
|
17
|
+
let(:storage) { Storage.new(db, :test) }
|
18
|
+
let(:aggregate_access) { AggregateAccess.new(storage) }
|
19
|
+
let(:snapshot_access) { SnapshotAccess.new(storage)}
|
20
|
+
let(:access) { EventAccess.new(storage) }
|
21
|
+
|
22
|
+
let(:events) do
|
23
|
+
[
|
24
|
+
{
|
25
|
+
aggregate_version: 1,
|
26
|
+
event_name: "new",
|
27
|
+
event_data: "new_data"
|
28
|
+
},{
|
29
|
+
aggregate_version: 2,
|
30
|
+
event_name: "foo",
|
31
|
+
event_data: "foo_data"
|
32
|
+
}
|
33
|
+
]
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#store_events" do
|
37
|
+
|
38
|
+
it "handles both arrays and single events" do
|
39
|
+
access.store_events(aggregate, events[0])
|
40
|
+
events = access.find_events_by_aggregate_id(aggregate_id)
|
41
|
+
expect(events.length).to eq(1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "adds timestamps to all events and associates them to the aggregate" do
|
45
|
+
access.store_events(aggregate, events)
|
46
|
+
events = access.find_events_by_aggregate_id(aggregate_id)
|
47
|
+
expect(events.map(&:timestamp).all?).to be_truthy
|
48
|
+
end
|
49
|
+
|
50
|
+
it "updates the aggregate version" do
|
51
|
+
access.store_events(aggregate, events)
|
52
|
+
events = access.find_events_by_aggregate_id(aggregate_id)
|
53
|
+
version = events.map(&:aggregate_version).max
|
54
|
+
|
55
|
+
reloaded_aggregate = aggregate_access.find(aggregate.id)
|
56
|
+
expect(reloaded_aggregate.aggregate_version).to eq(version)
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when the aggregate version of an event is incorrect" do
|
60
|
+
it "throws an error" do
|
61
|
+
event = { aggregate_version: 100 }
|
62
|
+
expect { access.store_events(aggregate, [event])}.to raise_error(Errors::ConcurrencyError)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#find_events_by_aggregate_id" do
|
68
|
+
context "when there are events" do
|
69
|
+
it "returns correct events" do
|
70
|
+
access.store_events(aggregate, events)
|
71
|
+
|
72
|
+
stored_events = access.find_events_by_aggregate_id(aggregate.aggregate_id)
|
73
|
+
expect(stored_events.map(&:aggregate_table_id)).to all(eq(aggregate.id))
|
74
|
+
expect(stored_events.size).to eq(events.size)
|
75
|
+
expect(stored_events).to all(respond_to(:merge))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#after_snapshot" do
|
81
|
+
it "returns events after the given snapshot" do
|
82
|
+
access.store_events(aggregate, events.first)
|
83
|
+
|
84
|
+
snapshot_id = snapshot_access.record_snapshot(aggregate.aggregate_id, { aggregate_version: 1, event_data: "foo"})
|
85
|
+
snapshot = snapshot_access.find(snapshot_id)
|
86
|
+
|
87
|
+
access.store_events(aggregate, events.last)
|
88
|
+
|
89
|
+
events = access.after_snapshot(snapshot)
|
90
|
+
expect(events.count).to eq(1)
|
91
|
+
expect(events.first[:event_data]).to eq("foo_data")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
@@ -5,7 +5,7 @@ module SandthornDriverSequel
|
|
5
5
|
before(:each) { prepare_for_test context: context; prepare_for_test context: nil; }
|
6
6
|
let(:event_store_with_context) { EventStore.new url: event_store_url, context: context }
|
7
7
|
let(:event_store_without_context) { EventStore.new url: event_store_url }
|
8
|
-
context("when saving in one context and
|
8
|
+
context("when saving in one context and retrieving in another") do
|
9
9
|
let(:test_events) do
|
10
10
|
e = []
|
11
11
|
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
@@ -14,10 +14,10 @@ module SandthornDriverSequel
|
|
14
14
|
end
|
15
15
|
let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
16
16
|
it "should not find them" do
|
17
|
-
event_store_without_context.save_events test_events,
|
18
|
-
events = event_store_without_context.get_aggregate_events aggregate_id
|
17
|
+
event_store_without_context.save_events test_events, aggregate_id, String
|
18
|
+
events = event_store_without_context.get_aggregate_events aggregate_id
|
19
19
|
expect(events.length).to eql test_events.length
|
20
|
-
events_2 = event_store_with_context.get_aggregate_events aggregate_id
|
20
|
+
events_2 = event_store_with_context.get_aggregate_events aggregate_id
|
21
21
|
expect(events_2.length).to eql 0
|
22
22
|
end
|
23
23
|
end
|
data/spec/get_events_spec.rb
CHANGED
@@ -4,35 +4,42 @@ module SandthornDriverSequel
|
|
4
4
|
describe EventStore do
|
5
5
|
before(:each) { prepare_for_test }
|
6
6
|
let(:test_events_a) do
|
7
|
-
e = []
|
7
|
+
e = []
|
8
8
|
e << {aggregate_version: 1, event_name: "new", event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
9
9
|
e << {aggregate_version: 2, event_name: "foo", event_data: "A2"}
|
10
10
|
e << {aggregate_version: 3, event_name: "bard", event_data: "A3"}
|
11
11
|
end
|
12
12
|
let(:aggregate_id_a) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
13
13
|
let(:test_events_b) do
|
14
|
-
e = []
|
14
|
+
e = []
|
15
15
|
e << {aggregate_version: 1, event_name: "new", event_data: "B1" }
|
16
16
|
e << {aggregate_version: 2, event_name: "foo", event_data: "B2"}
|
17
17
|
e << {aggregate_version: 3, event_name: "bar", event_data: "B3"}
|
18
18
|
end
|
19
19
|
let(:aggregate_id_b) {"c0456e26-1234-4f67-92fa-130b3a31a39a"}
|
20
20
|
let(:test_events_c) do
|
21
|
-
e = []
|
21
|
+
e = []
|
22
22
|
e << {aggregate_version: 1, event_name: "new", event_data: "C1" }
|
23
23
|
end
|
24
24
|
let(:test_events_c_2) do
|
25
|
-
e = []
|
25
|
+
e = []
|
26
26
|
e << {aggregate_version: 2, event_name: "flubber", event_data: "C2" }
|
27
27
|
end
|
28
28
|
let(:aggregate_id_c) {"c0456e26-2345-4f67-92fa-130b3a31a39a"}
|
29
29
|
before(:each) do
|
30
|
-
event_store.save_events test_events_a,
|
31
|
-
event_store.save_events test_events_c,
|
32
|
-
event_store.save_events test_events_b,
|
33
|
-
event_store.save_events test_events_c_2,
|
30
|
+
event_store.save_events test_events_a, aggregate_id_a, SandthornDriverSequel::EventStore
|
31
|
+
event_store.save_events test_events_c, aggregate_id_c, String
|
32
|
+
event_store.save_events test_events_b, aggregate_id_b, SandthornDriverSequel::SequelDriver
|
33
|
+
event_store.save_events test_events_c_2, aggregate_id_c, String
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
|
+
let(:event) { event_store.get_events(take: 1).first }
|
37
|
+
|
38
|
+
it "returns events that can be merged" do
|
39
|
+
expect(event).to respond_to(:merge)
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when using get_events" do
|
36
43
|
context "and using take" do
|
37
44
|
let(:events) {event_store.get_events after_sequence_number: 0, include_events: [:new], take: 2}
|
38
45
|
it "should find 2 events" do
|
@@ -51,8 +58,8 @@ module SandthornDriverSequel
|
|
51
58
|
context "and combining args" do
|
52
59
|
let(:events) do
|
53
60
|
all = event_store.get_events after_sequence_number: 0
|
54
|
-
first_seq_number = all[0][:sequence_number]
|
55
|
-
event_store.get_events after_sequence_number: first_seq_number , exclude_events: [:foo], include_events: [:new,
|
61
|
+
first_seq_number = all[0][:sequence_number]
|
62
|
+
event_store.get_events after_sequence_number: first_seq_number , exclude_events: [:foo], include_events: [:new, "bar", :flubber], take: 100
|
56
63
|
end
|
57
64
|
it "should find 4 events" do
|
58
65
|
events.length.should eql 4
|
@@ -89,7 +96,7 @@ module SandthornDriverSequel
|
|
89
96
|
events.each { |e| e[:sequence_number].should be > check; check = e[:sequence_number] }
|
90
97
|
end
|
91
98
|
it "should contain only events for aggregate_id_a and aggregate_id_c" do
|
92
|
-
events.each { |e| [aggregate_id_a, aggregate_id_c].include?(e[:aggregate_id]).should
|
99
|
+
events.each { |e| [aggregate_id_a, aggregate_id_c].include?(e[:aggregate_id]).should be_truthy }
|
93
100
|
end
|
94
101
|
end
|
95
102
|
context "and getting events for SandthornDriverSequel::EventStore after 0" do
|
@@ -147,4 +154,4 @@ module SandthornDriverSequel
|
|
147
154
|
end
|
148
155
|
|
149
156
|
end
|
150
|
-
end
|
157
|
+
end
|
@@ -7,29 +7,29 @@ module SandthornDriverSequel
|
|
7
7
|
aggregates = :aggregates
|
8
8
|
snapshots = :snapshots
|
9
9
|
if context
|
10
|
-
events = "#{context}_#{events}".to_sym
|
11
|
-
aggregates = "#{context}_#{aggregates}".to_sym
|
12
|
-
snapshots = "#{context}_#{snapshots}".to_sym
|
10
|
+
events = "#{context}_#{events}".to_sym
|
11
|
+
aggregates = "#{context}_#{aggregates}".to_sym
|
12
|
+
snapshots = "#{context}_#{snapshots}".to_sym
|
13
13
|
end
|
14
14
|
migration.driver.execute do |db|
|
15
|
-
expect(db.table_exists? events).to
|
16
|
-
expect(db.table_exists? aggregates).to
|
17
|
-
expect(db.table_exists? snapshots).to
|
18
|
-
end
|
15
|
+
expect(db.table_exists? events).to be_truthy, "expected table :#{events} to exist, but it didn't"
|
16
|
+
expect(db.table_exists? aggregates).to be_truthy, "expected table :#{aggregates} to exist, but it didn't"
|
17
|
+
expect(db.table_exists? snapshots).to be_truthy, "expected table :#{snapshots} to exist, but it didn't"
|
18
|
+
end
|
19
19
|
end
|
20
20
|
let(:migration) { Migration.new url: event_store_url, context: context }
|
21
21
|
before(:each) { migration.migrate! }
|
22
|
-
context "when default (nil) eventstore contex" do
|
22
|
+
context "when default (nil) eventstore contex" do
|
23
23
|
let(:context) { nil }
|
24
24
|
it "should create the tables events, aggregates and snapshots" do
|
25
25
|
check_tables
|
26
26
|
end
|
27
27
|
end
|
28
|
-
context "when specifying context" do
|
28
|
+
context "when specifying context" do
|
29
29
|
let(:context) { :another_domain }
|
30
30
|
it "should create the tables events, aggregates and snapshots" do
|
31
31
|
check_tables context
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
data/spec/saving_events_spec.rb
CHANGED
@@ -6,68 +6,69 @@ module SandthornDriverSequel
|
|
6
6
|
before(:each) { prepare_for_test }
|
7
7
|
context "when saving a prefectly sane event stream" do
|
8
8
|
let(:test_events) do
|
9
|
-
e = []
|
9
|
+
e = []
|
10
10
|
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
11
11
|
e << {aggregate_version: 2, event_name: "foo", event_args: ["bar"], event_data: "noop"}
|
12
12
|
e << {aggregate_version: 3, event_name: "flubber", event_args: ["bar"] , event_data: "noop"}
|
13
13
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
|
15
|
+
let(:aggregate_id) { "c0456e26-e29a-4f67-92fa-130b3a31a39a" }
|
16
|
+
|
17
|
+
it "should be able to save and retrieve events on the aggregate" do
|
18
|
+
event_store.save_events test_events, aggregate_id, String
|
19
|
+
events = event_store.get_aggregate_events aggregate_id
|
18
20
|
events.length.should eql test_events.length
|
19
21
|
end
|
20
|
-
|
21
|
-
expect { event_store.save_events test_events, 1, aggregate_id, String }.to raise_error SandthornDriverSequel::Errors::NoAggregateError
|
22
|
-
end
|
23
|
-
it "should fail if originating version is wrong" do
|
24
|
-
event_store.save_events test_events, 0, aggregate_id, String
|
25
|
-
expect { event_store.save_events test_events, 102, aggregate_id, String }.to raise_error SandthornDriverSequel::Errors::WrongAggregateVersionError
|
26
|
-
end
|
22
|
+
|
27
23
|
it "should have correct keys when asking for events" do
|
28
|
-
event_store.save_events test_events,
|
24
|
+
event_store.save_events test_events, aggregate_id, String
|
29
25
|
events = event_store.get_aggregate aggregate_id, String
|
30
26
|
event = events.first
|
31
27
|
event[:event_data].should eql(test_events.first[:event_data])
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
event[:event_name].should eql("new")
|
29
|
+
event[:aggregate_id].should eql aggregate_id
|
30
|
+
event[:aggregate_version].should eql 1
|
31
|
+
event[:sequence_number].should be_a(Fixnum)
|
32
|
+
event[:timestamp].should be_a(Time)
|
37
33
|
end
|
38
|
-
|
34
|
+
end
|
35
|
+
|
39
36
|
context "when saving two aggregate types" do
|
40
37
|
let(:test_events_1) do
|
41
|
-
e = []
|
38
|
+
e = []
|
42
39
|
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
43
|
-
e << {aggregate_version: 2, event_name: "foo", event_args:
|
44
|
-
e << {aggregate_version: 3, event_name: "flubber", event_args:
|
45
|
-
end
|
40
|
+
e << {aggregate_version: 2, event_name: "foo", event_args: "bar", event_data: "noop"}
|
41
|
+
e << {aggregate_version: 3, event_name: "flubber", event_args: "bar", event_data: "noop"}
|
42
|
+
end
|
46
43
|
let(:test_events_2) do
|
47
|
-
e = []
|
44
|
+
e = []
|
48
45
|
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
49
|
-
end
|
46
|
+
end
|
50
47
|
let(:aggregate_id_1) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
51
48
|
let(:aggregate_id_2) {"c0456e26-e92b-4f67-92fa-130b3a31b93b"}
|
52
49
|
let(:aggregate_id_3) {"c0456e26-e92b-1234-92fa-130b3a31b93b"}
|
50
|
+
|
53
51
|
before(:each) do
|
54
|
-
event_store.save_events test_events_1,
|
55
|
-
event_store.save_events test_events_2,
|
56
|
-
event_store.save_events test_events_2,
|
57
|
-
|
52
|
+
event_store.save_events test_events_1, aggregate_id_1, String
|
53
|
+
event_store.save_events test_events_2, aggregate_id_2, Hash
|
54
|
+
event_store.save_events test_events_2, aggregate_id_3, String
|
55
|
+
end
|
56
|
+
|
58
57
|
it "both types should exist in get_all_typenames in alphabetical order" do
|
59
|
-
names = event_store.
|
58
|
+
names = event_store.get_all_types
|
60
59
|
names.length.should eql 2
|
61
60
|
names.first.should eql "Hash"
|
62
61
|
names.last.should eql "String"
|
63
|
-
|
62
|
+
end
|
63
|
+
|
64
64
|
it "should list the aggregate ids when asking for get_aggregate_list_by_typename" do
|
65
|
-
ids = event_store.
|
65
|
+
ids = event_store.get_aggregate_ids(aggregate_type: String)
|
66
66
|
ids.length.should eql 2
|
67
|
-
ids.any? { |e| e == aggregate_id_1 }.should
|
68
|
-
ids.any? { |e| e == aggregate_id_3 }.should
|
67
|
+
ids.any? { |e| e == aggregate_id_1 }.should be_truthy
|
68
|
+
ids.any? { |e| e == aggregate_id_3 }.should be_truthy
|
69
69
|
end
|
70
|
-
|
70
|
+
end
|
71
|
+
|
71
72
|
context "when saving events that are serilized with msgpack" do
|
72
73
|
let(:test_data) { {name: "test", hash: {t: 123}} }
|
73
74
|
let(:test_events) do
|
@@ -76,12 +77,14 @@ module SandthornDriverSequel
|
|
76
77
|
e << {aggregate_version: 1, event_name: "new", event_args: nil, event_data: data}
|
77
78
|
end
|
78
79
|
let(:aggregate_id_1) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
79
|
-
|
80
|
-
|
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
|
81
83
|
events = event_store.get_aggregate aggregate_id_1, String
|
82
84
|
expect(MessagePack.unpack(events.first[:event_data], symbolize_keys: true)).to eql test_data
|
83
|
-
|
85
|
+
end
|
86
|
+
|
84
87
|
end
|
85
88
|
|
86
89
|
end
|
87
|
-
end
|
90
|
+
end
|