111 lines
4.5 KiB
TypeScript
111 lines
4.5 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {matchesVersion} from '../../../utils/testing/semver-matchers';
|
|
import {fetchLongTermSupportBranchesFromNpm} from '../../versioning/long-term-support';
|
|
import {ReleaseTrain} from '../../versioning/release-trains';
|
|
import {CutLongTermSupportPatchAction} from '../actions/cut-lts-patch';
|
|
|
|
import {expectStagingAndPublishWithCherryPick, fakeNpmPackageQueryRequest, getTestingMocksForReleaseAction, parse, setupReleaseActionForTesting, testTmpDir} from './test-utils';
|
|
|
|
describe('cut an LTS patch action', () => {
|
|
it('should be active', async () => {
|
|
expect(await CutLongTermSupportPatchAction.isActive({
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.1.0-next.3')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(true);
|
|
});
|
|
|
|
it('should be active if there is a feature-freeze train', async () => {
|
|
expect(await CutLongTermSupportPatchAction.isActive({
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-next.3')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.3')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(true);
|
|
});
|
|
|
|
it('should be active if there is a release-candidate train', async () => {
|
|
expect(await CutLongTermSupportPatchAction.isActive({
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.3')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(true);
|
|
});
|
|
|
|
it('should compute proper new version and select correct branch', async () => {
|
|
const action = setupReleaseActionForTesting(CutLongTermSupportPatchAction, {
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.1.0-next.3')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.2')),
|
|
});
|
|
|
|
spyOn<any>(action.instance, '_promptForTargetLtsBranch')
|
|
.and.resolveTo({name: '9.2.x', version: parse('9.2.4'), npmDistTag: 'v9-lts'});
|
|
|
|
await expectStagingAndPublishWithCherryPick(action, '9.2.x', '9.2.5', 'v9-lts');
|
|
});
|
|
|
|
it('should include number of active LTS branches in action description', async () => {
|
|
const {releaseConfig, gitClient} = getTestingMocksForReleaseAction();
|
|
const activeReleaseTrains = {
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.1.0-next.3')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.2')),
|
|
};
|
|
|
|
fakeNpmPackageQueryRequest(releaseConfig.npmPackages[0], {
|
|
'dist-tags': {'v9-lts': '9.1.2', 'v8-lts': '8.2.2'},
|
|
'time': {
|
|
'9.0.0': new Date().toISOString(),
|
|
'8.0.0': new Date().toISOString(),
|
|
},
|
|
});
|
|
|
|
const action = new CutLongTermSupportPatchAction(
|
|
activeReleaseTrains, gitClient, releaseConfig, testTmpDir);
|
|
|
|
expect(await action.getDescription())
|
|
.toEqual(`Cut a new release for an active LTS branch (2 active).`);
|
|
});
|
|
|
|
it('should properly determine active and inactive LTS branches', async () => {
|
|
const {releaseConfig} = getTestingMocksForReleaseAction();
|
|
fakeNpmPackageQueryRequest(releaseConfig.npmPackages[0], {
|
|
'dist-tags': {
|
|
'v9-lts': '9.2.3',
|
|
'v8-lts': '8.4.4',
|
|
'v7-lts': '7.0.1',
|
|
'v6-lts': '6.0.0',
|
|
},
|
|
time: {
|
|
'9.0.0': new Date().toISOString(),
|
|
'8.0.0': new Date().toISOString(),
|
|
// We pick dates for the v6 and v7 major versions that guarantee that the version
|
|
// is no longer considered as active LTS version.
|
|
'7.0.0': new Date(1912, 5, 23).toISOString(),
|
|
'6.0.0': new Date(1912, 5, 23).toISOString(),
|
|
},
|
|
});
|
|
|
|
// Note: This accesses a private method, so we need to use an element access to satisfy
|
|
// TypeScript. It is acceptable to access the member for fine-grained unit testing due to
|
|
// complexity with inquirer we want to avoid. It is not easy to test prompts.
|
|
const {active, inactive} = await fetchLongTermSupportBranchesFromNpm(releaseConfig);
|
|
|
|
expect(active).toEqual([
|
|
{name: '9.2.x', version: matchesVersion('9.2.3'), npmDistTag: 'v9-lts'},
|
|
{name: '8.4.x', version: matchesVersion('8.4.4'), npmDistTag: 'v8-lts'},
|
|
]);
|
|
expect(inactive).toEqual([
|
|
{name: '7.0.x', version: matchesVersion('7.0.1'), npmDistTag: 'v7-lts'},
|
|
{name: '6.0.x', version: matchesVersion('6.0.0'), npmDistTag: 'v6-lts'},
|
|
]);
|
|
});
|
|
});
|