ash/test/resource/validation/compare_test.exs

90 lines
2.5 KiB
Elixir
Raw Normal View History

defmodule Ash.Test.Resource.Validation.CompareTest do
@moduledoc false
use ExUnit.Case, async: true
alias Ash.Resource.Validation.Compare
defmodule Post do
use Ash.Resource
attributes do
uuid_primary_key :id
attribute :number_one, :integer
attribute :number_two, :integer
end
end
describe "greater than" do
test "validate success against number" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: 1)
changeset = Post |> Ash.Changeset.new(%{number_one: 100})
assert :ok = Compare.validate(changeset, opts)
end
test "validate success against argument" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: :foo)
changeset =
Post
|> Ash.Changeset.new(%{number_one: 100})
|> Ash.Changeset.set_argument(:foo, 1)
assert :ok = Compare.validate(changeset, opts)
end
test "validate success against attribute" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: :number_two)
changeset =
Post
|> Ash.Changeset.new(%{number_one: 100, number_two: 1})
assert :ok = Compare.validate(changeset, opts)
end
test "validate failure against number" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: 100)
changeset = Post |> Ash.Changeset.new(%{number_one: 1})
assert_error(changeset, opts, "must be greater than 100")
end
test "validate failure against argument" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: :foo)
changeset =
Post
|> Ash.Changeset.new(%{number_one: 1})
|> Ash.Changeset.set_argument(:foo, 100)
assert_error(changeset, opts, "must be greater than foo")
end
test "validate failure against attribute" do
{:ok, opts} = Compare.init(attribute: :number_one, greater_than: :number_two)
changeset =
Post
|> Ash.Changeset.new(%{number_one: 1, number_two: 100})
assert_error(changeset, opts, "must be greater than number_two")
end
end
defp assert_error(changeset, opts, expected_message) do
{:error, %{message: message, vars: vars}} = Compare.validate(changeset, opts)
assert expected_message == translate_message(message, vars)
end
defp translate_message(message, vars) do
Enum.reduce(vars, message, fn {key, value}, acc ->
if String.contains?(acc, "%{#{key}}") do
String.replace(acc, "%{#{key}}", to_string(value))
else
acc
end
end)
end
end