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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/Guardfile +7 -0
  4. data/lib/sandthorn_driver_sequel/access/aggregate_access.rb +50 -0
  5. data/lib/sandthorn_driver_sequel/access/event_access.rb +81 -0
  6. data/lib/sandthorn_driver_sequel/access/snapshot_access.rb +87 -0
  7. data/lib/sandthorn_driver_sequel/access.rb +20 -0
  8. data/lib/sandthorn_driver_sequel/errors.rb +47 -5
  9. data/lib/sandthorn_driver_sequel/event_query.rb +90 -0
  10. data/lib/sandthorn_driver_sequel/event_store.rb +90 -153
  11. data/lib/sandthorn_driver_sequel/event_store_context.rb +1 -0
  12. data/lib/sandthorn_driver_sequel/migration.rb +9 -1
  13. data/lib/sandthorn_driver_sequel/old_event_store.rb +228 -0
  14. data/lib/sandthorn_driver_sequel/sequel_driver.rb +8 -25
  15. data/lib/sandthorn_driver_sequel/storage.rb +46 -0
  16. data/lib/sandthorn_driver_sequel/utilities/array.rb +13 -0
  17. data/lib/sandthorn_driver_sequel/utilities.rb +1 -0
  18. data/lib/sandthorn_driver_sequel/version.rb +1 -1
  19. data/lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb +12 -0
  20. data/lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb +11 -0
  21. data/lib/sandthorn_driver_sequel/wrappers.rb +2 -0
  22. data/lib/sandthorn_driver_sequel.rb +5 -0
  23. data/sandthorn_driver_sequel.gemspec +2 -2
  24. data/spec/aggregate_access_spec.rb +97 -0
  25. data/spec/asking_for_aggregates_to_snapshot_spec.rb +7 -4
  26. data/spec/driver_interface_spec.rb +23 -40
  27. data/spec/event_access_spec.rb +96 -0
  28. data/spec/event_store_with_context_spec.rb +4 -4
  29. data/spec/get_events_spec.rb +20 -13
  30. data/spec/migration_specifying_domain_spec.rb +10 -10
  31. data/spec/saving_events_spec.rb +42 -39
  32. data/spec/saving_snapshot_spec.rb +7 -7
  33. data/spec/snapshot_access_spec.rb +119 -0
  34. data/spec/spec_helper.rb +0 -4
  35. data/spec/storage_spec.rb +66 -0
  36. 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 class_names: [Bar], max_event_distance: 5 }
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) { event_store.save_snapshot({ event_data: "YO MAN", aggregate_version: 11 }, aggregates[1][:id], aggregates[1][:class_name])}
27
- it "should return empty array" do
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, events.first[:aggregate_version]-1, aggregates[aggregate_index][:id], aggregates[aggregate_index][:class_name]
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
- it "should respond to save_events" do
9
- subject.should respond_to("save_events")
10
- end
11
-
12
- it "should respond to save_snapshot" do
13
- subject.should respond_to("save_snapshot")
14
- end
15
-
16
- it "should respond to get_aggregate" do
17
- subject.should respond_to("get_aggregate")
18
- end
19
-
20
- it "should respond to get_aggregate_events" do
21
- subject.should respond_to("get_aggregate_events")
22
- end
23
-
24
- it "should respond to get_aggregate_list_by_typename" do
25
- subject.should respond_to("get_aggregate_list_by_typename")
26
- end
27
-
28
- it "should respond to get_all_typenames" do
29
- subject.should respond_to("get_all_typenames")
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 retreiving in another") do
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, 0, aggregate_id, String
18
- events = event_store_without_context.get_aggregate_events aggregate_id, String
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, String
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
@@ -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, 0, aggregate_id_a, SandthornDriverSequel::EventStore
31
- event_store.save_events test_events_c, 0, aggregate_id_c, String
32
- event_store.save_events test_events_b, 0, aggregate_id_b, SandthornDriverSequel::SequelDriver
33
- event_store.save_events test_events_c_2, 1, aggregate_id_c, String
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
- context "when using get_events" do
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, :foo, "bar", :flubber], take: 100
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 be_true }
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 be_true, "expected table :#{events} to exist, but it didn't"
16
- expect(db.table_exists? aggregates).to be_true, "expected table :#{aggregates} to exist, but it didn't"
17
- expect(db.table_exists? snapshots).to be_true, "expected table :#{snapshots} to exist, but it didn't"
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
@@ -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
- let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
15
- it "should be able to save and retreive events on the aggregate" do
16
- event_store.save_events test_events, 0, aggregate_id, String
17
- events = event_store.get_aggregate_events aggregate_id, String
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
- it "should fail if aggregate does not exist and version is above 0" do
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, 0, aggregate_id, String
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
- event[:event_name].should eql("new")
33
- event[:aggregate_id].should eql aggregate_id
34
- event[:aggregate_version].should eql 1
35
- event[:sequence_number].should be_a(Fixnum)
36
- event[:timestamp].should be_a(Time)
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
- end
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: ["bar", event_data: "noop"]}
44
- e << {aggregate_version: 3, event_name: "flubber", event_args: ["bar", event_data: "noop"]}
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, 0, aggregate_id_1, String
55
- event_store.save_events test_events_2, 0, aggregate_id_2, Hash
56
- event_store.save_events test_events_2, 0, aggregate_id_3, String
57
- end
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.get_all_typenames
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
- end
62
+ end
63
+
64
64
  it "should list the aggregate ids when asking for get_aggregate_list_by_typename" do
65
- ids = event_store.get_aggregate_list_by_typename String
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 be_true
68
- ids.any? { |e| e == aggregate_id_3 }.should be_true
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
- end
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
- it "should save and get events that are serilized with msgpack" do
80
- event_store.save_events test_events, 0, aggregate_id_1, String
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
- end
85
+ end
86
+
84
87
  end
85
88
 
86
89
  end
87
- end
90
+ end