Blacked the code

This commit is contained in:
Eliot Berriot 2018-06-09 15:36:16 +02:00
commit 62ca3bd736
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
279 changed files with 8890 additions and 9556 deletions

View file

@ -13,315 +13,297 @@ from funkwhale_api.federation import views
from funkwhale_api.federation import webfinger
@pytest.mark.parametrize('view,permissions', [
(views.LibraryViewSet, ['federation']),
(views.LibraryTrackViewSet, ['federation']),
])
@pytest.mark.parametrize(
"view,permissions",
[
(views.LibraryViewSet, ["federation"]),
(views.LibraryTrackViewSet, ["federation"]),
],
)
def test_permissions(assert_user_permission, view, permissions):
assert_user_permission(view, permissions)
@pytest.mark.parametrize('system_actor', actors.SYSTEM_ACTORS.keys())
@pytest.mark.parametrize("system_actor", actors.SYSTEM_ACTORS.keys())
def test_instance_actors(system_actor, db, api_client):
actor = actors.SYSTEM_ACTORS[system_actor].get_actor_instance()
url = reverse(
'federation:instance-actors-detail',
kwargs={'actor': system_actor})
url = reverse("federation:instance-actors-detail", kwargs={"actor": system_actor})
response = api_client.get(url)
serializer = serializers.ActorSerializer(actor)
if system_actor == 'library':
response.data.pop('url')
if system_actor == "library":
response.data.pop("url")
assert response.status_code == 200
assert response.data == serializer.data
@pytest.mark.parametrize('route,kwargs', [
('instance-actors-outbox', {'actor': 'library'}),
('instance-actors-inbox', {'actor': 'library'}),
('instance-actors-detail', {'actor': 'library'}),
('well-known-webfinger', {}),
])
@pytest.mark.parametrize(
"route,kwargs",
[
("instance-actors-outbox", {"actor": "library"}),
("instance-actors-inbox", {"actor": "library"}),
("instance-actors-detail", {"actor": "library"}),
("well-known-webfinger", {}),
],
)
def test_instance_endpoints_405_if_federation_disabled(
authenticated_actor, db, preferences, api_client, route, kwargs):
preferences['federation__enabled'] = False
url = reverse('federation:{}'.format(route), kwargs=kwargs)
authenticated_actor, db, preferences, api_client, route, kwargs
):
preferences["federation__enabled"] = False
url = reverse("federation:{}".format(route), kwargs=kwargs)
response = api_client.get(url)
assert response.status_code == 405
def test_wellknown_webfinger_validates_resource(
db, api_client, settings, mocker):
clean = mocker.spy(webfinger, 'clean_resource')
url = reverse('federation:well-known-webfinger')
response = api_client.get(url, data={'resource': 'something'})
def test_wellknown_webfinger_validates_resource(db, api_client, settings, mocker):
clean = mocker.spy(webfinger, "clean_resource")
url = reverse("federation:well-known-webfinger")
response = api_client.get(url, data={"resource": "something"})
clean.assert_called_once_with('something')
assert url == '/.well-known/webfinger'
clean.assert_called_once_with("something")
assert url == "/.well-known/webfinger"
assert response.status_code == 400
assert response.data['errors']['resource'] == (
'Missing webfinger resource type'
)
assert response.data["errors"]["resource"] == ("Missing webfinger resource type")
@pytest.mark.parametrize('system_actor', actors.SYSTEM_ACTORS.keys())
def test_wellknown_webfinger_system(
system_actor, db, api_client, settings, mocker):
@pytest.mark.parametrize("system_actor", actors.SYSTEM_ACTORS.keys())
def test_wellknown_webfinger_system(system_actor, db, api_client, settings, mocker):
actor = actors.SYSTEM_ACTORS[system_actor].get_actor_instance()
url = reverse('federation:well-known-webfinger')
url = reverse("federation:well-known-webfinger")
response = api_client.get(
url,
data={'resource': 'acct:{}'.format(actor.webfinger_subject)},
HTTP_ACCEPT='application/jrd+json',
data={"resource": "acct:{}".format(actor.webfinger_subject)},
HTTP_ACCEPT="application/jrd+json",
)
serializer = serializers.ActorWebfingerSerializer(actor)
assert response.status_code == 200
assert response['Content-Type'] == 'application/jrd+json'
assert response["Content-Type"] == "application/jrd+json"
assert response.data == serializer.data
def test_wellknown_nodeinfo(db, preferences, api_client, settings):
expected = {
'links': [
"links": [
{
'rel': 'http://nodeinfo.diaspora.software/ns/schema/2.0',
'href': '{}{}'.format(
settings.FUNKWHALE_URL,
reverse('api:v1:instance:nodeinfo-2.0')
)
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "{}{}".format(
settings.FUNKWHALE_URL, reverse("api:v1:instance:nodeinfo-2.0")
),
}
]
}
url = reverse('federation:well-known-nodeinfo')
response = api_client.get(url, HTTP_ACCEPT='application/jrd+json')
url = reverse("federation:well-known-nodeinfo")
response = api_client.get(url, HTTP_ACCEPT="application/jrd+json")
assert response.status_code == 200
assert response['Content-Type'] == 'application/jrd+json'
assert response["Content-Type"] == "application/jrd+json"
assert response.data == expected
def test_wellknown_nodeinfo_disabled(db, preferences, api_client):
preferences['instance__nodeinfo_enabled'] = False
url = reverse('federation:well-known-nodeinfo')
preferences["instance__nodeinfo_enabled"] = False
url = reverse("federation:well-known-nodeinfo")
response = api_client.get(url)
assert response.status_code == 404
def test_audio_file_list_requires_authenticated_actor(
db, preferences, api_client):
preferences['federation__music_needs_approval'] = True
url = reverse('federation:music:files-list')
def test_audio_file_list_requires_authenticated_actor(db, preferences, api_client):
preferences["federation__music_needs_approval"] = True
url = reverse("federation:music:files-list")
response = api_client.get(url)
assert response.status_code == 403
def test_audio_file_list_actor_no_page(
db, preferences, api_client, factories):
preferences['federation__music_needs_approval'] = False
preferences['federation__collection_page_size'] = 2
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
tfs = factories['music.TrackFile'].create_batch(size=5)
def test_audio_file_list_actor_no_page(db, preferences, api_client, factories):
preferences["federation__music_needs_approval"] = False
preferences["federation__collection_page_size"] = 2
library = actors.SYSTEM_ACTORS["library"].get_actor_instance()
tfs = factories["music.TrackFile"].create_batch(size=5)
conf = {
'id': utils.full_url(reverse('federation:music:files-list')),
'page_size': 2,
'items': list(reversed(tfs)), # we order by -creation_date
'item_serializer': serializers.AudioSerializer,
'actor': library
"id": utils.full_url(reverse("federation:music:files-list")),
"page_size": 2,
"items": list(reversed(tfs)), # we order by -creation_date
"item_serializer": serializers.AudioSerializer,
"actor": library,
}
expected = serializers.PaginatedCollectionSerializer(conf).data
url = reverse('federation:music:files-list')
url = reverse("federation:music:files-list")
response = api_client.get(url)
assert response.status_code == 200
assert response.data == expected
def test_audio_file_list_actor_page(
db, preferences, api_client, factories):
preferences['federation__music_needs_approval'] = False
preferences['federation__collection_page_size'] = 2
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
tfs = factories['music.TrackFile'].create_batch(size=5)
def test_audio_file_list_actor_page(db, preferences, api_client, factories):
preferences["federation__music_needs_approval"] = False
preferences["federation__collection_page_size"] = 2
library = actors.SYSTEM_ACTORS["library"].get_actor_instance()
tfs = factories["music.TrackFile"].create_batch(size=5)
conf = {
'id': utils.full_url(reverse('federation:music:files-list')),
'page': Paginator(list(reversed(tfs)), 2).page(2),
'item_serializer': serializers.AudioSerializer,
'actor': library
"id": utils.full_url(reverse("federation:music:files-list")),
"page": Paginator(list(reversed(tfs)), 2).page(2),
"item_serializer": serializers.AudioSerializer,
"actor": library,
}
expected = serializers.CollectionPageSerializer(conf).data
url = reverse('federation:music:files-list')
response = api_client.get(url, data={'page': 2})
url = reverse("federation:music:files-list")
response = api_client.get(url, data={"page": 2})
assert response.status_code == 200
assert response.data == expected
def test_audio_file_list_actor_page_exclude_federated_files(
db, preferences, api_client, factories):
preferences['federation__music_needs_approval'] = False
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
tfs = factories['music.TrackFile'].create_batch(size=5, federation=True)
db, preferences, api_client, factories
):
preferences["federation__music_needs_approval"] = False
library = actors.SYSTEM_ACTORS["library"].get_actor_instance()
tfs = factories["music.TrackFile"].create_batch(size=5, federation=True)
url = reverse('federation:music:files-list')
url = reverse("federation:music:files-list")
response = api_client.get(url)
assert response.status_code == 200
assert response.data['totalItems'] == 0
assert response.data["totalItems"] == 0
def test_audio_file_list_actor_page_error(
db, preferences, api_client, factories):
preferences['federation__music_needs_approval'] = False
url = reverse('federation:music:files-list')
response = api_client.get(url, data={'page': 'nope'})
def test_audio_file_list_actor_page_error(db, preferences, api_client, factories):
preferences["federation__music_needs_approval"] = False
url = reverse("federation:music:files-list")
response = api_client.get(url, data={"page": "nope"})
assert response.status_code == 400
def test_audio_file_list_actor_page_error_too_far(
db, preferences, api_client, factories):
preferences['federation__music_needs_approval'] = False
url = reverse('federation:music:files-list')
response = api_client.get(url, data={'page': 5000})
db, preferences, api_client, factories
):
preferences["federation__music_needs_approval"] = False
url = reverse("federation:music:files-list")
response = api_client.get(url, data={"page": 5000})
assert response.status_code == 404
def test_library_actor_includes_library_link(db, preferences, api_client):
actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
url = reverse(
'federation:instance-actors-detail',
kwargs={'actor': 'library'})
actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
url = reverse("federation:instance-actors-detail", kwargs={"actor": "library"})
response = api_client.get(url)
expected_links = [
{
'type': 'Link',
'name': 'library',
'mediaType': 'application/activity+json',
'href': utils.full_url(reverse('federation:music:files-list'))
"type": "Link",
"name": "library",
"mediaType": "application/activity+json",
"href": utils.full_url(reverse("federation:music:files-list")),
}
]
assert response.status_code == 200
assert response.data['url'] == expected_links
assert response.data["url"] == expected_links
def test_can_fetch_library(superuser_api_client, mocker):
result = {'test': 'test'}
result = {"test": "test"}
scan = mocker.patch(
'funkwhale_api.federation.library.scan_from_account_name',
return_value=result)
"funkwhale_api.federation.library.scan_from_account_name", return_value=result
)
url = reverse('api:v1:federation:libraries-fetch')
response = superuser_api_client.get(
url, data={'account': 'test@test.library'})
url = reverse("api:v1:federation:libraries-fetch")
response = superuser_api_client.get(url, data={"account": "test@test.library"})
assert response.status_code == 200
assert response.data == result
scan.assert_called_once_with('test@test.library')
scan.assert_called_once_with("test@test.library")
def test_follow_library(superuser_api_client, mocker, factories, r_mock):
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
actor = factories['federation.Actor']()
follow = {'test': 'follow'}
on_commit = mocker.patch(
'funkwhale_api.common.utils.on_commit')
library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
actor = factories["federation.Actor"]()
follow = {"test": "follow"}
on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
actor_data = serializers.ActorSerializer(actor).data
actor_data['url'] = [{
'href': 'https://test.library',
'name': 'library',
'type': 'Link',
}]
actor_data["url"] = [
{"href": "https://test.library", "name": "library", "type": "Link"}
]
library_conf = {
'id': 'https://test.library',
'items': range(10),
'actor': actor,
'page_size': 5,
"id": "https://test.library",
"items": range(10),
"actor": actor,
"page_size": 5,
}
library_data = serializers.PaginatedCollectionSerializer(library_conf).data
r_mock.get(actor.url, json=actor_data)
r_mock.get('https://test.library', json=library_data)
r_mock.get("https://test.library", json=library_data)
data = {
'actor': actor.url,
'autoimport': False,
'federation_enabled': True,
'download_files': False,
"actor": actor.url,
"autoimport": False,
"federation_enabled": True,
"download_files": False,
}
url = reverse('api:v1:federation:libraries-list')
response = superuser_api_client.post(
url, data)
url = reverse("api:v1:federation:libraries-list")
response = superuser_api_client.post(url, data)
assert response.status_code == 201
follow = models.Follow.objects.get(
actor=library_actor,
target=actor,
approved=None,
)
follow = models.Follow.objects.get(actor=library_actor, target=actor, approved=None)
library = follow.library
assert response.data == serializers.APILibraryCreateSerializer(
library).data
assert response.data == serializers.APILibraryCreateSerializer(library).data
on_commit.assert_called_once_with(
activity.deliver,
serializers.FollowSerializer(follow).data,
on_behalf_of=library_actor,
to=[actor.url]
to=[actor.url],
)
def test_can_list_system_actor_following(factories, superuser_api_client):
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
follow1 = factories['federation.Follow'](actor=library_actor)
follow2 = factories['federation.Follow']()
library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
follow1 = factories["federation.Follow"](actor=library_actor)
follow2 = factories["federation.Follow"]()
url = reverse('api:v1:federation:libraries-following')
url = reverse("api:v1:federation:libraries-following")
response = superuser_api_client.get(url)
assert response.status_code == 200
assert response.data['results'] == [
serializers.APIFollowSerializer(follow1).data
]
assert response.data["results"] == [serializers.APIFollowSerializer(follow1).data]
def test_can_list_system_actor_followers(factories, superuser_api_client):
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
follow1 = factories['federation.Follow'](actor=library_actor)
follow2 = factories['federation.Follow'](target=library_actor)
library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
follow1 = factories["federation.Follow"](actor=library_actor)
follow2 = factories["federation.Follow"](target=library_actor)
url = reverse('api:v1:federation:libraries-followers')
url = reverse("api:v1:federation:libraries-followers")
response = superuser_api_client.get(url)
assert response.status_code == 200
assert response.data['results'] == [
serializers.APIFollowSerializer(follow2).data
]
assert response.data["results"] == [serializers.APIFollowSerializer(follow2).data]
def test_can_list_libraries(factories, superuser_api_client):
library1 = factories['federation.Library']()
library2 = factories['federation.Library']()
library1 = factories["federation.Library"]()
library2 = factories["federation.Library"]()
url = reverse('api:v1:federation:libraries-list')
url = reverse("api:v1:federation:libraries-list")
response = superuser_api_client.get(url)
assert response.status_code == 200
assert response.data['results'] == [
assert response.data["results"] == [
serializers.APILibrarySerializer(library1).data,
serializers.APILibrarySerializer(library2).data,
]
def test_can_detail_library(factories, superuser_api_client):
library = factories['federation.Library']()
library = factories["federation.Library"]()
url = reverse(
'api:v1:federation:libraries-detail',
kwargs={'uuid': str(library.uuid)})
"api:v1:federation:libraries-detail", kwargs={"uuid": str(library.uuid)}
)
response = superuser_api_client.get(url)
assert response.status_code == 200
@ -329,15 +311,15 @@ def test_can_detail_library(factories, superuser_api_client):
def test_can_patch_library(factories, superuser_api_client):
library = factories['federation.Library']()
library = factories["federation.Library"]()
data = {
'federation_enabled': not library.federation_enabled,
'download_files': not library.download_files,
'autoimport': not library.autoimport,
"federation_enabled": not library.federation_enabled,
"download_files": not library.download_files,
"autoimport": not library.autoimport,
}
url = reverse(
'api:v1:federation:libraries-detail',
kwargs={'uuid': str(library.uuid)})
"api:v1:federation:libraries-detail", kwargs={"uuid": str(library.uuid)}
)
response = superuser_api_client.patch(url, data)
assert response.status_code == 200
@ -349,55 +331,49 @@ def test_can_patch_library(factories, superuser_api_client):
def test_scan_library(factories, mocker, superuser_api_client):
scan = mocker.patch(
'funkwhale_api.federation.tasks.scan_library.delay',
return_value=mocker.Mock(id='id'))
library = factories['federation.Library']()
"funkwhale_api.federation.tasks.scan_library.delay",
return_value=mocker.Mock(id="id"),
)
library = factories["federation.Library"]()
now = timezone.now()
data = {
'until': now,
}
data = {"until": now}
url = reverse(
'api:v1:federation:libraries-scan',
kwargs={'uuid': str(library.uuid)})
"api:v1:federation:libraries-scan", kwargs={"uuid": str(library.uuid)}
)
response = superuser_api_client.post(url, data)
assert response.status_code == 200
assert response.data == {'task': 'id'}
scan.assert_called_once_with(
library_id=library.pk,
until=now
)
assert response.data == {"task": "id"}
scan.assert_called_once_with(library_id=library.pk, until=now)
def test_list_library_tracks(factories, superuser_api_client):
library = factories['federation.Library']()
lts = list(reversed(factories['federation.LibraryTrack'].create_batch(
size=5, library=library)))
factories['federation.LibraryTrack'].create_batch(size=5)
url = reverse('api:v1:federation:library-tracks-list')
response = superuser_api_client.get(url, {'library': library.uuid})
library = factories["federation.Library"]()
lts = list(
reversed(
factories["federation.LibraryTrack"].create_batch(size=5, library=library)
)
)
factories["federation.LibraryTrack"].create_batch(size=5)
url = reverse("api:v1:federation:library-tracks-list")
response = superuser_api_client.get(url, {"library": library.uuid})
assert response.status_code == 200
assert response.data == {
'results': serializers.APILibraryTrackSerializer(lts, many=True).data,
'count': 5,
'previous': None,
'next': None,
"results": serializers.APILibraryTrackSerializer(lts, many=True).data,
"count": 5,
"previous": None,
"next": None,
}
def test_can_update_follow_status(factories, superuser_api_client, mocker):
patched_accept = mocker.patch(
'funkwhale_api.federation.activity.accept_follow'
)
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
follow = factories['federation.Follow'](target=library_actor)
patched_accept = mocker.patch("funkwhale_api.federation.activity.accept_follow")
library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
follow = factories["federation.Follow"](target=library_actor)
payload = {
'follow': follow.pk,
'approved': True
}
url = reverse('api:v1:federation:libraries-followers')
payload = {"follow": follow.pk, "approved": True}
url = reverse("api:v1:federation:libraries-followers")
response = superuser_api_client.patch(url, payload)
follow.refresh_from_db()
@ -407,45 +383,33 @@ def test_can_update_follow_status(factories, superuser_api_client, mocker):
def test_can_filter_pending_follows(factories, superuser_api_client):
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
follow = factories['federation.Follow'](
target=library_actor,
approved=True)
library_actor = actors.SYSTEM_ACTORS["library"].get_actor_instance()
follow = factories["federation.Follow"](target=library_actor, approved=True)
params = {'pending': True}
url = reverse('api:v1:federation:libraries-followers')
params = {"pending": True}
url = reverse("api:v1:federation:libraries-followers")
response = superuser_api_client.get(url, params)
assert response.status_code == 200
assert len(response.data['results']) == 0
assert len(response.data["results"]) == 0
def test_library_track_action_import(
factories, superuser_api_client, mocker):
lt1 = factories['federation.LibraryTrack']()
lt2 = factories['federation.LibraryTrack'](library=lt1.library)
lt3 = factories['federation.LibraryTrack']()
lt4 = factories['federation.LibraryTrack'](library=lt3.library)
mocked_run = mocker.patch(
'funkwhale_api.music.tasks.import_batch_run.delay')
def test_library_track_action_import(factories, superuser_api_client, mocker):
lt1 = factories["federation.LibraryTrack"]()
lt2 = factories["federation.LibraryTrack"](library=lt1.library)
lt3 = factories["federation.LibraryTrack"]()
lt4 = factories["federation.LibraryTrack"](library=lt3.library)
mocked_run = mocker.patch("funkwhale_api.music.tasks.import_batch_run.delay")
payload = {
'objects': 'all',
'action': 'import',
'filters': {
'library': lt1.library.uuid
}
}
url = reverse('api:v1:federation:library-tracks-action')
response = superuser_api_client.post(url, payload, format='json')
batch = superuser_api_client.user.imports.latest('id')
expected = {
'updated': 2,
'action': 'import',
'result': {
'batch': {'id': batch.pk}
}
"objects": "all",
"action": "import",
"filters": {"library": lt1.library.uuid},
}
url = reverse("api:v1:federation:library-tracks-action")
response = superuser_api_client.post(url, payload, format="json")
batch = superuser_api_client.user.imports.latest("id")
expected = {"updated": 2, "action": "import", "result": {"batch": {"id": batch.pk}}}
imported_lts = [lt1, lt2]
assert response.status_code == 200