From ccfe692a38a0df3864c985a60daebb8a9d8175db Mon Sep 17 00:00:00 2001 From: Jakub Szajner <58347164+Jakshas@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:13:42 +0200 Subject: [PATCH] SBVT-1847: (Cypress) Add Pre-checks (#161) * add version check * add import * add checks * SBVT-1847: moving version check to plugins * SBVT-1847: changing the behavior of the pre check commands * SBVT-1847: small fixes * SBVT-1847: small fixes * SBVT-1847: small fixes * SBVT-1847: removing chrome beta --------- Co-authored-by: trevornelms --- .github/workflows/browser_test.yml | 3 +- package-lock.json | 31 +++++++++++++++ package.json | 1 + plugin.js | 64 ++++++++++++++++++++++++++++-- test/package-lock.json | 1 + 5 files changed, 96 insertions(+), 4 deletions(-) diff --git a/.github/workflows/browser_test.yml b/.github/workflows/browser_test.yml index ad83acf..094b366 100644 --- a/.github/workflows/browser_test.yml +++ b/.github/workflows/browser_test.yml @@ -7,7 +7,8 @@ jobs: strategy: fail-fast: false matrix: - browser: [ firefox, chrome, 'chrome:beta', edge ] +# browser: [ firefox, chrome, 'chrome:beta', edge ] + browser: [ firefox, chrome, edge ] #chrome beta causing issues steps: - name: Checkout code diff --git a/package-lock.json b/package-lock.json index 949c358..6c90786 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "jimp": "^0.22.10", "pino": "^8.15.0", "pino-pretty": "^10.2.0", + "semver": "^7.5.4", "uuid": "^9.0.0" }, "bin": { @@ -909,6 +910,17 @@ "xtend": "^4.0.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1283,6 +1295,20 @@ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sonic-boom": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", @@ -1480,6 +1506,11 @@ "engines": { "node": ">=0.4" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index 99c094f..2a1f43d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "jimp": "^0.22.10", "pino": "^8.15.0", "pino-pretty": "^10.2.0", + "semver": "^7.5.4", "uuid": "^9.0.0" }, "repository": { diff --git a/plugin.js b/plugin.js index 288db00..ddcf5be 100644 --- a/plugin.js +++ b/plugin.js @@ -9,6 +9,7 @@ require('dotenv').config(); const Jimp = require("jimp"); const os = require('os'); const pino = require('pino'); +const semver = require("semver"); const targetArray = [{target: 'pino-pretty', level: 'warn'}]; //to log below warn uncomment two lines below let logger = pino(pino.transport({targets: targetArray})); @@ -74,7 +75,11 @@ let configFile = (() => { config.debug = debugFolderPath; //overwrite 'true' to the folder path for passing to commands.js fs.mkdirSync(debugFolderPath, {recursive: true}); - targetArray.push({target: './debug-pino-transport.js', level: 'trace', options: {destination: `${debugFolderPath}/debug.log`}}); + targetArray.push({ + target: './debug-pino-transport.js', + level: 'trace', + options: {destination: `${debugFolderPath}/debug.log`} + }); logger = pino(pino.transport({targets: targetArray})); logger.level = 'trace'; //required to overwrite default 'info' logger.info('"debug: true" found in visualtest.config.js'); @@ -103,12 +108,56 @@ const apiRequest = async (method, url, body, headers) => { headers: headers, data: body }).catch((err) => { + console.log(`Full error is: %o`, err.response.data); logger.info(`Full error is: %o`, err.response.data); return err.response; }); }; +const checkConnectionToBackend = (async (projectToken) => { + let env = projectToken.split('_')[1].toLowerCase(); + if (env) { + host = `https://api.${env}.visualtest.io`; + } else { + host = "https://api.visualtest.io"; + } + const response = await apiRequest('get', host); + if (response.error) { + logger.trace(response) + throw new Error(`The VisualTest SDK is unable to communicate with our server. This is usually due to one of the following reasons:\n\ + 1) Firewall is blocking the domain: Solution is to whitelist the domain: "*.visualtest.io"\n\ + 2) Internet access requires a proxy server: Talk to your network admin\n\ + \n\ + Error:\n\ + ${response.error}`); + } else { + logger.info(`Got initial connection response: ${response.body}`); + } +}); +const isValidProjectToken = (async (projectToken) => { + const response = await apiRequest('get', `${host}/api/v1/projects/${projectToken.split('/')[0]}`, null, {Authorization: `Bearer ${projectToken}`}); + if (response.data.status) { + logger.trace(response) + throw new Error(`Error checking projectToken: ${response.data.message}`); + } else { + logger.info(`ProjectToken is correct.`) + } + return null +}) + +const checkUsersVersion =(async () => { + const userVersion = package_json.version + const response = await apiRequest('get', 'https://registry.npmjs.org/@smartbear/visualtest-cypress') + const {latest: latestVersion} = response.data["dist-tags"] + if (semver.eq(userVersion, latestVersion)) { + // console.log(chalk.blue('The user has the latest version.')); + } else { + console.log(chalk.yellow('Please upgrade to the latest VisualTest Cypress Plugin version.')); + console.log(chalk.blue('npm install @smartbear/visualtest-cypress@latest')); + } + return null +})(); let getDomCapture = (async () => { try { const res = await apiRequest('get', `${configFile.cdnUrl}/dom-capture.min.js`); @@ -170,7 +219,11 @@ function makeGlobalRunHooks() { configFile.debug = debugFolderPath; //overwrite 'true' to the folder path for passing to commands.js fs.mkdirSync(debugFolderPath, {recursive: true}); - targetArray.push({target: './debug-pino-transport.js', level: 'trace', options: {destination: `${debugFolderPath}/debug.log`}}); + targetArray.push({ + target: './debug-pino-transport.js', + level: 'trace', + options: {destination: `${debugFolderPath}/debug.log`} + }); logger = pino(pino.transport({targets: targetArray})); logger.level = 'trace'; //required to overwrite default 'info' } @@ -206,6 +259,9 @@ function makeGlobalRunHooks() { return configFile; } + await isValidProjectToken(configFile.projectToken); + await checkConnectionToBackend(configFile.projectToken); + logger.trace('config.projectToken: ' + configFile.projectToken); configFile.projectId = configFile.projectToken.split('/')[0]; //take the first ~half to get the projectId logger.trace('config.projectId: ' + configFile.projectId); @@ -241,7 +297,9 @@ function makeGlobalRunHooks() { configFile.testRunName = `${osPrettyName} / ${browserPrettyName} ${browserMajorVersion[0]}`; } logger.trace('config.testRunName: ' + configFile.testRunName); - + if (configFile.testRunName.length > 100) { + throw new Error(`The maximum size of testRunName is 100 characters. Received: ${configFile.testRunName.length} characters.`) + } configFile.url = host; configFile.websiteUrl = webUrl; diff --git a/test/package-lock.json b/test/package-lock.json index 37d27b2..58469c4 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -27,6 +27,7 @@ "jimp": "^0.22.10", "pino": "^8.15.0", "pino-pretty": "^10.2.0", + "semver": "^7.5.4", "uuid": "^9.0.0" }, "bin": {