Current section
Files
Jump to
Current section
Files
templates/tests/users_test.exs
defmodule <%= inspect @app_pascal_case %>.UsersTest do
@moduledoc false
use <%= inspect @app_pascal_case %>.DataCase, async: true
alias <%= inspect @app_pascal_case %>.UserFixtures
alias <%= inspect @app_pascal_case %>.Users
alias <%= inspect @app_pascal_case %>.Users.User
alias <%= inspect @app_pascal_case %>.UserKeys.UserKey
alias <%= inspect @app_pascal_case %>.UserTokens.UserToken
describe "list/1" do
setup do
users =
Stream.repeatedly(fn -> UserFixtures.user_fixture() end)
|> Enum.take(10)
%{users: users}
end
test "returns list of users without preloads", %{users: users} do
user_list = Users.list()
user_ids = Enum.map(user_list, & &1.id)
refute Enum.empty?(user_list)
for user <- user_list do
assert %User{} = user
refute Ecto.assoc_loaded?(user.keys)
refute Ecto.assoc_loaded?(user.tokens)
end
for user <- users do
assert user.id in user_ids
end
end
test "returns list of users with preloads", %{users: users} do
user_list = Users.list([:keys, :tokens])
user_ids = Enum.map(user_list, & &1.id)
refute Enum.empty?(user_list)
for user <- user_list do
assert %User{} = user
assert Ecto.assoc_loaded?(user.keys)
assert Ecto.assoc_loaded?(user.tokens)
assert Enum.all?(user.keys, &is_struct(&1, UserKey))
assert Enum.all?(user.tokens, &is_struct(&1, UserToken))
end
for user <- users do
assert user.id in user_ids
end
end
end
describe "create/1" do
test "returns error with invalid params" do
assert {:error, changeset} = Users.create(%{})
assert %Ecto.Changeset{valid?: false, errors: errors} = changeset
assert {"can't be blank", _} = errors[:email]
end
test "returns error with existing email" do
attrs = UserFixtures.valid_user_attrs()
{:ok, _user} = Users.create(attrs)
{:error, changeset} = Users.create(attrs)
assert %Ecto.Changeset{valid?: false, errors: errors} = changeset
assert {"has already been taken", _} = errors[:email]
end
test "returns success with valid params" do
attrs = UserFixtures.valid_user_attrs()
assert {:ok, user} = Users.create(attrs)
assert %User{} = user
assert user.email == attrs.email
end
end
describe "get/2" do
setup do
%{user: UserFixtures.user_fixture()}
end
test "returns error with invalid id" do
invalid_id = Ecto.ULID.generate()
assert {:error, :not_found} = Users.get(invalid_id)
end
test "returns success with valid id", %{user: user} do
assert {:ok, found_user} = Users.get(user.id)
assert found_user.id == user.id
assert found_user.email == user.email
refute Ecto.assoc_loaded?(found_user.keys)
refute Ecto.assoc_loaded?(found_user.tokens)
end
test "returns success with preloads", %{user: user} do
assert {:ok, found_user} = Users.get(user.id, [:keys, :tokens])
assert found_user.id == user.id
assert found_user.email == user.email
assert Ecto.assoc_loaded?(found_user.keys)
assert Ecto.assoc_loaded?(found_user.tokens)
end
end
describe "update/2" do
setup do
%{user: UserFixtures.user_fixture()}
end
test "returns error with invalid params", %{user: user} do
assert {:error, changeset} = Users.update(user, %{email: "bad email"})
assert %Ecto.Changeset{valid?: false, errors: errors} = changeset
assert {"has invalid format", _} = errors[:email]
end
test "returns success with valid params", %{user: user} do
attrs = UserFixtures.valid_user_attrs()
assert {:ok, updated_user} = Users.update(user, attrs)
assert updated_user.id == user.id
assert updated_user.email == attrs.email
end
end
describe "delete/1" do
setup do
%{user: UserFixtures.user_fixture()}
end
test "returns error with invalid user" do
invalid_id = Ecto.ULID.generate()
assert_raise Ecto.StaleEntryError, fn -> Users.delete(%User{id: invalid_id}) end
end
test "returns success with valid user", %{user: user} do
assert {:ok, deleted_user} = Users.delete(user)
assert deleted_user.id == user.id
assert deleted_user.email == user.email
end
end
end