mirror of
https://github.com/vikstrous/pirate-get
synced 2025-01-09 09:59:51 +01:00
fix test falldown from new api change
This commit is contained in:
parent
f9f491ea65
commit
7f879cc31f
@ -286,7 +286,7 @@ def search_mirrors(printer, args):
|
||||
# try default or user mirrors
|
||||
for mirror in args.mirror:
|
||||
result = connect_mirror(mirror, printer, args)
|
||||
if result:
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
# download mirror list
|
||||
@ -308,7 +308,7 @@ def search_mirrors(printer, args):
|
||||
if mirror in pirate.data.blacklist:
|
||||
continue
|
||||
result = connect_mirror(mirror, printer, args)
|
||||
if result:
|
||||
if result is not None:
|
||||
return result
|
||||
else:
|
||||
raise IOError('No more available mirrors')
|
||||
|
@ -9,8 +9,8 @@ import pirate.data
|
||||
import pirate.torrent
|
||||
|
||||
import colorama
|
||||
import veryprettytable as pretty
|
||||
|
||||
from veryprettytable import VeryPrettyTable
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
@ -45,14 +45,14 @@ class Printer:
|
||||
even = True
|
||||
|
||||
if local:
|
||||
table = VeryPrettyTable(['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
table = pretty.VeryPrettyTable(['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
|
||||
table.align['SIZE'] = 'r'
|
||||
table.align['NAME'] = 'l'
|
||||
else:
|
||||
table = VeryPrettyTable(['LINK', 'SEED', 'LEECH',
|
||||
'RATIO', 'SIZE',
|
||||
'UPLOAD', 'NAME'])
|
||||
table = pretty.VeryPrettyTable(['LINK', 'SEED', 'LEECH',
|
||||
'RATIO', 'SIZE',
|
||||
'UPLOAD', 'NAME'])
|
||||
table.align['NAME'] = 'l'
|
||||
table.align['SEED'] = 'r'
|
||||
table.align['LEECH'] = 'r'
|
||||
@ -99,7 +99,7 @@ class Printer:
|
||||
for link in chosen_links:
|
||||
result = results[link]
|
||||
req = request.Request(
|
||||
site + '/t.php?id=' + result['id'],
|
||||
site + '/t.php?id=' + str(result['id']),
|
||||
headers=pirate.data.default_headers)
|
||||
req.add_header('Accept-encoding', 'gzip')
|
||||
f = request.urlopen(req, timeout=timeout)
|
||||
@ -128,7 +128,7 @@ class Printer:
|
||||
for link in chosen_links:
|
||||
result = results[link]
|
||||
req = request.Request(
|
||||
site + '/f.php?id=' + result['id'],
|
||||
site + '/f.php?id=' + str(result['id']),
|
||||
headers=pirate.data.default_headers)
|
||||
req.add_header('Accept-encoding', 'gzip')
|
||||
f = request.urlopen(req, timeout=timeout)
|
||||
|
@ -64,9 +64,27 @@ def make_magnet(name, info_hash):
|
||||
info_hash, parse.quote(name, ''))
|
||||
|
||||
|
||||
def remote(printer, category, sort, mode, terms, mirror, timeout):
|
||||
def parse_page(page):
|
||||
results = []
|
||||
try:
|
||||
data = json.load(page)
|
||||
except json.decoder.JSONDecodeError:
|
||||
raise IOError('invalid JSON in API reply: blocked mirror?')
|
||||
|
||||
if len(data) == 1 and 'No results' in data[0]['name']:
|
||||
return results
|
||||
|
||||
for res in data:
|
||||
res['size'] = pretty_size(int(res['size']))
|
||||
res['magnet'] = make_magnet(res['name'], res['info_hash'])
|
||||
res['info_hash'] = int(res['info_hash'], 16)
|
||||
res['uploaded'] = pretty_date(res['added'])
|
||||
results.append(res)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def remote(printer, category, sort, mode, terms, mirror, timeout):
|
||||
# special query when no terms
|
||||
if not terms:
|
||||
if category == 0:
|
||||
@ -87,19 +105,7 @@ def remote(printer, category, sort, mode, terms, mirror, timeout):
|
||||
|
||||
if f.info().get('Content-Encoding') == 'gzip':
|
||||
f = gzip.GzipFile(fileobj=BytesIO(f.read()))
|
||||
data = json.load(f)
|
||||
|
||||
if len(data) == 1 and 'No results' in data[0]['name']:
|
||||
return []
|
||||
|
||||
for res in data:
|
||||
res['size'] = pretty_size(int(res['size']))
|
||||
res['magnet'] = make_magnet(res['name'], res['info_hash'])
|
||||
res['info_hash'] = int(res['info_hash'], 16)
|
||||
res['uploaded'] = pretty_date(res['added'])
|
||||
results.append(res)
|
||||
|
||||
return results
|
||||
return parse_page(f)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
printer.print('\nCancelled.')
|
||||
|
File diff suppressed because one or more lines are too long
1
tests/data/debian_iso.json
Normal file
1
tests/data/debian_iso.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
tests/data/no_hits.json
Normal file
1
tests/data/no_hits.json
Normal file
@ -0,0 +1 @@
|
||||
[{"id":"0","name":"No results returned","info_hash":"0000000000000000000000000000000000000000","leechers":"0","seeders":"0","num_files":"0","size":"0","username":"","added":"0","status":"member","category":"0","imdb":"","total_found":"1"}]
|
1
tests/data/result.json
Normal file
1
tests/data/result.json
Normal file
File diff suppressed because one or more lines are too long
@ -1,7 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
import socket
|
||||
import unittest
|
||||
import subprocess
|
||||
from argparse import Namespace
|
||||
from unittest import mock
|
||||
from unittest.mock import patch, call, MagicMock
|
||||
@ -28,33 +27,40 @@ class TestPirate(unittest.TestCase):
|
||||
@patch('subprocess.call')
|
||||
def test_main(self, mock_call):
|
||||
result = {
|
||||
'magnet': 'dn=derp',
|
||||
'seeds': '1',
|
||||
'name': 'derp',
|
||||
'magnet': 'magnet:?xt=urn:btih:deadbeef&dn=derp',
|
||||
'seeders': '1',
|
||||
'leechers': '1',
|
||||
'size': ('1', 'mb'),
|
||||
'uploaded': '1',
|
||||
}
|
||||
with patch('pirate.torrent.remote', return_value=[result]) as mock_remote:
|
||||
with patch('pirate.torrent.remote', return_value=[result]):
|
||||
config = pirate.pirate.parse_config_file('')
|
||||
args = pirate.pirate.combine_configs(config, pirate.pirate.parse_args(['-0', 'term', '-C', 'blah %s']))
|
||||
args = pirate.pirate.combine_configs(
|
||||
config,
|
||||
pirate.pirate.parse_args(['-0', 'term', '-C', 'blah %s']))
|
||||
pirate.pirate.pirate_main(args)
|
||||
mock_call.assert_called_once_with(['blah', 'dn=derp'])
|
||||
mock_call.assert_called_once_with(
|
||||
['blah', 'magnet:?xt=urn:btih:deadbeef&dn=derp'])
|
||||
|
||||
@patch('pirate.pirate.builtins.input', return_value='0')
|
||||
@patch('subprocess.call')
|
||||
def test_main_choice(self, mock_call, mock_input):
|
||||
result = {
|
||||
'magnet': 'dn=derp',
|
||||
'seeds': '1',
|
||||
'name': 'derp',
|
||||
'magnet': 'magnet:?xt=urn:btih:deadbeef&dn=derp',
|
||||
'seeders': '1',
|
||||
'leechers': '1',
|
||||
'size': ('1', 'mb'),
|
||||
'uploaded': '1',
|
||||
}
|
||||
with patch('pirate.torrent.remote', return_value=[result]) as mock_remote:
|
||||
with patch('pirate.torrent.remote', return_value=[result]):
|
||||
config = pirate.pirate.parse_config_file('')
|
||||
args = pirate.pirate.combine_configs(config, pirate.pirate.parse_args(['term', '-C', 'blah %s']))
|
||||
args = pirate.pirate.combine_configs(
|
||||
config, pirate.pirate.parse_args(['term', '-C', 'blah %s']))
|
||||
pirate.pirate.pirate_main(args)
|
||||
mock_call.assert_called_once_with(['blah', 'dn=derp'])
|
||||
mock_call.assert_called_once_with(
|
||||
['blah', 'magnet:?xt=urn:btih:deadbeef&dn=derp'])
|
||||
|
||||
def test_parse_torrent_command(self):
|
||||
tests = [
|
||||
@ -70,11 +76,13 @@ class TestPirate(unittest.TestCase):
|
||||
[['d 23, 1'], ('d', [23, 1])],
|
||||
[['1d'], ('d', [1])],
|
||||
[['1 ... d'], ('d', [1])],
|
||||
[['1-3 d'], ('d', [1,2,3])],
|
||||
[['1-3'], (None, [1,2,3])],
|
||||
[['1-3 d'], ('d', [1, 2, 3])],
|
||||
[['1-3'], (None, [1, 2, 3])],
|
||||
]
|
||||
for test in tests:
|
||||
self.assertEqual(pirate.pirate.parse_torrent_command(*test[0]), test[1])
|
||||
self.assertEqual(
|
||||
pirate.pirate.parse_torrent_command(*test[0]),
|
||||
test[1])
|
||||
|
||||
def test_parse_config_file(self):
|
||||
types = {
|
||||
@ -128,16 +136,30 @@ class TestPirate(unittest.TestCase):
|
||||
('', ['-l'], {'action': 'list_categories'}),
|
||||
('', ['--list_sorts'], {'action': 'list_sorts'}),
|
||||
('', ['term'], {'action': 'search', 'source': 'tpb'}),
|
||||
('', ['-L', 'filename', 'term'], {'action': 'search', 'source': 'local_tpb', 'database': 'filename'}),
|
||||
('', ['term', '-S', 'dir'], {'action': 'search', 'save_directory': 'dir'}),
|
||||
('', ['-E', 'localhost:1337'], {'transmission_command': ['transmission-remote', 'localhost:1337']}),
|
||||
('',
|
||||
['-L', 'filename', 'term'],
|
||||
{'action': 'search', 'source': 'local_tpb',
|
||||
'database': 'filename'}),
|
||||
('',
|
||||
['term', '-S', 'dir'],
|
||||
{'action': 'search', 'save_directory': 'dir'}),
|
||||
('',
|
||||
['-E', 'localhost:1337'],
|
||||
{'transmission_command':
|
||||
['transmission-remote', 'localhost:1337']}),
|
||||
('', ['term'], {'output': 'browser_open'}),
|
||||
('', ['term', '-t'], {'output': 'transmission'}),
|
||||
('', ['term', '--save-magnets'], {'output': 'save_magnet_files'}),
|
||||
('', ['term', '--save-torrents'], {'output': 'save_torrent_files'}),
|
||||
('', ['term', '-C', 'command'], {'output': 'open_command', 'open_command': 'command'}),
|
||||
('',
|
||||
['term', '-C', 'command'],
|
||||
{'output': 'open_command', 'open_command': 'command'}),
|
||||
('', ['internets'], {'action': 'search', 'search': ['internets']}),
|
||||
('', ['internets lol', 'lel'], {'action': 'search', 'search': ['internets lol', 'lel']}),
|
||||
('',
|
||||
['term', '--save-torrents'],
|
||||
{'output': 'save_torrent_files'}),
|
||||
('',
|
||||
['internets lol', 'lel'],
|
||||
{'action': 'search', 'search': ['internets lol', 'lel']}),
|
||||
]
|
||||
for test in tests:
|
||||
args = pirate.pirate.parse_args(test[1])
|
||||
@ -148,29 +170,36 @@ class TestPirate(unittest.TestCase):
|
||||
self.assertEqual(test[2][option], value)
|
||||
|
||||
def test_search_mirrors(self):
|
||||
args = Namespace(pages=1, category=100, sort=10,
|
||||
action='browse', search=[],
|
||||
mirror=[pirate.data.default_mirror])
|
||||
args = Namespace(
|
||||
category=100, sort=10,
|
||||
action='browse', search=[],
|
||||
mirror=[pirate.data.default_mirror],
|
||||
timeout=pirate.data.default_timeout)
|
||||
|
||||
class MockResponse():
|
||||
readlines = mock.MagicMock(return_value=[x.encode('utf-8') for x in ['', '', '', 'https://example.com']])
|
||||
readlines = mock.MagicMock(
|
||||
return_value=[
|
||||
x.encode('utf-8') for x in
|
||||
['', '', '', 'https://example.com']])
|
||||
info = mock.MagicMock()
|
||||
getcode = mock.MagicMock(return_value=200)
|
||||
response_obj = MockResponse()
|
||||
|
||||
returns = [None, ([], 'https://example.com')]
|
||||
|
||||
printer = MagicMock(Printer)
|
||||
with patch('urllib.request.urlopen', return_value=response_obj) as urlopen:
|
||||
with patch('pirate.torrent.remote', return_value=[]) as remote:
|
||||
with patch('pirate.pirate.connect_mirror',
|
||||
side_effect=returns) as connect:
|
||||
with patch('urllib.request.urlopen', return_value=response_obj):
|
||||
results, mirror = pirate.pirate.search_mirrors(printer, args)
|
||||
self.assertEqual(results, [])
|
||||
self.assertEqual(mirror, pirate.data.default_mirror)
|
||||
remote.assert_called_once_with(printer=printer, pages=1, category=100, sort=10, mode='browse', terms=[], mirror=pirate.data.default_mirror)
|
||||
with patch('pirate.torrent.remote', side_effect=[socket.timeout, []]) as remote:
|
||||
results, mirror = pirate.pirate.search_mirrors(printer, args)
|
||||
self.assertEqual(results, [])
|
||||
self.assertEqual(mirror, 'https://example.com')
|
||||
remote.assert_has_calls([
|
||||
call(printer=printer, pages=1, category=100, sort=10, mode='browse', terms=[], mirror=pirate.data.default_mirror),
|
||||
call(printer=printer, pages=1, category=100, sort=10, mode='browse', terms=[], mirror='https://example.com')
|
||||
])
|
||||
|
||||
connect.assert_has_calls([
|
||||
call(pirate.data.default_mirror, printer, args),
|
||||
call('https://example.com', printer, args)])
|
||||
|
||||
self.assertEqual(results, [])
|
||||
self.assertEqual(mirror, 'https://example.com')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -1,8 +1,9 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import unittest
|
||||
from unittest.mock import patch, call, MagicMock
|
||||
import json
|
||||
|
||||
from unittest.mock import patch, call, MagicMock
|
||||
from pirate.print import Printer
|
||||
|
||||
|
||||
@ -19,17 +20,21 @@ class TestPrint(unittest.TestCase):
|
||||
mock = MockTable()
|
||||
printer = Printer(False)
|
||||
printer.print = MagicMock()
|
||||
with patch('veryprettytable.VeryPrettyTable', return_value=mock) as prettytable:
|
||||
with patch('veryprettytable.VeryPrettyTable',
|
||||
return_value=mock) as prettytable:
|
||||
results = [{
|
||||
'magnet': 'dn=name',
|
||||
'seeds': 1,
|
||||
'name': 'name',
|
||||
'seeders': 1,
|
||||
'leechers': 2,
|
||||
'size': ['3','MiB'],
|
||||
'size': '3.0 MiB',
|
||||
'uploaded': 'never'
|
||||
}]
|
||||
printer.search_results(results)
|
||||
prettytable.assert_called_once_with(['LINK', 'SEED', 'LEECH', 'RATIO', 'SIZE', 'UPLOAD', 'NAME'])
|
||||
mock.add_row.assert_has_calls([call([0, 1, 2, '0.5', '3.0 MiB', 'never', 'name'])])
|
||||
prettytable.assert_called_once_with([
|
||||
'LINK', 'SEED', 'LEECH', 'RATIO',
|
||||
'SIZE', 'UPLOAD', 'NAME'])
|
||||
mock.add_row.assert_has_calls([
|
||||
call([0, 1, 2, '0.5', '3.0 MiB', 'never', 'name'])])
|
||||
|
||||
def test_print_results_local(self):
|
||||
class MockTable:
|
||||
@ -38,19 +43,22 @@ class TestPrint(unittest.TestCase):
|
||||
mock = MockTable()
|
||||
printer = Printer(False)
|
||||
printer.print = MagicMock()
|
||||
with patch('veryprettytable.VeryPrettyTable', return_value=mock) as prettytable:
|
||||
with patch('veryprettytable.VeryPrettyTable',
|
||||
return_value=mock) as prettytable:
|
||||
results = [{
|
||||
'magnet': 'dn=name',
|
||||
'name': 'name1',
|
||||
'date': '1',
|
||||
'size': '1',
|
||||
},{
|
||||
'magnet': 'dn=name2',
|
||||
}, {
|
||||
'name': 'name2',
|
||||
'date': '2',
|
||||
'size': '2',
|
||||
}]
|
||||
printer.search_results(results, local=True)
|
||||
prettytable.assert_called_once_with(['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
mock.add_row.assert_has_calls([call([0, '1', '1', 'name']), call([1, '2', '2', 'name2'])])
|
||||
prettytable.assert_called_once_with(
|
||||
['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
mock.add_row.assert_has_calls(
|
||||
[call([0, '1', '1', 'name1']), call([1, '2', '2', 'name2'])])
|
||||
|
||||
def test_print_color(self):
|
||||
printer = Printer(False)
|
||||
@ -69,57 +77,77 @@ class TestPrint(unittest.TestCase):
|
||||
mock = MockTable()
|
||||
printer = Printer(True)
|
||||
printer.print = MagicMock()
|
||||
with patch('veryprettytable.VeryPrettyTable', return_value=mock) as prettytable:
|
||||
with patch('veryprettytable.VeryPrettyTable',
|
||||
return_value=mock) as prettytable:
|
||||
results = [{
|
||||
'magnet': 'dn=name',
|
||||
'name': 'name1',
|
||||
'date': '1',
|
||||
'size': '1',
|
||||
},{
|
||||
'magnet': 'dn=name2',
|
||||
}, {
|
||||
'name': 'name2',
|
||||
'date': '2',
|
||||
'size': '2',
|
||||
}]
|
||||
printer.search_results(results, local=True)
|
||||
prettytable.assert_called_once_with(['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
mock.add_row.assert_has_calls([call([0, '1', '1', 'name']), call([1, '2', '2', 'name2'], fore_color='blue')])
|
||||
prettytable.assert_called_once_with(
|
||||
['LINK', 'DATE', 'SIZE', 'NAME'])
|
||||
mock.add_row.assert_has_calls([
|
||||
call([0, '1', '1', 'name1']),
|
||||
call([1, '2', '2', 'name2'], fore_color='blue')])
|
||||
|
||||
def test_print_descriptions(self):
|
||||
printer = Printer(False)
|
||||
printer.print = MagicMock()
|
||||
|
||||
class MockRequest():
|
||||
add_header = MagicMock()
|
||||
request_obj = MockRequest()
|
||||
|
||||
class MockResponse():
|
||||
read = MagicMock(return_value='<html><div class="nfo"><pre>stuff <a href="href">link</a></pre></div></html>'.encode('utf8'))
|
||||
read = MagicMock(return_value=json.dumps(
|
||||
{'name': 'cool torrent',
|
||||
'descr': 'A fake torrent.\n'}))
|
||||
info = MagicMock()
|
||||
response_obj = MockResponse()
|
||||
class MockOpener():
|
||||
open = MagicMock(return_value=response_obj)
|
||||
add_handler = MagicMock()
|
||||
opener_obj = MockOpener()
|
||||
with patch('urllib.request.Request', return_value=request_obj) as request:
|
||||
with patch('urllib.request.OpenerDirector', return_value=opener_obj) as opener:
|
||||
printer.descriptions([0], [{'id': '1', 'magnet': 'dn=name'}], 'example.com')
|
||||
printer.print.assert_has_calls([call('Description for "name":', color='zebra_1'),call('stuff [link](href)', color='zebra_0')])
|
||||
|
||||
with patch('urllib.request.Request', return_value=request_obj):
|
||||
with patch('urllib.request.urlopen',
|
||||
return_value=response_obj):
|
||||
printer.descriptions([0], [{'id': '1', 'name': 'name'}],
|
||||
'example.com', 9)
|
||||
printer.print.assert_has_calls([
|
||||
call('Description for "name":', color='zebra_1'),
|
||||
call('A fake torrent.\n', color='zebra_0')])
|
||||
|
||||
def test_print_file_lists(self):
|
||||
printer = Printer(False)
|
||||
printer.print = MagicMock()
|
||||
|
||||
class MockRequest():
|
||||
add_header = MagicMock()
|
||||
info = MagicMock()
|
||||
request_obj = MockRequest()
|
||||
|
||||
class MockResponse():
|
||||
read = MagicMock(return_value='<html><tr><td align="left">1.</td><td align="right">filename</tr></html>'.encode('utf8'))
|
||||
read = MagicMock(return_value=json.dumps(
|
||||
[{'name': ['readme.txt'], 'size': [16]},
|
||||
{'name': ['a.mkv'], 'size': [677739464]},
|
||||
{'name': ['b.nfo'], 'size': [61]}]))
|
||||
info = MagicMock()
|
||||
response_obj = MockResponse()
|
||||
class MockOpener():
|
||||
open = MagicMock(return_value=response_obj)
|
||||
add_handler = MagicMock()
|
||||
opener_obj = MockOpener()
|
||||
with patch('urllib.request.Request', return_value=request_obj) as request:
|
||||
with patch('urllib.request.OpenerDirector', return_value=opener_obj) as opener:
|
||||
printer.file_lists([0], [{'id': '1', 'magnet': 'dn=name'}], 'example.com')
|
||||
printer.print.assert_has_calls([call('Files in "name":', color='zebra_1'),call(' 1. filename', color='zebra_0')])
|
||||
|
||||
with patch('urllib.request.Request',
|
||||
return_value=request_obj):
|
||||
with patch('urllib.request.urlopen',
|
||||
return_value=response_obj):
|
||||
printer.file_lists([0], [{'id': '1', 'name': 'name'}],
|
||||
'example.com', 9)
|
||||
printer.print.assert_has_calls([
|
||||
call('Files in name:', color='zebra_1'),
|
||||
call(' 16 B readme.txt', color='zebra_0'),
|
||||
call(' 646.3 MiB a.mkv', color='zebra_1'),
|
||||
call(' 61 B b.nfo', color='zebra_0')])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -2,48 +2,34 @@
|
||||
import unittest
|
||||
from unittest import mock
|
||||
from unittest.mock import patch, MagicMock
|
||||
import os
|
||||
import io
|
||||
import urllib
|
||||
import json
|
||||
|
||||
import pirate.torrent
|
||||
import pirate.data
|
||||
from pirate.print import Printer
|
||||
from tests import util
|
||||
|
||||
|
||||
class TestTorrent(unittest.TestCase):
|
||||
|
||||
def test_no_hits(self):
|
||||
res = util.read_data('no_hits.html')
|
||||
actual = pirate.torrent.parse_page(res)
|
||||
expected = []
|
||||
with util.open_data('no_hits.json') as res:
|
||||
actual = pirate.torrent.parse_page(res)
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_blocked_mirror(self):
|
||||
res = util.read_data('blocked.html')
|
||||
with self.assertRaises(IOError):
|
||||
pirate.torrent.parse_page(res)
|
||||
with util.open_data('blocked.html') as res:
|
||||
with self.assertRaises(IOError):
|
||||
pirate.torrent.parse_page(res)
|
||||
|
||||
def test_search_results(self):
|
||||
res = util.read_data('dan_bull_search.html')
|
||||
actual = pirate.torrent.parse_page(res)
|
||||
expected = [
|
||||
{'uploaded': '04-04\xa02014', 'seeds': '16', 'leechers': '1', 'id': '9890864', 'magnet': 'magnet:?xt=urn:btih:30df4f8b42b8fd77f5e5aa34abbffe97f5e81fbf&dn=Dan+Croll+%26bull%3B+Sweet+Disarray+%5B2014%5D+320&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['89.33', 'MiB']},
|
||||
{'uploaded': '03-02\xa02014', 'seeds': '4', 'leechers': '0', 'id': '9684858', 'magnet': 'magnet:?xt=urn:btih:7abd3eda600996b8e6fc9a61b83288e0c6ac0d83&dn=Dan+Bull+-+Massive+Collection&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['294', 'MiB']},
|
||||
{'uploaded': '01-19\xa02013', 'seeds': '2', 'leechers': '0', 'id': '8037968', 'magnet': 'magnet:?xt=urn:btih:8f8d68fd0a51237c89692c428ed8a8f64a969c70&dn=Dan+Bull+-+Generation+Gaming+-+2013&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['54.86', 'MiB']},
|
||||
{'uploaded': '01-21\xa02010', 'seeds': '1', 'leechers': '0', 'id': '5295449', 'magnet': 'magnet:?xt=urn:btih:3da6a0fdc1d67a768cb32597e926abdf3e1a2fdd&dn=Dan+Bull+Collection&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['236.78', 'MiB']},
|
||||
{'uploaded': '09-02\xa02014', 'seeds': '1', 'leechers': '0', 'id': '10954408', 'magnet': 'magnet:?xt=urn:btih:5cd371a235317319db7da52c64422f9c2ac75d77&dn=Dan+Bull+-+The+Garden+%7B2014-Album%7D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['36.27', 'MiB']},
|
||||
{'uploaded': '09-27\xa02009', 'seeds': '0', 'leechers': '1', 'id': '5101630', 'magnet': 'magnet:?xt=urn:btih:4e14dbd077c920875be4c15971b23b609ad6716a&dn=Dan+Bull+-+Dear+Lily+%5Ban+open+letter+to+Lily+Allen%5D+-+2009%5BMP3+%40&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['5.51', 'MiB']},
|
||||
{'uploaded': '11-29\xa02009', 'seeds': '0', 'leechers': '0', 'id': '5185893', 'magnet': 'magnet:?xt=urn:btih:5d9319cf852f7462422cb1bffc37b65174645047&dn=Dan+Bull+-+Dear+Mandy+%5Ban+open+letter+to+Lord+Mandelson%5D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['5.07', 'MiB']},
|
||||
{'uploaded': '11-10\xa02011', 'seeds': '0', 'leechers': '0', 'id': '6806996', 'magnet': 'magnet:?xt=urn:btih:1c54af57426f53fdef4bbf1a9dbddf32f7b4988a&dn=Dan+Bull+-+Dear+Lily+%28Lily+Allen%29+%28Song+about+filesharing%29&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['5.34', 'MiB']},
|
||||
{'uploaded': '12-20\xa02011', 'seeds': '0', 'leechers': '0', 'id': '6901871', 'magnet': 'magnet:?xt=urn:btih:942c5bf3e1e9bc263939e13cea6ad7bd5f62aa36&dn=Dan+Bull+-+SOPA+Cabana.mp3&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['4.8', 'MiB']},
|
||||
{'uploaded': '12-21\xa02011', 'seeds': '0', 'leechers': '1', 'id': '6902247', 'magnet': 'magnet:?xt=urn:btih:d376f68a31b0db652234e790ed7256ac5e32db57&dn=Dan+Bull+-+SOPA+Cabana&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['3.4', 'MiB']},
|
||||
{'uploaded': '12-21\xa02011', 'seeds': '0', 'leechers': '1', 'id': '6903548', 'magnet': 'magnet:?xt=urn:btih:28163770a532eb24b9e0865878288a9bbdb7a5e6&dn=Dan+Bull+-+SOPA+Cabana+%5BWORKING%5D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['4.8', 'MiB']},
|
||||
{'uploaded': '03-09\xa02012', 'seeds': '0', 'leechers': '1', 'id': '7088979', 'magnet': 'magnet:?xt=urn:btih:779ab0f13a3fbb12ba68b27721491e4d143f26eb&dn=Dan+Bull+-+Bye+Bye+BPI+2012++%5BMP3%40192%5D%28oan%29&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['60.72', 'MiB']},
|
||||
{'uploaded': '10-24\xa02012', 'seeds': '0', 'leechers': '0', 'id': '7756344', 'magnet': 'magnet:?xt=urn:btih:2667e4795bd5c868dedcabcb52943f4bb7212bab&dn=Dan+Bull+-+Dishonored+%5BExplicit+ver.%5D+%28Single+2012%29&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['6.29', 'MiB']},
|
||||
{'uploaded': '11-10\xa02012', 'seeds': '0', 'leechers': '0', 'id': '7812951', 'magnet': 'magnet:?xt=urn:btih:16364f83c556ad0fd3bb57a4a7c890e7e8087414&dn=Halo+4+EPIC+Rap+By+Dan+Bull&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['6.41', 'MiB']},
|
||||
{'uploaded': '01-19\xa02013', 'seeds': '0', 'leechers': '1', 'id': '8037899', 'magnet': 'magnet:?xt=urn:btih:843b466d9fd1f0bee3a476573b272dc2d6d0ebae&dn=Dan+Bull+-+Generation+Gaming+-+2013&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'size': ['54.87', 'MiB']}
|
||||
]
|
||||
with util.open_data('result.json') as file:
|
||||
expected = json.load(file)
|
||||
with util.open_data('debian_iso.json') as res:
|
||||
actual = pirate.torrent.parse_page(res)
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_parse_category(self):
|
||||
@ -92,51 +78,74 @@ class TestTorrent(unittest.TestCase):
|
||||
|
||||
@patch('pirate.torrent.get_torrent')
|
||||
def test_save_torrents(self, get_torrent):
|
||||
with patch('pirate.torrent.open', mock.mock_open(), create=True) as open_:
|
||||
magnet = 'magnet:?xt=urn:btih:335fcd3cfbecc85554616d73de888033c6c16d37&dn=Test+Drive+Unl\im/ited+%5BPC+Version%5D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969'
|
||||
pirate.torrent.save_torrents(MagicMock(Printer), [0], [{'magnet':magnet}], 'path')
|
||||
get_torrent.assert_called_once_with(293294978876299923284263767676068334936407502135)
|
||||
open_.assert_called_once_with('path/Test Drive Unl_im_ited [PC Version].torrent', 'wb')
|
||||
with patch('pirate.torrent.open',
|
||||
mock.mock_open(), create=True) as open_:
|
||||
pirate.torrent.save_torrents(
|
||||
MagicMock(Printer), [0],
|
||||
[{'name': 'cool torrent',
|
||||
'info_hash': 3735928559,
|
||||
'magnet': 'magnet:?xt=urn:btih:deadbeef'}], 'path', 9)
|
||||
get_torrent.assert_called_once_with(3735928559, 9)
|
||||
open_.assert_called_once_with('path/cool torrent.torrent', 'wb')
|
||||
|
||||
@patch('pirate.torrent.get_torrent', side_effect=urllib.error.HTTPError('', '', '', '', io.StringIO()))
|
||||
@patch('pirate.torrent.get_torrent',
|
||||
side_effect=urllib.error.HTTPError('', '', '', '', io.StringIO()))
|
||||
def test_save_torrents_fail(self, get_torrent):
|
||||
magnet = 'magnet:?xt=urn:btih:335fcd3cfbecc85554616d73de888033c6c16d37&dn=Test+Drive+Unlimited+%5BPC+Version%5D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969'
|
||||
pirate.torrent.save_torrents(MagicMock(Printer), [0], [{'magnet':magnet}], 'path')
|
||||
pirate.torrent.save_torrents(
|
||||
MagicMock(Printer), [0],
|
||||
[{'name': 'cool torrent',
|
||||
'info_hash': 3735928559,
|
||||
'magnet': 'magnet:?xt=urn:btih:deadbeef'}], 'path', 9)
|
||||
|
||||
def test_save_magnets(self):
|
||||
with patch('pirate.torrent.open', mock.mock_open(), create=True) as open_:
|
||||
magnet = 'magnet:?xt=urn:btih:335fcd3cfbecc85554616d73de888033c6c16d37&dn=Test+Drive+Unl\im/ited+%5BPC+Version%5D&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969'
|
||||
pirate.torrent.save_magnets(MagicMock(Printer), [0], [{'magnet':magnet}], 'path')
|
||||
open_.assert_called_once_with('path/Test Drive Unl_im_ited [PC Version].magnet', 'w')
|
||||
with patch('pirate.torrent.open',
|
||||
mock.mock_open(), create=True) as open_:
|
||||
pirate.torrent.save_magnets(
|
||||
MagicMock(Printer), [0],
|
||||
[{'name': 'cool torrent',
|
||||
'info_hash': 3735928559,
|
||||
'magnet': 'magnet:?xt=urn:btih:deadbeef'}], 'path')
|
||||
open_.assert_called_once_with('path/cool torrent.magnet', 'w')
|
||||
|
||||
@patch('urllib.request.urlopen')
|
||||
def test_get_torrent(self, urlopen):
|
||||
class MockRequest():
|
||||
add_header = mock.MagicMock()
|
||||
request_obj = MockRequest()
|
||||
with patch('urllib.request.Request', return_value=request_obj) as request:
|
||||
pirate.torrent.get_torrent(100000000000000)
|
||||
request.assert_called_once_with('http://itorrents.org/torrent/5AF3107A4000.torrent', headers=pirate.data.default_headers)
|
||||
urlopen.assert_called_once_with(request_obj, timeout=pirate.data.default_timeout)
|
||||
with patch('urllib.request.Request', return_value=request_obj) as req:
|
||||
pirate.torrent.get_torrent(100000000000000, 9)
|
||||
req.assert_called_once_with(
|
||||
'http://itorrents.org/torrent/5AF3107A4000.torrent',
|
||||
headers=pirate.data.default_headers)
|
||||
urlopen.assert_called_once_with(
|
||||
request_obj,
|
||||
timeout=9)
|
||||
|
||||
def test_remote(self):
|
||||
class MockRequest():
|
||||
add_header = mock.MagicMock()
|
||||
request_obj = MockRequest()
|
||||
req_obj = MockRequest()
|
||||
|
||||
class MockInfo():
|
||||
get_content_type = mock.MagicMock(return_value='application/json')
|
||||
get = mock.MagicMock()
|
||||
|
||||
class MockResponse():
|
||||
read = mock.MagicMock(return_value=b'<html>No hits. Try adding an asterisk in you search phrase.</html>')
|
||||
info = mock.MagicMock()
|
||||
response_obj = MockResponse()
|
||||
class MockOpener():
|
||||
open = mock.MagicMock(return_value=response_obj)
|
||||
add_handler = mock.MagicMock()
|
||||
opener_obj = MockOpener()
|
||||
with patch('urllib.request.Request', return_value=request_obj) as request:
|
||||
with patch('urllib.request.OpenerDirector', return_value=opener_obj) as opener:
|
||||
res = pirate.torrent.remote(MagicMock(Printer), 1, 100, 10, 'browse', [], 'http://example.com')
|
||||
request.assert_called_once_with('http://example.com/browse/100/0/10', headers=pirate.data.default_headers)
|
||||
opener_obj.open.assert_called_once_with(request_obj, timeout=pirate.data.default_timeout)
|
||||
self.assertEqual(res, [])
|
||||
read = mock.MagicMock(return_value=b'[]')
|
||||
info = mock.MagicMock(return_value=MockInfo())
|
||||
res_obj = MockResponse()
|
||||
|
||||
with patch('urllib.request.Request', return_value=req_obj) as req:
|
||||
with patch('urllib.request.urlopen', return_value=res_obj) as res:
|
||||
results = pirate.torrent.remote(
|
||||
MagicMock(Printer), 100, 10, 'browse',
|
||||
[], 'http://example.com', 9)
|
||||
req.assert_called_once_with(
|
||||
'http://example.com/precompiled/data_top100_100.json',
|
||||
headers=pirate.data.default_headers)
|
||||
res.assert_called_once_with(req_obj, timeout=9)
|
||||
self.assertEqual(results, [])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -3,6 +3,5 @@ import os
|
||||
def data_path(name):
|
||||
return os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', name)
|
||||
|
||||
def read_data(name):
|
||||
with open(data_path(name)) as f:
|
||||
return f.read()
|
||||
def open_data(name):
|
||||
return open(data_path(name))
|
||||
|
Loading…
Reference in New Issue
Block a user