0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-17 23:45:29 -05:00

test(storage): add checks for addVersion

This commit is contained in:
Juan Picado @jotadeveloper 2018-07-29 13:57:32 +02:00
parent 25c62f09ea
commit b65b79bc09
No known key found for this signature in database
GPG key ID: 18AC54485952D158
7 changed files with 120 additions and 86 deletions

View file

@ -93,10 +93,10 @@ export function hasProxyTo(pkg: string, upLink: string, packages: PackageList):
return false;
}
export function getMatchedPackagesSpec(pkg: string, packages: PackageList): MatchedPackage {
export function getMatchedPackagesSpec(pkgName: string, packages: PackageList): MatchedPackage {
for (let i in packages) {
// $FlowFixMe
if (minimatch.makeRe(i).exec(pkg)) {
if (minimatch.makeRe(i).exec(pkgName)) {
return packages[i];
}
}

View file

@ -95,8 +95,8 @@ class Config implements AppConfig {
/**
* Check for package spec
*/
getMatchedPackagesSpec(pkg: string): MatchedPackage {
return getMatchedPackagesSpec(pkg, this.packages);
getMatchedPackagesSpec(pkgName: string): MatchedPackage {
return getMatchedPackagesSpec(pkgName, this.packages);
}
/**

View file

@ -601,11 +601,11 @@ class LocalStorage implements IStorage {
/**
* Retrieve a wrapper that provide access to the package location.
* @param {Object} packageInfo package name.
* @param {Object} pkgName package name.
* @return {Object}
*/
_getLocalStorage(packageInfo: string): IPackageStorage {
return this.localData.getPackageStorage(packageInfo);
_getLocalStorage(pkgName: string): IPackageStorage {
return this.localData.getPackageStorage(pkgName);
}
/**
@ -667,21 +667,21 @@ class LocalStorage implements IStorage {
/**
* Retrieve either a previous created local package or a boilerplate.
* @param {*} name
* @param {*} pkgName
* @param {*} callback
* @return {Function}
*/
_readCreatePackage(name: string, callback: Callback) {
const storage: any = this._getLocalStorage(name);
_readCreatePackage(pkgName: string, callback: Callback) {
const storage: any = this._getLocalStorage(pkgName);
if (_.isNil(storage)) {
return this._createNewPackage(name, callback);
return this._createNewPackage(pkgName, callback);
}
storage.readPackage(name, (err, data) => {
storage.readPackage(pkgName, (err, data) => {
// TODO: race condition
if (_.isNil(err) === false) {
if (err.code === noSuchFile) {
data = generatePackageTemplate(name);
data = generatePackageTemplate(pkgName);
} else {
return callback(this._internalError(err, pkgFileName, 'error reading'));
}

View file

@ -2,7 +2,10 @@
import type { Version } from "@verdaccio/types";
export function generateNewVersion(pkgName: string, version: string): Version {
export function generateNewVersion(
pkgName: string,
version: string,
shashum: string = '238e7641e59508dc9c20eb4ad37a8aa57ab777b4'): Version {
// $FlowFixMe
return {
"name": pkgName,
@ -23,8 +26,8 @@ export function generateNewVersion(pkgName: string, version: string): Version {
},
"dist": {
"integrity": "sha512-zVEqt1JUCOPsash9q4wMkJEDPD+QCx95TRhQII+JnoS31uBUKoZxhzvvUJCcLVy2CQG4QdwXARU7dYWPnrwhGg==",
"shasum": "b7088c30970489637f8b4e6795e8cf2b699d7569",
"tarball": `http:\/\/localhost:4873\/${pkgName}\/-\/npm_test-${version}.tgz`
"shasum": shashum,
"tarball": `http:\/\/localhost:4873\/${pkgName}\/-\/${pkgName}-${version}.tgz`
}
}
}

View file

@ -16,6 +16,8 @@ const readMetadata = (fileName: string = 'metadata') => readFile(`../../unit/par
import type {Config} from '@verdaccio/types';
import type {IStorage} from '../../../types/index';
import {API_ERROR, HTTP_STATUS} from '../../../src/lib/constants';
import {DIST_TAGS} from '../../../src/lib/utils';
setup([]);
@ -32,6 +34,24 @@ describe('LocalStorage', () => {
});
});
};
const addTarballToStore = (pkgName: string, tarballName) => {
return new Promise((resolve, reject) => {
const tarballData = JSON.parse(readMetadata('addTarball'));
const stream = storage.addTarball(pkgName, tarballName);
stream.on('error', function(err) {
expect(err).toBeNull();
reject();
});
stream.on('success', function() {
resolve();
});
stream.end(new Buffer(tarballData.data, 'base64'));
stream.done();
});
};
const addPackageToStore = (pkgName, metadata) => {
return new Promise((resolve, reject) => {
// $FlowFixMe
@ -97,38 +117,66 @@ describe('LocalStorage', () => {
storage.addPackage(pkgName, metadata, (err) => {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(409);
expect(err.message).toMatch(/this package is already present/);
expect(err.statusCode).toEqual(HTTP_STATUS.CONFLICT);
expect(err.message).toMatch(API_ERROR.PACKAGE_EXIST);
done();
});
});
describe('LocalStorage::addVersion', () => {
test('should add new version without tag', (done) => {
const metadata = JSON.parse(readMetadata('metadata-add-version'));
test('should add new version without tag', async (done) => {
const pkgName = 'add-version-test-1';
const version = '1.0.1';
await addPackageToStore(pkgName, generatePackageTemplate(pkgName));
const tarballName: string = `${pkgName}-${version}.tgz`;
await addNewVersion(pkgName, '9.0.0');
await addTarballToStore(pkgName, `${pkgName}-9.0.0.tgz`);
await addTarballToStore(pkgName, tarballName);
storage.addVersion(pkgName, '1.0.1', metadata, '', (err, data) => {
storage.addVersion(pkgName, version, generateNewVersion(pkgName, version), '', (err, data) => {
expect(err).toBeNull();
expect(data).toBeUndefined();
done();
});
});
test('should fails on add a duplicated version without tag', (done) => {
const metadata = JSON.parse(readMetadata('metadata-add-version'));
test('should fails on add a duplicated version without tag', async (done) => {
const pkgName = 'add-version-test-2';
const version = '1.0.1';
await addPackageToStore(pkgName, generatePackageTemplate(pkgName));
await addNewVersion(pkgName, version);
storage.addVersion(pkgName, '1.0.1', metadata, '', (err, data) => {
storage.addVersion(pkgName, version, generateNewVersion(pkgName, version), '', (err, data) => {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(409);
expect(err.message).toMatch(/this package is already present/);
expect(err.statusCode).toEqual(HTTP_STATUS.CONFLICT);
expect(err.message).toMatch(API_ERROR.PACKAGE_EXIST);
done();
});
});
test('should add new second version without tag', (done) => {
const metadata = JSON.parse(readMetadata('metadata-add-version'));
test('should fails add new version wrong shasum', async (done) => {
const pkgName = 'add-version-test-4';
const version = '4.0.0';
await addPackageToStore(pkgName, generatePackageTemplate(pkgName));
const tarballName: string = `${pkgName}-${version}.tgz`;
await addTarballToStore(pkgName, tarballName);
storage.addVersion(pkgName, '1.0.2', metadata, 'beta', (err, data) => {
storage.addVersion(pkgName, version, generateNewVersion(pkgName, version, 'fake'), '', (err, data) => {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(HTTP_STATUS.BAD_REQUEST);
expect(err.message).toMatch(/shasum error/);
done();
});
});
test('should add new second version without tag', async (done) => {
const pkgName = 'add-version-test-3';
const version = '1.0.2';
await addPackageToStore(pkgName, generatePackageTemplate(pkgName));
await addNewVersion(pkgName, '1.0.1');
await addNewVersion(pkgName, '1.0.3');
storage.addVersion(pkgName, version, generateNewVersion(pkgName, version), 'beta', (err, data) => {
expect(err).toBeNull();
expect(data).toBeUndefined();
done();
@ -137,12 +185,27 @@ describe('LocalStorage', () => {
});
describe('LocalStorage::updateVersions', () => {
test('should update versions from origin', (done) => {
test('should update versions from external source', async (done) => {
const metadata = JSON.parse(readMetadata('metadata-update-versions-tags'));
const pkgName = 'add-update-versions-test-1';
const version = '1.0.2';
await addPackageToStore(pkgName, generatePackageTemplate(pkgName));
await addNewVersion(pkgName, '1.0.1');
await addNewVersion(pkgName, version);
storage.updateVersions(pkgName, metadata, (err, data) => {
expect(err).toBeNull();
expect(data.versions['1.0.3']).toBeDefined();
expect(data.versions['1.0.1']).toBeDefined();
expect(data.versions[version]).toBeDefined();
expect(data.versions['1.0.4']).toBeDefined();
expect(data[DIST_TAGS]['latest']).toBeDefined();
expect(data[DIST_TAGS]['latest']).toBe('1.0.1');
expect(data[DIST_TAGS]['beta']).toBeDefined();
expect(data[DIST_TAGS]['beta']).toBe('1.0.2');
expect(data[DIST_TAGS]['next']).toBeDefined();
expect(data[DIST_TAGS]['next']).toBe('1.0.4');
expect(data['_rev'] === metadata['_rev']).toBeFalsy();
expect(data.readme).toBe('readme 1.0.4');
done();
});
});
@ -212,7 +275,7 @@ describe('LocalStorage', () => {
const stream = storage.addTarball(pkgName, tarballName);
stream.on('error', function(err) {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(409);
expect(err.statusCode).toEqual(HTTP_STATUS.CONFLICT);
expect(err.message).toMatch(/this package is already present/);
done();
});
@ -247,7 +310,7 @@ describe('LocalStorage', () => {
const stream = storage.addTarball(pkgName, `${pkgName}-fails-add-tarball-1.0.4.tgz`);
stream.on('error', function(err) {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(422);
expect(err.statusCode).toEqual(HTTP_STATUS.BAD_DATA);
expect(err.message).toMatch(/refusing to accept zero-length file/);
done();
});
@ -260,7 +323,7 @@ describe('LocalStorage', () => {
stream.abort();
stream.on('error', function(err) {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(403);
expect(err.statusCode).toEqual(HTTP_STATUS.FORBIDDEN);
expect(err.message).toMatch(/can't use this filename/);
done();
});
@ -281,7 +344,7 @@ describe('LocalStorage', () => {
test('should remove a tarball that does not exist', (done) => {
storage.removeTarball(pkgName, tarballName2, 'rev', (err) => {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(404);
expect(err.statusCode).toEqual(HTTP_STATUS.NOT_FOUND);
expect(err.message).toMatch(/no such file available/);
done();
});
@ -306,7 +369,7 @@ describe('LocalStorage', () => {
const stream = storage.getTarball('fake', tarballName);
stream.on('error', function(err) {
expect(err).not.toBeNull();
expect(err.statusCode).toEqual(404);
expect(err.statusCode).toEqual(HTTP_STATUS.NOT_FOUND);
expect(err.message).toMatch(/no such file available/);
done();
});
@ -363,7 +426,7 @@ describe('LocalStorage', () => {
test('should fails with @scoped package not found', (done) => {
storage.removePackage(pkgNameScoped, (err, data) => {
expect(err).not.toBeNull();
expect(err.message).toMatch(/no such package available/);
expect(err.message).toMatch(API_ERROR.NO_PACKAGE);
done();
});
});

View file

@ -1,32 +0,0 @@
{
"name": "npm_test",
"version": "1.0.1",
"description": "",
"main": "index.js",
"dependencies": {
"test": "^1.4.1"
},
"devDependencies": {
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
],
"author": "",
"license": "ISC",
"readme": "ERROR: No README data found!",
"_id": "npm_test@1.0.1",
"_npmVersion": "5.5.1",
"_nodeVersion": "9.3.0",
"_npmUser": {
},
"dist": {
"integrity": "sha512-zVEqt1JUCOPsash9q4wMkJEDPD+QCx95TRhQII+JnoS31uBUKoZxhzvvUJCcLVy2CQG4QdwXARU7dYWPnrwhGg==",
"shasum": "b7088c30970489637f8b4e6795e8cf2b699d7569",
"tarball": "http:\/\/localhost:4873\/npm_test\/-\/npm_test-1.0.1.tgz"
}
}

View file

@ -1,8 +1,8 @@
{
"name": "npm_test",
"name": "add-update-versions-test-1",
"versions": {
"1.0.1": {
"name": "npm_test",
"name": "add-update-versions-test-1",
"version": "1.0.1",
"description": "",
"main": "index.js",
@ -16,18 +16,18 @@
"keywords": [],
"author": "",
"license": "ISC",
"_id": "npm_test@1.0.1",
"_id": "add-update-versions-test-1@1.0.1",
"_npmVersion": "5.5.1",
"_nodeVersion": "9.3.0",
"_npmUser": {},
"dist": {
"integrity": "sha512-zVEqt1JUCOPsash9q4wMkJEDPD+QCx95TRhQII+JnoS31uBUKoZxhzvvUJCcLVy2CQG4QdwXARU7dYWPnrwhGg==",
"shasum": "b7088c30970489637f8b4e6795e8cf2b699d7569",
"tarball": "http://localhost:4873/npm_test/-/npm_test-1.0.1.tgz"
"shasum": "238e7641e59508dc9c20eb4ad37a8aa57ab777b4",
"tarball": "http://localhost:4873/add-update-versions-test-1/-/add-update-versions-test-1-1.0.1.tgz"
}
},
"1.0.2": {
"name": "npm_test",
"name": "add-update-versions-test-1",
"version": "1.0.1",
"description": "",
"main": "index.js",
@ -41,19 +41,19 @@
"keywords": [],
"author": "",
"license": "ISC",
"_id": "npm_test@1.0.1",
"_id": "add-update-versions-test-1@1.0.1",
"_npmVersion": "5.5.1",
"_nodeVersion": "9.3.0",
"_npmUser": {},
"dist": {
"integrity": "sha512-zVEqt1JUCOPsash9q4wMkJEDPD+QCx95TRhQII+JnoS31uBUKoZxhzvvUJCcLVy2CQG4QdwXARU7dYWPnrwhGg==",
"shasum": "b7088c30970489637f8b4e6795e8cf2b699d7569",
"tarball": "http://localhost:4873/npm_test/-/npm_test-1.0.1.tgz"
"shasum": "238e7641e59508dc9c20eb4ad37a8aa57ab777b4",
"tarball": "http://localhost:4873/add-update-versions-test-1/-/add-update-versions-test-1-1.0.1.tgz"
}
},
"1.0.3": {
"name": "npm_test",
"version": "1.0.3",
"1.0.4": {
"name": "add-update-versions-test-1",
"version": "1.0.4",
"description": "",
"main": "index.js",
"dependencies": {
@ -66,26 +66,26 @@
"keywords": [],
"author": "",
"license": "ISC",
"_id": "npm_test@1.0.1",
"_id": "add-update-versions-test-1@1.0.1",
"_npmVersion": "5.5.1",
"_nodeVersion": "9.3.0",
"_npmUser": {},
"dist": {
"integrity": "sha512-zVEqt1JUCOPsash9q4wMkJEDPD+QCx95TRhQII+JnoS31uBUKoZxhzvvUJCcLVy2CQG4QdwXARU7dYWPnrwhGg==",
"shasum": "b7088c30970489637f8b4e6795e8cf2b699d7569",
"tarball": "http://localhost:4873/npm_test/-/npm_test-1.0.1.tgz"
"shasum": "238e7641e59508dc9c20eb4ad37a8aa57ab777b4",
"tarball": "http://localhost:4873/add-update-versions-test-1/-/add-update-versions-test-1-1.0.1.tgz"
}
}
},
"dist-tags": {
"latest": "1.0.1",
"beta": "1.0.2",
"next": "1.0.3"
"next": "1.0.4"
},
"time": {},
"_distfiles": {},
"_attachments": {},
"_uplinks": {},
"_rev": "2-b8a00ec71cdc7323",
"readme": "ERROR: No README data found!"
"readme": "readme 1.0.4"
}