aboutsummaryrefslogtreecommitdiff
path: root/server/szurubooru/tests/func/test_users.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/szurubooru/tests/func/test_users.py')
-rw-r--r--server/szurubooru/tests/func/test_users.py402
1 files changed, 213 insertions, 189 deletions
diff --git a/server/szurubooru/tests/func/test_users.py b/server/szurubooru/tests/func/test_users.py
index 5506127..94e9c7c 100644
--- a/server/szurubooru/tests/func/test_users.py
+++ b/server/szurubooru/tests/func/test_users.py
@@ -1,56 +1,70 @@
-from unittest.mock import patch
from datetime import datetime
+from unittest.mock import patch
+
import pytest
-from szurubooru import db, model, errors
-from szurubooru.func import auth, users, files, util
+from szurubooru import db, errors, model
+from szurubooru.func import auth, files, users, util
EMPTY_PIXEL = (
- b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00'
- b'\xff\xff\xff\x21\xf9\x04\x01\x00\x00\x01\x00\x2c\x00\x00\x00\x00'
- b'\x01\x00\x01\x00\x00\x02\x02\x4c\x01\x00\x3b')
+ b"\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00"
+ b"\xff\xff\xff\x21\xf9\x04\x01\x00\x00\x01\x00\x2c\x00\x00\x00\x00"
+ b"\x01\x00\x01\x00\x00\x02\x02\x4c\x01\x00\x3b"
+)
-@pytest.mark.parametrize('user_name', ['test', 'TEST'])
+@pytest.mark.parametrize("user_name", ["test", "TEST"])
def test_get_avatar_path(user_name):
- assert users.get_avatar_path(user_name) == 'avatars/test.png'
+ assert users.get_avatar_path(user_name) == "avatars/test.png"
-@pytest.mark.parametrize('user_name,user_email,avatar_style,expected_url', [
- (
- 'user',
- None,
- model.User.AVATAR_GRAVATAR,
- ('https://gravatar.com/avatar/' +
- 'ee11cbb19052e40b07aac0ca060c23ee?d=retro&s=100'),
- ),
- (
- None,
- 'user@example.com',
- model.User.AVATAR_GRAVATAR,
- ('https://gravatar.com/avatar/' +
- 'b58996c504c5638798eb6b511e6f49af?d=retro&s=100'),
- ),
- (
- 'user',
- 'user@example.com',
- model.User.AVATAR_GRAVATAR,
- ('https://gravatar.com/avatar/' +
- 'b58996c504c5638798eb6b511e6f49af?d=retro&s=100'),
- ),
- (
- 'user',
- None,
- model.User.AVATAR_MANUAL,
- 'http://example.com/avatars/user.png',
- ),
-])
+@pytest.mark.parametrize(
+ "user_name,user_email,avatar_style,expected_url",
+ [
+ (
+ "user",
+ None,
+ model.User.AVATAR_GRAVATAR,
+ (
+ "https://gravatar.com/avatar/"
+ + "ee11cbb19052e40b07aac0ca060c23ee?d=retro&s=100"
+ ),
+ ),
+ (
+ None,
+ "user@example.com",
+ model.User.AVATAR_GRAVATAR,
+ (
+ "https://gravatar.com/avatar/"
+ + "b58996c504c5638798eb6b511e6f49af?d=retro&s=100"
+ ),
+ ),
+ (
+ "user",
+ "user@example.com",
+ model.User.AVATAR_GRAVATAR,
+ (
+ "https://gravatar.com/avatar/"
+ + "b58996c504c5638798eb6b511e6f49af?d=retro&s=100"
+ ),
+ ),
+ (
+ "user",
+ None,
+ model.User.AVATAR_MANUAL,
+ "http://example.com/avatars/user.png",
+ ),
+ ],
+)
def test_get_avatar_url(
- user_name, user_email, avatar_style, expected_url, config_injector):
- config_injector({
- 'data_url': 'http://example.com/',
- 'thumbnails': {'avatar_width': 100},
- })
+ user_name, user_email, avatar_style, expected_url, config_injector
+):
+ config_injector(
+ {
+ "data_url": "http://example.com/",
+ "thumbnails": {"avatar_width": 100},
+ }
+ )
user = model.User()
user.name = user_name
user.email = user_email
@@ -59,23 +73,21 @@ def test_get_avatar_url(
@pytest.mark.parametrize(
- 'same_user,can_edit_any_email,force_show,expected_email',
+ "same_user,can_edit_any_email,force_show,expected_email",
[
(False, False, False, False),
- (True, False, False, 'test@example.com'),
- (False, True, False, 'test@example.com'),
- (False, False, True, 'test@example.com'),
- ])
+ (True, False, False, "test@example.com"),
+ (False, True, False, "test@example.com"),
+ (False, False, True, "test@example.com"),
+ ],
+)
def test_get_email(
- same_user,
- can_edit_any_email,
- force_show,
- expected_email,
- user_factory):
- with patch('szurubooru.func.auth.has_privilege'):
+ same_user, can_edit_any_email, force_show, expected_email, user_factory
+):
+ with patch("szurubooru.func.auth.has_privilege"):
auth.has_privilege = lambda user, name: can_edit_any_email
user = user_factory()
- user.email = 'test@example.com'
+ user.email = "test@example.com"
auth_user = user if same_user else user_factory()
db.session.add_all([user, auth_user])
db.session.flush()
@@ -83,25 +95,28 @@ def test_get_email(
@pytest.mark.parametrize(
- 'same_user,score,expected_liked_post_count,expected_disliked_post_count',
+ "same_user,score,expected_liked_post_count,expected_disliked_post_count",
[
(False, 1, False, False),
(False, -1, False, False),
(True, 1, 1, 0),
(True, -1, 0, 1),
- ])
+ ],
+)
def test_get_liked_post_count(
- same_user,
- score,
- expected_liked_post_count,
- expected_disliked_post_count,
- user_factory,
- post_factory):
+ same_user,
+ score,
+ expected_liked_post_count,
+ expected_disliked_post_count,
+ user_factory,
+ post_factory,
+):
user = user_factory()
post = post_factory()
auth_user = user if same_user else user_factory()
score = model.PostScore(
- post=post, user=user, score=score, time=datetime.now())
+ post=post, user=user, score=score, time=datetime.now()
+ )
db.session.add_all([post, user, score])
db.session.flush()
actual_liked_post_count = users.get_liked_post_count(user, auth_user)
@@ -115,16 +130,17 @@ def test_serialize_user_when_empty():
def test_serialize_user(user_factory):
- with patch('szurubooru.func.users.get_email'), \
- patch('szurubooru.func.users.get_avatar_url'), \
- patch('szurubooru.func.users.get_liked_post_count'), \
- patch('szurubooru.func.users.get_disliked_post_count'):
- users.get_email.return_value = 'test@example.com'
- users.get_avatar_url.return_value = 'https://example.com/avatar.png'
+ with patch("szurubooru.func.users.get_email"), patch(
+ "szurubooru.func.users.get_avatar_url"
+ ), patch("szurubooru.func.users.get_liked_post_count"), patch(
+ "szurubooru.func.users.get_disliked_post_count"
+ ):
+ users.get_email.return_value = "test@example.com"
+ users.get_avatar_url.return_value = "https://example.com/avatar.png"
users.get_liked_post_count.return_value = 66
users.get_disliked_post_count.return_value = 33
auth_user = user_factory()
- user = user_factory(name='dummy user')
+ user = user_factory(name="dummy user")
user.creation_time = datetime(1997, 1, 1)
user.last_edit_time = datetime(1998, 1, 1)
user.avatar_style = model.User.AVATAR_MANUAL
@@ -132,36 +148,36 @@ def test_serialize_user(user_factory):
db.session.add(user)
db.session.flush()
assert users.serialize_user(user, auth_user) == {
- 'version': 1,
- 'name': 'dummy user',
- 'email': 'test@example.com',
- 'rank': 'administrator',
- 'creationTime': datetime(1997, 1, 1, 0, 0),
- 'lastLoginTime': None,
- 'avatarStyle': 'manual',
- 'avatarUrl': 'https://example.com/avatar.png',
- 'likedPostCount': 66,
- 'dislikedPostCount': 33,
- 'commentCount': 0,
- 'favoritePostCount': 0,
- 'uploadedPostCount': 0,
+ "version": 1,
+ "name": "dummy user",
+ "email": "test@example.com",
+ "rank": "administrator",
+ "creationTime": datetime(1997, 1, 1, 0, 0),
+ "lastLoginTime": None,
+ "avatarStyle": "manual",
+ "avatarUrl": "https://example.com/avatar.png",
+ "likedPostCount": 66,
+ "dislikedPostCount": 33,
+ "commentCount": 0,
+ "favoritePostCount": 0,
+ "uploadedPostCount": 0,
}
def test_serialize_micro_user(user_factory):
- with patch('szurubooru.func.users.get_avatar_url'):
- users.get_avatar_url.return_value = 'https://example.com/avatar.png'
+ with patch("szurubooru.func.users.get_avatar_url"):
+ users.get_avatar_url.return_value = "https://example.com/avatar.png"
auth_user = user_factory()
- user = user_factory(name='dummy user')
+ user = user_factory(name="dummy user")
db.session.add(user)
db.session.flush()
assert users.serialize_micro_user(user, auth_user) == {
- 'name': 'dummy user',
- 'avatarUrl': 'https://example.com/avatar.png',
+ "name": "dummy user",
+ "avatarUrl": "https://example.com/avatar.png",
}
-@pytest.mark.parametrize('count', [0, 1, 2])
+@pytest.mark.parametrize("count", [0, 1, 2])
def test_get_user_count(count, user_factory):
for _ in range(count):
db.session.add(user_factory())
@@ -170,72 +186,73 @@ def test_get_user_count(count, user_factory):
def test_try_get_user_by_name(user_factory):
- user = user_factory(name='name', email='email')
+ user = user_factory(name="name", email="email")
db.session.add(user)
db.session.flush()
- assert users.try_get_user_by_name('non-existing') is None
- assert users.try_get_user_by_name('email') is None
- assert users.try_get_user_by_name('name') is user
- assert users.try_get_user_by_name('NAME') is user
+ assert users.try_get_user_by_name("non-existing") is None
+ assert users.try_get_user_by_name("email") is None
+ assert users.try_get_user_by_name("name") is user
+ assert users.try_get_user_by_name("NAME") is user
def test_get_user_by_name(user_factory):
- user = user_factory(name='name', email='email')
+ user = user_factory(name="name", email="email")
db.session.add(user)
db.session.flush()
with pytest.raises(users.UserNotFoundError):
- assert users.get_user_by_name('non-existing')
+ assert users.get_user_by_name("non-existing")
with pytest.raises(users.UserNotFoundError):
- assert users.get_user_by_name('email')
- assert users.get_user_by_name('name') is user
- assert users.get_user_by_name('NAME') is user
+ assert users.get_user_by_name("email")
+ assert users.get_user_by_name("name") is user
+ assert users.get_user_by_name("NAME") is user
def test_try_get_user_by_name_or_email(user_factory):
- user = user_factory(name='name', email='email')
+ user = user_factory(name="name", email="email")
db.session.add(user)
db.session.flush()
- assert users.try_get_user_by_name_or_email('non-existing') is None
- assert users.try_get_user_by_name_or_email('email') is user
- assert users.try_get_user_by_name_or_email('EMAIL') is user
- assert users.try_get_user_by_name_or_email('name') is user
- assert users.try_get_user_by_name_or_email('NAME') is user
+ assert users.try_get_user_by_name_or_email("non-existing") is None
+ assert users.try_get_user_by_name_or_email("email") is user
+ assert users.try_get_user_by_name_or_email("EMAIL") is user
+ assert users.try_get_user_by_name_or_email("name") is user
+ assert users.try_get_user_by_name_or_email("NAME") is user
def test_get_user_by_name_or_email(user_factory):
- user = user_factory(name='name', email='email')
+ user = user_factory(name="name", email="email")
db.session.add(user)
db.session.flush()
with pytest.raises(users.UserNotFoundError):
- assert users.get_user_by_name_or_email('non-existing')
- assert users.get_user_by_name_or_email('email') is user
- assert users.get_user_by_name_or_email('EMAIL') is user
- assert users.get_user_by_name_or_email('name') is user
- assert users.get_user_by_name_or_email('NAME') is user
+ assert users.get_user_by_name_or_email("non-existing")
+ assert users.get_user_by_name_or_email("email") is user
+ assert users.get_user_by_name_or_email("EMAIL") is user
+ assert users.get_user_by_name_or_email("name") is user
+ assert users.get_user_by_name_or_email("NAME") is user
def test_create_user_for_first_user(fake_datetime):
- with patch('szurubooru.func.users.update_user_name'), \
- patch('szurubooru.func.users.update_user_password'), \
- patch('szurubooru.func.users.update_user_email'), \
- fake_datetime('1997-01-01'):
- user = users.create_user('name', 'password', 'email')
+ with patch("szurubooru.func.users.update_user_name"), patch(
+ "szurubooru.func.users.update_user_password"
+ ), patch("szurubooru.func.users.update_user_email"), fake_datetime(
+ "1997-01-01"
+ ):
+ user = users.create_user("name", "password", "email")
assert user.creation_time == datetime(1997, 1, 1)
assert user.last_login_time is None
assert user.rank == model.User.RANK_ADMINISTRATOR
- users.update_user_name.assert_called_once_with(user, 'name')
- users.update_user_password.assert_called_once_with(user, 'password')
- users.update_user_email.assert_called_once_with(user, 'email')
+ users.update_user_name.assert_called_once_with(user, "name")
+ users.update_user_password.assert_called_once_with(user, "password")
+ users.update_user_email.assert_called_once_with(user, "email")
def test_create_user_for_subsequent_users(user_factory, config_injector):
- config_injector({'default_rank': 'regular'})
+ config_injector({"default_rank": "regular"})
db.session.add(user_factory())
db.session.flush()
- with patch('szurubooru.func.users.update_user_name'), \
- patch('szurubooru.func.users.update_user_email'), \
- patch('szurubooru.func.users.update_user_password'):
- user = users.create_user('name', 'password', 'email')
+ with patch("szurubooru.func.users.update_user_name"), patch(
+ "szurubooru.func.users.update_user_email"
+ ), patch("szurubooru.func.users.update_user_password"):
+ user = users.create_user("name", "password", "email")
assert user.rank == model.User.RANK_REGULAR
@@ -248,56 +265,58 @@ def test_update_user_name_with_empty_string(user_factory):
def test_update_user_name_with_too_long_string(user_factory):
user = user_factory()
with pytest.raises(users.InvalidUserNameError):
- users.update_user_name(user, 'a' * 300)
+ users.update_user_name(user, "a" * 300)
def test_update_user_name_with_invalid_name(user_factory, config_injector):
- config_injector({'user_name_regex': '^[a-z]+$'})
+ config_injector({"user_name_regex": "^[a-z]+$"})
user = user_factory()
with pytest.raises(users.InvalidUserNameError):
- users.update_user_name(user, '0')
+ users.update_user_name(user, "0")
def test_update_user_name_with_duplicate_name(user_factory, config_injector):
- config_injector({'user_name_regex': '^[a-z]+$'})
+ config_injector({"user_name_regex": "^[a-z]+$"})
user = user_factory()
- existing_user = user_factory(name='dummy')
+ existing_user = user_factory(name="dummy")
db.session.add(existing_user)
db.session.flush()
with pytest.raises(users.UserAlreadyExistsError):
- users.update_user_name(user, 'dummy')
+ users.update_user_name(user, "dummy")
def test_update_user_name_reusing_own_name(user_factory, config_injector):
- config_injector({'user_name_regex': '^[a-z]+$'})
- user = user_factory(name='dummy')
+ config_injector({"user_name_regex": "^[a-z]+$"})
+ user = user_factory(name="dummy")
db.session.add(user)
db.session.flush()
- with patch('szurubooru.func.files.has'):
+ with patch("szurubooru.func.files.has"):
files.has.return_value = False
- users.update_user_name(user, 'dummy')
+ users.update_user_name(user, "dummy")
db.session.flush()
- assert users.try_get_user_by_name('dummy') is user
+ assert users.try_get_user_by_name("dummy") is user
def test_update_user_name_for_new_user(user_factory, config_injector):
- config_injector({'user_name_regex': '^[a-z]+$'})
+ config_injector({"user_name_regex": "^[a-z]+$"})
user = user_factory()
- with patch('szurubooru.func.files.has'):
+ with patch("szurubooru.func.files.has"):
files.has.return_value = False
- users.update_user_name(user, 'dummy')
- assert user.name == 'dummy'
+ users.update_user_name(user, "dummy")
+ assert user.name == "dummy"
def test_update_user_name_moves_avatar(user_factory, config_injector):
- config_injector({'user_name_regex': '^[a-z]+$'})
- user = user_factory(name='old')
- with patch('szurubooru.func.files.has'), \
- patch('szurubooru.func.files.move'):
+ config_injector({"user_name_regex": "^[a-z]+$"})
+ user = user_factory(name="old")
+ with patch("szurubooru.func.files.has"), patch(
+ "szurubooru.func.files.move"
+ ):
files.has.return_value = True
- users.update_user_name(user, 'new')
+ users.update_user_name(user, "new")
files.move.assert_called_once_with(
- 'avatars/old.png', 'avatars/new.png')
+ "avatars/old.png", "avatars/new.png"
+ )
def test_update_user_password_with_empty_string(user_factory):
@@ -307,72 +326,74 @@ def test_update_user_password_with_empty_string(user_factory):
def test_update_user_password_with_invalid_string(
- user_factory, config_injector):
- config_injector({'password_regex': '^[a-z]+$'})
+ user_factory, config_injector
+):
+ config_injector({"password_regex": "^[a-z]+$"})
user = user_factory()
with pytest.raises(users.InvalidPasswordError):
- users.update_user_password(user, '0')
+ users.update_user_password(user, "0")
def test_update_user_password(user_factory, config_injector):
- config_injector({'password_regex': '^[a-z]+$'})
+ config_injector({"password_regex": "^[a-z]+$"})
user = user_factory()
- with patch('szurubooru.func.auth.create_password'), \
- patch('szurubooru.func.auth.get_password_hash'):
- auth.create_password.return_value = 'salt'
- auth.get_password_hash.return_value = ('hash', 3)
- users.update_user_password(user, 'a')
- assert user.password_salt == 'salt'
- assert user.password_hash == 'hash'
+ with patch("szurubooru.func.auth.create_password"), patch(
+ "szurubooru.func.auth.get_password_hash"
+ ):
+ auth.create_password.return_value = "salt"
+ auth.get_password_hash.return_value = ("hash", 3)
+ users.update_user_password(user, "a")
+ assert user.password_salt == "salt"
+ assert user.password_hash == "hash"
assert user.password_revision == 3
def test_update_user_email_with_too_long_string(user_factory):
user = user_factory()
with pytest.raises(users.InvalidEmailError):
- users.update_user_email(user, 'a' * 300)
+ users.update_user_email(user, "a" * 300)
def test_update_user_email_with_invalid_email(user_factory):
user = user_factory()
- with patch('szurubooru.func.util.is_valid_email'):
+ with patch("szurubooru.func.util.is_valid_email"):
util.is_valid_email.return_value = False
with pytest.raises(users.InvalidEmailError):
- users.update_user_email(user, 'a')
+ users.update_user_email(user, "a")
def test_update_user_email_with_empty_string(user_factory):
user = user_factory()
- with patch('szurubooru.func.util.is_valid_email'):
+ with patch("szurubooru.func.util.is_valid_email"):
util.is_valid_email.return_value = True
- users.update_user_email(user, '')
+ users.update_user_email(user, "")
assert user.email is None
def test_update_user_email(user_factory):
user = user_factory()
- with patch('szurubooru.func.util.is_valid_email'):
+ with patch("szurubooru.func.util.is_valid_email"):
util.is_valid_email.return_value = True
- users.update_user_email(user, 'a')
- assert user.email == 'a'
+ users.update_user_email(user, "a")
+ assert user.email == "a"
def test_update_user_rank_with_empty_string(user_factory):
user = user_factory()
auth_user = user_factory()
with pytest.raises(users.InvalidRankError):
- users.update_user_rank(user, '', auth_user)
+ users.update_user_rank(user, "", auth_user)
def test_update_user_rank_with_invalid_string(user_factory):
user = user_factory()
auth_user = user_factory()
with pytest.raises(users.InvalidRankError):
- users.update_user_rank(user, 'invalid', auth_user)
+ users.update_user_rank(user, "invalid", auth_user)
with pytest.raises(users.InvalidRankError):
- users.update_user_rank(user, 'anonymous', auth_user)
+ users.update_user_rank(user, "anonymous", auth_user)
with pytest.raises(users.InvalidRankError):
- users.update_user_rank(user, 'nobody', auth_user)
+ users.update_user_rank(user, "nobody", auth_user)
def test_update_user_rank_with_higher_rank_than_possible(user_factory):
@@ -382,9 +403,9 @@ def test_update_user_rank_with_higher_rank_than_possible(user_factory):
auth_user = user_factory()
auth_user.rank = model.User.RANK_ANONYMOUS
with pytest.raises(errors.AuthError):
- users.update_user_rank(user, 'regular', auth_user)
+ users.update_user_rank(user, "regular", auth_user)
with pytest.raises(errors.AuthError):
- users.update_user_rank(auth_user, 'regular', auth_user)
+ users.update_user_rank(auth_user, "regular", auth_user)
def test_update_user_rank(user_factory):
@@ -393,8 +414,8 @@ def test_update_user_rank(user_factory):
user = user_factory()
auth_user = user_factory()
auth_user.rank = model.User.RANK_ADMINISTRATOR
- users.update_user_rank(user, 'regular', auth_user)
- users.update_user_rank(auth_user, 'regular', auth_user)
+ users.update_user_rank(user, "regular", auth_user)
+ users.update_user_rank(auth_user, "regular", auth_user)
assert user.rank == model.User.RANK_REGULAR
assert auth_user.rank == model.User.RANK_REGULAR
@@ -402,54 +423,57 @@ def test_update_user_rank(user_factory):
def test_update_user_avatar_with_invalid_style(user_factory):
user = user_factory()
with pytest.raises(users.InvalidAvatarError):
- users.update_user_avatar(user, 'invalid', b'')
+ users.update_user_avatar(user, "invalid", b"")
def test_update_user_avatar_to_gravatar(user_factory):
user = user_factory()
- users.update_user_avatar(user, 'gravatar')
+ users.update_user_avatar(user, "gravatar")
assert user.avatar_style == model.User.AVATAR_GRAVATAR
def test_update_user_avatar_to_empty_manual(user_factory):
user = user_factory()
- with patch('szurubooru.func.files.has'), \
- pytest.raises(users.InvalidAvatarError):
+ with patch("szurubooru.func.files.has"), pytest.raises(
+ users.InvalidAvatarError
+ ):
files.has.return_value = False
- users.update_user_avatar(user, 'manual', b'')
+ users.update_user_avatar(user, "manual", b"")
def test_update_user_avatar_to_previous_manual(user_factory):
user = user_factory()
- with patch('szurubooru.func.files.has'):
+ with patch("szurubooru.func.files.has"):
files.has.return_value = True
- users.update_user_avatar(user, 'manual', b'')
+ users.update_user_avatar(user, "manual", b"")
def test_update_user_avatar_to_new_manual(user_factory, config_injector):
config_injector(
- {'thumbnails': {'avatar_width': 500, 'avatar_height': 500}})
+ {"thumbnails": {"avatar_width": 500, "avatar_height": 500}}
+ )
user = user_factory()
- with patch('szurubooru.func.files.save'):
- users.update_user_avatar(user, 'manual', EMPTY_PIXEL)
+ with patch("szurubooru.func.files.save"):
+ users.update_user_avatar(user, "manual", EMPTY_PIXEL)
assert user.avatar_style == model.User.AVATAR_MANUAL
assert files.save.called
def test_bump_user_login_time(user_factory, fake_datetime):
user = user_factory()
- with fake_datetime('1997-01-01'):
+ with fake_datetime("1997-01-01"):
users.bump_user_login_time(user)
assert user.last_login_time == datetime(1997, 1, 1)
def test_reset_user_password(user_factory):
- with patch('szurubooru.func.auth.create_password'), \
- patch('szurubooru.func.auth.get_password_hash'):
+ with patch("szurubooru.func.auth.create_password"), patch(
+ "szurubooru.func.auth.get_password_hash"
+ ):
user = user_factory()
- auth.create_password.return_value = 'salt'
- auth.get_password_hash.return_value = ('hash', 3)
+ auth.create_password.return_value = "salt"
+ auth.get_password_hash.return_value = ("hash", 3)
users.reset_user_password(user)
- assert user.password_salt == 'salt'
- assert user.password_hash == 'hash'
+ assert user.password_salt == "salt"
+ assert user.password_hash == "hash"
assert user.password_revision == 3

© 2015 - 2026 Jakob L. Kreuze