Search code examples
elixirectoex-unit

How do I make an invalid attributes test pass with zero allowed or required attributes


Using Ecto 2.0 I'm trying to make this test pass:

defmodule PlexServer.FleetInstanceTest do
  use PlexServer.ModelCase

  alias PlexServer.FleetInstance

  @invalid_attrs %{some_random_data: "random data"}

  test "changeset with invalid attributes" do
    changeset = FleetInstance.changeset(%FleetInstance{}, @invalid_attrs)
    refute changeset.valid?
  end
end

Here's the model

defmodule PlexServer.FleetInstance do
  use PlexServer.Web, :model

  schema "fleet_instances" do
    has_many :ship_instance, PlexServer.ShipInstance

    timestamps
  end

  def changeset(model, params \\ %{}) do
    model
      |> cast(params, [])
      |> validate_required([])
  end
end

It seems cast simply ignores any data that is not in the allowed list so the changeset is considered valid, failing the test.


Solution

  • Yes, Ecto.Changeset.cast/3 will ignore any fields not specified in the third argument, and as you are passing [] to validate_required, there's really no possible params that would make your current version of PlexServer.FleetInstance.changeset/2 return valid?: false.