defmodule Ash.Test.Resource.ValidationsTest do
  @moduledoc false
  use ExUnit.Case, async: true

  defmacrop defposts(do: body) do
    module = Module.concat(["rand#{System.unique_integer([:positive])}", Post])

    quote do
      defmodule unquote(module) do
        @moduledoc false
        use Ash.Resource, domain: Ash.Test.Domain

        attributes do
          uuid_primary_key :id

          attribute :name, :string do
            public?(true)
          end

          attribute :contents, :string do
            public?(true)
          end
        end

        unquote(body)
      end

      alias unquote(module), as: Post
    end
  end

  describe "representation" do
    test "validations are persisted on the resource properly" do
      defposts do
        validations do
          validate present([:name, :contents], at_least: 1)
        end
      end

      assert [
               %Ash.Resource.Validation{
                 validation:
                   {Ash.Resource.Validation.Present,
                    [attributes: [:name, :contents], at_least: 1]}
               }
             ] = Ash.Resource.Info.validations(Post)
    end

    test "Validation descriptions are allowed" do
      defposts do
        validations do
          validate present([:name, :contents], at_least: 1),
            description: "require one of name/contents"
        end
      end

      assert [
               %Ash.Resource.Validation{description: "require one of name/contents"}
             ] = Ash.Resource.Info.validations(Post)
    end
  end
end
