Add comprehensive tests for AccountsFixtures

- Test all fixture generation functions
- Test user creation (confirmed and unconfirmed)
- Test scope fixtures
- Test password setting
- Test token generation and manipulation
- Test credential fixtures
This commit is contained in:
Graham McIntire 2026-01-13 08:57:49 -06:00
parent d58f6b2d3a
commit 2c35ad457c
No known key found for this signature in database

View file

@ -0,0 +1,166 @@
defmodule Towerops.AccountsFixturesTest do
use Towerops.DataCase
import Towerops.AccountsFixtures
alias Towerops.Accounts.UserToken
describe "unique_user_email/0" do
test "generates unique email addresses" do
email1 = unique_user_email()
email2 = unique_user_email()
assert email1 != email2
assert email1 =~ ~r/@example\.com$/
assert email2 =~ ~r/@example\.com$/
end
end
describe "valid_user_password/0" do
test "returns valid password" do
password = valid_user_password()
assert is_binary(password)
assert String.length(password) >= 12
end
end
describe "valid_user_attributes/1" do
test "returns valid user attributes with default email" do
attrs = valid_user_attributes()
assert attrs.email =~ ~r/@example\.com$/
end
test "merges provided attributes" do
attrs = valid_user_attributes(%{custom_field: "value"})
assert attrs.email =~ ~r/@example\.com$/
assert attrs.custom_field == "value"
end
end
describe "unconfirmed_user_fixture/1" do
test "creates an unconfirmed user" do
user = unconfirmed_user_fixture()
assert user.email =~ ~r/@example\.com$/
refute user.confirmed_at
end
test "creates user with custom attributes" do
email = "custom@example.com"
user = unconfirmed_user_fixture(%{email: email})
assert user.email == email
end
end
describe "user_fixture/1" do
test "creates a confirmed user" do
user = user_fixture()
assert user.email =~ ~r/@example\.com$/
assert user.confirmed_at
end
test "creates user with custom attributes" do
email = "confirmed@example.com"
user = user_fixture(%{email: email})
assert user.email == email
assert user.confirmed_at
end
end
describe "user_scope_fixture/0 and user_scope_fixture/1" do
test "creates a user scope without arguments" do
scope = user_scope_fixture()
assert scope.user
assert scope.user.email =~ ~r/@example\.com$/
end
test "creates a user scope from existing user" do
user = user_fixture()
scope = user_scope_fixture(user)
assert scope.user.id == user.id
end
end
describe "set_password/1" do
test "sets password for user" do
user = user_fixture()
user_with_password = set_password(user)
assert user_with_password.id == user.id
# Verify password was set by attempting login
assert Towerops.Accounts.get_user_by_email_and_password(
user_with_password.email,
valid_user_password()
)
end
end
describe "generate_user_magic_link_token/1" do
test "generates a magic link token for user" do
user = user_fixture()
{encoded_token, token} = generate_user_magic_link_token(user)
assert is_binary(encoded_token)
assert is_binary(token)
assert encoded_token != token
end
end
describe "offset_user_token/3" do
test "offsets a user token's timestamps" do
user = user_fixture()
{_encoded_token, token} = generate_user_magic_link_token(user)
assert {1, _} = offset_user_token(token, -1, :day)
# Verify the token was updated
user_token = Towerops.Repo.get_by(UserToken, token: token)
assert user_token
assert DateTime.before?(user_token.inserted_at, DateTime.utc_now())
end
end
describe "override_token_authenticated_at/2" do
test "overrides authenticated_at for a token" do
user = user_fixture()
{_encoded_token, token} = generate_user_magic_link_token(user)
custom_time = DateTime.utc_now() |> DateTime.add(-2, :hour) |> DateTime.truncate(:second)
assert {1, _} = override_token_authenticated_at(token, custom_time)
# Verify the token was updated
user_token = Towerops.Repo.get_by(UserToken, token: token)
assert user_token
# Compare with truncated time since database might store at second precision
assert DateTime.diff(user_token.authenticated_at, custom_time, :second) == 0
end
end
describe "credential_fixture/2" do
test "creates a credential for a user" do
user = user_fixture()
credential = credential_fixture(user)
assert credential.user_id == user.id
assert credential.name =~ "Test Credential"
assert is_binary(credential.credential_id)
assert is_binary(credential.public_key)
assert credential.sign_count == 0
end
test "creates a credential with custom attributes" do
user = user_fixture()
credential = credential_fixture(user, %{name: "Custom Credential", sign_count: 5})
assert credential.name == "Custom Credential"
assert credential.sign_count == 5
end
end
end