amanuensis/tests/backend/test_user.py

77 lines
2.4 KiB
Python
Raw Normal View History

import os
2021-05-28 01:56:29 +00:00
import pytest
2021-06-29 04:13:14 +00:00
from amanuensis.backend import userq
from amanuensis.db import DbContext, User
from amanuensis.errors import ArgumentError, BackendArgumentTypeError
2021-05-28 01:56:29 +00:00
2021-05-31 17:52:37 +00:00
def test_create_user(db: DbContext):
2021-05-28 01:56:29 +00:00
"""Test new user creation."""
2021-06-03 04:31:42 +00:00
defaults: dict = {
"db": db,
2021-06-03 03:10:34 +00:00
"username": "username",
"password": "password",
"display_name": "User Name",
"email": "user@example.com",
"is_site_admin": False,
2021-05-28 01:56:29 +00:00
}
2021-06-03 04:31:42 +00:00
kwargs: dict
2021-05-28 01:56:29 +00:00
# Test length constraints
with pytest.raises(ArgumentError):
2021-06-03 04:31:42 +00:00
kwargs = {**defaults, "username": "me"}
userq.create(**kwargs)
2021-05-28 01:56:29 +00:00
with pytest.raises(ArgumentError):
2021-06-03 04:31:42 +00:00
kwargs = {**defaults, "username": "the right honorable user-name, esquire"}
userq.create(**kwargs)
2021-05-28 01:56:29 +00:00
# Test allowed characters
with pytest.raises(ArgumentError):
2021-06-03 04:31:42 +00:00
kwargs = {**defaults, "username": "user name"}
userq.create(**kwargs)
2021-05-28 01:56:29 +00:00
# No password
with pytest.raises(BackendArgumentTypeError):
2021-06-03 04:31:42 +00:00
kwargs = {**defaults, "password": None}
userq.create(**kwargs)
2021-05-28 01:56:29 +00:00
# Valid creation works and populates fields
2021-06-03 04:31:42 +00:00
new_user = userq.create(**defaults)
2021-05-28 01:56:29 +00:00
assert new_user
assert new_user.id is not None
assert new_user.created is not None
# No duplicate usernames
with pytest.raises(ArgumentError):
2021-06-03 04:31:42 +00:00
userq.create(**defaults)
2021-05-28 01:56:29 +00:00
# Missing display name populates with username
2021-06-03 04:31:42 +00:00
user2_kw: dict = {**defaults, "username": "user2", "display_name": None}
user2: User = userq.create(**user2_kw)
2021-05-28 01:56:29 +00:00
assert user2.display_name is not None
def test_user_from(db: DbContext, make):
"""Test userq.from_*."""
user1: User = make.user()
user2: User = make.user()
2021-06-29 03:56:40 +00:00
assert userq.try_from_id(db, user1.id) == user1
assert userq.try_from_username(db, user1.username) == user1
assert userq.try_from_id(db, user2.id) == user2
assert userq.try_from_username(db, user2.username) == user2
def test_user_password(db: DbContext, make):
"""Test user password functions."""
pw1 = os.urandom(8).hex()
pw2 = os.urandom(8).hex()
user: User = make.user(password=pw1)
assert userq.password_check(db, user.username, pw1)
assert not userq.password_check(db, user.username, pw2)
userq.password_set(db, user.username, pw2)
assert not userq.password_check(db, user.username, pw1)
assert userq.password_check(db, user.username, pw2)