2019-08-10 06:38:06 -05:00
|
|
|
import _ from 'lodash';
|
|
|
|
import request from 'supertest';
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
import { HEADER_TYPE, HEADERS, HTTP_STATUS, TOKEN_BEARER } from '../../../src/lib/constants';
|
|
|
|
import { buildToken, encodeScopedUri } from '../../../src/lib/utils';
|
2019-07-27 16:47:04 -05:00
|
|
|
import { Package } from '@verdaccio/types';
|
2021-03-14 02:42:46 -05:00
|
|
|
import { getTaggedVersionFromPackage } from './expects';
|
|
|
|
import { generateRandomHexString } from '../../../src/lib/crypto-utils';
|
2018-08-21 01:05:34 -05:00
|
|
|
|
2019-06-13 11:28:43 -05:00
|
|
|
// API Helpers
|
|
|
|
|
|
|
|
// This file should contain utilities to avoid repeated task over API unit testing,
|
|
|
|
// Please, comply with the following:
|
|
|
|
// - Promisify everything
|
|
|
|
// - Encourage using constants or create new ones if it's needed
|
2019-07-27 16:47:04 -05:00
|
|
|
// - // @ts-ignore or any is fine if there is no other way
|
|
|
|
|
|
|
|
export function putPackage(
|
|
|
|
request: any,
|
|
|
|
pkgName: string,
|
2019-08-10 06:38:06 -05:00
|
|
|
publishMetadata: Package,
|
2021-03-14 02:42:46 -05:00
|
|
|
token?: string
|
|
|
|
): Promise<any[]> {
|
2019-07-27 16:47:04 -05:00
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
let put = request
|
|
|
|
.put(pkgName)
|
|
|
|
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
|
|
|
|
.send(JSON.stringify(publishMetadata));
|
|
|
|
|
|
|
|
if (_.isEmpty(token) === false) {
|
|
|
|
expect(token).toBeDefined();
|
|
|
|
put.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token as string));
|
2019-08-10 06:38:06 -05:00
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
put
|
|
|
|
.set('accept', 'gzip')
|
|
|
|
.set('accept-encoding', HEADERS.JSON)
|
|
|
|
.expect(HTTP_STATUS.CREATED)
|
|
|
|
.end(function (err, res) {
|
2019-07-27 16:47:04 -05:00
|
|
|
resolve([err, res]);
|
2021-03-14 02:42:46 -05:00
|
|
|
});
|
2019-07-27 16:47:04 -05:00
|
|
|
});
|
|
|
|
}
|
2018-08-21 01:05:34 -05:00
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export function deletePackage(request: any, pkgName: string, token?: string): Promise<any[]> {
|
2019-08-10 06:38:06 -05:00
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
let del = request
|
|
|
|
.put(`/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`)
|
2019-08-10 06:38:06 -05:00
|
|
|
.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON);
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
if (_.isNil(token) === false) {
|
|
|
|
del.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token as string));
|
2019-08-10 06:38:06 -05:00
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
del
|
|
|
|
.set('accept-encoding', HEADERS.JSON)
|
2019-08-10 06:38:06 -05:00
|
|
|
.expect(HTTP_STATUS.CREATED)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2019-08-10 06:38:06 -05:00
|
|
|
resolve([err, res]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-08-21 01:05:34 -05:00
|
|
|
export function getPackage(
|
2019-07-16 01:40:01 -05:00
|
|
|
request: any,
|
2019-08-10 06:38:06 -05:00
|
|
|
token: string,
|
|
|
|
pkgName: string,
|
2021-03-14 02:42:46 -05:00
|
|
|
statusCode: number = HTTP_STATUS.OK
|
|
|
|
): Promise<any[]> {
|
2018-08-21 01:05:34 -05:00
|
|
|
return new Promise((resolve) => {
|
2019-08-10 06:38:06 -05:00
|
|
|
let getRequest = request.get(`/${pkgName}`);
|
|
|
|
|
2020-06-19 15:54:03 -05:00
|
|
|
// token is a string
|
|
|
|
if (token !== '') {
|
2019-08-10 06:38:06 -05:00
|
|
|
getRequest.set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token));
|
|
|
|
}
|
|
|
|
|
|
|
|
getRequest
|
2019-07-16 01:40:01 -05:00
|
|
|
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
|
|
.expect(statusCode)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2019-07-16 01:40:01 -05:00
|
|
|
resolve([err, res]);
|
|
|
|
});
|
2018-08-21 01:05:34 -05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export function loginUserToken(
|
|
|
|
request: any,
|
|
|
|
user: string,
|
|
|
|
credentials: any,
|
|
|
|
token: string,
|
|
|
|
statusCode: number = HTTP_STATUS.CREATED
|
|
|
|
): Promise<any[]> {
|
2019-06-12 23:58:43 -05:00
|
|
|
// $FlowFixMe
|
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
request
|
|
|
|
.put(`/-/user/org.couchdb.user:${user}`)
|
2019-06-12 23:58:43 -05:00
|
|
|
.send(credentials)
|
|
|
|
.set('authorization', buildToken(TOKEN_BEARER, token))
|
|
|
|
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
|
|
.expect(statusCode)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2019-06-12 23:58:43 -05:00
|
|
|
return resolve([err, res]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export function addUser(
|
|
|
|
request: any,
|
|
|
|
user: string,
|
|
|
|
credentials: any,
|
|
|
|
statusCode: number = HTTP_STATUS.CREATED
|
|
|
|
): Promise<any[]> {
|
2018-09-27 09:37:45 -05:00
|
|
|
// $FlowFixMe
|
2018-10-12 04:07:55 -05:00
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
request
|
|
|
|
.put(`/-/user/org.couchdb.user:${user}`)
|
2018-08-21 01:05:34 -05:00
|
|
|
.send(credentials)
|
|
|
|
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
|
|
.expect(statusCode)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2018-08-21 01:05:34 -05:00
|
|
|
return resolve([err, res]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2018-10-12 04:07:55 -05:00
|
|
|
|
2019-07-16 01:40:01 -05:00
|
|
|
export async function getNewToken(request: any, credentials: any): Promise<string> {
|
2019-12-23 03:29:27 -05:00
|
|
|
/* eslint no-async-promise-executor: 0 */
|
2018-10-12 04:07:55 -05:00
|
|
|
return new Promise(async (resolve) => {
|
2019-12-23 03:29:27 -05:00
|
|
|
const [err, res] = await addUser(request, credentials.name, credentials);
|
2018-10-12 04:07:55 -05:00
|
|
|
expect(err).toBeNull();
|
2021-03-14 02:42:46 -05:00
|
|
|
const { token, ok } = res.body;
|
2018-10-12 04:07:55 -05:00
|
|
|
expect(ok).toBeDefined();
|
|
|
|
expect(token).toBeDefined();
|
|
|
|
expect(typeof token).toBe('string');
|
|
|
|
resolve(token);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export function getProfile(
|
|
|
|
request: any,
|
|
|
|
token: string,
|
|
|
|
statusCode: number = HTTP_STATUS.OK
|
|
|
|
): Promise<any[]> {
|
2018-10-12 04:07:55 -05:00
|
|
|
// $FlowFixMe
|
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
request
|
|
|
|
.get(`/-/npm/v1/user`)
|
2019-06-12 23:58:43 -05:00
|
|
|
.set('authorization', buildToken(TOKEN_BEARER, token))
|
2018-10-12 04:07:55 -05:00
|
|
|
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
|
|
.expect(statusCode)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2018-10-12 04:07:55 -05:00
|
|
|
return resolve([err, res]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export function postProfile(
|
|
|
|
request: any,
|
|
|
|
body: any,
|
|
|
|
token: string,
|
|
|
|
statusCode: number = HTTP_STATUS.OK
|
|
|
|
): Promise<any[]> {
|
2018-10-12 04:07:55 -05:00
|
|
|
// $FlowFixMe
|
|
|
|
return new Promise((resolve) => {
|
2021-03-14 02:42:46 -05:00
|
|
|
request
|
|
|
|
.post(`/-/npm/v1/user`)
|
2018-10-12 04:07:55 -05:00
|
|
|
.send(body)
|
2019-05-19 14:37:43 -05:00
|
|
|
.set(HEADERS.AUTHORIZATION, `Bearer ${token}`)
|
2018-10-12 04:07:55 -05:00
|
|
|
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
|
|
.expect(statusCode)
|
2021-03-14 02:42:46 -05:00
|
|
|
.end(function (err, res) {
|
2018-10-12 04:07:55 -05:00
|
|
|
return resolve([err, res]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2019-08-10 06:38:06 -05:00
|
|
|
|
2021-03-14 02:42:46 -05:00
|
|
|
export async function fetchPackageByVersionAndTag(
|
|
|
|
app,
|
|
|
|
encodedPkgName,
|
|
|
|
pkgName,
|
|
|
|
version,
|
|
|
|
tag = 'latest'
|
|
|
|
) {
|
2019-08-10 06:38:06 -05:00
|
|
|
// we retrieve the package to verify
|
2021-03-14 02:42:46 -05:00
|
|
|
const [err, resp] = await getPackage(request(app), '', encodedPkgName);
|
2019-08-10 06:38:06 -05:00
|
|
|
|
|
|
|
expect(err).toBeNull();
|
|
|
|
|
|
|
|
// we check whether the latest version match with the previous published one
|
|
|
|
return getTaggedVersionFromPackage(resp.body, pkgName, tag, version);
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function isExistPackage(app, packageName) {
|
2021-03-14 02:42:46 -05:00
|
|
|
const [err] = await getPackage(request(app), '', encodeScopedUri(packageName), HTTP_STATUS.OK);
|
2019-08-10 06:38:06 -05:00
|
|
|
|
|
|
|
return _.isNull(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function verifyPackageVersionDoesExist(app, packageName, version, token?: string) {
|
2021-03-14 02:42:46 -05:00
|
|
|
const [, res] = await getPackage(
|
|
|
|
request(app),
|
|
|
|
token as string,
|
|
|
|
encodeScopedUri(packageName),
|
|
|
|
HTTP_STATUS.OK
|
|
|
|
);
|
2019-08-10 06:38:06 -05:00
|
|
|
|
|
|
|
const { versions } = res.body;
|
|
|
|
const versionsKeys = Object.keys(versions);
|
|
|
|
|
|
|
|
return versionsKeys.includes(version) === false;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function generateUnPublishURI(pkgName) {
|
|
|
|
return `/${encodeScopedUri(pkgName)}/-rev/${generateRandomHexString(8)}`;
|
|
|
|
}
|