diff --git a/ruby_event_store/lib/ruby_event_store/event.rb b/ruby_event_store/lib/ruby_event_store/event.rb index 385f821782..9e796bb40e 100644 --- a/ruby_event_store/lib/ruby_event_store/event.rb +++ b/ruby_event_store/lib/ruby_event_store/event.rb @@ -123,6 +123,21 @@ def correlate_with(other_message) self end + # Returns a hash of the name/value pairs for the given event attributes. + # + # @param attributes [Array] attributes to deconstruct + # @return [Hash] deconstructed event + def deconstruct_keys(attributes) + { + causation_id: causation_id, + correlation_id: correlation_id, + data: data, + event_id: event_id, + event_type: event_type, + metadata: metadata.to_h + }.slice(*attributes) + end + alias_method :eql?, :== end end diff --git a/ruby_event_store/spec/get_event_spec.rb b/ruby_event_store/spec/get_event_spec.rb index 7b405c0a90..17a054788c 100644 --- a/ruby_event_store/spec/get_event_spec.rb +++ b/ruby_event_store/spec/get_event_spec.rb @@ -187,6 +187,49 @@ module RubyEventStore expect(event.event_type).to eq("Doh") end + specify "pattern matching" do + test_created = Test::TestCreated.new( + event_id: "foo", + data: { foo: "foo", bar: "bar" }, + metadata: { user_id: 42, correlation_id: "coid", causation_id: "caid" } + ) + + # match by class + expect(test_created).to satisfy { |event| event in Test::TestCreated } + expect(test_created).to satisfy { |event| event in {} } + expect(test_created).to_not satisfy { |event| event in Test::TestDeleted } + + # match by event id + expect(test_created).to satisfy { |event| event in Test::TestCreated(event_id: "foo") } + expect(test_created).to satisfy { |event| event in { event_id: "foo" } } + expect(test_created).to_not satisfy { |event| event in Test::TestCreated(event_id: "bar") } + + # match by event type + expect(test_created).to satisfy { |event| event in Test::TestCreated(event_type: "Test::TestCreated") } + expect(test_created).to satisfy { |event| event in { event_type: "Test::TestCreated" } } + expect(test_created).to_not satisfy { |event| event in { event_type: "Test::TestDeleted" } } + + # match by causation id + expect(test_created).to satisfy { |event| event in Test::TestCreated(causation_id: "caid") } + expect(test_created).to satisfy { |event| event in { causation_id: "caid"} } + expect(test_created).to_not satisfy { |event| event in { causation_id: "foo"} } + + # match by correlation id + expect(test_created).to satisfy { |event| event in Test::TestCreated(correlation_id: "coid") } + expect(test_created).to satisfy { |event| event in { correlation_id: "coid"} } + expect(test_created).to_not satisfy { |event| event in { correlation_id: "foo"} } + + # match by data + expect(test_created).to satisfy { |event| event in Test::TestCreated(data: { foo: "foo" }) } + expect(test_created).to satisfy { |event| event in { data: { foo: "foo" } } } + expect(test_created).to_not satisfy { |event| event in Test::TestCreated(data: { foo: "bar" }) } + + # match by metadata + expect(test_created).to satisfy { |event| event in Test::TestCreated(metadata: { user_id: 42 }) } + expect(test_created).to satisfy { |event| event in { metadata: { user_id: 42 } } } + expect(test_created).to_not satisfy { |event| event in Test::TestCreated(metedata: { user_id: 41 }) } + end + specify do event_id = SecureRandom.uuid one = Event.new(event_id: event_id, data: { yes: :no }, metadata: { event_type: "one" })