forked from zentus/download
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.js
121 lines (103 loc) · 3.89 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const fs = require('node:fs');
const fsPromise = require('node:fs/promises');
const path = require('node:path');
const test = require('ava');
const contentDisposition = require('content-disposition');
const getStream = require('get-stream');
const isZip = require('is-zip');
const nock = require('nock');
const pify = require('pify');
const randomBuffer = require('random-buffer');
const m = require('./');
const pathExists = path => fsPromise.stat(path)
.then(s => Boolean(s))
.catch(e => false)
const fsP = pify(fs);
test.before(() => {
nock('http://foo.bar')
.persist()
.get('/404')
.reply(404)
.get('/foo.zip')
.replyWithFile(200, path.join(__dirname, 'fixture.zip'))
.get('/foo.js')
.replyWithFile(200, __filename)
.get('/querystring.zip').query({param: 'value'})
.replyWithFile(200, path.join(__dirname, 'fixture.zip'))
.get('/dispo')
.replyWithFile(200, path.join(__dirname, 'fixture.zip'), {
'Content-Disposition': contentDisposition('dispo.zip')
})
.get('/foo*bar.zip')
.replyWithFile(200, path.join(__dirname, 'fixture.zip'))
.get('/large.bin')
.reply(200, randomBuffer(7928260))
.get('/redirect.zip')
.reply(302, null, {location: 'http://foo.bar/foo.zip'})
.get('/redirect-https.zip')
.reply(301, null, {location: 'https://foo.bar/foo-https.zip'})
.get('/filetype')
.replyWithFile(200, path.join(__dirname, 'fixture.zip'));
nock('https://foo.bar')
.persist()
.get('/foo-https.zip')
.replyWithFile(200, path.join(__dirname, 'fixture.zip'));
});
test('download as stream', async t => {
t.true(isZip(await getStream.buffer(m('http://foo.bar/foo.zip'))));
});
test('download as promise', async t => {
t.true(isZip(await m('http://foo.bar/foo.zip')));
});
test('download a very large file', async t => {
t.is((await getStream.buffer(m('http://foo.bar/large.bin'))).length, 7928260);
});
test('download and rename file', async t => {
await m('http://foo.bar/foo.zip', __dirname, {filename: 'bar.zip'});
t.true(await pathExists(path.join(__dirname, 'bar.zip')));
await fsP.unlink(path.join(__dirname, 'bar.zip'));
});
test('save file', async t => {
await m('http://foo.bar/foo.zip', __dirname);
t.true(await pathExists(path.join(__dirname, 'foo.zip')));
await fsP.unlink(path.join(__dirname, 'foo.zip'));
});
test('extract file', async t => {
await m('http://foo.bar/foo.zip', __dirname, {extract: true});
t.true(await pathExists(path.join(__dirname, 'file.txt')));
await fsP.unlink(path.join(__dirname, 'file.txt'));
});
test('extract file that is not compressed', async t => {
await m('http://foo.bar/foo.js', __dirname, {extract: true});
t.true(await pathExists(path.join(__dirname, 'foo.js')));
await fsP.unlink(path.join(__dirname, 'foo.js'));
});
test('error on 404', async t => {
await t.throwsAsync(m('http://foo.bar/404'), undefined, 'Response code 404 (Not Found)');
});
test('rename to valid filename', async t => {
await m('http://foo.bar/foo*bar.zip', __dirname);
t.true(await pathExists(path.join(__dirname, 'foo!bar.zip')));
await fsP.unlink(path.join(__dirname, 'foo!bar.zip'));
});
test('follow redirects', async t => {
t.true(isZip(await m('http://foo.bar/redirect.zip')));
});
test('follow redirect to https', async t => {
t.true(isZip(await m('http://foo.bar/redirect-https.zip')));
});
test('handle query string', async t => {
await m('http://foo.bar/querystring.zip?param=value', __dirname);
t.true(await pathExists(path.join(__dirname, 'querystring.zip')));
await fsP.unlink(path.join(__dirname, 'querystring.zip'));
});
test('handle content dispositon', async t => {
await m('http://foo.bar/dispo', __dirname);
t.true(await pathExists(path.join(__dirname, 'dispo.zip')));
await fsP.unlink(path.join(__dirname, 'dispo.zip'));
});
test('handle filename from file type', async t => {
await m('http://foo.bar/filetype', __dirname);
t.true(await pathExists(path.join(__dirname, 'filetype.zip')));
await fsP.unlink(path.join(__dirname, 'filetype.zip'));
});