funkwhale/api/tests/cli/test_users.py

164 wiersze
5.0 KiB
Python

import pytest
from funkwhale_api.cli import users
def test_user_create_handler(factories, mocker, now):
kwargs = {
"username": "helloworld",
"password": "securepassword",
"is_superuser": False,
"is_staff": True,
"email": "hello@world.email",
"upload_quota": 35,
"permissions": ["moderation"],
}
set_password = mocker.spy(users.models.User, "set_password")
create_actor = mocker.spy(users.models, "create_actor")
user = users.handler_create_user(**kwargs)
assert user.username == kwargs["username"]
assert user.is_superuser == kwargs["is_superuser"]
assert user.is_staff == kwargs["is_staff"]
assert user.date_joined >= now
assert user.upload_quota == kwargs["upload_quota"]
set_password.assert_called_once_with(user, kwargs["password"])
create_actor.assert_called_once_with(user)
expected_permissions = {
p: p in kwargs["permissions"] for p in users.models.PERMISSIONS
}
assert user.all_permissions == expected_permissions
def test_user_implicit_staff():
kwargs = {
"username": "helloworld",
"password": "securepassword",
"is_superuser": True,
"email": "hello@world.email",
"upload_quota": 35,
"permissions": ["moderation"],
}
user = users.handler_create_user(**kwargs)
assert user.username == kwargs["username"]
assert user.is_superuser == kwargs["is_superuser"]
assert user.is_staff is True
def test_user_delete_handler_soft(factories, mocker, now):
user1 = factories["federation.Actor"](local=True).user
actor1 = user1.actor
user2 = factories["federation.Actor"](local=True).user
actor2 = user2.actor
user3 = factories["federation.Actor"](local=True).user
delete_account = mocker.spy(users.tasks, "delete_account")
users.handler_delete_user([user1.username, user2.username, "unknown"])
assert delete_account.call_count == 2
delete_account.assert_any_call(user_id=user1.pk)
with pytest.raises(user1.DoesNotExist):
user1.refresh_from_db()
delete_account.assert_any_call(user_id=user2.pk)
with pytest.raises(user2.DoesNotExist):
user2.refresh_from_db()
# soft delete, actor shouldn't be deleted
actor1.refresh_from_db()
actor2.refresh_from_db()
# not deleted
user3.refresh_from_db()
def test_user_delete_handler_hard(factories, mocker, now):
user1 = factories["federation.Actor"](local=True).user
actor1 = user1.actor
user2 = factories["federation.Actor"](local=True).user
actor2 = user2.actor
user3 = factories["federation.Actor"](local=True).user
delete_account = mocker.spy(users.tasks, "delete_account")
users.handler_delete_user([user1.username, user2.username, "unknown"], soft=False)
assert delete_account.call_count == 2
delete_account.assert_any_call(user_id=user1.pk)
with pytest.raises(user1.DoesNotExist):
user1.refresh_from_db()
delete_account.assert_any_call(user_id=user2.pk)
with pytest.raises(user2.DoesNotExist):
user2.refresh_from_db()
# hard delete, actors are deleted as well
with pytest.raises(actor1.DoesNotExist):
actor1.refresh_from_db()
with pytest.raises(actor2.DoesNotExist):
actor2.refresh_from_db()
# not deleted
user3.refresh_from_db()
@pytest.mark.parametrize(
"params, expected",
[
({"is_active": False}, {"is_active": False}),
(
{"is_staff": True, "is_superuser": True},
{"is_staff": True, "is_superuser": True},
),
({"upload_quota": 35}, {"upload_quota": 35}),
(
{
"permission_library": True,
"permission_moderation": True,
"permission_settings": True,
},
{
"all_permissions": {
"library": True,
"moderation": True,
"settings": True,
}
},
),
],
)
def test_user_update_handler(params, expected, factories):
user1 = factories["federation.Actor"](local=True).user
user2 = factories["federation.Actor"](local=True).user
user3 = factories["federation.Actor"](local=True).user
def get_field_values(user):
return {f: getattr(user, f) for f, v in expected.items()}
unchanged = get_field_values(user3)
users.handler_update_user([user1.username, user2.username, "unknown"], params)
user1.refresh_from_db()
user2.refresh_from_db()
user3.refresh_from_db()
assert get_field_values(user1) == expected
assert get_field_values(user2) == expected
assert get_field_values(user3) == unchanged
def test_user_update_handler_password(factories, mocker):
user = factories["federation.Actor"](local=True).user
current_password = user.password
set_password = mocker.spy(users.models.User, "set_password")
users.handler_update_user([user.username], {"password": "hello"})
user.refresh_from_db()
set_password.assert_called_once_with(user, "hello")
assert user.password != current_password