From 2f04b7ed1f87fe2c6a98d48df0738d08e0469a9b Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 26 Jun 2020 10:37:08 -0700 Subject: [PATCH 1/3] feat(testlab): add transform option for sandbox copyFile --- .../integration/test-sandbox.integration.ts | 21 ++++++++++++++ packages/testlab/src/test-sandbox.ts | 28 ++++++++++++------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/packages/testlab/src/__tests__/integration/test-sandbox.integration.ts b/packages/testlab/src/__tests__/integration/test-sandbox.integration.ts index f8ade846ad53..0981c842fea8 100644 --- a/packages/testlab/src/__tests__/integration/test-sandbox.integration.ts +++ b/packages/testlab/src/__tests__/integration/test-sandbox.integration.ts @@ -36,6 +36,27 @@ describe('TestSandbox integration tests', () => { await expectFilesToBeIdentical(COPY_FILE_PATH, resolve(path, COPY_FILE)); }); + it('copies a file to the sandbox with transform', async () => { + await sandbox.copyFile(COPY_FILE_PATH, undefined, content => + content.toUpperCase(), + ); + const dest = resolve(path, COPY_FILE); + expect(await pathExists(dest)).to.be.True(); + const content = await readFile(dest, 'utf-8'); + expect(content).to.equal('HELLO WORLD!'); + }); + + it('copies a file to the sandbox with dest and transform', async () => { + const rename = 'copy.me.js'; + await sandbox.copyFile(COPY_FILE_PATH, rename, content => + content.toUpperCase(), + ); + const dest = resolve(path, rename); + expect(await pathExists(dest)).to.be.True(); + const content = await readFile(dest, 'utf-8'); + expect(content).to.equal('HELLO WORLD!'); + }); + it('copies and renames the file to the sandbox', async () => { const rename = 'copy.me.js'; await sandbox.copyFile(COPY_FILE_PATH, rename); diff --git a/packages/testlab/src/test-sandbox.ts b/packages/testlab/src/test-sandbox.ts index 9d4ab6e4c6a3..efe7d09bedac 100644 --- a/packages/testlab/src/test-sandbox.ts +++ b/packages/testlab/src/test-sandbox.ts @@ -10,10 +10,11 @@ import { ensureDir, ensureDirSync, mkdtempSync, + outputFile, + outputJson, pathExists, + readFile, remove, - writeFile, - writeJson, } from 'fs-extra'; import {join, parse, resolve} from 'path'; @@ -131,13 +132,24 @@ export class TestSandbox { * @param src - Absolute path of file to be copied to the TestSandbox * @param dest - Optional. Destination filename of the copy operation * (relative to TestSandbox). Original filename used if not specified. + * @param transform - Optional. A function to transform the file content. */ - async copyFile(src: string, dest?: string): Promise { + async copyFile( + src: string, + dest?: string, + transform?: (content: string) => string, + ): Promise { dest = dest ? resolve(this.path, dest) : resolve(this.path, parse(src).base); - await copy(src, dest); + if (transform == null) { + await copy(src, dest); + } else { + let content = await readFile(src, 'utf-8'); + content = transform(content); + await outputFile(dest, content, {encoding: 'utf-8'}); + } if (parse(src).ext === '.js' && pathExists(src + '.map')) { const srcMap = src + '.map'; @@ -153,9 +165,7 @@ export class TestSandbox { */ async writeJsonFile(dest: string, data: unknown): Promise { dest = resolve(this.path, dest); - const destDir = parse(dest).dir; - await ensureDir(destDir); - return writeJson(dest, data, {spaces: 2}); + return outputJson(dest, data, {spaces: 2}); } /** @@ -166,8 +176,6 @@ export class TestSandbox { */ async writeTextFile(dest: string, data: string): Promise { dest = resolve(this.path, dest); - const destDir = parse(dest).dir; - await ensureDir(destDir); - return writeFile(dest, data, {encoding: 'utf-8'}); + return outputFile(dest, data, 'utf-8'); } } From b8d0ca0efa174282432b0df726f7de555d423df5 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Mon, 15 Jun 2020 11:19:18 -0700 Subject: [PATCH 2/3] fix(boot): use unique sandbox subdirs for testing --- .../application-metadata.booter.acceptance.ts | 14 +++++++------- .../component-application.booter.acceptance.ts | 14 ++++++++------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/boot/src/__tests__/acceptance/application-metadata.booter.acceptance.ts b/packages/boot/src/__tests__/acceptance/application-metadata.booter.acceptance.ts index 6da946e3dba4..3de1c8be196a 100644 --- a/packages/boot/src/__tests__/acceptance/application-metadata.booter.acceptance.ts +++ b/packages/boot/src/__tests__/acceptance/application-metadata.booter.acceptance.ts @@ -10,12 +10,7 @@ import {BooterApp} from '../fixtures/application'; describe('application metadata booter acceptance tests', () => { let app: BooterApp; - const sandbox = new TestSandbox(resolve(__dirname, '../../.sandbox'), { - // We intentionally use this flag so that `dist/application.js` can keep - // its relative path to satisfy import statements - subdir: false, - }); - + const sandbox = new TestSandbox(resolve(__dirname, '../../.sandbox')); beforeEach('reset sandbox', () => sandbox.reset()); beforeEach(getApp); @@ -33,14 +28,19 @@ describe('application metadata booter acceptance tests', () => { // Add the following files // - package.json // - dist/application.js - await sandbox.copyFile(resolve(__dirname, '../fixtures/package.json')); + await sandbox.copyFile( resolve(__dirname, '../fixtures/application.js'), 'dist/application.js', + // Adjust the relative path for `import` + content => content.replace('../..', '../../..'), ); + await sandbox.copyFile(resolve(__dirname, '../fixtures/package.json')); + const MyApp = require(resolve(sandbox.path, 'dist/application.js')) .BooterApp; + app = new MyApp({ rest: givenHttpServerConfig(), }); diff --git a/packages/boot/src/__tests__/acceptance/component-application.booter.acceptance.ts b/packages/boot/src/__tests__/acceptance/component-application.booter.acceptance.ts index 2f87ddb53c07..7ccce707386f 100644 --- a/packages/boot/src/__tests__/acceptance/component-application.booter.acceptance.ts +++ b/packages/boot/src/__tests__/acceptance/component-application.booter.acceptance.ts @@ -13,11 +13,7 @@ import {BooterApp} from '../fixtures/application'; describe('component application booter acceptance tests', () => { let app: BooterApp; - const sandbox = new TestSandbox(resolve(__dirname, '../../.sandbox'), { - // We intentionally use this flag so that `dist/application.js` can keep - // its relative path to satisfy import statements - subdir: false, - }); + const sandbox = new TestSandbox(resolve(__dirname, '../../.sandbox')); beforeEach('reset sandbox', () => sandbox.reset()); beforeEach(getApp); @@ -87,8 +83,14 @@ describe('component application booter acceptance tests', () => { } async function getApp() { + await sandbox.copyFile( + resolve(__dirname, '../fixtures/application.js'), + 'application.js', + // Adjust the relative path for `import` + content => content.replace('../..', '../../..'), + ); + await sandbox.copyFile(resolve(__dirname, '../fixtures/package.json')); - await sandbox.copyFile(resolve(__dirname, '../fixtures/application.js')); await sandbox.copyFile( resolve(__dirname, '../fixtures/multiple.artifact.js'), 'controllers/multiple.controller.js', From 6ad5c9e52e8afcbf9c1e47b1a22db3d0b515fb1c Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Mon, 15 Jun 2020 11:19:45 -0700 Subject: [PATCH 3/3] chore(boot): clean up stopApp --- .../__tests__/acceptance/controller.booter.acceptance.ts | 6 +----- .../acceptance/crud-rest.api-builder.acceptance.ts | 3 +-- .../src/__tests__/acceptance/model-api.booter.acceptance.ts | 6 +----- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/boot/src/__tests__/acceptance/controller.booter.acceptance.ts b/packages/boot/src/__tests__/acceptance/controller.booter.acceptance.ts index 5104728c21b7..dc8d2258164d 100644 --- a/packages/boot/src/__tests__/acceptance/controller.booter.acceptance.ts +++ b/packages/boot/src/__tests__/acceptance/controller.booter.acceptance.ts @@ -46,10 +46,6 @@ describe('controller booter acceptance tests', () => { } async function stopApp() { - try { - await app.stop(); - } catch (err) { - console.log(`Stopping the app threw an error: ${err}`); - } + await app?.stop(); } }); diff --git a/packages/boot/src/__tests__/acceptance/crud-rest.api-builder.acceptance.ts b/packages/boot/src/__tests__/acceptance/crud-rest.api-builder.acceptance.ts index 241d0c6ddb35..5cee86b9b78b 100644 --- a/packages/boot/src/__tests__/acceptance/crud-rest.api-builder.acceptance.ts +++ b/packages/boot/src/__tests__/acceptance/crud-rest.api-builder.acceptance.ts @@ -165,7 +165,6 @@ module.exports = { } async function stopApp() { - if (app.state !== 'started') return; - await app.stop(); + if (app?.state === 'started') await app?.stop(); } }); diff --git a/packages/boot/src/__tests__/acceptance/model-api.booter.acceptance.ts b/packages/boot/src/__tests__/acceptance/model-api.booter.acceptance.ts index f1ccfe6babce..c610e517fbcd 100644 --- a/packages/boot/src/__tests__/acceptance/model-api.booter.acceptance.ts +++ b/packages/boot/src/__tests__/acceptance/model-api.booter.acceptance.ts @@ -167,10 +167,6 @@ module.exports = { } async function stopApp() { - try { - await app.stop(); - } catch (err) { - // console.error('Cannot stop the app, ignoring the error.', err); - } + if (app?.state === 'started') await app?.stop(); } });