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
         |