В моем приложении 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