From f37f42fb4667af2335718bb5a067585fc4a85c5e Mon Sep 17 00:00:00 2001 From: Ihor Chulinda Date: Wed, 7 Mar 2018 11:17:50 +0100 Subject: [PATCH] feat(core): abstract environment api --- .../baset-core/src/abstractEnvironment.ts | 8 ++++-- packages/baset-core/src/index.ts | 2 +- packages/baset-core/src/testGroup.ts | 28 ++++++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/baset-core/src/abstractEnvironment.ts b/packages/baset-core/src/abstractEnvironment.ts index 768c3cf1..023803e1 100644 --- a/packages/baset-core/src/abstractEnvironment.ts +++ b/packages/baset-core/src/abstractEnvironment.ts @@ -1,6 +1,10 @@ -export abstract class AbstractEnvironmet { +import { IDictionary } from './utils'; + +export abstract class AbstractEnvironment { constructor(public options: any) { } + abstract getContextImport(sandbox: IDictionary): string; + abstract dispose(): void; } export type IEnvironmentConstructor = - new (options: any) => AbstractEnvironmet; + new (options: any) => AbstractEnvironment; diff --git a/packages/baset-core/src/index.ts b/packages/baset-core/src/index.ts index d6c52297..aba2b961 100644 --- a/packages/baset-core/src/index.ts +++ b/packages/baset-core/src/index.ts @@ -4,7 +4,7 @@ import * as utils from './utils'; export { AbstractBaseliner } from './abstractBaseliner'; export { AbstractReader, AddHook, AddFileResolver } from './abstractReader'; export { AbstractResolver } from './abstractResolver'; -export { AbstractEnvironmet } from './abstractEnvironment'; +export { AbstractEnvironment } from './abstractEnvironment'; export { circularReference, ITestGroupOptions } from './testGroup'; export { Tester } from './tester'; export { diff --git a/packages/baset-core/src/testGroup.ts b/packages/baset-core/src/testGroup.ts index 0e74878d..d627ce08 100644 --- a/packages/baset-core/src/testGroup.ts +++ b/packages/baset-core/src/testGroup.ts @@ -3,7 +3,7 @@ import fs from 'fs'; import path from 'path'; import { isPrimitive } from 'util'; import { AbstractBaseliner, IBaselinerConstructor } from './abstractBaseliner'; -import { AbstractEnvironmet } from './abstractEnvironment'; +import { AbstractEnvironment, IEnvironmentConstructor } from './abstractEnvironment'; import { AbstractReader, IHookOptions, IReaderConstructor } from './abstractReader'; import { AbstractResolver, IResolverConstructor } from './abstractResolver'; import { IDictionary, isExists, readFile } from './utils'; @@ -20,12 +20,11 @@ export interface ITestGroupOptions { export class TestGroup { private baseliner: AbstractBaseliner; - // private environemt: AbstractEnvironmet; + private environment?: AbstractEnvironment; private references = new WeakMap(); private pattern: RegExp; private readerChain: AbstractReader[]; private resolvers: AbstractResolver[]; - private allImports: string[]; private indexOfResolver: (obj: any, context: NodeVM, sandbox: IDictionary) => Promise; constructor( pattern: string | RegExp, @@ -48,6 +47,12 @@ export class TestGroup { return new resolver(pluginsOptions[resolverName]); }); + if (options.environment) { + const environment: IEnvironmentConstructor = require(path.resolve(options.environment)).default; + + this.environment = new environment(pluginsOptions[options.environment] || pluginsOptions[path.basename(options.environment)]); + } + const resolveMatchers = this.resolvers .map((resolver, index) => async (toMatch: any, context: NodeVM, sandbox: IDictionary) => resolver.match(toMatch, context, sandbox)); @@ -56,11 +61,6 @@ export class TestGroup { resolveMatchers .map(matcher => matcher(obj, context, sandbox)))) .indexOf(true); - - this.allImports = [ - options.environment, - ...options.imports, - ].filter((importName): importName is string => !!importName); } match = (filePath: string) => @@ -70,12 +70,17 @@ export class TestGroup { const resolvedPath = path.resolve(filePath); const compiler = this.getCompiler(); const sandbox: IDictionary = {}; + const envImport = this.environment && this.environment.getContextImport(sandbox); + const imports = [ + envImport, + ...this.options.imports, + ].filter((importName): importName is string => !!importName); const context = new NodeVM({ require: { builtin: ['*'], context: 'sandbox', external: true, - import: this.allImports, + import: imports, }, sandbox: { basetSandbox: sandbox }, compiler: compiler.compile, @@ -97,9 +102,12 @@ export class TestGroup { ? readFile(baselinePath, { encoding: 'utf-8' }) : new Promise(resolve => resolve('')); + const output = await this.baseliner.compare(testsResults, baselineValue); + this.environment && this.environment.dispose(); + return { path: baselinePath, - output: await this.baseliner.compare(testsResults, baselineValue), + output, }; } // tslint:disable-next-line:no-any