@sapui5/sap.fe.test 1.97.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -2
- package/src/sap/fe/test/.library +1 -1
- package/src/sap/fe/test/BaseActions.js +3 -2
- package/src/sap/fe/test/BaseArrangements.js +3 -2
- package/src/sap/fe/test/BaseAssertions.js +3 -2
- package/src/sap/fe/test/ConfirmDialog.js +3 -2
- package/src/sap/fe/test/FCLView.js +3 -2
- package/src/sap/fe/test/FeMocks.js +66 -0
- package/src/sap/fe/test/FeMocks.ts +77 -0
- package/src/sap/fe/test/Flexibility.js +3 -2
- package/src/sap/fe/test/FlexibleColumnLayout.js +3 -2
- package/src/sap/fe/test/JestTemplatingHelper.js +83 -25
- package/src/sap/fe/test/JestTemplatingHelper.ts +74 -26
- package/src/sap/fe/test/JourneyRunner.js +11 -5
- package/src/sap/fe/test/ListReport.js +11 -5
- package/src/sap/fe/test/LocationUtil.js +3 -2
- package/src/sap/fe/test/ObjectPage.js +28 -17
- package/src/sap/fe/test/Shell.js +3 -2
- package/src/sap/fe/test/Stubs.js +3 -2
- package/src/sap/fe/test/TemplatePage.js +3 -2
- package/src/sap/fe/test/TemplatingTestUtils.js +4 -3
- package/src/sap/fe/test/UI5MockHelper.js +249 -137
- package/src/sap/fe/test/UI5MockHelper.ts +143 -13
- package/src/sap/fe/test/Utils.js +3 -14
- package/src/sap/fe/test/api/APIHelper.js +3 -2
- package/src/sap/fe/test/api/BaseAPI.js +5 -9
- package/src/sap/fe/test/api/ChartActions.js +3 -2
- package/src/sap/fe/test/api/ChartAssertions.js +7 -6
- package/src/sap/fe/test/api/DialogAPI.js +17 -4
- package/src/sap/fe/test/api/DialogActions.js +3 -2
- package/src/sap/fe/test/api/DialogAssertions.js +3 -2
- package/src/sap/fe/test/api/DialogCreateActions.js +4 -3
- package/src/sap/fe/test/api/DialogCreateAssertions.js +4 -3
- package/src/sap/fe/test/api/DialogMessageActions.js +19 -3
- package/src/sap/fe/test/api/DialogMessageAssertions.js +4 -3
- package/src/sap/fe/test/api/DialogType.js +3 -2
- package/src/sap/fe/test/api/DialogValueHelpActions.js +4 -3
- package/src/sap/fe/test/api/DialogValueHelpAssertions.js +4 -3
- package/src/sap/fe/test/api/EditState.js +3 -2
- package/src/sap/fe/test/api/FilterBarAPI.js +12 -3
- package/src/sap/fe/test/api/FilterBarActions.js +3 -2
- package/src/sap/fe/test/api/FilterBarAssertions.js +3 -2
- package/src/sap/fe/test/api/FooterAPI.js +3 -2
- package/src/sap/fe/test/api/FooterActionsBase.js +3 -2
- package/src/sap/fe/test/api/FooterActionsOP.js +3 -2
- package/src/sap/fe/test/api/FooterAssertionsBase.js +3 -2
- package/src/sap/fe/test/api/FooterAssertionsOP.js +3 -2
- package/src/sap/fe/test/api/FormAPI.js +3 -2
- package/src/sap/fe/test/api/FormActions.js +3 -2
- package/src/sap/fe/test/api/FormAssertions.js +3 -2
- package/src/sap/fe/test/api/HeaderAPI.js +3 -2
- package/src/sap/fe/test/api/HeaderActions.js +3 -2
- package/src/sap/fe/test/api/HeaderActionsLR.js +3 -2
- package/src/sap/fe/test/api/HeaderAssertions.js +3 -2
- package/src/sap/fe/test/api/HeaderAssertionsLR.js +3 -2
- package/src/sap/fe/test/api/HeaderLR.js +3 -2
- package/src/sap/fe/test/api/KPICardAPI.js +3 -2
- package/src/sap/fe/test/api/KPICardActions.js +43 -0
- package/src/sap/fe/test/api/KPICardAssertions.js +22 -17
- package/src/sap/fe/test/api/TableAPI.js +3 -2
- package/src/sap/fe/test/api/TableActions.js +3 -21
- package/src/sap/fe/test/api/TableAssertions.js +17 -6
- package/src/sap/fe/test/builder/DialogBuilder.js +3 -2
- package/src/sap/fe/test/builder/FEBuilder.js +3 -2
- package/src/sap/fe/test/builder/KPIBuilder.js +14 -4
- package/src/sap/fe/test/builder/MacroFieldBuilder.js +3 -2
- package/src/sap/fe/test/builder/MdcFieldBuilder.js +3 -2
- package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +3 -2
- package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +3 -2
- package/src/sap/fe/test/builder/MdcTableBuilder.js +29 -2
- package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +3 -2
- package/src/sap/fe/test/builder/VMBuilder.js +3 -2
- package/src/sap/fe/test/internal/FEArrangements.js +3 -2
- package/src/sap/fe/test/internal/FEJourneyRunner.js +9 -5
- package/src/sap/fe/test/library.js +4 -3
- package/src/sap/fe/test/massEdit.js +3 -2
- package/ui5.yaml +0 -3
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
import { PhantomUtil } from "sap/fe/macros";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
2
|
+
import _MetadataRequestor from "sap/ui/model/odata/v4/lib/_MetadataRequestor";
|
|
3
|
+
import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
|
|
4
|
+
import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
|
|
5
|
+
import Log from "sap/base/Log";
|
|
6
6
|
import xpath from "xpath";
|
|
7
7
|
import * as fs from "fs";
|
|
8
8
|
import { compileSources, to } from "@sap/cds-compiler";
|
|
9
9
|
import { format } from "prettier";
|
|
10
|
-
import
|
|
10
|
+
import BindingParser from "sap/ui/base/BindingParser";
|
|
11
11
|
import { AnyAnnotation, ConverterOutput, EntitySet, Property } from "@sap-ux/annotation-converter";
|
|
12
12
|
import { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
|
|
13
|
-
import
|
|
14
|
-
import
|
|
13
|
+
import JSONModel from "sap/ui/model/json/JSONModel";
|
|
14
|
+
import InvisibleText from "sap/ui/core/InvisibleText";
|
|
15
15
|
import { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
|
|
16
16
|
import { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
|
|
17
17
|
import { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
|
|
18
|
-
import
|
|
18
|
+
import merge from "sap/base/util/merge";
|
|
19
19
|
import * as path from "path";
|
|
20
20
|
import ConverterContext from "sap/fe/core/converters/ConverterContext";
|
|
21
21
|
import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
22
|
+
import TemplateModel from "sap/fe/core/TemplateModel";
|
|
23
|
+
import Context from "sap/ui/model/Context";
|
|
22
24
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
23
25
|
const formatXml = require("xml-formatter");
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
25
|
-
// @ts-ignore
|
|
26
|
-
import * as TemplateModel from "sap/fe/core/TemplateModel";
|
|
27
26
|
|
|
28
27
|
Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
|
|
29
28
|
jest.setTimeout(40000);
|
|
@@ -38,8 +37,11 @@ const nameSpaceMap = {
|
|
|
38
37
|
"core": "sap.ui.core",
|
|
39
38
|
"m": "sap.m",
|
|
40
39
|
"f": "sap.ui.layout.form",
|
|
40
|
+
"internalMacro": "sap.fe.macros.internal",
|
|
41
41
|
"mdc": "sap.ui.mdc",
|
|
42
|
+
"mdcat": "sap.ui.mdc.actiontoolbar",
|
|
42
43
|
"mdcField": "sap.ui.mdc.field",
|
|
44
|
+
"mdcTable": "sap.ui.mdc.table",
|
|
43
45
|
"u": "sap.ui.unified",
|
|
44
46
|
"macroMicroChart": "sap.fe.macros.microchart",
|
|
45
47
|
"microChart": "sap.suite.ui.microchart"
|
|
@@ -105,8 +107,7 @@ export const serializeXML = function(xmlDom: Node) {
|
|
|
105
107
|
*/
|
|
106
108
|
export const compileCDS = function(sCDSUrl: string) {
|
|
107
109
|
const cdsString = fs.readFileSync(sCDSUrl, "utf-8");
|
|
108
|
-
const
|
|
109
|
-
const edmxContent = to.edmx(csn, { service: "sap.fe.test.JestService" });
|
|
110
|
+
const edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService");
|
|
110
111
|
const dir = path.resolve(sCDSUrl, "..", "gen");
|
|
111
112
|
const edmxUrl = path.resolve(dir, path.basename(sCDSUrl).replace(".cds", ".xml"));
|
|
112
113
|
|
|
@@ -118,6 +119,22 @@ export const compileCDS = function(sCDSUrl: string) {
|
|
|
118
119
|
return edmxUrl;
|
|
119
120
|
};
|
|
120
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Compile CDS to EDMX.
|
|
124
|
+
*
|
|
125
|
+
* @param cds The CDS model. It must define at least one service.
|
|
126
|
+
* @param service The fully-qualified name of the service to compile. Defaults to "sap.fe.test.JestService".
|
|
127
|
+
* @returns The compiled service model as EDMX.
|
|
128
|
+
*/
|
|
129
|
+
export function cds2edmx(cds: string, service: string = "sap.fe.test.JestService") {
|
|
130
|
+
const csn = compileSources({ "string.cds": cds }, {});
|
|
131
|
+
const edmx = to.edmx(csn, { service: service, odataForeignKeys: true, odataFormat: "structured", odataContainment: false });
|
|
132
|
+
if (!edmx) {
|
|
133
|
+
throw new Error(`Compilation failed. Hint: Make sure that the CDS model defines service ${service}.`);
|
|
134
|
+
}
|
|
135
|
+
return edmx;
|
|
136
|
+
}
|
|
137
|
+
|
|
121
138
|
export const getFakeSideEffectsService = async function(oMetaModel: ODataMetaModel): Promise<any> {
|
|
122
139
|
const oServiceContext = { scopeObject: {}, scopeType: "", settings: {} };
|
|
123
140
|
return new SideEffectsFactory().createInstance(oServiceContext).then(function(oServiceInstance: any) {
|
|
@@ -165,14 +182,14 @@ export const getConverterContextForTest = function(
|
|
|
165
182
|
manifestSettings: ListReportManifestSettings | ObjectPageManifestSettings
|
|
166
183
|
) {
|
|
167
184
|
const entitySet = convertedTypes.entitySets.find(es => es.name === manifestSettings.entitySet);
|
|
168
|
-
const dataModelPath = getDataModelObjectPathForProperty(entitySet as EntitySet, entitySet);
|
|
185
|
+
const dataModelPath = getDataModelObjectPathForProperty(entitySet as EntitySet, convertedTypes, entitySet);
|
|
169
186
|
return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
|
|
170
187
|
};
|
|
171
188
|
const metaModelCache: any = {};
|
|
172
189
|
export const getMetaModel = async function(sMetadataUrl: string) {
|
|
173
190
|
const oRequestor = _MetadataRequestor.create({}, "4.0", {});
|
|
174
191
|
if (!metaModelCache[sMetadataUrl]) {
|
|
175
|
-
const oMetaModel = new ODataMetaModel(oRequestor, sMetadataUrl, undefined, null);
|
|
192
|
+
const oMetaModel = new (ODataMetaModel as any)(oRequestor, sMetadataUrl, undefined, null);
|
|
176
193
|
await oMetaModel.fetchEntityContainer();
|
|
177
194
|
metaModelCache[sMetadataUrl] = oMetaModel;
|
|
178
195
|
}
|
|
@@ -182,6 +199,7 @@ export const getMetaModel = async function(sMetadataUrl: string) {
|
|
|
182
199
|
|
|
183
200
|
export const getDataModelObjectPathForProperty = function(
|
|
184
201
|
entitySet: EntitySet,
|
|
202
|
+
convertedTypes: ConverterOutput,
|
|
185
203
|
property?: Property | EntitySet | AnyAnnotation
|
|
186
204
|
): DataModelObjectPath {
|
|
187
205
|
const targetPath: DataModelObjectPath = {
|
|
@@ -189,7 +207,8 @@ export const getDataModelObjectPathForProperty = function(
|
|
|
189
207
|
navigationProperties: [],
|
|
190
208
|
targetObject: property,
|
|
191
209
|
targetEntitySet: entitySet,
|
|
192
|
-
targetEntityType: entitySet.entityType
|
|
210
|
+
targetEntityType: entitySet.entityType,
|
|
211
|
+
convertedTypes: convertedTypes
|
|
193
212
|
};
|
|
194
213
|
targetPath.contextLocation = targetPath;
|
|
195
214
|
return targetPath;
|
|
@@ -200,15 +219,41 @@ export const evaluateBinding = function(bindingString: string, ...args: any[]) {
|
|
|
200
219
|
return bindingElement.formatter.apply(undefined, args);
|
|
201
220
|
};
|
|
202
221
|
|
|
203
|
-
|
|
222
|
+
type ModelContent = {
|
|
223
|
+
[name: string]: any;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Evaluate a binding against a model.
|
|
228
|
+
*
|
|
229
|
+
* @param bindingString The binding string.
|
|
230
|
+
* @param modelContent Content of the default model to use for evaluation.
|
|
231
|
+
* @param namedModelsContent Contents of additional, named models to use.
|
|
232
|
+
* @returns The evaluated binding.
|
|
233
|
+
*/
|
|
234
|
+
export function evaluateBindingWithModel(
|
|
235
|
+
bindingString: string | undefined,
|
|
236
|
+
modelContent: ModelContent,
|
|
237
|
+
namedModelsContent?: { [modelName: string]: ModelContent }
|
|
238
|
+
): string {
|
|
204
239
|
const bindingElement = BindingParser.complexParser(bindingString);
|
|
205
|
-
const jsonModel = new JSONModel(modelContent);
|
|
206
240
|
const text = new InvisibleText();
|
|
207
241
|
text.bindProperty("text", bindingElement);
|
|
208
|
-
|
|
209
|
-
|
|
242
|
+
|
|
243
|
+
const defaultModel = new JSONModel(modelContent);
|
|
244
|
+
text.setModel(defaultModel);
|
|
245
|
+
text.setBindingContext(defaultModel.createBindingContext("/") as Context);
|
|
246
|
+
|
|
247
|
+
if (namedModelsContent) {
|
|
248
|
+
for (const [name, content] of Object.entries(namedModelsContent)) {
|
|
249
|
+
const model = new JSONModel(content);
|
|
250
|
+
text.setModel(model, name);
|
|
251
|
+
text.setBindingContext(model.createBindingContext("/") as Context, name);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
210
255
|
return text.getText();
|
|
211
|
-
}
|
|
256
|
+
}
|
|
212
257
|
|
|
213
258
|
export const getTemplatingResult = async function(
|
|
214
259
|
xmlInput: string,
|
|
@@ -275,7 +320,7 @@ export const getTemplatedXML = async function(
|
|
|
275
320
|
*
|
|
276
321
|
* @param {string} name Fully qualified name of the fragment to be tested.
|
|
277
322
|
* @param {object} testData Test data consisting
|
|
278
|
-
* @returns
|
|
323
|
+
* @returns Templated fragment as string
|
|
279
324
|
*/
|
|
280
325
|
export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
|
|
281
326
|
const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
|
|
@@ -284,14 +329,14 @@ export async function processFragment(name: string, testData: { [model: string]:
|
|
|
284
329
|
|
|
285
330
|
// build model and bindings for given test data
|
|
286
331
|
const settings = {
|
|
287
|
-
models: {} as { [name: string]: JSONModel
|
|
332
|
+
models: {} as { [name: string]: JSONModel },
|
|
288
333
|
bindingContexts: {} as { [name: string]: object }
|
|
289
334
|
};
|
|
290
335
|
for (const model in testData) {
|
|
291
|
-
const jsonModel = new JSONModel
|
|
336
|
+
const jsonModel = new JSONModel();
|
|
292
337
|
jsonModel.setData(testData[model]);
|
|
293
338
|
settings.models[model] = jsonModel;
|
|
294
|
-
settings.bindingContexts[model] = settings.models[model].createBindingContext("/");
|
|
339
|
+
settings.bindingContexts[model] = settings.models[model].createBindingContext("/") as Context;
|
|
295
340
|
}
|
|
296
341
|
|
|
297
342
|
// execute the pre-processor
|
|
@@ -305,7 +350,10 @@ export async function processFragment(name: string, testData: { [model: string]:
|
|
|
305
350
|
}
|
|
306
351
|
}
|
|
307
352
|
|
|
308
|
-
|
|
353
|
+
// Keep the fragment result as child of root node when fragment generates multiple root controls
|
|
354
|
+
const xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
|
|
355
|
+
|
|
356
|
+
return formatXml(xmlResult, {
|
|
309
357
|
filter: (node: any) => node.type !== "Comment"
|
|
310
358
|
});
|
|
311
359
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
/* global QUnit */
|
|
6
7
|
sap.ui.define(
|
|
@@ -70,7 +71,9 @@ sap.ui.define(
|
|
|
70
71
|
* @param {object} [mSettings.launchParameters] The URL launch parameters
|
|
71
72
|
* @param {boolean} [mSettings.async] If false (default), only one JourneyRunner is executed at a time
|
|
72
73
|
* @param {Function[] | string[]} vJourneys The journeys to be executed. If a journey is represented as a string, it will be interpreted
|
|
73
|
-
* as a module path to the file that should be loaded. Else it is expected to be a function
|
|
74
|
+
* as a module path to the file that should be loaded. Else it is expected to be a function.
|
|
75
|
+
* Alternatively, instead of being wrapped in an array, the journeys can also be given as separate parameters:
|
|
76
|
+
* <pre>.run(mSettings, Journey1, Journey2, ...)</pre>
|
|
74
77
|
* @returns {object} A <code>Promise</code> that is resolved after all tests have been executed
|
|
75
78
|
*
|
|
76
79
|
* @function
|
|
@@ -86,8 +89,11 @@ sap.ui.define(
|
|
|
86
89
|
mSettings = Utils.mergeObjects(this._mInstanceSettings, mSettings);
|
|
87
90
|
}
|
|
88
91
|
|
|
89
|
-
var aJourneys =
|
|
90
|
-
|
|
92
|
+
var aJourneys = Array.prototype.slice.call(arguments, iJourneyParameterIndex); // journey-related parameter(s) as array
|
|
93
|
+
if (aJourneys && aJourneys.length && Array.isArray(aJourneys[0])) { // if the first journey parameter is an array...
|
|
94
|
+
aJourneys = aJourneys[0]; // ...then unwrap it, to use this array itself
|
|
95
|
+
}
|
|
96
|
+
var bAsync = mSettings.async,
|
|
91
97
|
pSyncPromise;
|
|
92
98
|
|
|
93
99
|
if (bAsync) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(
|
|
6
7
|
[
|
|
@@ -17,7 +18,8 @@ sap.ui.define(
|
|
|
17
18
|
"sap/fe/test/api/FooterAssertionsBase",
|
|
18
19
|
"sap/fe/test/api/HeaderActionsLR",
|
|
19
20
|
"sap/fe/test/api/HeaderAssertionsLR",
|
|
20
|
-
"sap/fe/test/api/KPICardAssertions"
|
|
21
|
+
"sap/fe/test/api/KPICardAssertions",
|
|
22
|
+
"sap/fe/test/api/KPICardActions"
|
|
21
23
|
],
|
|
22
24
|
function(
|
|
23
25
|
Utils,
|
|
@@ -33,7 +35,8 @@ sap.ui.define(
|
|
|
33
35
|
FooterAssertionsBase,
|
|
34
36
|
HeaderActionsLR,
|
|
35
37
|
HeaderAssertionsLR,
|
|
36
|
-
KPICardAssertions
|
|
38
|
+
KPICardAssertions,
|
|
39
|
+
KPICardActions
|
|
37
40
|
) {
|
|
38
41
|
"use strict";
|
|
39
42
|
|
|
@@ -131,6 +134,9 @@ sap.ui.define(
|
|
|
131
134
|
id: sChartId
|
|
132
135
|
});
|
|
133
136
|
},
|
|
137
|
+
onKPICard: function() {
|
|
138
|
+
return new KPICardActions(KPIBuilder.create(this));
|
|
139
|
+
},
|
|
134
140
|
/**
|
|
135
141
|
* Returns a {@link sap.fe.test.api.FilterBarActions} instance.
|
|
136
142
|
*
|
|
@@ -350,7 +356,7 @@ sap.ui.define(
|
|
|
350
356
|
},
|
|
351
357
|
iSeeFlpLink: function(sDescription) {
|
|
352
358
|
return OpaBuilder.create(this)
|
|
353
|
-
.hasType("sap.
|
|
359
|
+
.hasType("sap.m.Link")
|
|
354
360
|
.isDialogElement(true)
|
|
355
361
|
.hasProperties({ text: sDescription })
|
|
356
362
|
.description("FLP link with text '" + sDescription + "' is present")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
|
|
6
7
|
"use strict";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(
|
|
6
7
|
[
|
|
@@ -39,8 +40,10 @@ sap.ui.define(
|
|
|
39
40
|
) {
|
|
40
41
|
"use strict";
|
|
41
42
|
|
|
42
|
-
function getTableId(sNavProperty) {
|
|
43
|
-
return
|
|
43
|
+
function getTableId(sNavProperty, sQualifier) {
|
|
44
|
+
return sQualifier
|
|
45
|
+
? "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem::" + sQualifier
|
|
46
|
+
: "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem";
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
function getChartId(sEntityType) {
|
|
@@ -182,7 +185,7 @@ sap.ui.define(
|
|
|
182
185
|
*/
|
|
183
186
|
onTable: function(vTableIdentifier) {
|
|
184
187
|
if (!Utils.isOfType(vTableIdentifier, String)) {
|
|
185
|
-
vTableIdentifier = { id: getTableId(vTableIdentifier.property) };
|
|
188
|
+
vTableIdentifier = { id: getTableId(vTableIdentifier.property, vTableIdentifier.qualifier) };
|
|
186
189
|
}
|
|
187
190
|
return this._onTable(vTableIdentifier);
|
|
188
191
|
},
|
|
@@ -297,13 +300,15 @@ sap.ui.define(
|
|
|
297
300
|
.execute();
|
|
298
301
|
},
|
|
299
302
|
iEnableLink: function(sText) {
|
|
300
|
-
return
|
|
301
|
-
.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
303
|
+
return (
|
|
304
|
+
OpaBuilder.create(this)
|
|
305
|
+
.hasType("sap.m.ColumnListItem")
|
|
306
|
+
//.hasAggregationProperties("cells", { text: sText })
|
|
307
|
+
.isDialogElement()
|
|
308
|
+
.doPress("selectMulti")
|
|
309
|
+
.description("The CheckBox for link " + sText + " is selected")
|
|
310
|
+
.execute()
|
|
311
|
+
);
|
|
307
312
|
},
|
|
308
313
|
iPressKeyboardShortcutOnSection: function(sShortcut, mProperties) {
|
|
309
314
|
return this._iPressKeyboardShortcut(undefined, sShortcut, mProperties, "sap.uxap.ObjectPageSection");
|
|
@@ -463,7 +468,7 @@ sap.ui.define(
|
|
|
463
468
|
*/
|
|
464
469
|
onTable: function(vTableIdentifier) {
|
|
465
470
|
if (!Utils.isOfType(vTableIdentifier, String)) {
|
|
466
|
-
vTableIdentifier = { id: getTableId(vTableIdentifier.property) };
|
|
471
|
+
vTableIdentifier = { id: getTableId(vTableIdentifier.property, vTableIdentifier.qualifier) };
|
|
467
472
|
}
|
|
468
473
|
return this._onTable(vTableIdentifier);
|
|
469
474
|
},
|
|
@@ -641,7 +646,7 @@ sap.ui.define(
|
|
|
641
646
|
},
|
|
642
647
|
iSeeFlpLink: function(sDescription) {
|
|
643
648
|
return OpaBuilder.create(this)
|
|
644
|
-
.hasType("sap.
|
|
649
|
+
.hasType("sap.m.Link")
|
|
645
650
|
.isDialogElement(true)
|
|
646
651
|
.hasProperties({ text: sDescription })
|
|
647
652
|
.description("FLP link with text '" + sDescription + "' is present")
|
|
@@ -814,12 +819,18 @@ sap.ui.define(
|
|
|
814
819
|
.hasType("sap.m.MessageView")
|
|
815
820
|
.check(function(oMessageView) {
|
|
816
821
|
var messages = oMessageView[0].getItems();
|
|
817
|
-
|
|
822
|
+
var bMessageObjectHasExpectedValues =
|
|
818
823
|
messages[iMessagePosition].getGroupName() === oBoundMessageInfo.GroupLabel &&
|
|
819
824
|
messages[iMessagePosition].getTitle() === oBoundMessageInfo.MessageText &&
|
|
820
825
|
messages[iMessagePosition].getSubtitle() === oBoundMessageInfo.SubTitle &&
|
|
821
|
-
messages[iMessagePosition].getActiveTitle() === oBoundMessageInfo.ActiveTitle
|
|
822
|
-
)
|
|
826
|
+
messages[iMessagePosition].getActiveTitle() === oBoundMessageInfo.ActiveTitle;
|
|
827
|
+
if (oBoundMessageInfo.Description) {
|
|
828
|
+
return (
|
|
829
|
+
bMessageObjectHasExpectedValues &&
|
|
830
|
+
messages[iMessagePosition].getGroupName() === oBoundMessageInfo.GroupLabel
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
return bMessageObjectHasExpectedValues;
|
|
823
834
|
}, true)
|
|
824
835
|
.isDialogElement(true)
|
|
825
836
|
.description("MessageItem is correctly displayed")
|
package/src/sap/fe/test/Shell.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
|
|
6
7
|
"use strict";
|
package/src/sap/fe/test/Stubs.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* ! SAPUI5
|
|
3
|
-
|
|
2
|
+
* ! SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(
|
|
6
7
|
[
|
|
@@ -131,7 +132,7 @@ sap.ui.define(
|
|
|
131
132
|
if (sKey === "T_NEW_OBJECT") {
|
|
132
133
|
return "New Object";
|
|
133
134
|
} else {
|
|
134
|
-
return "
|
|
135
|
+
return "Unnamed Object";
|
|
135
136
|
}
|
|
136
137
|
});
|
|
137
138
|
}
|