valence-test
Version:
Test applications running in Valence and 5250 screens with Fusion5250
363 lines (315 loc) • 10.8 kB
JavaScript
;
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
};