Files
cnpmcore/test/core/service/PackageVersionService.test.ts
fengmk2 4427a4fca5 feat: use egg v4 (#747)
BREAKING CHANGE: only support egg >= 4.0.0

the first app on egg v4

https://github.com/eggjs/egg/issues/3644
2025-02-09 15:43:24 +08:00

447 lines
14 KiB
TypeScript

import { strict as assert } from 'node:assert';
import { app, mock } from '@eggjs/mock/bootstrap';
import npa from 'npm-package-arg';
import { Package as PackageModel } from '../../../app/repository/model/Package';
import { PackageVersion as CnpmPackageVersionModel } from '../../../app//repository/model/PackageVersion';
import { PackageTag as PackageTagModel } from '../../../app/repository/model/PackageTag';
import { PackageVersionService } from '../../../app/core/service/PackageVersionService';
import { PaddingSemVer } from '../../../app/core/entity/PaddingSemVer';
import { BugVersionService } from '../../../app/core/service/BugVersionService';
import { BugVersion } from '../../../app/core/entity/BugVersion';
import { PackageVersionRepository } from '../../../app/repository/PackageVersionRepository';
import { DistRepository } from '../../../app/repository/DistRepository';
describe('test/core/service/PackageVersionService.test.ts', () => {
let distRepository: DistRepository;
let packageVersionService: PackageVersionService;
let bugVersionService: BugVersionService;
let packageVersionRepository: PackageVersionRepository;
beforeEach(async () => {
await app.ready();
await PackageModel.create({
createdAt: new Date(),
updatedAt: new Date(),
packageId: 'mock_package_id',
scope: '',
name: 'mock_package',
isPrivate: false,
description: 'mock desc',
abbreviatedsDistId: 'mock_abbreviated_dist_id',
manifestsDistId: 'mock_manifest_dist_id',
});
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_package_1.0.0',
version: '1.0.0',
abbreviatedDistId: 'mock_abbreviated_dist_id',
manifestDistId: 'mock_manifest_dist_id',
tarDistId: 'mock_tar_dist_id',
readmeDistId: 'mock_readme_dist_id',
publishTime: new Date(),
});
await PackageTagModel.create({
packageId: 'mock_package_id',
packageTagId: 'mock_package_tag_id',
tag: 'latest',
version: '1.0.0',
});
distRepository = await app.getEggObject(DistRepository);
packageVersionService = await app.getEggObject(PackageVersionService);
bugVersionService = await app.getEggObject(BugVersionService);
packageVersionRepository = await app.getEggObject(PackageVersionRepository);
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
if (version === '1.0.0') {
return {
name: 'mock_package',
version: '1.0.0',
};
}
if (version === '1.1.3') {
return {
name: 'mock_package',
version: '1.1.3',
};
}
});
});
afterEach(async () => {
await PackageModel.truncate();
await PackageTagModel.truncate();
await CnpmPackageVersionModel.truncate();
mock.restore();
});
describe('getPackageManifest', () => {
describe('version middlewares', () => {
describe('hit wildcard', () => {
beforeEach(async () => {
// 1.1.0
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_1.1.0',
version: '1.1.0',
abbreviatedDistId: 'mock_2',
manifestDistId: 'mock_manifest_id_2',
tarDistId: 'mock_tar_dist_id_2',
readmeDistId: 'mock_readme_dist_id_2',
publishTime: new Date(),
});
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
assert.equal(version, '1.1.0');
return {
name: 'mock_package',
version: '1.1.0',
};
});
});
it('should return latest for *', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@*'), true);
assert(manifest);
assert.equal(manifest.version, '1.1.0');
});
describe('getVersion should work', () => {
it('should work without options', async () => {
const wildVersion = await packageVersionService.getVersion(npa('mock_package@*'));
const tagVersion = await packageVersionService.getVersion(npa('mock_package@latest'));
assert.equal(wildVersion, '1.1.0');
assert.equal(tagVersion, '1.0.0');
});
});
it('should return latest for x', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@*'), true);
assert(manifest);
assert.equal(manifest.version, '1.1.0');
});
it('should return latest for compose', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@^*||~x'), true);
assert(manifest);
assert.equal(manifest.version, '1.1.0');
});
});
});
describe('hit bug version', () => {
beforeEach(async () => {
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_2',
version: '0.0.9',
abbreviatedDistId: 'mock_2',
manifestDistId: 'mock_manifest_id_2',
tarDistId: 'mock_tar_dist_id_2',
readmeDistId: 'mock_readme_dist_id_2',
publishTime: new Date(),
});
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
assert(version === '0.0.9');
return {
name: 'mock_package',
version: '0.0.9',
};
});
mock(bugVersionService, 'getBugVersion', async () => {
return new BugVersion({
mock_package: {
'1.0.0': {
version: '0.0.9',
reason: 'mock bug version',
},
},
});
});
});
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@latest'), true);
assert(manifest);
assert.equal(manifest.deprecated, '[WARNING] Use 0.0.9 instead of 1.0.0, reason: mock bug version');
});
});
describe('hit range resolution', () => {
beforeEach(async () => {
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_3',
version: '0.0.9',
abbreviatedDistId: 'mock_3',
manifestDistId: 'mock_manifest_id_3',
tarDistId: 'mock_tar_dist_id_3',
readmeDistId: 'mock_readme_dist_id_3',
publishTime: new Date(),
});
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_4',
version: '0.0.10',
abbreviatedDistId: 'mock_4',
manifestDistId: 'mock_manifest_id_4',
tarDistId: 'mock_tar_dist_id_4',
readmeDistId: 'mock_readme_dist_id_4',
publishTime: new Date(),
});
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
if (version === '0.0.9') {
return {
name: 'mock_package',
version: '0.0.9',
};
} else if (version === '0.0.10') {
return {
name: 'mock_package',
version: '0.0.10',
};
}
});
mock(bugVersionService, 'getBugVersion', () => {
return new BugVersion({});
});
});
afterEach(async () => {
await CnpmPackageVersionModel.truncate();
await CnpmPackageVersionModel.truncate();
});
});
describe('hit tag resolution', () => {
beforeEach(async () => {
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_5',
version: '0.0.9',
abbreviatedDistId: 'mock_5',
manifestDistId: 'mock_manifest_id_5',
tarDistId: 'mock_tar_dist_id_5',
readmeDistId: 'mock_readme_dist_id_5',
publishTime: new Date(),
});
await PackageTagModel.create({
packageId: 'mock_package_id',
packageTagId: 'mock_package_tag_id_1.23',
tag: 'beta',
version: '0.0.9',
});
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
assert(version === '0.0.9');
return {
name: 'mock_package',
version: '0.0.9',
};
});
mock(bugVersionService, 'getBugVersion', () => {
return new BugVersion({});
});
});
afterEach(async () => {
await CnpmPackageVersionModel.truncate();
});
});
describe('semver', () => {
beforeEach(async () => {
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_2',
version: '2.0.0',
abbreviatedDistId: 'mock_2',
manifestDistId: 'mock_manifest_id_2',
tarDistId: 'mock_tar_dist_id_2',
readmeDistId: 'mock_readme_dist_id_2',
publishTime: new Date(),
});
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_3',
version: '2.2.0',
abbreviatedDistId: 'mock_3',
manifestDistId: 'mock_manifest_id_2',
tarDistId: 'mock_tar_dist_id_2',
readmeDistId: 'mock_readme_dist_id_2',
publishTime: new Date(),
});
mock(distRepository, 'findPackageVersionManifest', async (_: string, version: string) => {
if (version === '2.2.0') {
return {
name: 'mock_package',
version: '2.2.0',
};
}
if (version === '1.0.0') {
return {
name: 'mock_package',
version: '1.0.0',
};
}
});
});
describe('should return latest tag', () => {
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@^1.0.0'), true);
assert(manifest);
assert(manifest.version === '1.0.0');
});
});
describe('2.x', () => {
it('should return major latest tag', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@^2.0.0'), true);
assert(manifest);
assert(manifest.version === '2.2.0');
});
});
});
});
describe('get alias', () => {
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package_alias@npm:mock_package@^1.0.0'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.0.0',
});
});
});
describe('get tag', () => {
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@latest'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.0.0',
});
});
it('should work for range tag', async () => {
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_package_1.1.3',
version: '1.1.3',
abbreviatedDistId: 'mock_abbreviated_dist_id',
manifestDistId: 'mock_manifest_dist_id',
tarDistId: 'mock_tar_dist_id',
readmeDistId: 'mock_readme_dist_id',
publishTime: new Date(),
});
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_package_1.1.4',
version: '1.1.4',
abbreviatedDistId: 'mock_abbreviated_dist_id',
manifestDistId: 'mock_manifest_dist_id',
tarDistId: 'mock_tar_dist_id',
readmeDistId: 'mock_readme_dist_id',
publishTime: new Date(),
});
await PackageTagModel.create({
packageId: 'mock_package_id',
packageTagId: 'mock_package_tag_1.1',
tag: '1.1',
version: '1.1.3',
});
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@1.1'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.1.3',
});
});
});
describe('get version', () => {
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@1.0.0'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.0.0',
});
});
});
describe('get range', () => {
it('should work', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@^1.0.0'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.0.0',
});
});
it('should work for equal range', async () => {
const manifest = await packageVersionService.readManifest('mock_package_id', npa('mock_package@=1.0.0'), true);
assert.deepStrictEqual(manifest, {
name: 'mock_package',
version: '1.0.0',
});
});
it('should support maxSatisfying', async () => {
// 17.0.18
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_package_17.0.18',
version: '17.0.18',
abbreviatedDistId: 'mock_abbreviated_dist_id',
manifestDistId: 'mock_manifest_dist_id',
tarDistId: 'mock_tar_dist_id',
readmeDistId: 'mock_readme_dist_id',
publishTime: new Date(),
});
await packageVersionRepository.fixPaddingVersion('mock_package_17.0.18', new PaddingSemVer('17.0.18'));
// 17.0.9
await CnpmPackageVersionModel.create({
packageId: 'mock_package_id',
packageVersionId: 'mock_package_17.0.9',
version: '17.0.9',
abbreviatedDistId: 'mock_abbreviated_dist_id',
manifestDistId: 'mock_manifest_dist_id',
tarDistId: 'mock_tar_dist_id',
readmeDistId: 'mock_readme_dist_id',
publishTime: new Date(),
});
await packageVersionRepository.fixPaddingVersion('mock_package_17.0.9', new PaddingSemVer('17.0.9'));
const version = await packageVersionService.getVersion(npa('mock_package@<18.0.0'));
assert(version, '17.0.18');
});
});
});