async def test_enable_rate_limit(self): self.daemon.response = rsrc.response_torrents( { 'id': 1, 'name': 'Foo', 'uploadLimit': 100, 'uploadLimited': False }, { 'id': 2, 'name': 'Bar', 'uploadLimit': 200, 'uploadLimited': False }, ) response = await self.api.set_limit_rate_up(TorrentFilter('id=1|id=2'), True) self.assert_request({ 'method': 'torrent-set', 'arguments': { 'ids': [1, 2], 'uploadLimited': True } }) self.assertEqual(response.success, True)
async def test_subtract_from_current_limit_when_enabled(self): self.daemon.response = rsrc.response_torrents( { 'id': 1, 'name': 'Foo', 'uploadLimit': 100, 'uploadLimited': True }, { 'id': 2, 'name': 'Bar', 'uploadLimit': 200, 'uploadLimited': True }, ) await self.api.adjust_limit_rate_up(TorrentFilter('id=1|id=2'), -50e3) self.assert_request({ 'method': 'torrent-set', 'arguments': { 'ids': [1], 'uploadLimited': True, 'uploadLimit': 50 } }) self.assert_request({ 'method': 'torrent-set', 'arguments': { 'ids': [2], 'uploadLimited': True, 'uploadLimit': 150 } })
def __init__(self, tfilter, *keys): self.keys = keys if isinstance(tfilter, str): self.tfilter = TorrentFilter(tfilter) self.keys_needed = tuple(set(self.keys + self.tfilter.needed_keys)) else: self.tfilter = tfilter self.keys_needed = self.keys self.callback = FakeCallback()
async def test_no_torrents_found(self): response = await self.api._torrent_action( torrents=TorrentFilter('id=4'), method=self.mock_method, ) self.assertEqual(self.mock_method_args, None) self.assertEqual(self.mock_method_kwargs, None) self.assertEqual(response.success, False) self.assertEqual(response.torrents, ()) self.assertEqual(response.msgs, ()) self.assertEqual(response.errors, ('No matching torrents: id=4', ))
async def test_get_torrents_by_filter(self): self.daemon.response = rsrc.response_torrents( { 'id': 1, 'name': 'Foo' }, { 'id': 2, 'name': 'Bar' }, { 'id': 3, 'name': 'Boo' }, ) response = await self.api.torrents(torrents=TorrentFilter('name=Foo')) self.assertEqual(response.success, True) self.assertEqual(response.torrents, (Torrent({ 'id': 1, 'name': 'Foo' }), )) self.assertEqual(response.msgs, ('Found 1 =Foo torrent', )) self.assertEqual(response.errors, ()) response = await self.api.torrents(torrents=TorrentFilter('name~oo')) self.assertEqual(response.success, True) self.assertEqual(response.torrents, (Torrent({ 'id': 1, 'name': 'Foo' }), Torrent({ 'id': 3, 'name': 'Boo' }))) self.assertEqual(response.msgs, ('Found 2 ~oo torrents', )) self.assertEqual(response.errors, ()) response = await self.api.torrents(torrents=TorrentFilter('name=Nope')) self.assertEqual(response.success, False) self.assertEqual(response.torrents, ()) self.assertEqual(response.msgs, ()) self.assertEqual(response.errors, ('No matching torrents: =Nope', ))
async def test_combining_requests(self): await self.rp.start() self.assertEqual(self.rp.running, True) await self.advance(0) self.assert_api_request(calls=0) # No requests registered yet foo = Subscriber('name~foo', 'name', 'rate-down') self.rp.register('foo', foo.callback, keys=foo.keys, tfilter=foo.tfilter) await self.advance(self.rp.interval) self.assert_api_request(calls=1, tfilter=foo.tfilter, keys=foo.keys_needed) bar = Subscriber('name~bar', 'name', 'rate-up') self.rp.register('bar', bar.callback, keys=bar.keys, tfilter=bar.tfilter) await self.advance(self.rp.interval) self.assert_api_request(calls=2, tfilter=(foo + bar).tfilter, keys=(foo + bar).keys_needed) baz = Subscriber('private', 'id', 'size-total') self.rp.register('baz', baz.callback, keys=baz.keys, tfilter=baz.tfilter) await self.advance(self.rp.interval) self.assert_api_request(calls=3, tfilter=(foo + bar + baz).tfilter, keys=(foo + bar + baz).keys_needed) # no filter for f in (None, TorrentFilter('all')): thelot = Subscriber(f, 'name', 'rate-up') self.rp.register('all', thelot.callback, keys=thelot.keys, tfilter=thelot.tfilter) await self.advance(self.rp.interval) self.assert_api_request(tfilter=None, keys=(foo + bar + baz + thelot).keys_needed) self.rp.remove('all') await self.advance(self.rp.interval) self.assert_api_request(tfilter=(foo + bar + baz).tfilter, keys=(foo + bar + baz).keys_needed) await self.rp.stop()
async def test_rpc_method_without_kwargs(self): response = await self.api._torrent_action( torrents=TorrentFilter('id=4|id=3'), method=self.mock_method, ) self.assertEqual(self.mock_method_args, (3, )) self.assertEqual(self.mock_method_kwargs, {}) self.assertEqual(response.success, True) self.assertEqual(response.torrents, (Torrent({ 'id': 3, 'name': 'Boo' }), )) self.assertEqual(response.msgs, ('Found 1 id=4|id=3 torrent', )) self.assertEqual(response.errors, ())
async def test_subtract_from_current_limit_when_disabled(self): self.daemon.response = rsrc.response_torrents( { 'id': 1, 'name': 'Foo', 'uploadLimit': 100, 'uploadLimited': False }, { 'id': 2, 'name': 'Bar', 'uploadLimit': 200, 'uploadLimited': False }, ) await self.api.adjust_limit_rate_up(TorrentFilter('id=1|id=2'), -50e3) self.daemon.requests == () # Assert no requests were sent
async def test_rpc_method_with_kwargs(self): response = await self.api._torrent_action( torrents=TorrentFilter('name~B'), method=self.mock_method, method_args={'foo': 'bar'}, ) self.assertEqual(self.mock_method_args, (2, 3)) self.assertEqual(self.mock_method_kwargs, {'foo': 'bar'}) self.assertEqual(response.success, True) self.assertEqual(response.torrents, ( Torrent({ 'id': 2, 'name': 'Bar' }), Torrent({ 'id': 3, 'name': 'Boo' }), )) self.assertEqual(response.msgs, ('Found 2 ~B torrents', )) self.assertEqual(response.errors, ())
async def test_set_absolute_rate_limit(self): self.daemon.response = rsrc.response_torrents( { 'id': 1, 'name': 'Foo', 'uploadLimit': 100, 'uploadLimited': False }, { 'id': 2, 'name': 'Bar', 'uploadLimit': 200, 'uploadLimited': True }, ) await self.api.set_limit_rate_up(TorrentFilter('id=1|id=2'), 1e6) self.assert_request({ 'method': 'torrent-set', 'arguments': { 'ids': [1, 2], 'uploadLimited': True, 'uploadLimit': 1000 } })