Skip to content

Commit 79bc657

Browse files
Merge pull request #180 from browserstack/CYP-870-fix-npm-console-message
Fix sticky npm console message
2 parents f6748f0 + 5319910 commit 79bc657

File tree

4 files changed

+53
-85
lines changed

4 files changed

+53
-85
lines changed

bin/helpers/constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const userMessages = {
2626
MD5_CHECK_FAILED: "There was some issue while checking if zip is already uploaded.",
2727
ZIP_DELETE_FAILED: "Could not delete tests.zip successfully.",
2828
ZIP_DELETED: "Deleted tests.zip successfully.",
29+
NPM_INSTALL_AND_UPLOAD: "Installing required dependencies and building the package to upload to BrowserStack",
2930
NPM_DELETE_FAILED: "Could not delete the dependency packages.",
3031
NPM_DELETED: "Deleted dependency packages successfully.",
3132
API_DEPRECATED: "This version of API is deprecated, please use latest version of API.",

bin/helpers/packageInstaller.js

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
'use strict';
2-
const npm = require('npm'),
3-
archiver = require("archiver"),
2+
const archiver = require("archiver"),
43
path = require('path'),
5-
os = require('os'),
64
fs = require('fs-extra'),
75
fileHelpers = require('./fileHelpers'),
86
logger = require("./logger").winstonLogger,
97
Constants = require('./constants'),
108
process = require('process'),
11-
utils = require('./utils');
9+
utils = require('./utils'),
10+
{ spawn } = require('child_process');
11+
12+
let nodeProcess;
1213

1314
const setupPackageFolder = (runSettings, directoryPath) => {
1415
return new Promise(function (resolve, reject) {
@@ -39,7 +40,7 @@ const setupPackageFolder = (runSettings, directoryPath) => {
3940
if (fs.existsSync(sourceNpmrc)) {
4041
fs.copyFileSync(sourceNpmrc, destNpmrc);
4142
}
42-
return resolve("package file created");
43+
return resolve("Package file created");
4344
}
4445
return reject("Nothing in package file");
4546
} catch(error) {
@@ -51,25 +52,20 @@ const setupPackageFolder = (runSettings, directoryPath) => {
5152

5253
const packageInstall = (packageDir) => {
5354
return new Promise(function (resolve, reject) {
54-
let savedPrefix = null;
55-
let npmLoad = Constants.packageInstallerOptions.npmLoad
56-
npmLoad["cache"] = fs.mkdtempSync(`${os.tmpdir()}${path.sep}`);
57-
const installCallback = (err, result) => {
58-
npm.prefix = savedPrefix;
59-
if (err) {
60-
return reject(err);
55+
const nodeProcessCloseCallback = (code) => {
56+
if(code == 0) {
57+
resolve('Packages were installed successfully.');
58+
} else {
59+
reject('Packages were not installed successfully.');
6160
}
62-
resolve(result);
6361
};
64-
const loadCallback = (err) => {
65-
if (err) {
66-
return reject(err);
67-
}
68-
savedPrefix = npm.prefix;
69-
npm.prefix = packageDir;
70-
npm.commands.install(packageDir, [], installCallback);
62+
const nodeProcessErrorCallback = (error) => {
63+
logger.error(`Some error occurred while installing packages: ${error}`);
64+
reject(`Packages were not installed successfully.`);
7165
};
72-
npm.load(npmLoad, loadCallback);
66+
nodeProcess = spawn('npm', ['install'], {cwd: packageDir});
67+
nodeProcess.on('close', nodeProcessCloseCallback);
68+
nodeProcess.on('error', nodeProcessErrorCallback);
7369
});
7470
};
7571

@@ -113,7 +109,7 @@ const packageWrapper = (bsConfig, packageDir, packageFile, md5data, instrumentBl
113109
if (md5data.packageUrlPresent || !utils.isTrueString(bsConfig.run_settings.cache_dependencies)) {
114110
return resolve(obj);
115111
}
116-
logger.info(`Installing required dependencies and building the package to upload to BrowserStack`);
112+
logger.info(Constants.userMessages.NPM_INSTALL_AND_UPLOAD);
117113
instrumentBlocks.markBlockStart("packageInstaller.folderSetup");
118114
return setupPackageFolder(bsConfig.run_settings, packageDir).then((_result) => {
119115
process.env.CYPRESS_INSTALL_BINARY = 0

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
"uuid": "^8.3.2",
2727
"winston": "^2.3.1",
2828
"yargs": "^14.2.3",
29-
"npm": "^6.14.15",
3029
"axios": "^0.21.1",
3130
"unzipper": "^0.10.11",
3231
"update-notifier": "^5.1.0"

test/unit/bin/helpers/packageInstaller.js

Lines changed: 34 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const chai = require("chai"),
44
sinon = require("sinon"),
55
fs = require('fs-extra'),
66
path = require('path'),
7-
npm = require('npm');
7+
cp = require('child_process');
88

99
const logger = require("../../../../bin/helpers/logger").winstonLogger,
1010
fileHelpers = require("../../../../bin/helpers/fileHelpers");
@@ -150,7 +150,7 @@ describe("packageInstaller", () => {
150150
sinon.assert.calledOnce(pathdirnameStub);
151151
sinon.assert.calledThrice(pathjoinStub);
152152
sinon.assert.calledWith(fswriteFileSyncStub, null, packageCreated);
153-
chai.assert.equal(data, "package file created");
153+
chai.assert.equal(data, "Package file created");
154154
})
155155
.catch((_error) => {
156156
console.log(_error)
@@ -202,7 +202,7 @@ describe("packageInstaller", () => {
202202
sinon.assert.calledOnce(pathdirnameStub);
203203
sinon.assert.calledThrice(pathjoinStub);
204204
sinon.assert.calledWith(fswriteFileSyncStub, null, packageCreated);
205-
chai.assert.equal(data, "package file created");
205+
chai.assert.equal(data, "Package file created");
206206
})
207207
.catch((_error) => {
208208
console.log(_error)
@@ -212,80 +212,52 @@ describe("packageInstaller", () => {
212212
});
213213

214214
context("packageInstall", () => {
215-
let npmInstallStub;
216215
const packageInstaller = rewire("../../../../bin/helpers/packageInstaller");
217-
beforeEach(() => {
218-
npmInstallStub = sandbox.stub(npm.commands, "install").returns(null);
219-
});
220216

221-
it("should reject if error in npm load", () => {
222-
packageInstaller.__set__({
223-
npm: {
224-
commands: {
225-
install: npmInstallStub
226-
},
227-
load: (_npmLoad, loadCallback) => {
228-
loadCallback("test error");
229-
}
230-
},
217+
it("should call npm install on directory and resolve if spawn is closed successfully", () => {
218+
let spawnStub = sandbox.stub(cp, 'spawn').returns({
219+
on: (_close, nodeProcessCloseCallback) => {
220+
nodeProcessCloseCallback(0);
221+
}
231222
});
232-
let packageInstallrewire = packageInstaller.__get__('packageInstall');
233-
let directoryPath = "/random/path";
234-
return packageInstallrewire(directoryPath)
235-
.then((_data) => {
236-
chai.assert.fail("Promise error");
237-
})
238-
.catch((error) => {
239-
chai.assert.equal(error, "test error")
240-
});
241-
});
242-
243-
it("should call npm install on directory", () => {
244223
packageInstaller.__set__({
245-
npm: {
246-
commands: {
247-
install: (_packageDir, [], installCallback) => {
248-
installCallback(null, "npm install done");
249-
}
250-
},
251-
load: (_npmLoad, loadCallback) => {
252-
loadCallback(null);
253-
}
254-
},
224+
nodeProcess: {},
225+
spawn: spawnStub
255226
});
256227
let packageInstallrewire = packageInstaller.__get__('packageInstall');
257228
let directoryPath = "/random/path";
258229
return packageInstallrewire(directoryPath)
259-
.then((data) => {
260-
chai.assert.equal(data, "npm install done")
261-
})
262-
.catch((_error) => {
263-
chai.assert.fail("Promise error");
264-
});
230+
.then((data) => {
231+
console.log(data);
232+
chai.assert.equal(data, "Packages were installed successfully.")
233+
spawnStub.restore();
234+
})
235+
.catch((_error) => {
236+
chai.assert.fail(`Promise error ${_error}`);
237+
});
265238
});
266239

267-
it("should reject if error in npm install", () => {
240+
it("should call npm install on directory and reject if spawn is not closed successfully", () => {
241+
let spawnStub = sandbox.stub(cp, 'spawn').returns({
242+
on: (_close, nodeProcessCloseCallback) => {
243+
nodeProcessCloseCallback(1);
244+
}
245+
});
268246
packageInstaller.__set__({
269-
npm: {
270-
commands: {
271-
install: (_packageDir, [], installCallback) => {
272-
installCallback("test error", "npm install failed");
273-
}
274-
},
275-
load: (_npmLoad, loadCallback) => {
276-
loadCallback(null);
277-
}
278-
},
247+
nodeProcess: {},
248+
spawn: spawnStub
279249
});
280250
let packageInstallrewire = packageInstaller.__get__('packageInstall');
281251
let directoryPath = "/random/path";
282252
return packageInstallrewire(directoryPath)
283-
.then((_data) => {
284-
chai.assert.fail("Promise error");
285-
})
286-
.catch((error) => {
287-
chai.assert.equal(error, "test error")
288-
});
253+
.then((_data) => {
254+
spawnStub.restore();
255+
chai.assert.fail("Promise error");
256+
})
257+
.catch((error) => {
258+
spawnStub.restore();
259+
chai.assert.equal(error, "Packages were not installed successfully.")
260+
});
289261
});
290262
});
291263

0 commit comments

Comments
 (0)