@verdaccio/server 6.0.0-6-next.30 → 6.0.0-6-next.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.babelrc +1 -1
  2. package/CHANGELOG.md +88 -0
  3. package/build/debug/index.d.ts +1 -1
  4. package/build/debug/index.js +1 -1
  5. package/build/debug/index.js.map +1 -1
  6. package/build/env.js.map +1 -1
  7. package/build/index.js.map +1 -1
  8. package/build/server.d.ts +2 -2
  9. package/build/server.js +5 -3
  10. package/build/server.js.map +1 -1
  11. package/build/utils.d.ts +1 -0
  12. package/build/utils.js +19 -0
  13. package/build/utils.js.map +1 -0
  14. package/jest.config.js +7 -2
  15. package/package.json +70 -71
  16. package/src/debug/index.ts +2 -2
  17. package/src/server.ts +8 -7
  18. package/src/utils.ts +11 -0
  19. package/test/_helper.ts +29 -0
  20. package/test/config/conf.yaml +28 -0
  21. package/test/config/no_debug.yaml +26 -0
  22. package/test/config/powered-custom.yaml +29 -0
  23. package/test/config/powered-disabled.yaml +29 -0
  24. package/test/config/web-disabled.yaml +27 -0
  25. package/test/server.spec.ts +113 -0
  26. package/tsconfig.build.json +1 -1
  27. package/tsconfig.json +14 -14
  28. package/jest.setup.js +0 -1
  29. package/test/.eslintrc +0 -8
  30. package/test/README.md +0 -12
  31. package/test/api/api.spec.yaml +0 -87
  32. package/test/api/helpers/publish-api.js +0 -60
  33. package/test/api/helpers/utils.ts +0 -149
  34. package/test/api/htpasswd +0 -10
  35. package/test/api/index.spec.ts +0 -862
  36. package/test/api/mock/store/@jquery/jquery/jquery-1.5.1.tgz +0 -0
  37. package/test/api/mock/store/@jquery/jquery/package.json +0 -76
  38. package/test/api/mock/store/corrupted-package/package.json +0 -12
  39. package/test/api/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  40. package/test/api/mock/store/jquery/package.json +0 -4919
  41. package/test/api/mock/store/npm_test/package.json +0 -75
  42. package/test/api/mock/store/vue/package.json +0 -25169
  43. package/test/api/plugin/filter.ts +0 -25
  44. package/test/basic/basic.yaml +0 -14
  45. package/test/basic/index.spec.ts +0 -64
  46. package/test/jwt/index.spec.ts +0 -163
  47. package/test/jwt/jwt.yaml +0 -35
  48. package/test/jwt/mock/store/vue/package.json +0 -25169
  49. package/test/package-access/index.spec.ts +0 -100
  50. package/test/package-access/mock/store/.gitkeep +0 -0
  51. package/test/package-access/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  52. package/test/package-access/mock/store/jquery/package.json +0 -4919
  53. package/test/package-access/mock/store/vue/package.json +0 -25169
  54. package/test/package-access/pkg.access.yaml +0 -12
  55. package/test/profile/index.spec.ts +0 -129
  56. package/test/profile/mock/store/.gitkeep +0 -0
  57. package/test/profile/profile.yaml +0 -21
  58. package/test/storage/index.spec.ts +0 -219
  59. package/test/storage/mock/store/@jquery/jquery/jquery-1.5.1.tgz +0 -0
  60. package/test/storage/mock/store/@jquery/jquery/package.json +0 -76
  61. package/test/storage/mock/store/corrupted-package/package.json +0 -12
  62. package/test/storage/mock/store/jquery/jquery-1.5.1.tgz +0 -0
  63. package/test/storage/mock/store/jquery/package.json +0 -4919
  64. package/test/storage/mock/store/npm_test/package.json +0 -75
  65. package/test/storage/store.spec.yaml +0 -24
  66. package/test/token/index.spec.ts +0 -227
  67. package/test/token/mock/store/.gitkeep +0 -0
  68. package/test/token/token.spec.yaml +0 -26
  69. package/test/web/index.spec.ts +0 -157
  70. package/test/web/mock/store/.gitkeep +0 -0
  71. package/test/web/partials/forbidden-place.js +0 -50
  72. package/test/web/partials/publish-api.js +0 -50
  73. package/test/web/web.yaml +0 -20
@@ -1,862 +0,0 @@
1
- import _ from 'lodash';
2
- import path from 'path';
3
- import request from 'supertest';
4
-
5
- import { API_MESSAGE, HEADERS, HEADER_TYPE, HTTP_STATUS, TOKEN_BEARER } from '@verdaccio/core';
6
- import { logger, setup } from '@verdaccio/logger';
7
- import { mockServer } from '@verdaccio/mock';
8
- import {
9
- DOMAIN_SERVERS,
10
- configExample,
11
- generateRamdonStorage,
12
- generateUnPublishURI,
13
- getNewToken,
14
- getPackage,
15
- putPackage,
16
- verifyPackageVersionDoesExist,
17
- } from '@verdaccio/mock';
18
- import { buildToken } from '@verdaccio/utils';
19
-
20
- import endPointAPI from '../../src';
21
- import publishMetadata from './helpers/publish-api';
22
- import {
23
- generateDeprecateMetadata,
24
- generatePackageMetadata,
25
- generatePackageUnpublish,
26
- generateStarMedatada,
27
- generateVersion,
28
- } from './helpers/utils';
29
-
30
- setup([]);
31
-
32
- const credentials = { name: 'server_user_api_spec', password: 'secretPass' };
33
-
34
- const putVersion = (app, name, publishMetadata) => {
35
- return request(app)
36
- .put(name)
37
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
38
- .send(JSON.stringify(publishMetadata))
39
- .expect(HTTP_STATUS.CREATED)
40
- .set('accept', 'gzip')
41
- .set('accept-encoding', HEADERS.JSON)
42
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON);
43
- };
44
-
45
- describe('endpoint unit test', () => {
46
- let app;
47
- let mockRegistry;
48
-
49
- beforeAll(async function () {
50
- const store = generateRamdonStorage();
51
- const mockServerPort = 55549;
52
- const configForTest = configExample(
53
- {
54
- filters: {
55
- [path.join(__dirname, './plugin/filter')]: {
56
- pkg: 'npm_test',
57
- version: '2.0.0',
58
- },
59
- },
60
- storage: store,
61
- config_path: store,
62
- uplinks: {
63
- npmjs: {
64
- url: `http://${DOMAIN_SERVERS}:${mockServerPort}`,
65
- },
66
- },
67
- },
68
- 'api.spec.yaml',
69
- __dirname
70
- );
71
-
72
- app = await endPointAPI(configForTest);
73
- const binPath = require.resolve('verdaccio/bin/verdaccio');
74
- const storePath = path.join(__dirname, '/mock/store');
75
- mockRegistry = await mockServer(mockServerPort, { storePath, silence: true }).init(binPath);
76
- });
77
-
78
- afterAll(function () {
79
- const [registry, pid] = mockRegistry;
80
- registry.stop();
81
- logger.info(`registry ${pid} has been stopped`);
82
- });
83
-
84
- describe('Registry API Endpoints', () => {
85
- describe('should test user api', () => {
86
- describe('should test authorization headers with tokens only errors', () => {
87
- test('should fails on protected endpoint /-/auth-package bad format', () => {
88
- return new Promise((resolve) => {
89
- request(app)
90
- .get('/auth-package')
91
- .set(HEADERS.AUTHORIZATION, 'FakeHader')
92
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
93
- .expect(HTTP_STATUS.FORBIDDEN)
94
- .end(function (err, res) {
95
- expect(res.body.error).toBeDefined();
96
- expect(res.body.error).toMatch(
97
- /authorization required to access package auth-package/
98
- );
99
- resolve(res);
100
- });
101
- });
102
- });
103
-
104
- test('should fails on protected endpoint /-/auth-package bad JWT Bearer format', (done) => {
105
- request(app)
106
- .get('/auth-package')
107
- .set(HEADERS.AUTHORIZATION, TOKEN_BEARER)
108
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
109
- .expect(HTTP_STATUS.FORBIDDEN)
110
- .end(function (err, res) {
111
- expect(res.body.error).toBeDefined();
112
- expect(res.body.error).toMatch(
113
- /authorization required to access package auth-package/
114
- );
115
- done();
116
- });
117
- });
118
-
119
- test('should fails on protected endpoint /-/auth-package well JWT Bearer', (done) => {
120
- request(app)
121
- .get('/auth-package')
122
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, '12345'))
123
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
124
- .expect(HTTP_STATUS.FORBIDDEN)
125
- .end(function (err, res) {
126
- expect(res.body.error).toBeDefined();
127
- expect(res.body.error).toMatch(
128
- /authorization required to access package auth-package/
129
- );
130
- done();
131
- });
132
- });
133
- });
134
-
135
- test('should test add a new user', (done) => {
136
- request(app)
137
- .put(`/-/user/org.couchdb.user:${credentials.name}`)
138
- .send(credentials)
139
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
140
- .expect(HTTP_STATUS.CREATED)
141
- .end(function (err, res) {
142
- if (err) {
143
- return done(err);
144
- }
145
- expect(res.body.ok).toBeDefined();
146
- expect(res.body.token).toBeDefined();
147
- const token = res.body.token;
148
- expect(typeof token).toBe('string');
149
- expect(res.body.ok).toMatch(`user '${credentials.name}' created`);
150
-
151
- // testing JWT auth headers with token
152
- // we need it here, because token is required
153
- request(app)
154
- .get('/vue')
155
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
156
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
157
- .expect(HTTP_STATUS.OK)
158
- .end(function (err, res) {
159
- expect(err).toBeNull();
160
- expect(res.body).toBeDefined();
161
- expect(res.body.name).toMatch(/vue/);
162
- done();
163
- });
164
- });
165
- });
166
- });
167
-
168
- describe('should test package api', () => {
169
- // The current behaviour depends of what's defined in the following configuration file.
170
- // test/unit/partials/config/yaml/api.spec.yaml
171
- // 'jquery':
172
- // access: $all
173
- // publish: $all
174
- // proxy: npmjs
175
-
176
- test('should fetch jquery package from remote uplink', (done) => {
177
- request(app)
178
- .get('/jquery')
179
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
180
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
181
- .expect(HTTP_STATUS.OK)
182
- .end(function (err, res) {
183
- if (err) {
184
- return done(err);
185
- }
186
-
187
- expect(res.body).toBeDefined();
188
- expect(res.body.name).toMatch(/jquery/);
189
- done();
190
- });
191
- });
192
-
193
- test('should fetch jquery specific version package from remote uplink', (done) => {
194
- request(app)
195
- .get('/jquery/1.5.1')
196
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
197
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
198
- .expect(HTTP_STATUS.OK)
199
- .end(function (err, res) {
200
- if (err) {
201
- return done(err);
202
- }
203
-
204
- expect(res.body).toBeDefined();
205
- expect(res.body.name).toMatch(/jquery/);
206
- done();
207
- });
208
- });
209
-
210
- test('should fetch jquery specific tag package from remote uplink', (done) => {
211
- request(app)
212
- .get('/jquery/latest')
213
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
214
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
215
- .expect(HTTP_STATUS.OK)
216
- .end(function (err, res) {
217
- if (err) {
218
- return done(err);
219
- }
220
-
221
- expect(res.body).toBeDefined();
222
- expect(res.body.name).toMatch(/jquery/);
223
- done();
224
- });
225
- });
226
-
227
- test('should fails on fetch jquery specific tag package from remote uplink', (done) => {
228
- request(app)
229
- .get('/jquery/never-will-exist-this-tag')
230
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
231
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
232
- .expect(HTTP_STATUS.NOT_FOUND)
233
- .end(function (err) {
234
- if (err) {
235
- return done(err);
236
- }
237
- done();
238
- });
239
- });
240
-
241
- test('should not found a unexisting remote package under scope', (done) => {
242
- request(app)
243
- .get('/@verdaccio/not-found')
244
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
245
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
246
- .expect(HTTP_STATUS.NOT_FOUND)
247
- .end(function (err) {
248
- if (err) {
249
- return done(err);
250
- }
251
- done();
252
- });
253
- });
254
-
255
- describe('testing filters', () => {
256
- test('be able to filter packages', (done) => {
257
- request(app)
258
- .get('/npm_test')
259
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
260
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
261
- .expect(HTTP_STATUS.OK)
262
- .end(function (err, res) {
263
- if (err) {
264
- return done(err);
265
- }
266
- // Filter out 2.0.0
267
- expect(Object.keys(res.body.versions)).toEqual(['1.0.0']);
268
- done();
269
- });
270
- });
271
-
272
- test('should not found when a filter fails', (done) => {
273
- request(app)
274
- // Filter errors look like other uplink errors
275
- .get('/trigger-filter-failure')
276
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
277
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
278
- .expect(HTTP_STATUS.NOT_FOUND)
279
- .end(function (err) {
280
- if (err) {
281
- return done(err);
282
- }
283
- done();
284
- });
285
- });
286
- });
287
-
288
- test('should forbid access to remote package', (done) => {
289
- request(app)
290
- .get('/forbidden-place')
291
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
292
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
293
- .expect(HTTP_STATUS.UNAUTHORIZED)
294
- .end(function (err) {
295
- if (err) {
296
- return done(err);
297
- }
298
- done();
299
- });
300
- });
301
-
302
- test('should fetch a tarball from remote uplink', (done) => {
303
- request(app)
304
- .get('/jquery/-/jquery-1.5.1.tgz')
305
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.OCTET_STREAM)
306
- .expect(HTTP_STATUS.OK)
307
- .end(function (err, res) {
308
- if (err) {
309
- return done(err);
310
- }
311
-
312
- expect(res.body).toBeDefined();
313
- done();
314
- });
315
- });
316
-
317
- test('should fetch a scoped tarball from remote uplink', (done) => {
318
- request(app)
319
- .get('/@jquery/jquery/-/@jquery/jquery-1.5.1.tgz')
320
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.OCTET_STREAM)
321
- .expect(HTTP_STATUS.OK)
322
- .end(function (err, res) {
323
- if (err) {
324
- return done(err);
325
- }
326
-
327
- expect(res.body).toBeDefined();
328
- done();
329
- });
330
- });
331
-
332
- test('should fails fetch a tarball from remote uplink', (done) => {
333
- request(app)
334
- .get('/jquery/-/jquery-not-found-tarball-0.0.1.tgz')
335
- .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.OCTET_STREAM)
336
- .expect(HTTP_STATUS.NOT_FOUND)
337
- .end(function (err) {
338
- if (err) {
339
- expect(err).not.toBeNull();
340
- return done(err);
341
- }
342
-
343
- done();
344
- });
345
- });
346
- });
347
-
348
- describe('should test dist-tag api', () => {
349
- const jqueryVersion = '2.1.2';
350
- const jqueryUpdatedVersion = {
351
- beta: '3.0.0',
352
- jota: '1.6.3',
353
- };
354
-
355
- test('should set a new tag on jquery', (done) => {
356
- putVersion(app, '/jquery/verdaccio-tag', jqueryVersion)
357
- .expect(HTTP_STATUS.CREATED)
358
- .end(function (err, res) {
359
- if (err) {
360
- expect(err).toBeNull();
361
- return done(err);
362
- }
363
-
364
- expect(res.body.ok).toBeDefined();
365
- expect(res.body.ok).toMatch(/package tagged/);
366
- done();
367
- });
368
- });
369
-
370
- test('should fetch all tag for jquery', (done) => {
371
- request(app)
372
- .get('/-/package/jquery/dist-tags')
373
- .set('accept-encoding', HEADERS.JSON)
374
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
375
- .expect(HTTP_STATUS.OK)
376
- .end(function (err, res) {
377
- if (err) {
378
- expect(err).toBeNull();
379
- return done(err);
380
- }
381
-
382
- expect(res.body).toBeDefined();
383
- expect(res.body['verdaccio-tag']).toMatch(jqueryVersion);
384
- done();
385
- });
386
- });
387
-
388
- test('should update a new tag on jquery', (done) => {
389
- request(app)
390
- .post('/-/package/jquery/dist-tags')
391
- .send(JSON.stringify(jqueryUpdatedVersion))
392
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
393
- .expect(HTTP_STATUS.CREATED)
394
- .end(function (err, res) {
395
- if (err) {
396
- expect(err).toBeNull();
397
- return done(err);
398
- }
399
-
400
- expect(res.body.ok).toBeDefined();
401
- expect(res.body.ok).toMatch(API_MESSAGE.TAG_UPDATED);
402
- done();
403
- });
404
- });
405
-
406
- test('should fetch all tags for jquery and ccheck previous update', (done) => {
407
- request(app)
408
- .get('/-/package/jquery/dist-tags')
409
- .set('accept-encoding', HEADERS.JSON)
410
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
411
- .expect(HTTP_STATUS.OK)
412
- .end(function (err, res) {
413
- if (err) {
414
- expect(err).toBeNull();
415
- return done(err);
416
- }
417
-
418
- expect(res.body).toBeDefined();
419
- expect(res.body['beta']).toMatch(jqueryUpdatedVersion['beta']);
420
- done();
421
- });
422
- });
423
-
424
- test('should set a remove a tag on jquery', (done) => {
425
- request(app)
426
- .del('/-/package/jquery/dist-tags/verdaccio-tag')
427
- .set('accept-encoding', HEADERS.JSON)
428
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
429
- // .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
430
- .expect(HTTP_STATUS.CREATED)
431
- .end(function (err, res) {
432
- if (err) {
433
- expect(err).toBeNull();
434
- return done(err);
435
- }
436
-
437
- expect(res.body.ok).toBeDefined();
438
- expect(res.body.ok).toMatch(API_MESSAGE.TAG_REMOVED);
439
- done();
440
- });
441
- });
442
- });
443
-
444
- describe('should test search api', () => {
445
- test('should perform a search', (done) => {
446
- request(app)
447
- .get('/-/v1/search?text=npm7&size=2000&from=0&quality=1&popularity=0.1&maintenance=0.1')
448
- .set('accept-encoding', HEADERS.JSON)
449
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
450
- .expect(HEADERS.CONTENT_TYPE, HEADERS.JSON_CHARSET)
451
- .expect(HTTP_STATUS.OK)
452
- .end(function (err) {
453
- if (err) {
454
- expect(err).toBeNull();
455
- return done(err);
456
- }
457
- // TODO: we have to catch the stream check whether it returns something
458
- // we should not spend much time on this api since is deprecated somehow.
459
- done();
460
- });
461
- });
462
- });
463
-
464
- describe('should test publish/unpublish api', () => {
465
- /**
466
- * It publish 2 versions and unpublish the latest one, then verifies
467
- * the version do not exist anymore in the body of the metadata.
468
- */
469
- const runPublishUnPublishFlow = async (pkgName: string, token?: string) => {
470
- const version = '2.0.0';
471
- const pkg = generatePackageMetadata(pkgName, version);
472
-
473
- const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
474
- if (err) {
475
- expect(err).toBeNull();
476
- return Promise.reject(err);
477
- }
478
-
479
- const newVersion = '2.0.1';
480
- const [newErr] = await putPackage(
481
- request(app),
482
- `/${pkgName}`,
483
- generatePackageMetadata(pkgName, newVersion),
484
- token
485
- );
486
- if (newErr) {
487
- expect(newErr).toBeNull();
488
- return Promise.reject(newErr);
489
- }
490
-
491
- const deletePayload = generatePackageUnpublish(pkgName, ['2.0.0']);
492
- const [err2, res2] = await putPackage(
493
- request(app),
494
- generateUnPublishURI(pkgName),
495
- deletePayload,
496
- token
497
- );
498
-
499
- expect(err2).toBeNull();
500
- expect(res2.body.ok).toMatch(API_MESSAGE.PKG_CHANGED);
501
-
502
- const existVersion = await verifyPackageVersionDoesExist(app, pkgName, newVersion, token);
503
- expect(existVersion).toBeTruthy();
504
-
505
- return Promise.resolve();
506
- };
507
-
508
- describe('un/publish scenarios with credentials', () => {
509
- test('should flow with no credentials', async () => {
510
- const pkgName = '@public-anyone-can-publish/pk1-test';
511
- return await runPublishUnPublishFlow(pkgName, undefined);
512
- });
513
-
514
- test('should flow with credentials', async () => {
515
- const credentials = { name: 'jota_unpublish', password: 'secretPass' };
516
- const token = await getNewToken(request(app), credentials);
517
- const pkgName = '@only-one-can-publish/pk1-test';
518
-
519
- return await runPublishUnPublishFlow(pkgName, token);
520
- });
521
- });
522
-
523
- describe('test error handling', () => {
524
- test('should fail if user is not allowed to unpublish', async () => {
525
- /**
526
- * Context:
527
- *
528
- * 'non-unpublish':
529
- * access: $authenticated
530
- * publish: jota_unpublish_fail
531
- * # There is some conditions to keep on mind here
532
- * # - If unpublish is empty, fallback with the publish value
533
- * # - If the user has permissions to publish and this empty it will
534
- * # be allowed to unpublish
535
- * # - If we want to forbid anyone to unpublish, just write here any non-existing user
536
- * unpublish: none
537
- *
538
- * The result of this test should fail and even if jota_unpublish_fail is
539
- * allowed to publish.
540
- *
541
- */
542
- const credentials = { name: 'jota_unpublish_fail', password: 'secretPass' };
543
- const pkgName = 'non-unpublish';
544
- const newVersion = '1.0.0';
545
- const token = await getNewToken(request(app), credentials);
546
-
547
- const [newErr] = await putPackage(
548
- request(app),
549
- `/${pkgName}`,
550
- generatePackageMetadata(pkgName, newVersion),
551
- token
552
- );
553
- if (newErr) {
554
- expect(newErr).toBeNull();
555
- return Promise.reject(newErr);
556
- }
557
-
558
- const deletePayload = generatePackageUnpublish(pkgName, ['2.0.0']);
559
- const [err2, res2] = await putPackage(
560
- request(app),
561
- generateUnPublishURI(pkgName),
562
- deletePayload,
563
- token
564
- );
565
-
566
- expect(err2).not.toBeNull();
567
- expect(res2.body.error).toMatch(
568
- /user jota_unpublish_fail is not allowed to unpublish package non-unpublish/
569
- );
570
- });
571
-
572
- test('should fail if publish prop is not defined', async () => {
573
- /**
574
- * Context:
575
- *
576
- * 'non-unpublish':
577
- access: $authenticated
578
- publish: jota_unpublish_fail
579
- # There is some conditions to keep on mind here
580
- # - If unpublish is empty, fallback with the publish value
581
- # - If the user has permissions to publish and this empty it will be allowed to unpublish
582
- # - If we want to forbid anyone to unpublish, just write here any non-existing user
583
- unpublish: none
584
-
585
- The result of this test should fail and even if jota_unpublish_fail is allowed
586
- to publish.
587
-
588
- *
589
- */
590
- const credentials = { name: 'jota_only_unpublish_fail', password: 'secretPass' };
591
- const pkgName = 'only-unpublish';
592
- const newVersion = '1.0.0';
593
- const token = await getNewToken(request(app), credentials);
594
-
595
- const [newErr, resp] = await putPackage(
596
- request(app),
597
- `/${pkgName}`,
598
- generatePackageMetadata(pkgName, newVersion),
599
- token
600
- );
601
-
602
- expect(newErr).not.toBeNull();
603
- expect(resp.body.error).toMatch(
604
- /user jota_only_unpublish_fail is not allowed to publish package only-unpublish/
605
- );
606
- });
607
- });
608
-
609
- test('should be able to publish/unpublish by only super_admin user', async () => {
610
- const credentials = { name: 'super_admin', password: 'secretPass' };
611
- const token = await getNewToken(request(app), credentials);
612
- return new Promise((resolve, reject) => {
613
- request(app)
614
- .put('/super-admin-can-unpublish')
615
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
616
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
617
- .send(
618
- JSON.stringify(
619
- _.assign({}, publishMetadata, {
620
- name: 'super-admin-can-unpublish',
621
- })
622
- )
623
- )
624
- .expect(HTTP_STATUS.CREATED)
625
- .end(function (err, res) {
626
- if (err) {
627
- expect(err).toBeNull();
628
- return reject(err);
629
- }
630
- expect(res.body.ok).toBeDefined();
631
- expect(res.body.success).toBeDefined();
632
- expect(res.body.success).toBeTruthy();
633
- expect(res.body.ok).toMatch(API_MESSAGE.PKG_CREATED);
634
- request(app)
635
- .del('/super-admin-can-unpublish/-rev/4-6abcdb4efd41a576')
636
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
637
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
638
- .expect(HTTP_STATUS.CREATED)
639
- .end(function (err, res) {
640
- expect(err).toBeNull();
641
- expect(res.body.ok).toBeDefined();
642
- expect(res.body.ok).toMatch(API_MESSAGE.PKG_REMOVED);
643
- resolve(res);
644
- });
645
- });
646
- });
647
- });
648
-
649
- test('should be able to publish/unpublish by any user', async () => {
650
- const credentials = { name: 'any_user', password: 'secretPass' };
651
- const token = await getNewToken(request(app), credentials);
652
- return new Promise((resolve, reject) => {
653
- request(app)
654
- .put('/all-can-unpublish')
655
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
656
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
657
- .send(
658
- JSON.stringify(
659
- _.assign({}, publishMetadata, {
660
- name: 'all-can-unpublish',
661
- })
662
- )
663
- )
664
- .expect(HTTP_STATUS.CREATED)
665
- .end(function (err, res) {
666
- if (err) {
667
- expect(err).toBeNull();
668
- return reject(err);
669
- }
670
- expect(res.body.ok).toBeDefined();
671
- expect(res.body.success).toBeDefined();
672
- expect(res.body.success).toBeTruthy();
673
- expect(res.body.ok).toMatch(API_MESSAGE.PKG_CREATED);
674
- request(app)
675
- .del('/all-can-unpublish/-rev/4-6abcdb4efd41a576')
676
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
677
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
678
- .expect(HTTP_STATUS.CREATED)
679
- .end(function (err, res) {
680
- expect(err).toBeNull();
681
- expect(res.body.ok).toBeDefined();
682
- expect(res.body.ok).toMatch(API_MESSAGE.PKG_REMOVED);
683
- resolve(res);
684
- });
685
- });
686
- });
687
- });
688
- });
689
-
690
- describe('should test star and stars api', () => {
691
- const pkgName = '@scope/starPackage';
692
- const credentials = { name: 'jota_star', password: 'secretPass' };
693
- let token = '';
694
- beforeAll(async () => {
695
- token = await getNewToken(request(app), credentials);
696
- await putPackage(request(app), `/${pkgName}`, generatePackageMetadata(pkgName), token);
697
- });
698
-
699
- test('should star a package', (done) => {
700
- request(app)
701
- .put(`/${pkgName}`)
702
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
703
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
704
- .send(
705
- JSON.stringify(
706
- generateStarMedatada(pkgName, {
707
- [credentials.name]: true,
708
- })
709
- )
710
- )
711
- .expect(HTTP_STATUS.OK)
712
- .end(function (err, res) {
713
- if (err) {
714
- expect(err).toBeNull();
715
- return done(err);
716
- }
717
- expect(res.body.success).toBeDefined();
718
- expect(res.body.success).toBeTruthy();
719
- done();
720
- });
721
- });
722
-
723
- test('should unstar a package', (done) => {
724
- request(app)
725
- .put(`/${pkgName}`)
726
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
727
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
728
- .send(JSON.stringify(generateStarMedatada(pkgName, {})))
729
- .expect(HTTP_STATUS.OK)
730
- .end(function (err, res) {
731
- if (err) {
732
- expect(err).toBeNull();
733
- return done(err);
734
- }
735
- expect(res.body.success).toBeDefined();
736
- expect(res.body.success).toBeTruthy();
737
- done();
738
- });
739
- });
740
-
741
- test('should retrieve stars list with credentials', async () => {
742
- return new Promise((resolve, reject) => {
743
- request(app)
744
- .put(`/${pkgName}`)
745
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
746
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
747
- .send(generateStarMedatada(pkgName, { [credentials.name]: true }))
748
- .expect(HTTP_STATUS.OK)
749
- .end(function (err) {
750
- if (err) {
751
- expect(err).toBeNull();
752
- return reject(err);
753
- }
754
- request(app)
755
- .get('/-/_view/starredByUser')
756
- .set(HEADERS.AUTHORIZATION, buildToken(TOKEN_BEARER, token))
757
- .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
758
- .send(
759
- JSON.stringify({
760
- key: [credentials.name],
761
- })
762
- )
763
- .expect(HTTP_STATUS.OK)
764
- .end(function (err, res) {
765
- if (err) {
766
- expect(err).toBeNull();
767
- return reject(err);
768
- }
769
- expect(res.body.rows).toBeDefined();
770
- expect(res.body.rows).toHaveLength(1);
771
- resolve(res);
772
- });
773
- });
774
- });
775
- });
776
- });
777
-
778
- describe('should test (un)deprecate api', () => {
779
- const pkgName = '@scope/deprecate';
780
- const credentials = { name: 'jota_deprecate', password: 'secretPass' };
781
- const version = '1.0.0';
782
- let token = '';
783
- beforeAll(async () => {
784
- token = await getNewToken(request(app), credentials);
785
- await putPackage(
786
- request(app),
787
- `/${pkgName}`,
788
- generatePackageMetadata(pkgName, version),
789
- token
790
- );
791
- });
792
-
793
- test('should deprecate a package', async () => {
794
- const pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
795
- const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
796
- if (err) {
797
- expect(err).toBeNull();
798
- return Promise.reject(err);
799
- }
800
- const [, res] = await getPackage(request(app), '', pkgName);
801
- expect(res.body.versions[version].deprecated).toEqual('get deprecated');
802
- });
803
-
804
- test('should undeprecate a package', async () => {
805
- let pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
806
- await putPackage(request(app), `/${pkgName}`, pkg, token);
807
- pkg = generateDeprecateMetadata(pkgName, version, '');
808
- const [err] = await putPackage(request(app), `/${pkgName}`, pkg, token);
809
- if (err) {
810
- expect(err).toBeNull();
811
- return;
812
- }
813
- const [, res] = await getPackage(request(app), '', pkgName);
814
- expect(res.body.versions[version].deprecated).not.toBeDefined();
815
- });
816
-
817
- test(
818
- 'should require both publish and unpublish access to ' + '(un)deprecate a package',
819
- async () => {
820
- let credentials = { name: 'only_publish', password: 'secretPass' };
821
- let token = await getNewToken(request(app), credentials);
822
- const pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
823
- const [err, res] = await putPackage(request(app), `/${pkgName}`, pkg, token);
824
- expect(err).not.toBeNull();
825
- expect(res.body.error).toBeDefined();
826
- expect(res.body.error).toMatch(
827
- /user only_publish is not allowed to unpublish package @scope\/deprecate/
828
- );
829
- credentials = { name: 'only_unpublish', password: 'secretPass' };
830
- token = await getNewToken(request(app), credentials);
831
- const [err2, res2] = await putPackage(request(app), `/${pkgName}`, pkg, token);
832
- expect(err2).not.toBeNull();
833
- expect(res2.body.error).toBeDefined();
834
- expect(res2.body.error).toMatch(
835
- /user only_unpublish is not allowed to publish package @scope\/deprecate/
836
- );
837
- }
838
- );
839
-
840
- test('should deprecate multiple packages', async () => {
841
- await putPackage(
842
- request(app),
843
- `/${pkgName}`,
844
- generatePackageMetadata(pkgName, '1.0.1'),
845
- token
846
- );
847
- const pkg = generateDeprecateMetadata(pkgName, version, 'get deprecated');
848
- pkg.versions['1.0.1'] = {
849
- ...generateVersion(pkgName, '1.0.1'),
850
- deprecated: 'get deprecated',
851
- };
852
- await putPackage(request(app), `/${pkgName}`, pkg, token);
853
- const [, res] = await getPackage(request(app), '', pkgName);
854
- return new Promise((resolve) => {
855
- expect(res.body.versions[version].deprecated).toEqual('get deprecated');
856
- expect(res.body.versions['1.0.1'].deprecated).toEqual('get deprecated');
857
- resolve(res);
858
- });
859
- });
860
- });
861
- });
862
- });