funkwhale/api/tests/common/test_fields.py

106 wiersze
3.2 KiB
Python

import pytest
from django.contrib.auth.models import AnonymousUser
from django.db.models import Q
from funkwhale_api.common import fields
from funkwhale_api.users.factories import UserFactory
@pytest.mark.parametrize(
"user,expected",
[
(AnonymousUser(), Q(privacy_level="everyone")),
(
UserFactory.build(pk=1),
Q(privacy_level__in=["instance", "everyone"])
| Q(privacy_level="me", user=UserFactory.build(pk=1)),
),
],
)
def test_privacy_level_query(user, expected):
query = fields.privacy_level_query(user)
assert query == expected
def test_generic_relation_field(factories):
obj = factories["users.User"]()
f = fields.GenericRelation(
{
"user": {
"queryset": obj.__class__.objects.all(),
"id_attr": "username",
"id_field": fields.serializers.CharField(),
}
}
)
data = {"type": "user", "username": obj.username}
assert f.to_internal_value(data) == obj
@pytest.mark.parametrize(
"payload, expected_error",
[
({}, r".*Invalid data.*"),
(1, r".*Invalid data.*"),
(False, r".*Invalid data.*"),
("test", r".*Invalid data.*"),
({"missing": "type"}, r".*Invalid type.*"),
({"type": "noop"}, r".*Invalid type.*"),
({"type": "user"}, r".*Invalid username.*"),
({"type": "user", "username": {}}, r".*Invalid username.*"),
({"type": "user", "username": "not_found"}, r".*Object not found.*"),
],
)
def test_generic_relation_field_validation_error(payload, expected_error, factories):
obj = factories["users.User"]()
f = fields.GenericRelation(
{
"user": {
"queryset": obj.__class__.objects.all(),
"id_attr": "username",
"id_field": fields.serializers.CharField(),
}
}
)
with pytest.raises(fields.serializers.ValidationError, match=expected_error):
f.to_internal_value(payload)
def test_generic_relation_filter_target_type(factories):
user = factories["users.User"]()
note = factories["moderation.Note"](target=user)
factories["moderation.Note"](target=factories["music.Artist"]())
f = fields.GenericRelationFilter(
"target",
{
"user": {
"queryset": user.__class__.objects.all(),
"id_attr": "username",
"id_field": fields.serializers.CharField(),
}
},
)
qs = f.filter(note.__class__.objects.all(), "user")
assert list(qs) == [note]
def test_generic_relation_filter_target_type_and_id(factories):
user = factories["users.User"]()
note = factories["moderation.Note"](target=user)
factories["moderation.Note"](target=factories["users.User"]())
f = fields.GenericRelationFilter(
"target",
{
"user": {
"queryset": user.__class__.objects.all(),
"id_attr": "username",
"id_field": fields.serializers.CharField(),
}
},
)
qs = f.filter(note.__class__.objects.all(), "user:{}".format(user.username))
assert list(qs) == [note]