Files
picard/test/test_collection.py
2024-04-22 17:59:57 +02:00

176 lines
6.8 KiB
Python

# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
#
# Copyright (C) 2024 Philipp Wolfer
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from unittest.mock import (
ANY,
MagicMock,
)
from test.picardtestcase import (
PicardTestCase,
load_test_json,
)
import picard.collection
from picard.collection import (
Collection,
add_release_to_user_collections,
get_user_collection,
load_user_collections,
)
from picard.webservice.api_helpers import MBAPIHelper
def fake_request_handler(collection_id, releases, handler):
handler(None, None, None)
def fake_get_collection_list(handler):
document = load_test_json('collection_list.json')
handler(document, None, None)
mb_api = MagicMock(auto_spec=MBAPIHelper)
mb_api.put_to_collection.side_effect = fake_request_handler
mb_api.delete_from_collection.side_effect = fake_request_handler
mb_api.get_collection_list.side_effect = fake_get_collection_list
class CollectionTest(PicardTestCase):
def setUp(self):
super().setUp()
self.tagger.mb_api = mb_api
picard.collection.user_collections = {}
def test_collection_init(self):
collection = Collection('foo', mb_api)
self.assertEqual('foo', collection.id)
self.assertEqual('', collection.name)
self.assertEqual(0, collection.size)
self.assertEqual(set(), collection.pending_releases)
self.assertEqual(set(), collection.releases)
self.assertEqual(mb_api, collection._mb_api)
def test_collection_size(self):
collection = Collection('foo', mb_api)
self.assertEqual(0, collection.size)
collection.size = 2
self.assertEqual(2, collection.size)
collection.size = '10'
self.assertEqual(10, collection.size)
def test_collection_add_releases(self):
releases = {
'963a7d48-5995-4751-aef8-6727cb879b9c',
'54292079-790c-4e99-bf8d-12efa29fa3e9',
}
collection = Collection('foo', mb_api)
callback = MagicMock()
collection.add_releases(releases, callback)
mb_api.put_to_collection.assert_called_once_with(
'foo', list(releases), ANY)
self.assertEqual(2, collection.size)
self.assertEqual(releases, collection.releases)
collection.tagger.window.set_statusbar_message.assert_called_once()
def test_collection_remove_releases(self):
releases = [
'963a7d48-5995-4751-aef8-6727cb879b9c',
'54292079-790c-4e99-bf8d-12efa29fa3e9',
'd0e5212c-d463-4810-ab0b-a33431b38008',
]
releases_to_remove = set(releases[:2])
collection = Collection('foo', mb_api)
collection.releases = set(releases)
collection.size = len(releases)
callback = MagicMock()
collection.remove_releases(releases_to_remove, callback)
mb_api.delete_from_collection.assert_called_once_with(
'foo', list(releases_to_remove), ANY)
self.assertEqual(1, collection.size)
self.assertEqual({releases[2]}, collection.releases)
collection.tagger.window.set_statusbar_message.assert_called_once()
def test_get_user_collection(self):
self.assertEqual({}, picard.collection.user_collections)
collection1 = get_user_collection('foo')
self.assertIsInstance(collection1, Collection)
self.assertEqual('foo', collection1.id)
self.assertEqual(collection1, get_user_collection('foo'))
collection2 = get_user_collection('bar')
self.assertNotEqual(collection1, collection2)
self.assertEqual(
{'foo': collection1, 'bar': collection2},
picard.collection.user_collections,
)
def test_add_release_to_user_collections(self):
self.set_config_values(persist={'oauth_username': 'theuser'})
release_node = {
'id': '54292079-790c-4e99-bf8d-12efa29fa3e9',
'collections': [{
'id': '00000000-0000-0000-0000-000000000001',
'name': 'collection1',
'editor': 'theuser',
'release-count': 42
}, {
'id': '00000000-0000-0000-0000-000000000002',
'name': 'collection2',
'editor': 'otheruser',
'release-count': 12
}, {
'id': '00000000-0000-0000-0000-000000000003',
'name': 'collection3',
'editor': 'theuser',
'release-count': 0
}]
}
add_release_to_user_collections(release_node)
self.assertEqual(2, len(picard.collection.user_collections))
collection1 = picard.collection.user_collections['00000000-0000-0000-0000-000000000001']
collection3 = picard.collection.user_collections['00000000-0000-0000-0000-000000000003']
self.assertEqual('collection1', collection1.name)
self.assertIn(release_node['id'], collection1.releases)
self.assertEqual(42, collection1.size)
self.assertEqual('collection3', collection3.name)
self.assertIn(release_node['id'], collection3.releases)
self.assertEqual(0, collection3.size)
def test_load_user_collections(self):
self.tagger.webservice.oauth_manager.is_authorized.return_value = True
picard.collection.user_collections['old-collection'] = Collection('old-collection', mb_api)
callback = MagicMock()
load_user_collections(callback)
callback.assert_called_once_with()
self.assertEqual(3, len(picard.collection.user_collections))
self.assertNotIn('old-collection', picard.collection.user_collections)
collection1 = picard.collection.user_collections['40734348-a970-491a-a160-722246cfadf4']
self.assertEqual(collection1.name, 'My Collection')
self.assertEqual(collection1.size, 402)
def test_load_user_collections_not_authorized(self):
self.tagger.webservice.oauth_manager.is_authorized.return_value = False
picard.collection.user_collections['old-collection'] = Collection('old-collection', mb_api)
callback = MagicMock()
load_user_collections(callback)
callback.assert_not_called()
self.assertEqual(0, len(picard.collection.user_collections))