Files
cnpmjs.org/test/controllers/registry/package/save.test.js
killa bbae9d3bc3 fix: new publish with token should add user to maintainers (#1662)
* fix: new publish with token should add user to maintainers

ci: use github

fix: fix _saveNpmUser

* ci: github add mysql service
2021-09-03 14:04:40 +08:00

346 lines
11 KiB
JavaScript

'use strict';
var assert = require('assert');
var should = require('should');
var request = require('supertest');
var pedding = require('pedding');
var mm = require('mm');
var packageService = require('../../../../services/package');
var tokenService = require('../../../../services/token');
var app = require('../../../../servers/registry');
var config = require('../../../../config');
var utils = require('../../../utils');
describe('test/controllers/registry/package/save.test.js', function () {
afterEach(mm.restore);
describe('no @scoped package', function () {
beforeEach(function () {
mm(config, 'syncModel', 'all');
mm(config, 'privatePackages', ['testmodule-new-1', 'testmodule-new-2', 'testmodule-no-latest', 'testmodule-new-4']);
});
before(function (done) {
mm(config, 'privatePackages', ['testmodule-new-1', 'testmodule-new-2']);
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
pkg.versions['0.0.1'].dependencies = {
'bytetest-1': '~0.0.1',
mocha: '~1.0.0'
};
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, function (err) {
should.not.exist(err);
var pkg = utils.getPackage('testmodule-new-2', '1.0.0', utils.admin);
pkg.versions['1.0.0'].dependencies = {
'bytetest-1': '~0.0.1',
mocha: '~1.0.0'
};
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, done);
});
});
it('should publish new version package and save dependencies', function (done) {
request(app)
.get('/testmodule-new-1')
.expect(200, function (err, res) {
should.not.exist(err);
var data = res.body;
data.name.should.equal('testmodule-new-1');
Object.keys(data.versions).should.eql(['0.0.1']);
data.versions['0.0.1'].dependencies.should.eql({
'bytetest-1': '~0.0.1',
mocha: '~1.0.0'
});
done();
});
});
it('should publish new package and fire globalHook', done => {
done = pedding(done, 2);
mm(config, 'globalHook', function* (envelope) {
console.log(envelope);
assert(envelope.version === '1.0.1');
assert(envelope.name === 'testmodule-new-2');
assert(envelope.type === 'package');
assert(envelope.event === 'package:publish');
done();
});
var pkg = utils.getPackage('testmodule-new-2', '1.0.1', utils.admin);
pkg.versions['1.0.1'].dependencies = {
'bytetest-1': '~0.0.1',
mocha: '~1.0.0'
};
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, done);
});
it('should save dependents', function* () {
var names = yield packageService.listDependents('bytetest-1');
names.should.length(2);
names.should.eql(['testmodule-new-1', 'testmodule-new-2']);
names = yield packageService.listDependents('testmodule-new-1');
names.should.length(0);
});
it('should auto add latest tag when it not exists', function (done) {
var pkg = utils.getPackage('testmodule-no-latest', '0.0.1', utils.admin);
var tags = pkg['dist-tags'];
tags.v2 = tags.latest;
delete tags.latest;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, function (err) {
should.not.exist(err);
request(app)
.get('/' + pkg.name)
.expect(200, function (err, res) {
should.not.exist(err);
var data = res.body;
data['dist-tags'].should.eql({
latest: '0.0.1',
v2: '0.0.1'
});
done();
});
});
});
it('should publish with tag', function (done) {
var pkg = utils.getPackage('testmodule-no-latest', '0.0.2', utils.admin);
var tags = pkg['dist-tags'];
tags.v2 = tags.latest;
delete tags.latest;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, function (err) {
should.not.exist(err);
request(app)
.get('/' + pkg.name)
.expect(200, function (err, res) {
should.not.exist(err);
var data = res.body;
data['dist-tags'].should.eql({
latest: '0.0.1',
v2: '0.0.2'
});
done();
});
});
});
it('should 400 when versions missing', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
delete pkg.versions;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[version_error] package.versions is empty',
reason: '[version_error] package.versions is empty',
})
.expect(400, done);
});
it('should 400 when maintainers missing', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
delete pkg.versions['0.0.1'].maintainers;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[maintainers_error] request body need maintainers',
reason: '[maintainers_error] request body need maintainers',
})
.expect(400, done);
});
it('should publish use token', function* () {
var token = yield tokenService.createToken(utils.admin);
var pkg = utils.getPackageWithToken('testmodule-new-3', '0.0.1', utils.admin);
yield request(app)
.put('/' + pkg.name)
.set('authorization', 'Bearer ' + token.token)
.send(pkg)
.expect(201);
yield tokenService.deleteToken(utils.admin, token.token);
});
it('should 400 when dist-tags missing', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
delete pkg['dist-tags'];
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[invalid] dist-tags should not be empty',
reason: '[invalid] dist-tags should not be empty',
})
.expect(400, done);
});
it('should 403 when maintainers dont contain current user', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
pkg.versions['0.0.1'].maintainers[0].name += '-testuser';
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[maintainers_error] ' + utils.admin + ' does not in maintainer list',
reason: '[maintainers_error] ' + utils.admin + ' does not in maintainer list'
})
.expect(403, done);
});
it('should publish when maintainers dont contain current user in token mode', function* () {
var token = yield tokenService.createToken(utils.admin);
var pkg = utils.getPackage('testmodule-new-4', '0.0.1', utils.admin);
pkg.versions['0.0.1'].maintainers[0].name += '-testuser';
yield request(app)
.put('/' + pkg.name)
.set('authorization', 'Bearer ' + token.token)
.send(pkg)
.expect(201);
yield tokenService.deleteToken(utils.admin, token.token);
var maintainers = yield packageService.listMaintainers(pkg.name);
maintainers.should.eql([{
name: 'cnpmjstest10',
email: 'fengmk2@gmail.com',
}]);
});
it('should 400 when attachments missing', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
delete pkg._attachments;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[attachment_error] package._attachments is empty',
reason: '[attachment_error] package._attachments is empty',
})
.expect(400, done);
});
it('should 403 when attachments length wrong', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.3', utils.admin);
pkg._attachments[Object.keys(pkg._attachments)[0]].length += 10;
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[size_wrong] Attachment size 261 not match download size 251',
reason: '[size_wrong] Attachment size 261 not match download size 251',
})
.expect(403, done);
});
it('should 403 when user is not maintainer', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.2', utils.otherAdmin2);
request(app)
.put('/' + pkg.name)
.set('authorization', utils.otherAdmin2Auth)
.send(pkg)
.expect({
error: '[forbidden] cnpmjstestAdmin2 not authorized to modify testmodule-new-1, please contact maintainers: cnpmjstest10',
reason: '[forbidden] cnpmjstestAdmin2 not authorized to modify testmodule-new-1, please contact maintainers: cnpmjstest10',
})
.expect(403, done);
});
it('should 403 when version exists', function (done) {
var pkg = utils.getPackage('testmodule-new-1', '0.0.1', utils.admin);
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect({
error: '[forbidden] cannot modify pre-existing version: 0.0.1',
reason: '[forbidden] cannot modify pre-existing version: 0.0.1',
})
.expect(403, done);
});
});
describe('@scoped package', function () {
before(function (done) {
var pkg = utils.getPackage('@cnpmtest/testmodule-new-1', '0.0.1', utils.admin);
pkg.versions['0.0.1'].dependencies = {
bytetest2: '~0.0.1',
mocha: '~1.0.0'
};
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, function (err) {
should.not.exist(err);
var pkg = utils.getPackage('@cnpmtest/testmodule-new-2', '1.0.0', utils.admin);
pkg.versions['1.0.0'].dependencies = {
bytetest2: '~0.0.1',
mocha: '~1.0.0'
};
request(app)
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, done);
});
});
it('should publish new version package and save dependencies', function (done) {
request(app)
.get('/@cnpmtest/testmodule-new-1')
.expect(200, function (err, res) {
should.not.exist(err);
var data = res.body;
data.name.should.equal('@cnpmtest/testmodule-new-1');
Object.keys(data.versions).should.eql(['0.0.1']);
data.versions['0.0.1'].dependencies.should.eql({
bytetest2: '~0.0.1',
mocha: '~1.0.0'
});
done();
});
});
it('should save dependents', function* () {
var names = yield packageService.listDependents('bytetest2');
names.should.length(2);
names.should.eql(['@cnpmtest/testmodule-new-1', '@cnpmtest/testmodule-new-2']);
names = yield packageService.listDependents('@cnpmtest/testmodule-new-1');
names.should.length(0);
});
});
});