ADD unzip support

This commit is contained in:
RecuencoJones
2020-03-21 11:34:19 +01:00
parent ea4cba1c34
commit 7e5607f443
6 changed files with 86 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ const common = require('../../src/common');
const install = require('../../src/actions/install');
const move = require('../../src/assets/move');
const untar = require('../../src/assets/untar');
const unzip = require('../../src/assets/unzip');
const verifyAndPlaceCallback = require('../../src/assets/binary');
jest.mock('fs');
@@ -12,6 +13,7 @@ jest.mock('request');
jest.mock('../../src/common');
jest.mock('../../src/assets/move');
jest.mock('../../src/assets/untar');
jest.mock('../../src/assets/unzip');
jest.mock('../../src/assets/binary');
describe('install()', () => {
@@ -77,6 +79,17 @@ describe('install()', () => {
expect(untar).toHaveBeenCalled();
});
it('should pick unzip strategy if url ends with .zip', () => {
request.mockReturnValueOnce(requestEvents);
common.parsePackageJson.mockReturnValueOnce({ url: 'http://url.zip' });
install(callback);
requestEvents.emit('response', { statusCode: 200 });
expect(unzip).toHaveBeenCalled();
});
it('should call verifyAndPlaceCallback on success', () => {
request.mockReturnValueOnce(requestEvents);
common.parsePackageJson.mockReturnValueOnce({ url: 'http://url', binName: 'command', binPath: './bin' });

View File

@@ -0,0 +1,50 @@
const { EventEmitter } = require('events');
const unzipper = require('unzipper');
const unzip = require('../../src/assets/unzip');
jest.mock('unzipper', () => ({
Extract: jest.fn()
}));
describe('unzip()', () => {
let unzipEvents, pipe, onSuccess, onError;
beforeEach(() => {
unzipEvents = new EventEmitter();
pipe = jest.fn();
onSuccess = jest.fn();
onError = jest.fn();
pipe.mockReturnValueOnce({ pipe });
unzipper.Extract.mockReturnValueOnce(unzipEvents);
});
it('should download resource and unzip to given binPath', () => {
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
expect(unzipper.Extract).toHaveBeenCalledWith({ path: './bin' });
});
it('should call onSuccess on unzip close', () => {
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
unzipEvents.emit('close');
expect(onSuccess).toHaveBeenCalled();
});
it('should call onError with error on unzip error', () => {
const error = new Error();
unzip({ opts: { binPath: './bin', binName: 'command' }, req: { pipe }, onSuccess, onError });
unzipEvents.emit('error', error);
expect(onError).toHaveBeenCalledWith(error);
});
});

View File

@@ -15,7 +15,8 @@
"dependencies": {
"mkdirp": "^0.5.1",
"request": "^2.81.0",
"tar": "^2.2.2"
"tar": "^2.2.2",
"unzipper": "0.10.10"
},
"repository": {
"type": "git",

View File

@@ -10,6 +10,8 @@ function getStrategy({ url }) {
if (url.endsWith('.tar.gz')) {
return require('../assets/untar');
} else if (url.endsWith('.zip')) {
return require('../assets/unzip');
} else {
return require('../assets/move');
}

View File

@@ -14,9 +14,6 @@ function untar({ opts, req, onSuccess, onError }) {
ungz.on('error', onError);
untar.on('error', onError);
// First we will Un-GZip, then we will untar. So once untar is completed,
// binary is downloaded into `binPath`. Verify the binary and call it good
untar.on('end', onSuccess);
req.pipe(ungz).pipe(untar);

19
src/assets/unzip.js Normal file
View File

@@ -0,0 +1,19 @@
const unzipper = require('unzipper');
/**
* Unzip strategy for resources using `.zip`.
*
* Once unzip is completed, binary is downloaded into `binPath`.
* Verify the binary and call it good.
*/
function unzip({ opts, req, onSuccess, onError }) {
const unzip = unzipper.Extract({ path: opts.binPath });
unzip.on('error', onError);
unzip.on('close', onSuccess);
req.pipe(unzip);
}
module.exports = unzip;