UNPKG

lambdatest-cypress-cli

Version:

The lambdatest-cypress-cli is LambdaTest's command-line interface (CLI) aimed to help you run your Cypress tests on LambdaTest platform.

472 lines (441 loc) 17.4 kB
const fs = require("fs"); const semver = require("semver"); const semverCompare = require("semver/functions/compare"); const { split_at_pattern } = require("./utils.js"); const constants = require("./constants.js"); module.exports = validate_config = function (lt_config, validation_configs) { console.log("Validating lambdatest config"); return new Promise(function (resolve, reject) { //validate auth keys are present if ( !("lambdatest_auth" in lt_config) || !("username" in lt_config["lambdatest_auth"]) || !("access_key" in lt_config["lambdatest_auth"]) ) { reject("Error!!! Incompatible Config. Auth not present"); } if ( lt_config["lambdatest_auth"]["username"] == "<Your LambdaTest username>" || lt_config["lambdatest_auth"]["access_key"] == "<Your LambdaTest access key>" ) { reject("Error!!! Auth details not correct"); } //Validate spec file if (!("specs" in lt_config["run_settings"])) { reject("Error!! please provide specs key"); } else if (lt_config["run_settings"]["specs"].length == 0) { reject("Error!! Please provide specs, specs list can not be empty"); } //validate if browsers are not empty if (!("browsers" in lt_config)) { reject("Error!! please provide browsers"); } else if (lt_config["browsers"].length == 0) { reject("Error!! please provide browsers, browsers list can not be empty"); } //validate parellel session let parallels = lt_config["run_settings"]["parallels"]; if ( parallels == undefined || parallels == null || isNaN(parallels) || (Number(parallels) && Number(parallels) % 1 !== 0) || parseInt(parallels, 10) <= 0 || parallels === "Here goes the number of parallels you want to run" ) { reject("Error!! Parallels value not correct"); } //validate max duration if ("max_duration" in lt_config["run_settings"]){ let max_duration = lt_config["run_settings"]["max_duration"]; if (!(max_duration == undefined || max_duration == null || isNaN(max_duration))) { if (Number(max_duration) && Number(max_duration) % 1 !== 0){ reject("Error!! max_duration should be an Integer between 2 and 240 minutes"); }else if (parseInt(max_duration) <2 || parseInt(max_duration) > 240){ reject("Error!! max_duration should be between 2 and 240 minutes"); } } } //Validate if package.json is having the cypress dependency var cypress_version; if (!fs.existsSync("package.json")) { reject( "Error!! Package.json file does not exist in the root on the project" ); } else { let rawdata = fs.readFileSync("package.json"); try { let package = JSON.parse(rawdata); //Override npm_dependencies if (lt_config.run_settings.npm_dependencies) { package.dependencies = lt_config.run_settings.npm_dependencies; package.devDependencies = {}; } let cypress_flag = false; if (package.hasOwnProperty("dependencies")) { for (const [key, value] of Object.entries(package["dependencies"])) { if (key == "cypress") { cypress_flag = true; cypress_version = value; break; } } } if ( cypress_flag == false && package.hasOwnProperty("devDependencies") ) { for (const [key, value] of Object.entries( package["devDependencies"] )) { if (key == "cypress") { cypress_flag = true; cypress_version = value; break; } } } if ( lt_config.run_settings.hasOwnProperty("cypress_version") && lt_config.run_settings.cypress_version != "" ) { cypress_flag = true; cypress_version = lt_config.run_settings.cypress_version; } else if ( lt_config.run_settings.hasOwnProperty("cypress_version") && lt_config.run_settings.cypress_version == "" ) { cypress_flag = false; reject( "Error!! cypress_version can not be blank, either provide a value or remove the key" ); } if (cypress_flag == false && lt_config.run_settings.npm_dependencies) { reject( "Error!!Cypress dependency is not present in npm_dependencies" ); } else if (cypress_flag == false) { reject("Error!!Cypress dependency is not present in package.json"); } } catch (e) { console.log( "Package.json is not parsed, please provide a valid json", e ); reject("Error!! Package.json File does not have correct json"); } } //validate if cypress config file is passed and exists cypress_version = semver.coerce(cypress_version).version; // validate cypress.json only in case of cypress<10 if ( semverCompare(cypress_version, "10.0.0") == -1 && lt_config["run_settings"]["cypress_config_file"] ) { if (!fs.existsSync(lt_config["run_settings"]["cypress_config_file"])) { reject("Error!! Cypress Config File does not exist"); } else { let rawdata = fs.readFileSync( lt_config["run_settings"]["cypress_config_file"] ); try { let cypress_config = JSON.parse(rawdata); } catch { console.log( "Cypress.json is not parsed, please provide a valid json" ); reject("Error!! Cypress Config File does not has correct json"); } } } else if ( semverCompare(cypress_version, "10.0.0") >= 0 && lt_config["run_settings"]["cypress_config_file"] ) { reject( 'Error!! --ccf flag, cypress_config_file, cypress.json is not supported with cypress>=10,remove cypress.json if present and use \n --cy="--config-file <file path>" For passing custom config files' ); } if ( lt_config["run_settings"]["ignore_files"] && lt_config["run_settings"]["ignore_files"].length > 0 ) { for ( var i = 0; i < lt_config["run_settings"]["ignore_files"].length; i++ ) { if (lt_config["run_settings"]["ignore_files"][i] == "package.json") { reject( "package.json is added to ignore_files in run settings, Please remove package.json from ignore_files parameter in lambdatest-config.json file" ); break; } } } //validate if network field contains expected value if ("network" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["network"])) { reject("Error!! boolean value is expected in network key"); } } //validate if video field contains expected value if ("video" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["video"])) { reject("Error!! boolean value is expected in video key"); } } //validate if network_http2 field contains expected value if ("network_http2" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["network_http2"])) { reject("Error!! boolean value is expected in network_http2 key"); } } //validate if accessibility field contains expected value if ("accessibility" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["accessibility"])) { reject("Error!! boolean value is expected in accessibility key"); } } //validate if useNode18 field contains expected value if ("useNode18" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["useNode18"])) { reject("Error!! boolean value is expected in useNode18 key"); } } if ( "downloads" in lt_config["run_settings"] && lt_config["run_settings"]["downloads"] != "" ) { let download_folders = lt_config["run_settings"]["downloads"].split(","); for (folder in download_folders) { if (download_folders[folder][0] != ".") { reject("Error!! dowloads folder path is not relative " + folder); } } } if (lt_config["run_settings"]["cypress_settings"] != "") { for (let i = 0; i < validation_configs.blacklistCommands.length; i++) { validation_configs.blacklistCommands[i] = new RegExp( validation_configs.blacklistCommands[i] ); } let settings = split_at_pattern(lt_config["run_settings"]["cypress_settings"], ';') let settings_flag = true; let setting_param = ""; for (let i = 0; i < settings.length; i++) { let configs = split_at_pattern(settings[i],' ') if ( validation_configs.blacklistCommands.some((rx) => rx.test(configs[0]) ) ) { settings_flag = false; setting_param = configs[0]; break; } } if (settings_flag == false) { reject( "Error!! Following cypress param is not allowed " + setting_param ); } } if ("smart_ui" in lt_config.run_settings) { if (!("project" in lt_config.run_settings.smart_ui)) { reject("Smart UI project name is missing"); } else if (lt_config.run_settings.smart_ui.project == "") { reject("Smart UI project name can not be blank"); } } if ( lt_config["run_settings"]["reporter_config_file"] && lt_config["run_settings"]["reporter_config_file"] != "" ) { if (!fs.existsSync(lt_config["run_settings"]["reporter_config_file"])) { console.log( "Warning!! Reporter Config File does not exist, Commands section on dashboard may not get generated. Use lambdatest-cypress init command to generate." ); } else { let rawdata = fs.readFileSync( lt_config["run_settings"]["reporter_config_file"] ); try { let reporter_config = JSON.parse(rawdata); if (Object.keys(reporter_config).length == 0) { reject( "Error!! Reporter JSON File has no keys, either remove Key reporter_config_file from lambdatest config or pass some options" ); } else if ( reporter_config.reporterEnabled && reporter_config.reporterEnabled != "" ) { if (!reporter_config.reporterEnabled.includes("mochawesome")) { console.log( "Warning!! mochawesome reporter config not present. Command log may not be visible on dashboard" ); } } } catch(e) { console.log( "reporter_config_file could not be parsed, please provide a valid json in Reporter Config - ", e ); reject("Error!! Reporter JSON File does not have correct json"); } } } else { console.log( "Warning!! Value of reporter_config_file parameter missing. Proceeding with default reporter config" ); } if ( lt_config.run_settings.stop_on_failure && typeof lt_config.run_settings.stop_on_failure != "boolean" ) { reject("Type of stop_on_failure flag is not bool"); } if ( lt_config.run_settings.detailed_command_logs && typeof lt_config.run_settings.detailed_command_logs != "boolean" ) { reject("Type of detailed_command_logs flag should be bool"); } //Check for project capability if ( lt_config.run_settings.project_name && lt_config.run_settings.project_key ) { if (lt_config.run_settings.project_name == "") { reject("Project name can not blank"); } if (lt_config.run_settings.project_name == "") { reject("Project key can not blank"); } } if ( lt_config.run_settings.project_autocreate && typeof lt_config.run_settings.project_autocreate != "boolean" ) { reject("Type of project_autocreate capability is not bool"); } //Check for browsers and platforms let browsers = validation_configs.supportedBrowserAlias; let platforms = validation_configs.supportedPlatformAlias; for (let i = 0; i < lt_config.browsers.length; i++) { if (browsers.indexOf(lt_config.browsers[i].browser.toLowerCase()) == -1) { reject( "Browser not supported!!! Please pass from following list: " + validation_configs.supportedBrowsers ); } if ( platforms.indexOf(lt_config.browsers[i].platform.toLowerCase()) == -1 ) { reject( "Platform not supported!!! Please pass from following list: " + validation_configs.supportedPlatforms ); } } //Validate Build Tags //1) less than 15 //2) each tag should be less than 50 characters if (lt_config.run_settings.build_tags) { if (lt_config.run_settings.build_tags.length > 15) { reject("Build Tags can not be more than 15"); } for (let i = 0; i < lt_config.run_settings.build_tags.length; i++) { if (lt_config.run_settings.build_tags[i].length > 50) { reject("Build Tags can not have over 50 characters"); } } } //Validate Test Tags //1) less than 15 //2) each tag should be less than 50 characters if (lt_config.run_settings.tags) { if (lt_config.run_settings.tags.length > 15) { reject("Test Tags can not be more than 15") } for (let i = 0; i < lt_config.run_settings.tags.length; i++) { if (lt_config.run_settings.tags[i].length > 50) { reject("Test Tags can not have over 50 characters"); } } } //validate if reject unauthorized field contains expected value if ("reject_unauthorized" in lt_config["run_settings"]) { if ( ![true, false].includes( lt_config["run_settings"]["reject_unauthorized"] ) ) { reject("Error!! boolean value is expected in reject_unauthorized key"); } } // validate system env variables to be set up if ("sys_envs" in lt_config["run_settings"]) { let sys_envs = lt_config["run_settings"]["sys_envs"]; let envValue; Object.keys(sys_envs).forEach(function (envKey) { envValue = sys_envs[envKey]; if (envKey && constants.BLOCKED_ENV_VARS.includes(envKey)) { reject( `Usage of unwanted environment variable detected. Blocked variables are - ${constants.BLOCKED_ENV_VARS}` ); } if (envValue == undefined || envValue === "") { reject(`Value of environment variable ${envKey} cannot be left blank`); } }); } //validate if dedicated proxy field contains expected value if ("dedicated_proxy" in lt_config["run_settings"]) { if (!(typeof lt_config["run_settings"]["dedicated_proxy"] === "boolean")) { reject("Error!! boolean value is expected in dedicated_proxy key"); } } //validate if dedicatedproxy and tunnel are not passed simultaniously if (lt_config["run_settings"]["dedicated_proxy"]==true && lt_config["run_settings"]["geo_location"] !=""){ reject("Error!! Dedicated Proxy and Geolocation can not be passed in same run") } //validate if tunnel and geo are not passed simultaniously if (lt_config["tunnel_settings"]["tunnel"]==true && lt_config["run_settings"]["geo_location"] !=""){ reject("Error!! Tunnel and Geolocation can not be passed in same run") } //validate if dedicatedproxy and geo are not passed simultaniously if (lt_config["tunnel_settings"]["tunnel"]==true && lt_config["run_settings"]["dedicated_proxy"]==true){ reject("Error!! Tunnel and Dedicated Proxy can not be passed in same run") } //validate if npm_via_tunnel field contains expected value if ("npm_via_tunnel" in lt_config["run_settings"]) { if (!(typeof lt_config["run_settings"]["npm_via_tunnel"] === "boolean")) { reject("Error!! boolean value is expected in npm_via_tunnel key"); } } //validate that if npm_via_tunnel is set, tunnel must be set to true if (lt_config["run_settings"]["npm_via_tunnel"]==true) { if (lt_config["tunnel_settings"]["tunnel"] ==false){ reject("Error!! Installing npm packages behind private VPN is supported only with tunnel. Please pass tunnel as true."); }else{ console.log("Warning!! Using the flag `npm_via_tunnel` may result in higher build duration."); } } //validate if npm_via_tunnel field contains expected value if ("command_log" in lt_config["run_settings"]) { if (!(typeof lt_config["run_settings"]["command_log"] === "boolean")) { reject("Error!! boolean value is expected in command_log key"); } } if ("privateCloud" in lt_config["run_settings"]) { if (![true, false].includes(lt_config["run_settings"]["privateCloud"])) { reject("Error!! boolean value is expected in privateCloud key"); } } if(lt_config) resolve(cypress_version); }); };