CaseClauseError в смешанном тесте при вставке значения utc_datetime - PullRequest
0 голосов
/ 06 сентября 2018

В моем приложении Phoenix у меня есть контроллер, функция которого delete на самом деле не удаляет элемент из базы данных, а скорее архивирует его и вставляет значение :utc_datetime, соответствующее дате и времени, когда элемент был «удален». Вот функция:

def delete(conn, %{"id" => contact_id}) do
  contact = Contact.get(contact_id)

  case Contact.archive(contact) do
    {:ok, _contact} ->
      conn
      |> put_flash(:info, "Contact successfully deleted.")
      |> redirect(to: contact_path(conn, :index))
    {:error, _changeset} ->
      conn
      |> put_flash(:error, "Contact deletion failed.")
      |> redirect(to: contact_path(conn, :index))
  end
end

Это Contact.archive:

def archive(contact) do
  contact
  |> User.changeset(%{archived_at: DateTime.utc_now()})
  |> Repo.update()
end

Мой тест не пройден с этой ошибкой: (CaseClauseError) no case clause matching: {{{2018, 9, 6}, {6, 39, 5, 659053}}}. Вот как я настроил свой тест для delete:

client =
  :provider_user
  |> build(
    provider: conn.assigns.provider,
    type: "external",
    billable: true,
    first_name: "client",
    last_name: "user",
    email: "client@user.com"
  )
  |> set_password("password")
  |> insert

describe "delete contact" do
  test "deletes contact with valid params", %{conn: conn, client: client} do
    conn = delete(conn, contact_path(conn, :delete, client))

    assert redirected_to(conn) == contact_path(conn, :index)
    assert Repo.get(User, client.id).archived_at
  end
end

Если это имеет какое-либо отношение, вот функция получения Contact:

def get(contact_id, preload \\ []) do
  query =
    from(
      u in User,
      where: is_nil(u.archived_at) and u.id == ^contact_id,
      preload: ^preload
    )

  Repo.one!(query)
end
...