148 lines
6.5 KiB
TypeScript
148 lines
6.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 {getBranchPushMatcher} from '../../../utils/testing';
|
|
import {ActiveReleaseTrains} from '../../versioning/active-release-trains';
|
|
import * as npm from '../../versioning/npm-publish';
|
|
import {ReleaseTrain} from '../../versioning/release-trains';
|
|
import {MoveNextIntoFeatureFreezeAction} from '../actions/move-next-into-feature-freeze';
|
|
import * as externalCommands from '../external-commands';
|
|
|
|
import {getChangelogForVersion, parse, setupReleaseActionForTesting, testTmpDir} from './test-utils';
|
|
|
|
describe('move next into feature-freeze action', () => {
|
|
it('should not activate if a feature-freeze release-train is active', async () => {
|
|
expect(await MoveNextIntoFeatureFreezeAction.isActive({
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-next.1')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(false);
|
|
});
|
|
|
|
it('should not activate if release-candidate release-train is active', async () => {
|
|
expect(await MoveNextIntoFeatureFreezeAction.isActive({
|
|
// No longer in feature-freeze but in release-candidate phase.
|
|
releaseCandidate: new ReleaseTrain('10.1.x', parse('10.1.0-rc.0')),
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(false);
|
|
});
|
|
|
|
it('should activate if no FF/RC release-train is active', async () => {
|
|
expect(await MoveNextIntoFeatureFreezeAction.isActive({
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.1.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
})).toBe(true);
|
|
});
|
|
|
|
it('should create pull requests and feature-freeze branch', async () => {
|
|
await expectVersionAndBranchToBeCreated(
|
|
{
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
},
|
|
/* isNextPublishedToNpm */ true, '10.3.0-next.0', '10.2.0-next.1', '10.2.x');
|
|
});
|
|
|
|
it('should not increment the version if "next" version is not yet published', async () => {
|
|
await expectVersionAndBranchToBeCreated(
|
|
{
|
|
releaseCandidate: null,
|
|
next: new ReleaseTrain('master', parse('10.2.0-next.0')),
|
|
latest: new ReleaseTrain('10.0.x', parse('10.0.3')),
|
|
},
|
|
/* isNextPublishedToNpm */ false, '10.3.0-next.0', '10.2.0-next.0', '10.2.x');
|
|
});
|
|
|
|
/** Performs the action and expects versions and branches to be determined properly. */
|
|
async function expectVersionAndBranchToBeCreated(
|
|
active: ActiveReleaseTrains, isNextPublishedToNpm: boolean, expectedNextVersion: string,
|
|
expectedVersion: string, expectedNewBranch: string) {
|
|
const {repo, fork, instance, gitClient, releaseConfig} =
|
|
setupReleaseActionForTesting(MoveNextIntoFeatureFreezeAction, active, isNextPublishedToNpm);
|
|
|
|
const expectedNextUpdateBranch = `next-release-train-${expectedNextVersion}`;
|
|
const expectedStagingForkBranch = `release-stage-${expectedVersion}`;
|
|
const expectedTagName = expectedVersion;
|
|
|
|
// We first mock the commit status check for the next branch, then expect two pull
|
|
// requests from a fork that are targeting next and the new feature-freeze branch.
|
|
repo.expectBranchRequest('master', 'MASTER_COMMIT_SHA')
|
|
.expectCommitStatusCheck('MASTER_COMMIT_SHA', 'success')
|
|
.expectFindForkRequest(fork)
|
|
.expectPullRequestToBeCreated(expectedNewBranch, fork, expectedStagingForkBranch, 200)
|
|
.expectPullRequestWait(200)
|
|
.expectBranchRequest(expectedNewBranch, 'STAGING_COMMIT_SHA')
|
|
.expectCommitRequest(
|
|
'STAGING_COMMIT_SHA', `release: cut the v${expectedVersion} release\n\nPR Close #200.`)
|
|
.expectTagToBeCreated(expectedTagName, 'STAGING_COMMIT_SHA')
|
|
.expectReleaseToBeCreated(`v${expectedVersion}`, expectedTagName)
|
|
.expectChangelogFetch(expectedNewBranch, getChangelogForVersion(expectedVersion))
|
|
.expectPullRequestToBeCreated('master', fork, expectedNextUpdateBranch, 100);
|
|
|
|
// In the fork, we make the following branches appear as non-existent,
|
|
// so that the PRs can be created properly without collisions.
|
|
fork.expectBranchRequest(expectedStagingForkBranch, null)
|
|
.expectBranchRequest(expectedNextUpdateBranch, null);
|
|
|
|
await instance.perform();
|
|
|
|
expect(gitClient.pushed.length).toBe(3);
|
|
expect(gitClient.pushed[0])
|
|
.toEqual(
|
|
getBranchPushMatcher({
|
|
baseRepo: repo,
|
|
baseBranch: 'master',
|
|
targetRepo: repo,
|
|
targetBranch: expectedNewBranch,
|
|
expectedCommits: [],
|
|
}),
|
|
'Expected feature-freeze branch to be created upstream and based on "master".');
|
|
expect(gitClient.pushed[1])
|
|
.toEqual(
|
|
getBranchPushMatcher({
|
|
baseBranch: 'master',
|
|
baseRepo: repo,
|
|
targetBranch: expectedStagingForkBranch,
|
|
targetRepo: fork,
|
|
expectedCommits: [{
|
|
message: `release: cut the v${expectedVersion} release`,
|
|
files: ['package.json', 'CHANGELOG.md'],
|
|
}],
|
|
}),
|
|
'Expected release staging branch to be created in fork.');
|
|
|
|
expect(gitClient.pushed[2])
|
|
.toEqual(
|
|
getBranchPushMatcher({
|
|
baseBranch: 'master',
|
|
baseRepo: repo,
|
|
targetBranch: expectedNextUpdateBranch,
|
|
targetRepo: fork,
|
|
expectedCommits: [
|
|
{
|
|
message: `release: bump the next branch to v${expectedNextVersion}`,
|
|
files: ['package.json']
|
|
},
|
|
{
|
|
message: `docs: release notes for the v${expectedVersion} release`,
|
|
files: ['CHANGELOG.md']
|
|
},
|
|
],
|
|
}),
|
|
'Expected next release-train update branch be created in fork.');
|
|
|
|
expect(externalCommands.invokeReleaseBuildCommand).toHaveBeenCalledTimes(1);
|
|
expect(npm.runNpmPublish).toHaveBeenCalledTimes(2);
|
|
expect(npm.runNpmPublish).toHaveBeenCalledWith(`${testTmpDir}/dist/pkg1`, 'next', undefined);
|
|
expect(npm.runNpmPublish).toHaveBeenCalledWith(`${testTmpDir}/dist/pkg2`, 'next', undefined);
|
|
}
|
|
});
|