159 lines
5.3 KiB
JavaScript
159 lines
5.3 KiB
JavaScript
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
/*
|
|
This is code that handles communicating with the published app. Half of this code should live within the published app.
|
|
*/
|
|
var testEnginePluginName = "TestEnginePlugin";
|
|
var isPluginRegistered = false;
|
|
|
|
var callbackDictionary = {};
|
|
|
|
class TestEnginePlugin {
|
|
contructor() {
|
|
|
|
}
|
|
|
|
processResult(commandInfo) {
|
|
if (commandInfo.args[1].successful) {
|
|
callbackDictionary[commandInfo.args[0]].complete(commandInfo.args[1].message);
|
|
} else {
|
|
callbackDictionary[commandInfo.args[0]].error(commandInfo.args[1].message);
|
|
}
|
|
delete callbackDictionary[commandInfo.args[0]];
|
|
}
|
|
}
|
|
|
|
function executePublishedAppScript(scriptToExecute) {
|
|
var callbackId = Core.Utility.generate128BitUUID();
|
|
var completeablePromise = Core.Promise.createCompletablePromise();
|
|
callbackDictionary[callbackId] = completeablePromise;
|
|
AppMagic.Runtime.WebPlayerRuntime._appHostManager._apiHandler.invokeScriptAsync(`
|
|
try {
|
|
var result = ${scriptToExecute};
|
|
Cordova.exec(function() {}, function() {}, '${testEnginePluginName}', 'processResult', ['${callbackId}', {successful: true, message: result}])
|
|
}
|
|
catch(err) {
|
|
Cordova.exec(function() {}, function() {}, '${testEnginePluginName}', 'processResult', ['${callbackId}', {successful: false, message: err}])
|
|
}`)
|
|
return completeablePromise.promise;
|
|
}
|
|
|
|
function getOngoingActionsInPublishedApp() {
|
|
return executePublishedAppScript("AppMagic.AuthoringTool.Runtime.existsOngoingAsync()");
|
|
}
|
|
|
|
function getControlObjectModel () {
|
|
return executePublishedAppScript("buildControlObjectModel()");
|
|
}
|
|
|
|
function getPropertyValueFromPublishedApp(itemPath) {
|
|
var script = `getPropertyValueFromControl(${JSON.stringify(itemPath)})`;
|
|
return executePublishedAppScript(script);
|
|
}
|
|
|
|
function selectControl(itemPath) {
|
|
var script = `selectControl(${JSON.stringify(itemPath)})`;
|
|
return executePublishedAppScript(script);
|
|
}
|
|
|
|
function interactWithControl(itemPath, value) {
|
|
var script = "";
|
|
if (isArray(Object.values(value))) {
|
|
var valuesJsonArr = [];
|
|
var values = Object.values(value);
|
|
for (var index in values) {
|
|
valuesJsonArr[`${index}`] = `${JSON.stringify(values[index])}`;
|
|
}
|
|
var valueJson = `{"${itemPath.propertyName}":${valuesJsonArr}}`;
|
|
script = `interactWithControl(${JSON.stringify(itemPath)}, ${valueJson})`;
|
|
} else {
|
|
var valueJson = `{"${itemPath.propertyName}":${value}}`;
|
|
script = `interactWithControl(${JSON.stringify(itemPath)}, ${valueJson})`;
|
|
}
|
|
return executePublishedAppScript(script);
|
|
}
|
|
|
|
function setPropertyValueForControl(itemPath, value) {
|
|
if (typeof value == "object") {
|
|
return interactWithControl(itemPath, value);
|
|
} else if (typeof value == "string") {
|
|
value = JSON.stringify(value);
|
|
}
|
|
var script = `setPropertyValueForControl(${JSON.stringify(itemPath)}, ${value})`;
|
|
return executePublishedAppScript(script);
|
|
}
|
|
|
|
function fetchArrayItemCount(itemPath) {
|
|
var script = `fetchArrayItemCount(${JSON.stringify(itemPath)})`;
|
|
return executePublishedAppScript(script);
|
|
}
|
|
|
|
function isArray(obj) {
|
|
return obj.constructor === Array;
|
|
}
|
|
|
|
/*
|
|
These are the functions that will be called by the Test Engine
|
|
*/
|
|
|
|
var PowerAppsTestEngine = {
|
|
|
|
getAppStatus: function () {
|
|
if (typeof AppMagic === "undefined" || typeof AppMagic.Runtime === "undefined"
|
|
|| typeof AppMagic.Runtime.WebPlayerRuntime === "undefined" || typeof AppMagic.Runtime.WebPlayerRuntime._appHostManager === "undefined") {
|
|
return "Loading";
|
|
}
|
|
if (AppMagic.Runtime.WebPlayerRuntime._appHostManager._appIsLoading) {
|
|
return "Loading";
|
|
}
|
|
else {
|
|
// Determine interaction required and error states
|
|
|
|
// App is loaded, register plugin
|
|
// When this is ported into PowerApps, need to do the proper plugin registration
|
|
if (!isPluginRegistered) {
|
|
AppMagic.Runtime.WebPlayerRuntime._appHostManager._apiHandler.registerHandler(testEnginePluginName, new TestEnginePlugin());
|
|
}
|
|
return getOngoingActionsInPublishedApp().then((ongoingAppActionRunning) => {
|
|
if (ongoingAppActionRunning) {
|
|
return "Busy";
|
|
} else {
|
|
return "Idle";
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
buildObjectModel: function () {
|
|
return getControlObjectModel().then((controlObjectModel) => {
|
|
return {
|
|
controls: controlObjectModel
|
|
};
|
|
})
|
|
},
|
|
|
|
getPropertyValue: function (itemPath) {
|
|
return getPropertyValueFromPublishedApp(itemPath)
|
|
},
|
|
|
|
select: function (itemPath) {
|
|
return selectControl(itemPath)
|
|
},
|
|
|
|
setPropertyValue: function (itemPath, value) {
|
|
return setPropertyValueForControl(itemPath, value);
|
|
},
|
|
|
|
getItemCount: function (itemPath) {
|
|
return fetchArrayItemCount(itemPath);
|
|
},
|
|
|
|
debugInfo: {
|
|
appId: Core.Telemetry?.Log?.getAppId(),
|
|
appVersion: Core.Telemetry?.Log?.getAppVersion(),
|
|
environmentId: Core.Telemetry?.Log?.getEnvironmentId(),
|
|
sessionId: Core.Telemetry?.Log?._sessionId,
|
|
}
|
|
} |