UNPKG

valence-test

Version:

Test applications running in Valence and 5250 screens with Fusion5250

363 lines (315 loc) 10.8 kB
'use strict'; const fs = require('fs'); /** * Fusion5250 Test Class */ class Fusion5250 { constructor() { let me = this; /** * Fusion5250 App ID * @type {number} */ me.app = 150; /** * Folder name that contains the scripts * @type {string} */ me.scriptsFolder = 'fusion5250Scripts'; /** * Array of blank replacements * @type {string[]} */ me.blankReplace = ["\u00A0"]; /** * Default seconds to pause after send key * @type {number} */ me.sendKeyPause = 2; } /** * close Fusion5250 * @param I * @returns {Promise<void>} */ async close(I) { const me = this, appId = me.app; const errorFound = (err) => { if (err) { throw TypeError(error); } }; let error = await I.executeScript(async ([appId]) => { try { Valence.util.App.close(appId); } catch (e) { return e.message; } }, [appId]); errorFound(error); I.wait(1); } /** * check if error found * @param err */ errorFound(err) { if (err) { throw TypeError(err); } } /** * pause the test * @param I * @param config */ pause(I, config) { I.wait(config.value); } /** * run the script * @param script * @param file * @returns {Promise<void>} */ async runScript(script, file) { const me = this, title = (script.title) ? script.title : file; Scenario(`[SCRIPT] - ${title}`, async (I) => { await I.launchApp(me.app); // run the steps // let ii, step; for (ii = 0; ii < script.steps.length; ii++) { step = script.steps[ii]; if (typeof me[step.command] === 'function') { await me[step.command](I, step, script.blankReplace); // if this is a send key auto pause // if (step.command === 'sendKey' && (script.steps[ii + 1] && script.steps[ii + 1].command !== 'pause')) { I.wait((script.sendKeyPause) ? script.sendKeyPause : me.sendKeyPause); } } } // close Fusion5250 // await me.close(I); // logout // I.logout(); }); } /** * Run all the scripts found in the Fusion5250 scripts directory */ runScripts() { const me = this, projectPath = process.env.INIT_CWD || path.resolve('../../../', __dirname), files = fs.readdirSync(`${projectPath}/tests/${me.scriptsFolder}`); let ii; for (ii = 0; ii < files.length; ii++) { if (files[ii] !== 'Readme.md') { me.runScript(require(`${projectPath}/tests/${me.scriptsFolder}/${files[ii]}`), files[ii]); } } } /** * check if we see a element in the dom with a value or not empty * @param I * @param config * @param blankReplace * @returns {Promise<void>} */ async see(I, config, blankReplace) { const me = this; if (!blankReplace) { blankReplace = me.blankReplace; } if (!config.tag) { config.tag = 'span'; } let error = await I.executeScript(async ([config, blankReplace]) => { try { var input = document.querySelector(`${config.tag}[col='${config.column}'][row='${config.row}']`), replaceBlanks = (v) => { for (var ii = 0; ii < blankReplace.length; ii++) { v = v.replace(new RegExp(blankReplace[ii], 'g'), " ") } return v; }, value; if (!input) { return `${config.value} - not found`; } if (config.tag === 'span') { value = input.innerText; } else if (config.tag === 'input') { value = input.value; } if (config.hasValue) { if (replaceBlanks(value).trim().length === 0) { return `${config.value} - not populated`; } } else { if (replaceBlanks(value).trim() !== config.value) { return `${config.value} - not found`; } } } catch (e) { return e.message; } }, [config, blankReplace]); me.errorFound(error); if (!error && config.successMessage) { // I.addMochawesomeContext(config.successMessage); //todo } } /** * send a key press to fusion * @param I * @param config * @returns {Promise<void>} */ async sendKey(I, config) { const me = this; let error = await I.executeScript(async ([config]) => { try { let keyEvent = new KeyboardEvent("keydown", { bubbles : true, cancelable : true, keyCode : Ext.event.Event[config.value], shiftKey : false }); document.body.dispatchEvent(keyEvent); } catch (e) { return e.message; } }, [config]); me.errorFound(error); } /** * type a value in a input field * @param I * @param config * @returns {Promise<void>} */ async type(I, config) { const me = this; let error = await I.executeScript(async ([config]) => { try { var input = document.querySelector(`input[col='${config.column}'][row='${config.row}']`); if (!input) { return "input[col='${config.column}'][row='${config.row}']"; } input.setAttribute('changed', true); input.value = config.value; } catch (e) { return e.message; } }, [config]); me.errorFound(error); } } module.exports = { codeceptjs : { actor : { /** * launch application in portal * @param appId - application id * @param user - override the user from config.json * @param password - override the password from config.json * @returns {Promise<void>} */ launchApp : async function (appId, user, password) { const me = this, errorFound = (err) => { if (err) { throw TypeError(error); } }; await me.login(user, password); me.wait(2); let error = await me.executeScript(async ([appId]) => { try { const dataView = Ext.ComponentQuery.query('launchpad')[0].down('dataview'), store = dataView.getStore(), rec = store.findRecord('appId', appId, 0, false, true, true); dataView.getNode(rec).click(); } catch (e) { return e.message; } }, [appId]); errorFound(error); me.wait(8); /** * verify app is running in the portal */ error = await me.executeScript(async ([appId]) => { const activeApp = Portal.util.Helper.getActiveApp(); if (!activeApp || activeApp.app !== appId) { return `App ID ${appId} did not launch`; } }, [appId]); errorFound(error); me.switchTo('iframe'); me.wait(2); }, /** * login to the portal * @param user * @param password * @returns {Promise<void>} */ login : async function (user, password) { const me = this, projectPath = process.env.INIT_CWD || path.resolve('../../../', __dirname), isEmpty = (value) => { return (value == null) || (value === '') || (toString.call(value) === '[object Array]' && value.length === 0); }, configPath = `${projectPath}/config.json`; const config = require(configPath); me.amOnPage(`${config.valenceUrl}/build/production/Portal/index.html?theme=default`); me.wait(1); /** * check if we are already logged in */ let loggedIn = await me.executeScript(() => { return Valence.util.Helper.getValenceRuntime().getIsConnected(); }); if (!loggedIn) { if (isEmpty(user)) { user = config.valenceUserId; } if (isEmpty(password)) { password = config.valenceUserPwd; } //log in // me.fillField('input[name=user]', user); me.fillField('input[name=password]', password); me.wait(1); me.click({css : '.vv-login-btn'}); me.wait(5); await me.executeScript(() => { if (!Valence.util.Helper.getValenceRuntime().getIsConnected()) { throw TypeError("Unsuccessful Login"); } }); } }, /** * logout of the Portal * @param namespace * @returns {Promise<void>} */ logout : async function () { var me = this; me.switchTo(); me.executeScript(() => { window.Portal.getApplication().fireEvent('logout'); }); } } }, Fusion5250 };