| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from django.urls import reverse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-16 19:59:13 +00:00
										 |  |  | from funkwhale_api.federation import actors | 
					
						
							|  |  |  | from funkwhale_api.federation import serializers as federation_serializers | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  | from funkwhale_api.music import tasks | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_create_import_can_bind_to_request( | 
					
						
							| 
									
										
										
										
											2018-03-25 20:27:38 +00:00
										 |  |  |         artists, albums, mocker, factories, superuser_api_client): | 
					
						
							| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  |     request = factories['requests.ImportRequest']() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocker.patch('funkwhale_api.music.tasks.import_job_run') | 
					
						
							|  |  |  |     mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.musicbrainz.api.artists.get', | 
					
						
							| 
									
										
										
										
											2018-03-25 20:27:38 +00:00
										 |  |  |         return_value=artists['get']['soad']) | 
					
						
							| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  |     mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.musicbrainz.api.images.get_front', | 
					
						
							|  |  |  |         return_value=b'') | 
					
						
							|  |  |  |     mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.musicbrainz.api.releases.get', | 
					
						
							| 
									
										
										
										
											2018-03-25 20:27:38 +00:00
										 |  |  |         return_value=albums['get_with_includes']['hypnotize']) | 
					
						
							| 
									
										
										
										
											2018-02-22 22:33:29 +00:00
										 |  |  |     payload = { | 
					
						
							|  |  |  |         'releaseId': '47ae093f-1607-49a3-be11-a15d335ccc94', | 
					
						
							|  |  |  |         'importRequest': request.pk, | 
					
						
							|  |  |  |         'tracks': [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 'mbid': '1968a9d6-8d92-4051-8f76-674e157b6eed', | 
					
						
							|  |  |  |                 'source': 'https://www.youtube.com/watch?v=1111111111', | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     url = reverse('api:v1:submit-album') | 
					
						
							|  |  |  |     response = superuser_api_client.post( | 
					
						
							|  |  |  |         url, json.dumps(payload), content_type='application/json') | 
					
						
							|  |  |  |     batch = request.import_batches.latest('id') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert batch.import_request == request | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_job_from_federation_no_musicbrainz(factories): | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     lt = factories['federation.LibraryTrack']( | 
					
						
							|  |  |  |         artist_name='Hello', | 
					
						
							|  |  |  |         album_title='World', | 
					
						
							|  |  |  |         title='Ping', | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         federation=True, | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         library_track=lt, | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tasks.import_job_run(import_job_id=job.pk) | 
					
						
							|  |  |  |     job.refresh_from_db() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tf = job.track_file | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     assert tf.mimetype == lt.audio_mimetype | 
					
						
							|  |  |  |     assert tf.library_track == job.library_track | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     assert tf.track.title == 'Ping' | 
					
						
							|  |  |  |     assert tf.track.artist.name == 'Hello' | 
					
						
							|  |  |  |     assert tf.track.album.title == 'World' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_job_from_federation_musicbrainz_recording(factories, mocker): | 
					
						
							|  |  |  |     t = factories['music.Track']() | 
					
						
							|  |  |  |     track_from_api = mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.music.models.Track.get_or_create_from_api', | 
					
						
							|  |  |  |         return_value=t) | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     lt = factories['federation.LibraryTrack']( | 
					
						
							|  |  |  |         metadata__recording__musicbrainz=True, | 
					
						
							|  |  |  |         artist_name='Hello', | 
					
						
							|  |  |  |         album_title='World', | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         federation=True, | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         library_track=lt, | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tasks.import_job_run(import_job_id=job.pk) | 
					
						
							|  |  |  |     job.refresh_from_db() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tf = job.track_file | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     assert tf.mimetype == lt.audio_mimetype | 
					
						
							|  |  |  |     assert tf.library_track == job.library_track | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     assert tf.track == t | 
					
						
							|  |  |  |     track_from_api.assert_called_once_with( | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         mbid=lt.metadata['recording']['musicbrainz_id']) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_job_from_federation_musicbrainz_release(factories, mocker): | 
					
						
							|  |  |  |     a = factories['music.Album']() | 
					
						
							|  |  |  |     album_from_api = mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.music.models.Album.get_or_create_from_api', | 
					
						
							|  |  |  |         return_value=a) | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     lt = factories['federation.LibraryTrack']( | 
					
						
							|  |  |  |         metadata__release__musicbrainz=True, | 
					
						
							|  |  |  |         artist_name='Hello', | 
					
						
							|  |  |  |         title='Ping', | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         federation=True, | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         library_track=lt, | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tasks.import_job_run(import_job_id=job.pk) | 
					
						
							|  |  |  |     job.refresh_from_db() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tf = job.track_file | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     assert tf.mimetype == lt.audio_mimetype | 
					
						
							|  |  |  |     assert tf.library_track == job.library_track | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     assert tf.track.title == 'Ping' | 
					
						
							|  |  |  |     assert tf.track.artist == a.artist | 
					
						
							|  |  |  |     assert tf.track.album == a | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     album_from_api.assert_called_once_with( | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         mbid=lt.metadata['release']['musicbrainz_id']) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_job_from_federation_musicbrainz_artist(factories, mocker): | 
					
						
							|  |  |  |     a = factories['music.Artist']() | 
					
						
							|  |  |  |     artist_from_api = mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.music.models.Artist.get_or_create_from_api', | 
					
						
							|  |  |  |         return_value=a) | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     lt = factories['federation.LibraryTrack']( | 
					
						
							|  |  |  |         metadata__artist__musicbrainz=True, | 
					
						
							|  |  |  |         album_title='World', | 
					
						
							|  |  |  |         title='Ping', | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         federation=True, | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         library_track=lt, | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tasks.import_job_run(import_job_id=job.pk) | 
					
						
							|  |  |  |     job.refresh_from_db() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tf = job.track_file | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |     assert tf.mimetype == lt.audio_mimetype | 
					
						
							|  |  |  |     assert tf.library_track == job.library_track | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-05 21:22:28 +00:00
										 |  |  |     assert tf.track.title == 'Ping' | 
					
						
							|  |  |  |     assert tf.track.artist == a | 
					
						
							|  |  |  |     assert tf.track.album.artist == a | 
					
						
							|  |  |  |     assert tf.track.album.title == 'World' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     artist_from_api.assert_called_once_with( | 
					
						
							| 
									
										
										
										
											2018-04-07 09:29:40 +00:00
										 |  |  |         mbid=lt.metadata['artist']['musicbrainz_id']) | 
					
						
							| 
									
										
										
										
											2018-04-16 19:59:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_job_run_triggers_notifies_followers( | 
					
						
							|  |  |  |         factories, mocker, tmpfile): | 
					
						
							|  |  |  |     mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.downloader.download', | 
					
						
							|  |  |  |         return_value={'audio_file_path': tmpfile.name}) | 
					
						
							|  |  |  |     mocked_notify = mocker.patch( | 
					
						
							|  |  |  |         'funkwhale_api.music.tasks.import_batch_notify_followers.delay') | 
					
						
							|  |  |  |     batch = factories['music.ImportBatch']() | 
					
						
							|  |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         finished=True, batch=batch) | 
					
						
							|  |  |  |     track = factories['music.Track'](mbid=job.mbid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     batch.update_status() | 
					
						
							|  |  |  |     batch.refresh_from_db() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert batch.status == 'finished' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocked_notify.assert_called_once_with(import_batch_id=batch.pk) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_batch_notifies_followers_skip_on_disabled_federation( | 
					
						
							| 
									
										
										
										
											2018-04-28 03:55:21 +00:00
										 |  |  |         preferences, factories, mocker): | 
					
						
							| 
									
										
										
										
											2018-04-16 19:59:13 +00:00
										 |  |  |     mocked_deliver = mocker.patch('funkwhale_api.federation.activity.deliver') | 
					
						
							|  |  |  |     batch = factories['music.ImportBatch'](finished=True) | 
					
						
							| 
									
										
										
										
											2018-04-28 03:55:21 +00:00
										 |  |  |     preferences['federation__enabled'] = False | 
					
						
							| 
									
										
										
										
											2018-04-16 19:59:13 +00:00
										 |  |  |     tasks.import_batch_notify_followers(import_batch_id=batch.pk) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocked_deliver.assert_not_called() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_batch_notifies_followers_skip_on_federation_import( | 
					
						
							|  |  |  |         factories, mocker): | 
					
						
							|  |  |  |     mocked_deliver = mocker.patch('funkwhale_api.federation.activity.deliver') | 
					
						
							|  |  |  |     batch = factories['music.ImportBatch'](finished=True, federation=True) | 
					
						
							|  |  |  |     tasks.import_batch_notify_followers(import_batch_id=batch.pk) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocked_deliver.assert_not_called() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_import_batch_notifies_followers( | 
					
						
							|  |  |  |         factories, mocker): | 
					
						
							|  |  |  |     library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     f1 = factories['federation.Follow'](approved=True, target=library_actor) | 
					
						
							|  |  |  |     f2 = factories['federation.Follow'](approved=False, target=library_actor) | 
					
						
							|  |  |  |     f3 = factories['federation.Follow']() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocked_deliver = mocker.patch('funkwhale_api.federation.activity.deliver') | 
					
						
							|  |  |  |     batch = factories['music.ImportBatch']() | 
					
						
							|  |  |  |     job1 = factories['music.ImportJob']( | 
					
						
							|  |  |  |         finished=True, batch=batch) | 
					
						
							|  |  |  |     job2 = factories['music.ImportJob']( | 
					
						
							|  |  |  |         finished=True, federation=True, batch=batch) | 
					
						
							|  |  |  |     job3 = factories['music.ImportJob']( | 
					
						
							|  |  |  |         status='pending', batch=batch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     batch.status = 'finished' | 
					
						
							|  |  |  |     batch.save() | 
					
						
							|  |  |  |     tasks.import_batch_notify_followers(import_batch_id=batch.pk) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # only f1 match the requirements to be notified | 
					
						
							|  |  |  |     # and only job1 is a non federated track with finished import | 
					
						
							|  |  |  |     expected = { | 
					
						
							|  |  |  |         '@context': federation_serializers.AP_CONTEXT, | 
					
						
							|  |  |  |         'actor': library_actor.url, | 
					
						
							|  |  |  |         'type': 'Create', | 
					
						
							|  |  |  |         'id': batch.get_federation_url(), | 
					
						
							|  |  |  |         'to': [f1.actor.url], | 
					
						
							|  |  |  |         'object': federation_serializers.CollectionSerializer( | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 'id': batch.get_federation_url(), | 
					
						
							|  |  |  |                 'items': [job1.track_file], | 
					
						
							|  |  |  |                 'actor': library_actor, | 
					
						
							|  |  |  |                 'item_serializer': federation_serializers.AudioSerializer | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ).data | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mocked_deliver.assert_called_once_with( | 
					
						
							|  |  |  |         expected, | 
					
						
							|  |  |  |         on_behalf_of=library_actor, | 
					
						
							|  |  |  |         to=[f1.actor.url] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-21 16:20:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test__do_import_in_place_mbid(factories, tmpfile): | 
					
						
							|  |  |  |     path = '/test.ogg' | 
					
						
							|  |  |  |     job = factories['music.ImportJob']( | 
					
						
							|  |  |  |         in_place=True, source='file:///test.ogg') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     track = factories['music.Track'](mbid=job.mbid) | 
					
						
							|  |  |  |     tf = tasks._do_import(job, use_acoustid=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert bool(tf.audio_file) is False | 
					
						
							|  |  |  |     assert tf.source == 'file:///test.ogg' | 
					
						
							| 
									
										
										
										
											2018-04-27 19:10:02 +00:00
										 |  |  |     assert tf.mimetype == 'audio/ogg' |