From 5d32c809dbc6ec1533e29d30619bc10a9d081b8f Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 2 Jul 2017 10:25:11 +0300 Subject: [PATCH] Adds backport for &build_slug/1 --- lib/ecto_autoslug_field/slug.ex | 12 +++-- .../build_slug_arity_2_test.exs | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 test/ecto_autoslug_field_test/edge_cases_test/build_slug_arity_2_test.exs diff --git a/lib/ecto_autoslug_field/slug.ex b/lib/ecto_autoslug_field/slug.ex index e16465e..8ebf977 100644 --- a/lib/ecto_autoslug_field/slug.ex +++ b/lib/ecto_autoslug_field/slug.ex @@ -72,7 +72,7 @@ defmodule EctoAutoslugField.SlugBase do It should return a `binary` or `nil`. """ - @spec build_slug(Keyword.t, Changeset.t) :: String.t + @spec build_slug(Keyword.t, Changeset.t | nil) :: String.t def build_slug(sources, changeset), do: SlugGenerator.build_slug(sources, changeset) end @@ -184,9 +184,15 @@ defmodule EctoAutoslugField.Slug do SlugBase.get_sources(changeset, opts) end - def build_slug(sources, changeset), do: SlugBase.build_slug(sources, changeset) + def build_slug(sources) do + SlugBase.build_slug(sources, nil) + end + + def build_slug(sources, _changeset) do + build_slug(sources) + end - defoverridable [get_sources: 2, build_slug: 2] + defoverridable [get_sources: 2, build_slug: 2, build_slug: 1] end end diff --git a/test/ecto_autoslug_field_test/edge_cases_test/build_slug_arity_2_test.exs b/test/ecto_autoslug_field_test/edge_cases_test/build_slug_arity_2_test.exs new file mode 100644 index 0000000..a3d9e25 --- /dev/null +++ b/test/ecto_autoslug_field_test/edge_cases_test/build_slug_arity_2_test.exs @@ -0,0 +1,44 @@ +defmodule EctoAutoslugField.SlugTest.EdgeCases.Arity2 do + use ExUnit.Case + + defmodule StringSource do + use EctoAutoslugField.Slug, to: :slug, from: :title + + def build_slug(sources) do + sources + |> super() + |> String.replace("-", "*") + end + end + + defmodule Article do + use Ecto.Schema + import Ecto.Changeset + + schema "articles" do + field :title, :string + field :slug, StringSource.Type + end + + def changeset(model, params \\ :invalid) do + model + |> cast(params, [:title, :slug]) + |> validate_required([:title]) + |> StringSource.maybe_generate_slug + end + end + + setup do + {:ok, %{article: Article.changeset( + %Article{}, %{"title": "Some article title"}) + }} + end + + test "changeset is valid", %{article: article} do + assert article.valid? + end + + test "build_slug/2 is working", %{article: article} do + assert article.changes.slug == "some*article*title" + end +end