2023-04-19 10:23:04 +12:00
|
|
|
defmodule ReactorTest do
|
2023-05-10 16:27:18 +12:00
|
|
|
@moduledoc false
|
2023-04-19 10:23:04 +12:00
|
|
|
use ExUnit.Case
|
2023-05-10 16:27:18 +12:00
|
|
|
alias Example.{HelloWorldReactor, Step.Greeter}
|
|
|
|
alias Reactor.{Builder, Info, Planner}
|
|
|
|
|
2023-04-19 10:23:04 +12:00
|
|
|
doctest Reactor
|
|
|
|
|
2023-05-10 16:27:18 +12:00
|
|
|
describe "run/1..4" do
|
|
|
|
defmodule BasicReactor do
|
|
|
|
@moduledoc false
|
|
|
|
use Reactor
|
|
|
|
|
|
|
|
input :name
|
|
|
|
|
|
|
|
step :split do
|
|
|
|
argument :name, input(:name)
|
2023-06-16 14:39:29 +12:00
|
|
|
run(fn %{name: name}, _ -> {:ok, String.split(name)} end)
|
2023-05-10 16:27:18 +12:00
|
|
|
end
|
|
|
|
|
|
|
|
step :reverse do
|
|
|
|
argument :chunks, result(:split)
|
2023-06-16 14:39:29 +12:00
|
|
|
run(fn %{chunks: chunks}, _ -> {:ok, Enum.reverse(chunks)} end)
|
2023-05-10 16:27:18 +12:00
|
|
|
end
|
|
|
|
|
|
|
|
step :join do
|
|
|
|
argument :chunks, result(:reverse)
|
2023-06-16 14:39:29 +12:00
|
|
|
run(fn %{chunks: chunks}, _ -> {:ok, Enum.join(chunks, " ")} end)
|
2023-05-10 16:27:18 +12:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "it can run a module-based reactor directly" do
|
|
|
|
assert {:ok, "McFly Marty"} = Reactor.run(BasicReactor, name: "Marty McFly")
|
|
|
|
end
|
|
|
|
|
|
|
|
test "it can run unplanned reactors" do
|
|
|
|
{:ok, reactor} = Info.to_struct(BasicReactor)
|
|
|
|
|
|
|
|
assert {:ok, "McFly Marty"} = Reactor.run(reactor, name: "Marty McFly")
|
|
|
|
end
|
|
|
|
|
|
|
|
test "it can run partially planned reactors" do
|
|
|
|
{:ok, reactor} = Info.to_struct(BasicReactor)
|
|
|
|
join_step = Enum.find(reactor.steps, &(&1.name == :join))
|
|
|
|
{:ok, reactor} = Planner.plan(reactor)
|
|
|
|
|
|
|
|
reactor = %{
|
|
|
|
reactor
|
|
|
|
| plan: Graph.delete_vertex(reactor.plan, join_step),
|
|
|
|
steps: [join_step]
|
|
|
|
}
|
|
|
|
|
|
|
|
assert {:ok, "McFly Marty"} = Reactor.run(reactor, name: "Marty McFly")
|
|
|
|
end
|
2023-04-19 10:23:04 +12:00
|
|
|
end
|
|
|
|
end
|