1 | var extend = require('xtend')
|
2 | var magnet = require('../')
|
3 | var test = require('tape')
|
4 |
|
5 | var leavesOfGrass = 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&dn=Leaves+of+Grass+by+Walt+Whitman.epub&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337'
|
6 |
|
7 | var empty = { announce: [], announceList: [], urlList: [] }
|
8 |
|
9 | test('decode: valid magnet uris', function (t) {
|
10 | var result = magnet(leavesOfGrass)
|
11 | t.equal(result.xt, 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36')
|
12 | t.equal(result.dn, 'Leaves of Grass by Walt Whitman.epub')
|
13 | t.equal(result.infoHash, 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36')
|
14 | var announce = [
|
15 | 'udp://tracker.openbittorrent.com:80',
|
16 | 'udp://tracker.publicbt.com:80',
|
17 | 'udp://tracker.istole.it:6969',
|
18 | 'udp://tracker.ccc.de:80',
|
19 | 'udp://open.demonii.com:1337'
|
20 | ]
|
21 | var announceList = [
|
22 | [ 'udp://tracker.openbittorrent.com:80' ],
|
23 | [ 'udp://tracker.publicbt.com:80' ],
|
24 | [ 'udp://tracker.istole.it:6969' ],
|
25 | [ 'udp://tracker.ccc.de:80' ],
|
26 | [ 'udp://open.demonii.com:1337' ]
|
27 | ]
|
28 | t.deepEqual(result.tr, announce)
|
29 | t.deepEqual(result.announce, announce)
|
30 | t.deepEqual(result.announceList, announceList)
|
31 |
|
32 | t.end()
|
33 | })
|
34 |
|
35 | test('decode: empty magnet URIs return empty object', function (t) {
|
36 | var empty1 = ''
|
37 | var empty2 = 'magnet:'
|
38 | var empty3 = 'magnet:?'
|
39 |
|
40 | t.deepEqual(magnet(empty1), empty)
|
41 | t.deepEqual(magnet(empty2), empty)
|
42 | t.deepEqual(magnet(empty3), empty)
|
43 | t.end()
|
44 | })
|
45 |
|
46 | test('empty string as keys is okay', function (t) {
|
47 | var uri = 'magnet:?a=&b=&c='
|
48 |
|
49 | t.deepEqual(magnet(uri), extend({ a: '', b: '', c: '' }, empty))
|
50 | t.end()
|
51 | })
|
52 |
|
53 | test('decode: invalid magnet URIs return empty object', function (t) {
|
54 | var invalid1 = 'magnet:?xt=urn:btih:==='
|
55 | var invalid2 = 'magnet:?xt'
|
56 | var invalid3 = 'magnet:?xt=?dn='
|
57 |
|
58 | t.deepEqual(magnet(invalid1), empty)
|
59 | t.deepEqual(magnet(invalid2), empty)
|
60 | t.deepEqual(magnet(invalid3), empty)
|
61 | t.end()
|
62 | })
|
63 |
|
64 | test('decode: invalid magnet URIs return only valid keys (ignoring invalid ones)', function (t) {
|
65 | var invalid1 = 'magnet:?a=a&==='
|
66 | var invalid2 = 'magnet:?a==&b=b'
|
67 | var invalid3 = 'magnet:?a=b=&c=c&d==='
|
68 |
|
69 | t.deepEqual(magnet(invalid1), extend({ a: 'a' }, empty))
|
70 | t.deepEqual(magnet(invalid2), extend({ b: 'b' }, empty))
|
71 | t.deepEqual(magnet(invalid3), extend({ c: 'c' }, empty))
|
72 | t.end()
|
73 | })
|
74 |
|
75 | test('decode: extracts 40-char hex BitTorrent info_hash', function (t) {
|
76 | var result = magnet('magnet:?xt=urn:btih:aad050ee1bb22e196939547b134535824dabf0ce')
|
77 | t.equal(result.infoHash, 'aad050ee1bb22e196939547b134535824dabf0ce')
|
78 | t.end()
|
79 | })
|
80 |
|
81 | test('decode: extracts 32-char base32 BitTorrent info_hash', function (t) {
|
82 | var result = magnet('magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6')
|
83 | t.equal(result.infoHash, 'f7079c66cca02ab45934b9868572060010dfc97e')
|
84 | t.end()
|
85 | })
|
86 |
|
87 | test('decode: extracts keywords', function (t) {
|
88 | var result = magnet('magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&kt=joe+blow+mp3')
|
89 | t.deepEqual(result.keywords, ['joe', 'blow', 'mp3'])
|
90 | t.end()
|
91 | })
|
92 |
|
93 | test('decode: complicated magnet uri (multiple xt params, and as, xs)', function (t) {
|
94 | var result = magnet('magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&xt=urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY&xt=urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q&xl=10826029&dn=mediawiki-1.15.1.tar.gz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80%2Fannounce&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&xs=http%3A%2F%2Fcache.example.org%2FXRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5&xs=dchub://example.org')
|
95 | t.equal(result.infoHash, '81e177e2cc00943b29fcfc635457f575237293b0')
|
96 | t.deepEqual(result.xt, [
|
97 | 'urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1',
|
98 | 'urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY',
|
99 | 'urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q'
|
100 | ])
|
101 | t.equal(result.xl, '10826029')
|
102 | t.equal(result.dn, 'mediawiki-1.15.1.tar.gz')
|
103 | var announce = 'udp://tracker.openbittorrent.com:80/announce'
|
104 | var announceList = [
|
105 | [ 'udp://tracker.openbittorrent.com:80/announce' ]
|
106 | ]
|
107 | t.equal(result.tr, announce)
|
108 | t.deepEqual(result.announce, [ announce ])
|
109 | t.deepEqual(result.announceList, announceList)
|
110 | t.equal(result.as, 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz')
|
111 | t.deepEqual(result.urlList, [ 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz' ])
|
112 | t.deepEqual(result.xs, [
|
113 | 'http://cache.example.org/XRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5',
|
114 | 'dchub://example.org'
|
115 | ])
|
116 | t.end()
|
117 | })
|
118 |
|
119 | test('multiple as, ws params', function (t) {
|
120 | var result = magnet('magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz1&ws=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz2&ws=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz3')
|
121 | t.deepEqual(result.urlList, [
|
122 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz',
|
123 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz1',
|
124 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz2',
|
125 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz3'
|
126 | ])
|
127 | t.end()
|
128 | })
|