From 31b215fab346086c18d1995e26981c1d164472e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Ferreira?= Date: Fri, 8 Sep 2023 09:46:05 +0100 Subject: [PATCH] Adds a default transition_changeset/4 (#20) Why: * Fixes #17 This change addresses the need by: * Adding a default implementation of transition_changeset/4 that we had removed --- config/test.exs | 2 +- lib/fsmx/fsm.ex | 1 + test/fsmx/ecto_test.exs | 12 ++++++++++- .../test_ecto_schemas/with_changesets.ex | 21 +++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 test/support/test_ecto_schemas/with_changesets.ex diff --git a/config/test.exs b/config/test.exs index be4e402..ef438f5 100644 --- a/config/test.exs +++ b/config/test.exs @@ -10,4 +10,4 @@ config :fsmx, Fsmx.Repo, database: "fsmx_test", pool: Ecto.Adapters.SQL.Sandbox -config :logger, level: :warn +config :logger, level: :warning diff --git a/lib/fsmx/fsm.ex b/lib/fsmx/fsm.ex index a965df5..f47a64a 100644 --- a/lib/fsmx/fsm.ex +++ b/lib/fsmx/fsm.ex @@ -64,6 +64,7 @@ defmodule Fsmx.Fsm do def before_transition(struct, _from, _to, _state_field), do: {:ok, struct} if Code.ensure_loaded?(Ecto) do + def transition_changeset(changeset, _from, _to, _params), do: changeset def transition_changeset(changeset, _from, _to, _params, _state_field), do: changeset def after_transition_multi(struct, _from, _to, _state_field), do: {:ok, struct} end diff --git a/test/fsmx/ecto_test.exs b/test/fsmx/ecto_test.exs index e997e59..18aeef4 100644 --- a/test/fsmx/ecto_test.exs +++ b/test/fsmx/ecto_test.exs @@ -3,7 +3,7 @@ defmodule Fsmx.EctoTest do alias Ecto.Multi alias Fsmx.Repo - alias Fsmx.TestEctoSchemas.{Simple, WithCallbacks, WithSeparateFsm, MultiState} + alias Fsmx.TestEctoSchemas.{Simple, WithCallbacks, WithSeparateFsm, MultiState, WithChangesets} describe "transition_changeset/2" do test "returns a changeset" do @@ -86,6 +86,16 @@ defmodule Fsmx.EctoTest do end end + describe "transition/4" do + test "works even if you don't define all possibilities" do + one = %WithChangesets{state: "one"} + + three = Fsmx.transition_changeset(one, "three", %{}) + + assert Ecto.Changeset.get_change(three, :state) == "three" + end + end + describe "transition_multi/5" do test "adds a transition changeset to the given multi" do one = %Simple{state: "1"} diff --git a/test/support/test_ecto_schemas/with_changesets.ex b/test/support/test_ecto_schemas/with_changesets.ex new file mode 100644 index 0000000..94251e3 --- /dev/null +++ b/test/support/test_ecto_schemas/with_changesets.ex @@ -0,0 +1,21 @@ +defmodule Fsmx.TestEctoSchemas.WithChangesets do + use Ecto.Schema + + import Ecto.Changeset + + schema "test" do + field(:state, :string, default: "one") + field(:data, :map) + end + + use Fsmx.Struct, + transitions: %{ + "one" => ["two", "three"] + } + + def transition_changeset(changeset, "one", "two", params) do + changeset + |> cast(params, [:data]) + |> validate_required([:data]) + end +end