@lxfriday/nodejs-file-downloader
Version:
A file downloader for NodeJs
359 lines (288 loc) • 10.5 kB
JavaScript
const expect = require('expect')
// const request = require('supertest');
const { app, server } = require('./testServer');
// var MockAdapter = require("axios-mock-adapter");
// var mock = new MockAdapter(axios);
const fs = require('fs');
const Path = require('path');
const rimraf = require('rimraf')
const Downloader = require('./Downloader');
const { Readable } = require('stream');
describe('timeout and cancellation tests', () => {
before((done) => {
rimraf.sync("./downloads");
// console.log('done')
// deleteFolderRecursive('./downloads')
done();
})
after((done) => {
if(server){
server.close();
}
done();
})
it('Should get ERR_REQUEST_CANCELLED error after cancellation, while streaming', async function () {
this.timeout(0);
let errorCounter = 0
const downloader = new Downloader({
fileName: 'cancelled.jpg',
maxAttempts: 4,
timeout: 50000,
url: `http://localhost:3002/cancelWhileStream`,
directory: "./downloads",
onResponse() {
// debugger
// downloader.cancel()
setTimeout(() => {
downloader.cancel()
}, 2000)
},
onError() {
errorCounter++
}
})
let error;
try {
// setTimeout(() => {
// downloader.cancel()
// }, 1000)
// debugger
await downloader.download();
// console.log('success')
// debugger
} catch (e) {
error = e
// expect(error.code).toBe('ERR_REQUEST_CANCELLED')
} finally {
// console.log(error)
// debugger
expect(errorCounter).toBe(1)
if (!error || error.code !== 'ERR_REQUEST_CANCELLED') {
throw new Error('Cancellation did not work')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg was not deleted')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg.download was not deleted')
}
}
})
it('Should get ERR_REQUEST_CANCELLED error after cancellation, before stream', async function () {
this.timeout(0)
let errorCounter = 0
const downloader = new Downloader({
fileName: 'cancelled.jpg',
maxAttempts: 4,
timeout: 50000,
url: `http://localhost:3002/cancelBeforeStream`,
directory: "./downloads",
onResponse(r) {
// console.log('response!')
// debugger
// downloader.cancel()
},
onError() {
errorCounter++
}
})
let error;
try {
setTimeout(() => {
downloader.cancel()
}, 2000)
// debugger
await downloader.download();
// console.log('success')
// debugger
} catch (e) {
error = e
// expect(error.code).toBe('ERR_REQUEST_CANCELLED')
} finally {
// console.log(error,errorCounter)
// debugger
expect(errorCounter).toBe(1)
if (!error || error.code !== 'ERR_REQUEST_CANCELLED') {
throw new Error('Cancellation did not work')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg was not deleted')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg.download was not deleted')
}
}
})
it('Should get ERR_REQUEST_CANCELLED error after cancellation, while streaming, with shouldBufferResponse', async function () {
this.timeout(0);
let errorCounter = 0
const downloader = new Downloader({
fileName: 'cancelled.jpg',
maxAttempts: 4,
shouldBufferResponse: true,
url: `http://localhost:3002/cancelWhileStream`,
directory: "./downloads",
onResponse() {
// debugger
// downloader.cancel()
setTimeout(() => {
downloader.cancel()
}, 1000)
},
onError() {
errorCounter++
}
})
let error;
try {
// setTimeout(() => {
// downloader.cancel()
// }, 1000)
// debugger
await downloader.download();
// console.log('success')
// debugger
} catch (e) {
error = e
// expect(error.code).toBe('ERR_REQUEST_CANCELLED')
} finally {
// console.log(error)
// debugger
expect(errorCounter).toBe(1)
if (!error || error.code !== 'ERR_REQUEST_CANCELLED') {
throw new Error('Cancellation did not work')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg was not deleted')
}
if (await doesFileExist('./downloads/cancelled.jpg')) {
throw new Error('cancelled.jpg.download was not deleted')
}
}
})
it('Should timeout during stream, twice', async function () {
let error;
this.timeout(0)
try {
// let counter = 0
var onErrorCount = 0
const downloader = new Downloader({
timeout: 1500,
// debugMode:true,
maxAttempts: 2,
fileName: 'timeout.jpg',
url: `http://localhost:3002/timeoutDuringStream`,
directory: "./downloads",
onError: function (e) {
// debugger;
// console.log('error')
onErrorCount++;
}
})
await downloader.download();
debugger
} catch (e) {
error = e
// debugger;
// console.log('final error',error)
} finally {
// debugger;
expect(error.code).toBe('ERR_REQUEST_TIMEDOUT')
expect(onErrorCount).toBe(2)
// await verifyFile('./downloads/koala.jpg', 29051);
if (await doesFileExist('./downloads/timeout.jpg')) {
throw new Error('timeout.jpg was not deleted')
}
if (await doesFileExist('./downloads/timeout.jpg')) {
throw new Error('timeout.jpg.download was not deleted')
}
}
})
it('Should timeout during stream, twice, with shouldBufferResponse', async function () {
let error;
this.timeout(0)
try {
// let counter = 0
var onErrorCount = 0
const downloader = new Downloader({
timeout: 1500,
// debugMode:true,
shouldBufferResponse: true,
maxAttempts: 2,
fileName: 'timeout.jpg',
url: `http://localhost:3002/timeoutDuringStream`,
directory: "./downloads",
onError: function (e) {
// debugger;
// console.log('error')
onErrorCount++;
}
})
await downloader.download();
debugger
} catch (e) {
error = e
// debugger;
// console.log('final error',error)
} finally {
// debugger;
expect(error.code).toBe('ERR_REQUEST_TIMEDOUT')
expect(onErrorCount).toBe(2)
// await verifyFile('./downloads/koala.jpg', 29051);
if (await doesFileExist('./downloads/timeout.jpg')) {
throw new Error('timeout.jpg was not deleted')
}
if (await doesFileExist('./downloads/timeout.jpg')) {
throw new Error('timeout.jpg.download was not deleted')
}
}
})
it('Should timeout before response', async function () {
let error;
this.timeout(0)
try {
// let counter = 0
var onErrorCount = 0
const downloader = new Downloader({
timeout: 1500,
// debugMode:true,
// maxAttempts: 2,
fileName: 'timeout2.jpg',
url: `http://localhost:3002/timeoutBeforeResponse`,
directory: "./downloads",
onError: function (e) {
// debugger;
// console.log('error')
onErrorCount++;
}
})
await downloader.download();
debugger
} catch (e) {
error = e
// debugger;
// console.log('final error',error)
} finally {
// debugger;
expect(error.code).toBe('ERR_REQUEST_TIMEDOUT')
expect(onErrorCount).toBe(1)
// await verifyFile('./downloads/koala.jpg', 29051);
if (await doesFileExist('./downloads/timeout2.jpg')) {
throw new Error('timeout2.jpg was not deleted')
}
if (await doesFileExist('./downloads/timeout2.jpg')) {
throw new Error('timeout2.jpg.download was not deleted')
}
}
})
})
function doesFileExist(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
// console.log('err', err)
if (err)
return resolve(false)
resolve(true)
});
})
}