Packages
commanded
0.16.0-rc.0
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.0
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.1
1.0.0-rc.0
0.19.1
0.19.0
0.18.1
0.18.0
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.16.0-rc.1
0.16.0-rc.0
0.15.1
0.15.0
0.14.0
0.14.0-rc.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.5
0.8.4
0.8.3
0.8.1
0.8.0
0.7.1
0.6.2
0.6.1
0.6.0
0.4.0
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
Use Commanded to build your own Elixir applications following the CQRS/ES pattern.
Current section
Files
Jump to
Current section
Files
test/commands/composite_router_test.exs
defmodule Commanded.Commands.CompositeRouterTest do
use Commanded.StorageCase
alias Commanded.ExampleDomain.{BankAccount,MoneyTransfer}
alias Commanded.ExampleDomain.{OpenAccountHandler,DepositMoneyHandler,TransferMoneyHandler,WithdrawMoneyHandler}
alias Commanded.ExampleDomain.BankAccount.Commands.{OpenAccount,DepositMoney,WithdrawMoney}
alias Commanded.ExampleDomain.MoneyTransfer.Commands.TransferMoney
alias Commanded.Commands.ExecutionResult
defmodule UnregisteredCommand do
@moduledoc false
defstruct [:uuid]
end
defmodule BankAccountRouter do
@moduledoc false
use Commanded.Commands.Router
identify BankAccount, by: :account_number
dispatch OpenAccount, to: OpenAccountHandler, aggregate: BankAccount
dispatch DepositMoney, to: DepositMoneyHandler, aggregate: BankAccount
dispatch WithdrawMoney, to: WithdrawMoneyHandler, aggregate: BankAccount
end
defmodule MoneyTransferRouter do
@moduledoc false
use Commanded.Commands.Router
identify MoneyTransfer, by: :transfer_uuid
dispatch TransferMoney, to: TransferMoneyHandler, aggregate: MoneyTransfer
end
defmodule ExampleCompositeRouter do
@moduledoc false
use Commanded.Commands.CompositeRouter
router BankAccountRouter
router MoneyTransferRouter
end
describe "composite router" do
test "should register all commands" do
assert ExampleCompositeRouter.registered_commands() |> Enum.sort() == [
DepositMoney,
OpenAccount,
WithdrawMoney,
TransferMoney,
]
end
test "should dispatch command to registered handler" do
assert :ok = ExampleCompositeRouter.dispatch(%OpenAccount{account_number: "ACC123", initial_balance: 1_000})
assert :ok = ExampleCompositeRouter.dispatch(%TransferMoney{transfer_uuid: UUID.uuid4(), debit_account: "ACC123", credit_account: "ACC456", amount: 500})
end
test "should dispatch command to registered handler with options" do
command = %OpenAccount{account_number: "ACC123", initial_balance: 1_000}
assert {:ok, %ExecutionResult{}} = ExampleCompositeRouter.dispatch(command, include_execution_result: true)
end
test "should fail to dispatch unregistered command" do
assert {:error, :unregistered_command} = ExampleCompositeRouter.dispatch(%UnregisteredCommand{})
end
test "should fail to compile when duplicate commands registered" do
assert_raise RuntimeError, "duplicate registration for Commanded.ExampleDomain.MoneyTransfer.Commands.TransferMoney command, registered in both Commanded.Commands.CompositeRouterTest.MoneyTransferRouter and DuplicateMoneyTransferRouter", fn ->
Code.eval_string """
alias Commanded.ExampleDomain.{MoneyTransfer,TransferMoneyHandler}
alias Commanded.ExampleDomain.MoneyTransfer.Commands.TransferMoney
alias Commanded.Commands.CompositeRouterTest.MoneyTransferRouter
defmodule DuplicateMoneyTransferRouter do
use Commanded.Commands.Router
identify MoneyTransfer, by: :transfer_uuid
dispatch TransferMoney, to: TransferMoneyHandler, aggregate: MoneyTransfer
end
defmodule ExampleCompositeRouter do
use Commanded.Commands.CompositeRouter
router MoneyTransferRouter
router DuplicateMoneyTransferRouter
end
"""
end
end
end
describe "composite router composed of composite router" do
defmodule CompositeCompositeRouter do
@moduledoc false
use Commanded.Commands.CompositeRouter
router ExampleCompositeRouter
end
test "should register all commands" do
assert CompositeCompositeRouter.registered_commands() |> Enum.sort() == [
DepositMoney,
OpenAccount,
WithdrawMoney,
TransferMoney,
]
end
test "should dispatch command to registered handler" do
assert :ok = CompositeCompositeRouter.dispatch(%OpenAccount{account_number: "ACC123", initial_balance: 1_000})
assert :ok = CompositeCompositeRouter.dispatch(%TransferMoney{transfer_uuid: UUID.uuid4(), debit_account: "ACC123", credit_account: "ACC456", amount: 500})
end
end
end