def test_update(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.system.multicall.return_value = [[0]] client = RTorrent('http://localhost/RPC2') update_fields = { 'custom1': 'test_custom1', 'directory_base': '/data/downloads', 'priority': 3, } resp = client.update(torrent_info_hash, fields=update_fields) assert resp == 0 assert mocked_proxy.system.multicall.called_with(([ { 'params': (torrent_info_hash, '/data/downloads'), 'methodName': 'd.directory_base', }, { 'params': (torrent_info_hash, 'test_custom1'), 'methodName': 'd.custom1' }, { 'params': (torrent_info_hash, '/data/downloads'), 'methodName': 'd.custom1' }, ]))
def test_torrents(self, mocked_proxy): mocked_proxy = mocked_proxy() hash1 = '09977FE761AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' hash2 = '09977FE761BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' mocked_proxy.d.multicall.return_value = ( ['/data/downloads', 'private.torrent', hash1, 'test_custom1'], ['/data/downloads', 'private.torrent', hash2, 'test_custom2'], ) client = RTorrent('http://localhost/RPC2') torrents = client.torrents( fields=['custom1']) # Required fields should be added assert isinstance(torrents, list) for torrent in torrents: assert torrent.get('base_path') == '/data/downloads' assert torrent.get('name') == 'private.torrent' if torrent.get('hash') == hash1: assert torrent.get('custom1') == 'test_custom1' elif torrent.get('hash') == hash2: assert torrent.get('custom1') == 'test_custom2' else: assert False, 'Invalid hash returned' assert mocked_proxy.system.multicall.called_with(([ 'main', 'd.directory_base=', 'd.name=', 'd.hash=', u'd.custom1=' ], ))
def test_load(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.execute.throw.return_value = 0 mocked_proxy.load.raw_start.return_value = 0 client = RTorrent('http://localhost/RPC2') resp = client.load( torrent_raw, fields={'priority': 3, 'directory': '/data/downloads', 'custom1': 'testing'}, start=True, mkdir=True, ) assert resp == 0 # Ensure mkdir was called mocked_proxy.execute.throw.assert_called_with('', 'mkdir', '-p', '/data/downloads') # Ensure load was called assert mocked_proxy.load.raw_start.called match_binary = Matcher(compare_binary, xmlrpc_client.Binary(torrent_raw)) called_args = mocked_proxy.load.raw_start.call_args_list[0][0] assert len(called_args) == 5 assert '' == called_args[0] assert match_binary in called_args fields = [p for p in called_args[2:]] assert len(fields) == 3 assert 'd.directory.set=\\/data\\/downloads' in fields assert 'd.custom1.set=testing' in fields assert 'd.priority.set=3' in fields
def test_version(self, mocked_proxy): mocked_client = mocked_proxy() mocked_client.system.client_version.return_value = '0.9.4' client = RTorrent('http://localhost/RPC2') assert client.version == [0, 9, 4] assert mocked_client.system.client_version.called
def test_torrent(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.system.multicall.return_value = [ ['/data/downloads'], ['private.torrent'], [torrent_info_hash], ['test_custom1'], [123456], ] client = RTorrent('http://localhost/RPC2') torrent = client.torrent( torrent_info_hash, fields=['custom1', 'down_rate'] ) # Required fields should be added assert isinstance(torrent, dict) assert torrent.get('base_path') == '/data/downloads' assert torrent.get('hash') == torrent_info_hash assert torrent.get('custom1') == 'test_custom1' assert torrent.get('name') == 'private.torrent' assert torrent.get('down_rate') == 123456 assert mocked_proxy.system.multicall.called_with( ( [ {'params': (torrent_info_hash,), 'methodName': 'd.base_path'}, {'params': (torrent_info_hash,), 'methodName': 'd.name'}, {'params': (torrent_info_hash,), 'methodName': 'd.hash'}, {'params': (torrent_info_hash,), 'methodName': 'd.custom1'}, {'params': (torrent_info_hash,), 'methodName': 'd.down.rate'}, ] ) )
def test_start(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.d.start.return_value = 0 client = RTorrent('http://localhost/RPC2') resp = client.start(torrent_info_hash) assert resp == 0 assert mocked_proxy.d.start.called_with((torrent_info_hash, ))
def test_move(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.system.multicall.return_value = [ ['private.torrent'], [torrent_info_hash], ['/data/downloads'], ] mocked_proxy.move.return_value = 0 mocked_proxy.d.directory.set.return_value = 0 mocked_proxy.execute.throw.return_value = 0 client = RTorrent('http://localhost/RPC2') client.move(torrent_info_hash, '/new/folder') mocked_proxy.execute.throw.assert_has_calls([ mock.call('', 'mkdir', '-p', '/new/folder'), mock.call('', 'mv', '-u', '/data/downloads', '/new/folder'), ])
def test_load(self, mocked_proxy): mocked_proxy = mocked_proxy() mocked_proxy.execute.throw.return_value = 0 mocked_proxy.load.raw_start.return_value = 0 client = RTorrent('http://localhost/RPC2') resp = client.load( torrent_raw, fields={ 'priority': 3, 'directory': '/data/downloads', 'custom1': 'testing' }, start=True, mkdir=True, ) assert resp == 0 # Ensure mkdir was called mocked_proxy.execute.throw.assert_called_with('', 'mkdir', '-p', '/data/downloads') # Ensure load was called assert mocked_proxy.load.raw_start.called match_binary = Matcher(compare_binary, xmlrpc_client.Binary(torrent_raw)) called_args = mocked_proxy.load.raw_start.call_args_list[0][0] assert len(called_args) == 5 assert '' == called_args[0] assert match_binary in called_args fields = [p for p in called_args[2:]] assert len(fields) == 3 # TODO: check the note in clients/rtorrent.py about this escaping. # The client should be fixed to work consistenly on all python versions # Calling re.escape here is a workaround so test works on python 3.7 and older versions assert ('d.directory.set=' + re.escape('/data/downloads')) in fields assert 'd.custom1.set=testing' in fields assert 'd.priority.set=3' in fields