Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions ruby_event_store/lib/ruby_event_store/event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
43 changes: 43 additions & 0 deletions ruby_event_store/spec/get_event_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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" })
Expand Down