From 46d71c2e4fe775fa6e8bf208a797b5491287652c Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Mon, 17 May 2021 20:47:15 -0300 Subject: [PATCH] Fix test using promised generator. (#152) --- lib/run-context.js | 34 ++++++++++++++++++++++----------- test/run-context-environment.js | 27 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/run-context.js b/lib/run-context.js index 9012d05..3fad5d2 100644 --- a/lib/run-context.js +++ b/lib/run-context.js @@ -138,16 +138,25 @@ RunContext.prototype.build = function (callback = () => {}) { this.env.registerStub(this.Generator, namespace, this.settings.resolved); } - this.generator = this.env.create(namespace, { - arguments: this.args, - options: this.options + this._generatorPromise = Promise.resolve( + this.env.create(namespace, { + arguments: this.args, + options: this.options + }) + ); + + this._generatorPromise.then((generator) => { + this.generator = generator; }); this.helpers.mockPrompt(this.env, this.answers, this.promptOptions); if (this.localConfig) { // Only mock local config when withLocalConfig was called - this.helpers.mockLocalConfig(this.generator, this.localConfig); + this._generatorPromise = this._generatorPromise.then((generator) => { + this.helpers.mockLocalConfig(generator, this.localConfig); + return generator; + }); } callback(this); @@ -163,7 +172,8 @@ RunContext.prototype._run = function () { this.buildAsync = true; if (this.build() === false) return false; - this.emit('ready', this.generator); + this._generatorPromise.then((generator) => this.emit('ready', generator)); + this.run() .catch((error) => { if ( @@ -200,12 +210,14 @@ RunContext.prototype.run = function () { this.build(); } - return this.env - .runGenerator(this.generator) - .then(() => new RunResult(this._createRunResultOptions())) - .finally(() => { - this.helpers.restorePrompt(this.env); - }); + return this._generatorPromise.then((generator) => + this.env + .runGenerator(generator) + .then(() => new RunResult(this._createRunResultOptions())) + .finally(() => { + this.helpers.restorePrompt(this.env); + }) + ); }; RunContext.prototype._createRunResultOptions = function () { diff --git a/test/run-context-environment.js b/test/run-context-environment.js index 2db4d59..b70afc0 100644 --- a/test/run-context-environment.js +++ b/test/run-context-environment.js @@ -2,6 +2,7 @@ 'use strict'; const assert = require('assert'); const path = require('path'); +const sinon = require('sinon'); const helpers = require('../lib'); const RunContext = require('../lib/run-context'); @@ -93,6 +94,32 @@ describe('RunContext running environment', function () { }); }); + describe('with promised generator', () => { + before(() => { + gen = 'promised-generator'; + build = false; + }); + beforeEach(() => { + ctx.withEnvironment((env) => { + const FakeGenerator = helpers.createDummyGenerator(); + const fake = sinon.fake.returns( + Promise.resolve(new FakeGenerator({env})) + ); + sinon.replace(env, 'create', fake); + }); + }); + after(() => { + gen = undefined; + build = true; + }); + + it('runs the generator', () => { + return ctx.run().then(() => { + assert(ctx.generator.shouldRun); + }); + }); + }); + describe('with path', () => { before(() => { gen = require.resolve('./fixtures/generator-simple/app');