0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00
verdaccio/packages/plugins/local-storage/tests/local-fs.test.ts
Juan Picado b56d5cec39
chore: refactor pkgs location (#2538)
* chore: relocated mock package

* refactor: relocate local-storage htpasswd to plugins

because they are

* chore: format
2021-10-18 22:18:09 +02:00

307 lines
9.4 KiB
TypeScript

import path from 'path';
import fs from 'fs';
import { dirSync } from 'tmp-promise';
import { ILocalPackageManager, Logger, Package } from '@verdaccio/types';
import LocalDriver, { fileExist, fSError, noSuchFile, resourceNotAvailable } from '../src/local-fs';
import pkg from './__fixtures__/pkg';
let localTempStorage: string;
const pkgFileName = 'package.json';
const logger: Logger = {
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
child: jest.fn(),
warn: jest.fn(),
http: jest.fn(),
trace: jest.fn(),
};
describe('Local FS test', () => {
let tmpFolder;
beforeAll(() => {
tmpFolder = dirSync({ unsafeCleanup: true });
localTempStorage = path.join(tmpFolder.name, './_storage');
});
afterAll(() => {
// tmpFolder.removeCallback();
});
describe('savePackage() group', () => {
test('savePackage()', (done) => {
const data = {};
const localFs = new LocalDriver(path.join(localTempStorage, 'first-package'), logger);
localFs.savePackage('pkg.1.0.0.tar.gz', data as Package, (err) => {
expect(err).toBeNull();
done();
});
});
});
describe('readPackage() group', () => {
test('readPackage() success', (done) => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/readme-test'),
logger
);
localFs.readPackage(pkgFileName, (err) => {
expect(err).toBeNull();
done();
});
});
test('readPackage() fails', (done) => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/readme-testt'),
logger
);
localFs.readPackage(pkgFileName, (err) => {
expect(err).toBeTruthy();
done();
});
});
test('readPackage() fails corrupt', (done) => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/readme-test-corrupt'),
logger
);
localFs.readPackage('corrupt.js', (err) => {
expect(err).toBeTruthy();
done();
});
});
});
describe('createPackage() group', () => {
test('createPackage()', (done) => {
const localFs = new LocalDriver(path.join(localTempStorage, 'createPackage'), logger);
localFs.createPackage(path.join(localTempStorage, 'package5'), pkg, (err) => {
expect(err).toBeNull();
done();
});
});
test('createPackage() fails by fileExist', (done) => {
const localFs = new LocalDriver(path.join(localTempStorage, 'createPackage'), logger);
localFs.createPackage(path.join(localTempStorage, 'package5'), pkg, (err) => {
expect(err).not.toBeNull();
expect(err.code).toBe(fileExist);
done();
});
});
describe('deletePackage() group', () => {
test('deletePackage()', async () => {
const localFs = new LocalDriver(path.join(localTempStorage, 'createPackage'), logger);
// verdaccio removes the package.json instead the package name
await localFs.deletePackage('package.json');
});
});
});
describe('removePackage() group', () => {
beforeEach(() => {
fs.mkdirSync(path.join(localTempStorage, '_toDelete'), { recursive: true });
});
test('should successfully remove the package', async () => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(localTempStorage, '_toDelete'),
logger
);
await expect(localFs.removePackage()).resolves.toBeUndefined();
});
test('removePackage() fails', async () => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(localTempStorage, '_toDelete_fake'),
logger
);
await expect(localFs.removePackage()).rejects.toThrow(/ENOENT/);
});
});
describe('readTarball', () => {
test('should read tarball successfully', (done) => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/readme-test'),
logger
);
const readTarballStream = localFs.readTarball('test-readme-0.0.0.tgz');
readTarballStream.on('error', function (err) {
expect(err).toBeNull();
});
readTarballStream.on('content-length', function (content) {
expect(content).toBe(352);
});
readTarballStream.on('end', function () {
done();
});
readTarballStream.on('data', function (data) {
expect(data).toBeDefined();
});
});
test('readTarball() fails', (done) => {
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/readme-test'),
logger
);
const readTarballStream = localFs.readTarball('file-does-not-exist-0.0.0.tgz');
readTarballStream.on('error', function (err) {
expect(err).toBeTruthy();
done();
});
});
});
describe('updatePackage() group', () => {
const updateHandler = jest.fn((name, cb) => {
cb();
});
const onWrite = jest.fn((name, data, cb) => {
cb();
});
const transform = jest.fn();
beforeEach(() => {
jest.clearAllMocks();
jest.resetModules();
});
test('updatePackage() success', (done) => {
jest.doMock('@verdaccio/file-locking', () => {
return {
readFile: (name, _options, cb): any => cb(null, { name }),
unlockFile: (_something, cb): any => cb(null),
};
});
const LocalDriver = require('../src/local-fs').default;
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/update-package'),
logger
);
localFs.updatePackage('updatePackage', updateHandler, onWrite, transform, () => {
expect(transform).toHaveBeenCalledTimes(1);
expect(updateHandler).toHaveBeenCalledTimes(1);
expect(onWrite).toHaveBeenCalledTimes(1);
done();
});
});
describe('updatePackage() failures handler', () => {
test('updatePackage() whether locking fails', (done) => {
jest.doMock('@verdaccio/file-locking', () => {
return {
readFile: (name, _options, cb): any => cb(Error('whateverError'), { name }),
unlockFile: (_something, cb): any => cb(null),
};
});
require('../src/local-fs').default;
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/update-package'),
logger
);
localFs.updatePackage('updatePackage', updateHandler, onWrite, transform, (err) => {
expect(err).not.toBeNull();
expect(transform).toHaveBeenCalledTimes(0);
expect(updateHandler).toHaveBeenCalledTimes(0);
expect(onWrite).toHaveBeenCalledTimes(0);
done();
});
});
test('updatePackage() unlock a missing package', (done) => {
jest.doMock('@verdaccio/file-locking', () => {
return {
readFile: (name, _options, cb): any => cb(fSError(noSuchFile, 404), { name }),
unlockFile: (_something, cb): any => cb(null),
};
});
const LocalDriver = require('../src/local-fs').default;
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/update-package'),
logger
);
localFs.updatePackage('updatePackage', updateHandler, onWrite, transform, (err) => {
expect(err).not.toBeNull();
expect(transform).toHaveBeenCalledTimes(0);
expect(updateHandler).toHaveBeenCalledTimes(0);
expect(onWrite).toHaveBeenCalledTimes(0);
done();
});
});
test('updatePackage() unlock a resource non available', (done) => {
jest.doMock('@verdaccio/file-locking', () => {
return {
readFile: (name, _options, cb): any => cb(fSError(resourceNotAvailable, 503), { name }),
unlockFile: (_something, cb): any => cb(null),
};
});
const LocalDriver = require('../src/local-fs').default;
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/update-package'),
logger
);
localFs.updatePackage('updatePackage', updateHandler, onWrite, transform, (err) => {
expect(err).not.toBeNull();
expect(transform).toHaveBeenCalledTimes(0);
expect(updateHandler).toHaveBeenCalledTimes(0);
expect(onWrite).toHaveBeenCalledTimes(0);
done();
});
});
test('updatePackage() if updateHandler fails', (done) => {
jest.doMock('@verdaccio/file-locking', () => {
return {
readFile: (name, _options, cb): any => cb(null, { name }),
unlockFile: (_something, cb): any => cb(null),
};
});
const LocalDriver = require('../src/local-fs').default;
const localFs: ILocalPackageManager = new LocalDriver(
path.join(__dirname, '__fixtures__/update-package'),
logger
);
const updateHandler = jest.fn((_name, cb) => {
cb(fSError('something wrong', 500));
});
localFs.updatePackage('updatePackage', updateHandler, onWrite, transform, (err) => {
expect(err).not.toBeNull();
expect(transform).toHaveBeenCalledTimes(0);
expect(updateHandler).toHaveBeenCalledTimes(1);
expect(onWrite).toHaveBeenCalledTimes(0);
done();
});
});
});
});
});