Skip to content

Commit

Permalink
Add basic release script snapshot test (#14280)
Browse files Browse the repository at this point in the history
Added regression test for release scripts
  • Loading branch information
bvaughn committed Nov 23, 2018
1 parent 686f106 commit ed4c4a5
Show file tree
Hide file tree
Showing 5 changed files with 957 additions and 2 deletions.
12 changes: 11 additions & 1 deletion scripts/release/prepare-stable-commands/check-out-packages.js
Expand Up @@ -3,11 +3,21 @@
'use strict';

const {exec} = require('child-process-promise');
const {existsSync} = require('fs');
const {join} = require('path');
const {logPromise} = require('../utils');
const theme = require('../theme');

const run = async ({cwd, packages, version}) => {
const run = async ({cwd, local, packages, version}) => {
if (local) {
// Sanity test
if (!existsSync(join(cwd, 'build', 'node_modules', 'react'))) {
console.error(theme.error`No local build exists.`);
process.exit(1);
}
return;
}

// Cleanup from previous builds
await exec(`rm -rf ./build/node_modules*`, {cwd});
await exec(`mkdir ./build/node_modules`, {cwd});
Expand Down
7 changes: 7 additions & 0 deletions scripts/release/prepare-stable-commands/parse-params.js
Expand Up @@ -6,6 +6,13 @@ const commandLineArgs = require('command-line-args');
const commandLineUsage = require('command-line-usage');

const paramDefinitions = [
{
name: 'local',
type: Boolean,
description:
'Skip NPM and use the build already present in "build/node_modules".',
defaultValue: false,
},
{
name: 'version',
type: String,
Expand Down
Expand Up @@ -158,7 +158,8 @@ const run = async ({cwd, packages, version}, versionsMap) => {
}
if (beforeContents !== afterContents) {
numFilesModified++;
diff += printDiff(path, beforeContents, afterContents);
// Using a relative path for diff helps with the snapshot test
diff += printDiff(relative(cwd, path), beforeContents, afterContents);
writeFileSync(path, afterContents, {cwd});
}
});
Expand Down
97 changes: 97 additions & 0 deletions scripts/release/test.js
@@ -0,0 +1,97 @@
#!/usr/bin/env node

'use strict';

const {exec, spawn} = require('child-process-promise');
const {join} = require('path');
const {readFileSync} = require('fs');
const theme = require('./theme');
const {logPromise, printDiff} = require('./utils');

const cwd = join(__dirname, '..', '..');

const CIRCLE_CI_BUILD = 12707;
const COMMIT = 'b3d1a81a9';
const VERSION = '1.2.3';

const run = async () => {
const defaultOptions = {
cwd,
env: process.env,
};

try {
// Start with a known build/revision:
// https://circleci.com/gh/facebook/react/12707
let promise = spawn(
'node',
['./scripts/release/prepare-canary.js', `--build=${CIRCLE_CI_BUILD}`],
defaultOptions
);
logPromise(
promise,
theme`Checking out canary build {version ${CIRCLE_CI_BUILD}}`
);
await promise;

// Upgrade the above build top a known React version.
// Note that using the --local flag skips NPM checkout.
// This isn't totally necessary but is useful if we want to test an unpublished canary.
promise = spawn(
'node',
[
'./scripts/release/prepare-stable.js',
`--version=0.0.0-${COMMIT}`,
'--local',
],
defaultOptions
);
promise.childProcess.stdin.setEncoding('utf-8');
promise.childProcess.stdout.setEncoding('utf-8');
promise.childProcess.stdout.on('data', data => {
if (data.includes('✓ Version for')) {
// Update all packages to a stable version
promise.childProcess.stdin.write(VERSION);
} else if (data.includes('(y/N)')) {
// Accept all of the confirmation prompts
promise.childProcess.stdin.write('y');
}
});
logPromise(promise, theme`Preparing stable release {version ${VERSION}}`);
await promise;

const beforeContents = readFileSync(
join(cwd, 'scripts/release/test.snapshot'),
'utf-8'
);
await exec('cp build/temp.diff scripts/release/test.snapshot', {cwd});
const afterContents = readFileSync(
join(cwd, 'scripts/release/test.snapshot'),
'utf-8'
);

if (beforeContents === afterContents) {
console.log(theme.header`Snapshot test passed.`);
} else {
printDiff('scripts/release/test.snapshot', beforeContents, afterContents);
console.log();
console.error(theme.error('Snapshot test failed!'));
console.log();
console.log(
'If this failure was expected, please update the contents of the snapshot file:'
);
console.log(
theme` {command git add} {path scripts/release/test.snapshot}`
);
console.log(
theme` {command git commit -m "Updating release script snapshot file."}`
);
process.exit(1);
}
} catch (error) {
console.error(theme.error(error));
process.exit(1);
}
};

run();

0 comments on commit ed4c4a5

Please sign in to comment.