Hey all,
What is the best practice when testing user’s password? My user schema has a :password_digest
field and :password
virtual field. I am having problem making the test pass because password field is empty.
On sign up, user enters their password. In user changeset, the password is hashed (with bcrypt), and then that hash is saved under password_digest.
schema "users" do
field :email, :string
field :password_digest, :string
field :username, :string
timestamps()
field :password, :string, virtual: true
end
In the test, I have (from generator, modified a bit):
@valid_attrs %{email: "some email", password: "some password", username: "some username"}
...
def user_fixture(attrs \\ %{}) do
{:ok, user} =
attrs
|> Enum.into(@valid_attrs)
|> Accounts.create_user()
user
end
...
test "get_user!/1 returns the user with given id" do
user = user_fixture()
assert Accounts.get_user!(user.id) == user
end
The test above fails because password on left is nil, while on the right side it still has the password. I am not saving password in database.
1) test users get_user!/1 returns the user with given id...
...
Assertion with == failed
code: assert Accounts.get_user!(user.id()) == user
left: ... email: "some email", id: 56, inserted_at: ~N[2018-11-22 16:30:48], password_digest: "$2b$04$qjv2Log0RIcFoMdrLEbGGeMzBr3JQ9epDNgjSkxSB3cQO5ZBuzKPS", updated_at: ~N[2018-11-22 16:30:48], username: "some username", password: nil}
right: ... email: "some email", id: 56, inserted_at: ~N[2018-11-22 16:30:48], password_digest: "$2b$04$qjv2Log0RIcFoMdrLEbGGeMzBr3JQ9epDNgjSkxSB3cQO5ZBuzKPS", updated_at: ~N[2018-11-22 16:30:48], username: "some username", password: "some password_digest"}
user_fixture
saves the password, but Accounts.get_user
does not. Btw, get user is taken from generator: def get_user!(id), do: Repo.get!(User, id)
.
Thanks!