X-Git-Url: http://git.kaliko.me/?p=python-musicpd.git;a=blobdiff_plain;f=test.py;h=2c5094d9106296911223a1d3220c4213380d0f25;hp=ecf62ffb6c70e70fc28abc8f668644c00003aa3a;hb=e616985e3da118a4e2b14afe331446633e7e2254;hpb=a3420f074de70e8cd6f3050e3351fa9b43db0102 diff --git a/test.py b/test.py index ecf62ff..2c5094d 100755 --- a/test.py +++ b/test.py @@ -10,21 +10,13 @@ Test suite highly borrowed^Wsteal from python-mpd2 [0] project. import itertools import os -import sys import types import unittest +import unittest.mock as mock import warnings import musicpd -try: - import unittest.mock as mock -except ImportError: - try: - import mock - except ImportError: - print("Please install mock from PyPI to run tests!") - sys.exit(1) # show deprecation warnings warnings.simplefilter('default') @@ -61,6 +53,12 @@ class testEnvVar(unittest.TestCase): self.assertEqual(client.pwd, 'pa55w04d') self.assertEqual(client.host, 'example.org') + # Test host alone + os.environ['MPD_HOST'] = 'example.org' + client = musicpd.MPDClient() + self.assertFalse(client.pwd) + self.assertEqual(client.host, 'example.org') + # Test password extraction (no host) os.environ['MPD_HOST'] = 'pa55w04d@' with mock.patch('os.path.exists', return_value=False): @@ -117,7 +115,7 @@ class testEnvVar(unittest.TestCase): client = musicpd.MPDClient() self.assertEqual(client.mpd_timeout, musicpd.CONNECTION_TIMEOUT, - 'Garbage\'s not silently ignore to use default value') + 'Garbage is silently ignore to use default value') os.environ['MPD_TIMEOUT'] = '42' client = musicpd.MPDClient() self.assertEqual(client.mpd_timeout, 42) @@ -126,7 +124,7 @@ class testEnvVar(unittest.TestCase): class TestMPDClient(unittest.TestCase): longMessage = True - # last sync: musicpd 0.4.2 unreleased / Mon Nov 17 21:45:22 CET 2014 + # last sync: musicpd 0.6.0 unreleased / Fri Feb 19 15:34:53 CET 2021 commands = { # Status Commands 'clearerror': 'nothing', @@ -143,6 +141,7 @@ class TestMPDClient(unittest.TestCase): 'random': 'nothing', 'repeat': 'nothing', 'setvol': 'nothing', + 'getvol': 'object', 'single': 'nothing', 'replay_gain_mode': 'nothing', 'replay_gain_status': 'item', @@ -157,7 +156,7 @@ class TestMPDClient(unittest.TestCase): 'seekid': 'nothing', 'seekcur': 'nothing', 'stop': 'nothing', - # Playlist Commands + # Queue Commands 'add': 'nothing', 'addid': 'item', 'clear': 'nothing', @@ -193,19 +192,23 @@ class TestMPDClient(unittest.TestCase): 'rm': 'nothing', 'save': 'nothing', # Database Commands + 'albumart': 'composite', 'count': 'object', + 'getfingerprint': 'object', 'find': 'songs', 'findadd': 'nothing', 'list': 'list', 'listall': 'database', 'listallinfo': 'database', + 'listfiles': 'database', 'lsinfo': 'database', + 'readcomments': 'object', + 'readpicture': 'composite', 'search': 'songs', 'searchadd': 'nothing', 'searchaddpl': 'nothing', 'update': 'item', 'rescan': 'item', - 'readcomments': 'object', # Mounts and neighbors 'mount': 'nothing', 'unmount': 'nothing', @@ -222,20 +225,28 @@ class TestMPDClient(unittest.TestCase): 'kill': None, 'password': 'nothing', 'ping': 'nothing', + 'binarylimit': 'nothing', + 'tagtypes': 'list', + 'tagtypes disable': 'nothing', + 'tagtypes enable': 'nothing', + 'tagtypes clear': 'nothing', + 'tagtypes all': 'nothing', # Partition Commands 'partition': 'nothing', 'listpartitions': 'list', 'newpartition': 'nothing', + 'delpartition': 'nothing', + 'moveoutput': 'nothing', # Audio Output Commands 'disableoutput': 'nothing', 'enableoutput': 'nothing', 'toggleoutput': 'nothing', 'outputs': 'outputs', + 'outputset': 'nothing', # Reflection Commands 'config': 'object', 'commands': 'list', 'notcommands': 'list', - 'tagtypes': 'list', 'urlhandlers': 'list', 'decoders': 'plugins', # Client to Client @@ -332,6 +343,16 @@ class TestMPDClient(unittest.TestCase): self.assertMPDReceived('stats\n') self.assertIsInstance(stats, dict) + output = ['outputid: 0\n', + 'outputname: default detected output\n', + 'plugin: sndio\n', + 'outputenabled: 1\n'] + self.MPDWillReturn(*output, 'OK\n') + outputs = self.client.outputs() + self.assertMPDReceived('outputs\n') + self.assertIsInstance(outputs, list) + self.assertEqual([{'outputid': '0', 'outputname': 'default detected output', 'plugin': 'sndio', 'outputenabled': '1'}], outputs) + def test_fetch_songs(self): self.MPDWillReturn('file: my-song.ogg\n', 'Pos: 0\n', 'Id: 66\n', 'OK\n') playlist = self.client.playlistinfo() @@ -397,8 +418,6 @@ class TestMPDClient(unittest.TestCase): self.assertRaises(musicpd.CommandError, self.client.noidle) def test_client_to_client(self): - # client to client is at this time in beta! - self.MPDWillReturn('OK\n') self.assertIsNone(self.client.subscribe("monty")) self.assertMPDReceived('subscribe "monty"\n') @@ -503,6 +522,77 @@ class TestMPDClient(unittest.TestCase): res = self.client.albumart('muse/Raised Fist/2002-Dedication/', 0) self.assertEqual(res.get('data'), data) + def test_reading_binary(self): + # readpicture when there are no picture returns empty object + self.MPDWillReturnBinary([b'OK\n']) + res = self.client.readpicture('muse/Raised Fist/2002-Dedication/', 0) + self.assertEqual(res, {}) + + def test_command_list(self): + self.MPDWillReturn('updating_db: 42\n', + f'{musicpd.NEXT}\n', + 'repeat: 0\n', + 'random: 0\n', + f'{musicpd.NEXT}\n', + f'{musicpd.NEXT}\n', + 'OK\n') + self.client.command_list_ok_begin() + self.client.update() + self.client.status() + self.client.repeat(1) + self.client.command_list_end() + self.assertMPDReceived('command_list_end\n') + + def test_two_word_commands(self): + self.MPDWillReturn('OK\n') + self.client.tagtypes_clear() + self.assertMPDReceived('tagtypes clear\n') + self.MPDWillReturn('OK\n') + with self.assertRaises(AttributeError): + self.client.foo_bar() + +class testConnection(unittest.TestCase): + + def test_exposing_fileno(self): + with mock.patch('musicpd.socket') as socket_mock: + sock = mock.MagicMock(name='socket') + socket_mock.socket.return_value = sock + cli = musicpd.MPDClient() + cli.connect() + cli.fileno() + cli._sock.fileno.assert_called_with() + + def test_connect_abstract(self): + os.environ['MPD_HOST'] = '@abstract' + with mock.patch('musicpd.socket') as socket_mock: + sock = mock.MagicMock(name='socket') + socket_mock.socket.return_value = sock + cli = musicpd.MPDClient() + cli.connect() + sock.connect.assert_called_with('\0abstract') + + def test_connect_unix(self): + os.environ['MPD_HOST'] = '/run/mpd/socket' + with mock.patch('musicpd.socket') as socket_mock: + sock = mock.MagicMock(name='socket') + socket_mock.socket.return_value = sock + cli = musicpd.MPDClient() + cli.connect() + sock.connect.assert_called_with('/run/mpd/socket') + + +class testException(unittest.TestCase): + + def test_CommandError_on_newline(self): + os.environ['MPD_HOST'] = '/run/mpd/socket' + with mock.patch('musicpd.socket') as socket_mock: + sock = mock.MagicMock(name='socket') + socket_mock.socket.return_value = sock + cli = musicpd.MPDClient() + cli.connect() + with self.assertRaises(musicpd.CommandError): + cli.find('(album == "foo\nbar")') + if __name__ == '__main__': unittest.main()