← back to IWasCute

verification/TK-11380/rollback-test.cjs

22 lines

const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const assert = require('node:assert/strict');
const { execFileSync } = require('node:child_process');
const script = fs.readFileSync(path.join(__dirname, 'deploy-remote.sh'), 'utf8');
const recover = script.slice(script.indexOf('recover() {'), script.indexOf('\ncase '));
for (const partial of [false, true]) {
  const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'iwascute-rollback-'));
  const app = path.join(dir, 'app'), state = path.join(dir, 'state');
  fs.mkdirSync(app); fs.mkdirSync(state);
  for (const item of ['.next', 'node_modules']) {
    const old = partial && item === 'node_modules' ? path.join(app, item) : path.join(state, 'previous.' + item.replace(/^\./, ''));
    fs.mkdirSync(old); fs.writeFileSync(path.join(old, 'identity'), 'old');
    if (!partial) { fs.mkdirSync(path.join(app, item)); fs.writeFileSync(path.join(app, item, 'identity'), 'new'); }
  }
  execFileSync('bash', ['-c', 'set -eu\npm2(){ :; }\ngit(){ return 0; }\n' + recover + '\nrecover'], { env: { ...process.env, APP: app, STATE: state, PATCH: '/unused-in-rehearsal' } });
  for (const item of ['.next', 'node_modules']) assert.equal(fs.readFileSync(path.join(app, item, 'identity'), 'utf8'), 'old');
  if (!partial) for (const item of ['next', 'node_modules']) assert.equal(fs.readFileSync(path.join(state, 'failed.' + item, 'identity'), 'utf8'), 'new');
}
console.log('PASS rollback filesystem rehearsal: complete and partial activation; PM2/Git mocked');