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
Example #2
0
    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=", "d.custom1="],)
        )
Example #3
0
    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'},
                ]
            )
        )
Example #4
0
    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
Example #5
0
    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_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='],
        ))
Example #7
0
    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'
            },
        ]))
Example #8
0
    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
Example #9
0
    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='
        ], ))
Example #10
0
    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,))
Example #11
0
    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, ))
Example #12
0
    def test_delete(self, mocked_proxy):
        mocked_proxy = mocked_proxy()
        mocked_proxy.d.erase.return_value = 0

        client = RTorrent("http://localhost/RPC2")
        resp = client.delete(torrent_info_hash)

        assert resp == 0
        assert mocked_proxy.d.erase.called_with((torrent_info_hash,))
Example #13
0
    def test_stop(self, mocked_proxy):
        mocked_proxy = mocked_proxy()
        mocked_proxy.d.close.return_value = 0
        mocked_proxy.d.stop.return_value = 0

        client = RTorrent("http://localhost/RPC2")
        resp = client.stop(torrent_info_hash)

        assert resp == 0
        assert mocked_proxy.d.stop.called_with((torrent_info_hash,))
        assert mocked_proxy.d.close.called_with((torrent_info_hash,))
Example #14
0
    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")]
        )
Example #15
0
    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
Example #16
0
    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'),
        ])
Example #17
0
    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'),
        ])
Example #18
0
    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
Example #19
0
    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'}
        ]))
Example #20
0
    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"},
                ]
            )
        )
Example #21
0
    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'},
        ]))