Skip to content

Commit

Permalink
Additional projector concurrency tests
Browse files Browse the repository at this point in the history
  • Loading branch information
slashdotdash committed Jan 18, 2024
1 parent a071def commit 2039662
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
2 changes: 1 addition & 1 deletion config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ config :commanded_ecto_projections, Commanded.Projections.Repo,

config :ex_unit, capture_log: true

# Print only warnings and errors during test
# Print only warning and above log messages during tests
config :logger, :console, level: :warning, format: "[$level] $message\n"
45 changes: 42 additions & 3 deletions test/projections/ecto_projection_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,33 @@ defmodule Commanded.Projections.EctoProjectionTest do
assert_seen_event("Projector", 3)
end

test "should prevent first event being projected more than once" do
tasks =
Enum.map(1..5, fn _index ->
Task.async(Projector, :handle, [
%AnEvent{name: "Event1"},
%{handler_name: "Projector", event_number: 1}
])
end)

results = Task.await_many(tasks)

assert Enum.uniq(results) == [:ok]

assert_projections(Projection, ["Event1"])
assert_seen_event("Projector", 1)
end

test "should prevent an event being projected more than once" do
Projector.handle(%AnEvent{name: "Event1"}, %{handler_name: "Projector", event_number: 1})
Projector.handle(%AnEvent{name: "Event2"}, %{handler_name: "Projector", event_number: 2})

tasks =
Enum.map(1..5, fn _index ->
Task.async(fn ->
Projector.handle(%AnEvent{name: "Event3"}, %{handler_name: "Projector", event_number: 3})
end)
Task.async(Projector, :handle, [
%AnEvent{name: "Event3"},
%{handler_name: "Projector", event_number: 3}
])
end)

results = Task.await_many(tasks)
Expand All @@ -87,6 +105,27 @@ defmodule Commanded.Projections.EctoProjectionTest do
assert_seen_event("Projector", 3)
end

test "should prevent an event being projected more than once after an ignored event" do
Projector.handle(%AnEvent{name: "Event1"}, %{handler_name: "Projector", event_number: 1})
Projector.handle(%AnEvent{name: "Event2"}, %{handler_name: "Projector", event_number: 2})
Projector.handle(%IgnoredEvent{name: "Event2"}, %{handler_name: "Projector", event_number: 3})

tasks =
Enum.map(1..5, fn _index ->
Task.async(Projector, :handle, [
%AnEvent{name: "Event4"},
%{handler_name: "Projector", event_number: 4}
])
end)

results = Task.await_many(tasks)

assert Enum.uniq(results) == [:ok]

assert_projections(Projection, ["Event1", "Event2", "Event4"])
assert_seen_event("Projector", 4)
end

test "should return an error on failure" do
assert {:error, :failure} ==
Projector.handle(%ErrorEvent{}, %{handler_name: "Projector", event_number: 1})
Expand Down

0 comments on commit 2039662

Please sign in to comment.