Skip to content

Commit 98ca618

Browse files
committed
Fix accidental test deletion
1 parent bb8eca9 commit 98ca618

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

test/progress.ts

+155
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import {Buffer} from 'buffer';
2+
import {promisify} from 'util';
23
import stream from 'stream';
4+
import fs from 'fs';
35
// @ts-expect-error Fails to find slow-stream/index.d.ts
46
import SlowStream from 'slow-stream';
57
import toReadableStream from 'to-readable-stream';
68
import getStream from 'get-stream';
9+
import FormData from 'form-data';
10+
import tempy from 'tempy';
711
import is from '@sindresorhus/is';
812
import test, {ExecutionContext} from 'ava';
913
import {Handler} from 'express';
@@ -41,6 +45,24 @@ const checkEvents = (t: ExecutionContext, events: Progress[], bodySize?: number)
4145

4246
const file = Buffer.alloc(1024 * 1024 * 2);
4347

48+
const downloadEndpoint: Handler = (_request, response) => {
49+
response.setHeader('content-length', file.length);
50+
51+
stream.pipeline(
52+
toReadableStream(file),
53+
new SlowStream({maxWriteInterval: 50}),
54+
response,
55+
() => {
56+
response.end();
57+
},
58+
);
59+
};
60+
61+
const noTotalEndpoint: Handler = (_request, response) => {
62+
response.write('hello');
63+
response.end();
64+
};
65+
4466
const uploadEndpoint: Handler = (request, response) => {
4567
stream.pipeline(
4668
request,
@@ -51,6 +73,118 @@ const uploadEndpoint: Handler = (request, response) => {
5173
);
5274
};
5375

76+
test('download progress', withServer, async (t, server, got) => {
77+
server.get('/', downloadEndpoint);
78+
79+
const events: Progress[] = [];
80+
81+
const {body} = await got({responseType: 'buffer'})
82+
.on('downloadProgress', event => events.push(event));
83+
84+
checkEvents(t, events, body.length);
85+
});
86+
87+
test('download progress - missing total size', withServer, async (t, server, got) => {
88+
server.get('/', noTotalEndpoint);
89+
90+
const events: Progress[] = [];
91+
92+
await got('').on('downloadProgress', (event: Progress) => events.push(event));
93+
94+
t.is(events[0]?.total, undefined);
95+
checkEvents(t, events);
96+
});
97+
98+
test('download progress - stream', withServer, async (t, server, got) => {
99+
server.get('/', downloadEndpoint);
100+
101+
const events: Progress[] = [];
102+
103+
const stream = got.stream({responseType: 'buffer'})
104+
.on('downloadProgress', event => events.push(event));
105+
106+
await getStream(stream);
107+
108+
checkEvents(t, events, file.length);
109+
});
110+
111+
test('upload progress - file', withServer, async (t, server, got) => {
112+
server.post('/', uploadEndpoint);
113+
114+
const events: Progress[] = [];
115+
116+
await got.post({body: file}).on('uploadProgress', (event: Progress) => events.push(event));
117+
118+
checkEvents(t, events, file.length);
119+
});
120+
121+
test('upload progress - file stream', withServer, async (t, server, got) => {
122+
server.post('/', uploadEndpoint);
123+
124+
const path = tempy.file();
125+
fs.writeFileSync(path, file);
126+
127+
const {size} = await promisify(fs.stat)(path);
128+
129+
const events: Progress[] = [];
130+
131+
await got.post({
132+
body: fs.createReadStream(path),
133+
headers: {
134+
'content-length': size.toString(),
135+
},
136+
})
137+
.on('uploadProgress', (event: Progress) => events.push(event));
138+
139+
checkEvents(t, events, file.length);
140+
});
141+
142+
test('upload progress - form data', withServer, async (t, server, got) => {
143+
server.post('/', uploadEndpoint);
144+
145+
const events: Progress[] = [];
146+
147+
const body = new FormData();
148+
body.append('key', 'value');
149+
body.append('file', file);
150+
151+
const size = await promisify(body.getLength.bind(body))();
152+
153+
await got.post({body}).on('uploadProgress', (event: Progress) => events.push(event));
154+
155+
checkEvents(t, events, size);
156+
});
157+
158+
test('upload progress - json', withServer, async (t, server, got) => {
159+
server.post('/', uploadEndpoint);
160+
161+
const body = JSON.stringify({key: 'value'});
162+
const size = Buffer.byteLength(body);
163+
const events: Progress[] = [];
164+
165+
await got.post({body}).on('uploadProgress', (event: Progress) => events.push(event));
166+
167+
checkEvents(t, events, size);
168+
});
169+
170+
test('upload progress - stream with known body size', withServer, async (t, server, got) => {
171+
server.post('/', uploadEndpoint);
172+
173+
const events: Progress[] = [];
174+
const options = {
175+
headers: {'content-length': file.length.toString()},
176+
};
177+
178+
const request = got.stream.post(options)
179+
.on('uploadProgress', event => events.push(event));
180+
181+
await getStream(
182+
stream.pipeline(toReadableStream(file), request, () => {}),
183+
);
184+
185+
checkEvents(t, events, file.length);
186+
});
187+
54188
test('upload progress - stream with unknown body size', withServer, async (t, server, got) => {
55189
server.post('/', uploadEndpoint);
56190

@@ -66,3 +200,24 @@ test('upload progress - stream with unknown body size', withServer, async (t, se
66200
t.is(events[0]?.total, undefined);
67201
checkEvents(t, events);
68202
});
203+
204+
test('upload progress - no body', withServer, async (t, server, got) => {
205+
server.post('/', uploadEndpoint);
206+
207+
const events: Progress[] = [];
208+
209+
await got.post('').on('uploadProgress', (event: Progress) => events.push(event));
210+
211+
t.deepEqual(events, [
212+
{
213+
percent: 0,
214+
transferred: 0,
215+
total: undefined,
216+
},
217+
{
218+
percent: 1,
219+
transferred: 0,
220+
total: 0,
221+
},
222+
]);
223+
});

0 commit comments

Comments
 (0)