class MBAPITest(unittest.TestCase): def setUp(self): self.config = {'server_host': "mb.org", "server_port": 443} config.setting = self.config.copy() self.ws = MagicMock(auto_spec=WebService) self.api = MBAPIHelper(self.ws) def _test_ws_function_args(self, ws_function): self.assertGreater(ws_function.call_count, 0) self.assertEqual(ws_function.call_args[0][0], self.config['server_host']) self.assertEqual(ws_function.call_args[0][1], self.config['server_port']) self.assertIn("/ws/2/", ws_function.call_args[0][2]) def assertInPath(self, ws_function, path): self.assertIn(path, ws_function.call_args[0][2]) def assertNotInPath(self, ws_function, path): self.assertNotIn(path, ws_function.call_args[0][2]) def assertInQuery(self, ws_function, argname, value=None): query_args = ws_function.call_args[1]['queryargs'] self.assertIn(argname, query_args) self.assertEqual(value, query_args[argname]) def _test_inc_args(self, ws_function, arg_list): self.assertInQuery(self.ws.get, 'inc', "+".join(arg_list)) def test_get_release(self): inc_args_list = ['test'] self.api.get_release_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/release/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_track(self): inc_args_list = ['test'] self.api.get_track_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/recording/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection(self): inc_args_list = ["releases", "artist-credits", "media"] self.api.get_collection("1", None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertInPath(self.ws.get, "1/releases") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection_list(self): self.api.get_collection_list(None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertNotInPath(self.ws.get, "releases") def test_put_collection(self): self.api.put_to_collection("1", ["1", "2", "3"], None) self._test_ws_function_args(self.ws.put) self.assertInPath(self.ws.put, "collection/1/releases/1;2;3") def test_delete_collection(self): self.api.delete_from_collection("1", ["1", "2", "3", "4"] * 200, None) collection_string = ";".join(["1", "2", "3", "4"] * 100) self._test_ws_function_args(self.ws.delete) self.assertInPath(self.ws.delete, "collection/1/releases/" + collection_string) self.assertNotInPath(self.ws.delete, collection_string + ";" + collection_string) self.assertEqual(self.ws.delete.call_count, 2)
class MBAPITest(PicardTestCase): def setUp(self): self.config = {'server_host': "mb.org", "server_port": 443} config.setting = self.config.copy() self.ws = MagicMock(auto_spec=WebService) self.api = MBAPIHelper(self.ws) def _test_ws_function_args(self, ws_function): self.assertGreater(ws_function.call_count, 0) self.assertEqual(ws_function.call_args[0][0], self.config['server_host']) self.assertEqual(ws_function.call_args[0][1], self.config['server_port']) self.assertIn("/ws/2/", ws_function.call_args[0][2]) def assertInPath(self, ws_function, path): self.assertIn(path, ws_function.call_args[0][2]) def assertNotInPath(self, ws_function, path): self.assertNotIn(path, ws_function.call_args[0][2]) def assertInQuery(self, ws_function, argname, value=None): query_args = ws_function.call_args[1]['queryargs'] self.assertIn(argname, query_args) self.assertEqual(value, query_args[argname]) def _test_inc_args(self, ws_function, arg_list): self.assertInQuery(self.ws.get, 'inc', "+".join(arg_list)) def test_get_release(self): inc_args_list = ['test'] self.api.get_release_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/release/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_track(self): inc_args_list = ['test'] self.api.get_track_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/recording/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection(self): inc_args_list = ["releases", "artist-credits", "media"] self.api.get_collection("1", None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertInPath(self.ws.get, "1/releases") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection_list(self): self.api.get_collection_list(None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertNotInPath(self.ws.get, "releases") def test_put_collection(self): self.api.put_to_collection("1", ["1", "2", "3"], None) self._test_ws_function_args(self.ws.put) self.assertInPath(self.ws.put, "collection/1/releases/1;2;3") def test_delete_collection(self): self.api.delete_from_collection("1", ["1", "2", "3", "4"] * 200, None) collection_string = ";".join(["1", "2", "3", "4"] * 100) self._test_ws_function_args(self.ws.delete) self.assertInPath(self.ws.delete, "collection/1/releases/" + collection_string) self.assertNotInPath(self.ws.delete, collection_string + ";" + collection_string) self.assertEqual(self.ws.delete.call_count, 2)
class MBAPITest(PicardTestCase): def setUp(self): super().setUp() self.config = {'server_host': "mb.org", "server_port": 443} self.set_config_values(self.config) self.ws = MagicMock(auto_spec=WebService) self.api = MBAPIHelper(self.ws) def _test_ws_function_args(self, ws_function): self.assertGreater(ws_function.call_count, 0) self.assertEqual(ws_function.call_args[0][0], self.config['server_host']) self.assertEqual(ws_function.call_args[0][1], self.config['server_port']) self.assertIn("/ws/2/", ws_function.call_args[0][2]) def assertInPath(self, ws_function, path): self.assertIn(path, ws_function.call_args[0][2]) def assertNotInPath(self, ws_function, path): self.assertNotIn(path, ws_function.call_args[0][2]) def assertInQuery(self, ws_function, argname, value=None): query_args = ws_function.call_args[1]['queryargs'] self.assertIn(argname, query_args) self.assertEqual(value, query_args[argname]) def _test_inc_args(self, ws_function, arg_list): self.assertInQuery(self.ws.get, 'inc', "+".join(arg_list)) def test_get_release(self): inc_args_list = ['test'] self.api.get_release_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/release/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_track(self): inc_args_list = ['test'] self.api.get_track_by_id("1", None, inc=inc_args_list) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "/recording/1") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection(self): inc_args_list = ["releases", "artist-credits", "media"] self.api.get_collection("1", None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertInPath(self.ws.get, "1/releases") self._test_inc_args(self.ws.get, inc_args_list) def test_get_collection_list(self): self.api.get_collection_list(None) self._test_ws_function_args(self.ws.get) self.assertInPath(self.ws.get, "collection") self.assertNotInPath(self.ws.get, "releases") def test_put_collection(self): self.api.put_to_collection("1", ["1", "2", "3"], None) self._test_ws_function_args(self.ws.put) self.assertInPath(self.ws.put, "collection/1/releases/1;2;3") def test_delete_collection(self): self.api.delete_from_collection("1", ["1", "2", "3", "4"] * 200, None) collection_string = ";".join(["1", "2", "3", "4"] * 100) self._test_ws_function_args(self.ws.delete) self.assertInPath(self.ws.delete, "collection/1/releases/" + collection_string) self.assertNotInPath(self.ws.delete, collection_string + ";" + collection_string) self.assertEqual(self.ws.delete.call_count, 2) def test_xml_ratings_empty(self): ratings = dict() xmldata = self.api._xml_ratings(ratings) self.assertEqual( xmldata, '<?xml version="1.0" encoding="UTF-8"?>' '<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">' '<recording-list></recording-list>' '</metadata>') def test_xml_ratings_one(self): ratings = {("recording", 'a'): 1} xmldata = self.api._xml_ratings(ratings) self.assertEqual( xmldata, '<?xml version="1.0" encoding="UTF-8"?>' '<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">' '<recording-list>' '<recording id="a"><user-rating>20</user-rating></recording>' '</recording-list>' '</metadata>') def test_xml_ratings_multiple(self): ratings = { ("recording", 'a'): 1, ("recording", 'b'): 2, ("nonrecording", 'c'): 3, } xmldata = self.api._xml_ratings(ratings) self.assertEqual( xmldata, '<?xml version="1.0" encoding="UTF-8"?>' '<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">' '<recording-list>' '<recording id="a"><user-rating>20</user-rating></recording>' '<recording id="b"><user-rating>40</user-rating></recording>' '</recording-list>' '</metadata>') def test_xml_ratings_encode(self): ratings = {("recording", '<a&"\'>'): 0} xmldata = self.api._xml_ratings(ratings) self.assertEqual( xmldata, '<?xml version="1.0" encoding="UTF-8"?>' '<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">' '<recording-list>' '<recording id="<a&"\'>"><user-rating>0</user-rating></recording>' '</recording-list>' '</metadata>') def test_xml_ratings_raises_value_error(self): ratings = {("recording", 'a'): 'foo'} self.assertRaises(ValueError, self.api._xml_ratings, ratings) def test_collection_request(self): releases = tuple("r" + str(i) for i in range(13)) generator = self.api._collection_request("test", releases, batchsize=5) batch = next(generator) self.assertEqual(batch, ('collection', 'test', 'releases', 'r0;r1;r2;r3;r4')) batch = next(generator) self.assertEqual(batch, ('collection', 'test', 'releases', 'r5;r6;r7;r8;r9')) batch = next(generator) self.assertEqual(batch, ('collection', 'test', 'releases', 'r10;r11;r12')) with self.assertRaises(StopIteration): next(generator)