Skip to content
Snippets Groups Projects
test_models.py 5.19 KiB
Newer Older
import datetime
from django.urls import reverse

from funkwhale_api.federation import utils as federation_utils

def test__str__(factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](username="hello")
    assert user.__str__() == "hello"


def test_changing_password_updates_subsonic_api_token_no_token(factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](subsonic_api_token=None)
    user.set_password("new")
    assert user.subsonic_api_token is None


def test_changing_password_updates_subsonic_api_token(factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](subsonic_api_token="test")
    user.set_password("new")

    assert user.subsonic_api_token is not None
Eliot Berriot's avatar
Eliot Berriot committed
    assert user.subsonic_api_token != "test"
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](is_superuser=True)

    perms = user.get_permissions()
    for p in models.PERMISSIONS:
        assert perms[p] is True


def test_get_permissions_regular(factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](permission_library=True)

    perms = user.get_permissions()
    for p in models.PERMISSIONS:
Eliot Berriot's avatar
Eliot Berriot committed
        if p == "library":
def test_get_permissions_default(factories, preferences):
Eliot Berriot's avatar
Eliot Berriot committed
    preferences["users__default_permissions"] = ["upload", "federation"]
    user = factories["users.User"]()

    perms = user.get_permissions()
Eliot Berriot's avatar
Eliot Berriot committed
    assert perms["upload"] is True
    assert perms["federation"] is True
    assert perms["library"] is False
    assert perms["settings"] is False


@pytest.mark.parametrize(
    "args,perms,expected",
    [
        ({"is_superuser": True}, ["federation", "library"], True),
        ({"is_superuser": False}, ["federation"], False),
        ({"permission_library": True}, ["library"], True),
        ({"permission_library": True}, ["library", "federation"], False),
    ],
)
def test_has_permissions_and(args, perms, expected, factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](**args)
    assert user.has_permissions(*perms, operator="and") is expected


@pytest.mark.parametrize(
    "args,perms,expected",
    [
        ({"is_superuser": True}, ["federation", "library"], True),
        ({"is_superuser": False}, ["federation"], False),
        ({"permission_library": True}, ["library", "federation"], True),
        ({"permission_library": True}, ["federation"], False),
    ],
)
def test_has_permissions_or(args, perms, expected, factories):
Eliot Berriot's avatar
Eliot Berriot committed
    user = factories["users.User"](**args)
    assert user.has_permissions(*perms, operator="or") is expected


def test_record_activity(factories, now):
    user = factories["users.User"]()
    assert user.last_activity is None

    user.record_activity()

    assert user.last_activity == now


def test_record_activity_does_nothing_if_already(factories, now, mocker):
    user = factories["users.User"](last_activity=now)
    save = mocker.patch("funkwhale_api.users.models.User.save")
    user.record_activity()

    save.assert_not_called()


def test_invitation_generates_random_code_on_save(factories):
    invitation = factories["users.Invitation"]()
    assert len(invitation.code) >= 6


def test_invitation_expires_after_delay(factories, settings):
    delay = settings.USERS_INVITATION_EXPIRATION_DAYS
    invitation = factories["users.Invitation"]()
    assert invitation.expiration_date == (
        invitation.creation_date + datetime.timedelta(days=delay)
    )


def test_can_filter_open_invitations(factories):
    okay = factories["users.Invitation"]()
    factories["users.Invitation"](expired=True)
    factories["users.User"](invited=True)

    assert models.Invitation.objects.count() == 3
    assert list(models.Invitation.objects.open()) == [okay]


def test_can_filter_closed_invitations(factories):
    factories["users.Invitation"]()
    expired = factories["users.Invitation"](expired=True)
    used = factories["users.User"](invited=True).invitation

    assert models.Invitation.objects.count() == 3
    assert list(models.Invitation.objects.order_by("id").open(False)) == [expired, used]


def test_creating_actor_from_user(factories, settings):
    user = factories["users.User"](username="Hello M. world")
    actor = models.create_actor(user)

    assert actor.preferred_username == "Hello_M_world"  # slugified
    assert actor.domain == settings.FEDERATION_HOSTNAME
    assert actor.type == "Person"
    assert actor.name == user.username
    assert actor.manually_approves_followers is False
    assert actor.url == federation_utils.full_url(
        reverse(
            "federation:actors-detail",
            kwargs={"preferred_username": actor.preferred_username},
        )
    )
    assert actor.shared_inbox_url == federation_utils.full_url(
        reverse(
            "federation:actors-inbox",
            kwargs={"preferred_username": actor.preferred_username},
        )
    )
    assert actor.inbox_url == federation_utils.full_url(
        reverse(
            "federation:actors-inbox",
            kwargs={"preferred_username": actor.preferred_username},
        )
    )
    assert actor.outbox_url == federation_utils.full_url(
        reverse(
            "federation:actors-outbox",
            kwargs={"preferred_username": actor.preferred_username},
        )