@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.
Files changed (77) hide show
  1. package/package.json +6 -2
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +3 -2
  4. package/src/sap/fe/test/BaseArrangements.js +3 -2
  5. package/src/sap/fe/test/BaseAssertions.js +3 -2
  6. package/src/sap/fe/test/ConfirmDialog.js +3 -2
  7. package/src/sap/fe/test/FCLView.js +3 -2
  8. package/src/sap/fe/test/FeMocks.js +66 -0
  9. package/src/sap/fe/test/FeMocks.ts +77 -0
  10. package/src/sap/fe/test/Flexibility.js +3 -2
  11. package/src/sap/fe/test/FlexibleColumnLayout.js +3 -2
  12. package/src/sap/fe/test/JestTemplatingHelper.js +83 -25
  13. package/src/sap/fe/test/JestTemplatingHelper.ts +74 -26
  14. package/src/sap/fe/test/JourneyRunner.js +11 -5
  15. package/src/sap/fe/test/ListReport.js +11 -5
  16. package/src/sap/fe/test/LocationUtil.js +3 -2
  17. package/src/sap/fe/test/ObjectPage.js +28 -17
  18. package/src/sap/fe/test/Shell.js +3 -2
  19. package/src/sap/fe/test/Stubs.js +3 -2
  20. package/src/sap/fe/test/TemplatePage.js +3 -2
  21. package/src/sap/fe/test/TemplatingTestUtils.js +4 -3
  22. package/src/sap/fe/test/UI5MockHelper.js +249 -137
  23. package/src/sap/fe/test/UI5MockHelper.ts +143 -13
  24. package/src/sap/fe/test/Utils.js +3 -14
  25. package/src/sap/fe/test/api/APIHelper.js +3 -2
  26. package/src/sap/fe/test/api/BaseAPI.js +5 -9
  27. package/src/sap/fe/test/api/ChartActions.js +3 -2
  28. package/src/sap/fe/test/api/ChartAssertions.js +7 -6
  29. package/src/sap/fe/test/api/DialogAPI.js +17 -4
  30. package/src/sap/fe/test/api/DialogActions.js +3 -2
  31. package/src/sap/fe/test/api/DialogAssertions.js +3 -2
  32. package/src/sap/fe/test/api/DialogCreateActions.js +4 -3
  33. package/src/sap/fe/test/api/DialogCreateAssertions.js +4 -3
  34. package/src/sap/fe/test/api/DialogMessageActions.js +19 -3
  35. package/src/sap/fe/test/api/DialogMessageAssertions.js +4 -3
  36. package/src/sap/fe/test/api/DialogType.js +3 -2
  37. package/src/sap/fe/test/api/DialogValueHelpActions.js +4 -3
  38. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +4 -3
  39. package/src/sap/fe/test/api/EditState.js +3 -2
  40. package/src/sap/fe/test/api/FilterBarAPI.js +12 -3
  41. package/src/sap/fe/test/api/FilterBarActions.js +3 -2
  42. package/src/sap/fe/test/api/FilterBarAssertions.js +3 -2
  43. package/src/sap/fe/test/api/FooterAPI.js +3 -2
  44. package/src/sap/fe/test/api/FooterActionsBase.js +3 -2
  45. package/src/sap/fe/test/api/FooterActionsOP.js +3 -2
  46. package/src/sap/fe/test/api/FooterAssertionsBase.js +3 -2
  47. package/src/sap/fe/test/api/FooterAssertionsOP.js +3 -2
  48. package/src/sap/fe/test/api/FormAPI.js +3 -2
  49. package/src/sap/fe/test/api/FormActions.js +3 -2
  50. package/src/sap/fe/test/api/FormAssertions.js +3 -2
  51. package/src/sap/fe/test/api/HeaderAPI.js +3 -2
  52. package/src/sap/fe/test/api/HeaderActions.js +3 -2
  53. package/src/sap/fe/test/api/HeaderActionsLR.js +3 -2
  54. package/src/sap/fe/test/api/HeaderAssertions.js +3 -2
  55. package/src/sap/fe/test/api/HeaderAssertionsLR.js +3 -2
  56. package/src/sap/fe/test/api/HeaderLR.js +3 -2
  57. package/src/sap/fe/test/api/KPICardAPI.js +3 -2
  58. package/src/sap/fe/test/api/KPICardActions.js +43 -0
  59. package/src/sap/fe/test/api/KPICardAssertions.js +22 -17
  60. package/src/sap/fe/test/api/TableAPI.js +3 -2
  61. package/src/sap/fe/test/api/TableActions.js +3 -21
  62. package/src/sap/fe/test/api/TableAssertions.js +17 -6
  63. package/src/sap/fe/test/builder/DialogBuilder.js +3 -2
  64. package/src/sap/fe/test/builder/FEBuilder.js +3 -2
  65. package/src/sap/fe/test/builder/KPIBuilder.js +14 -4
  66. package/src/sap/fe/test/builder/MacroFieldBuilder.js +3 -2
  67. package/src/sap/fe/test/builder/MdcFieldBuilder.js +3 -2
  68. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +3 -2
  69. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +3 -2
  70. package/src/sap/fe/test/builder/MdcTableBuilder.js +29 -2
  71. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +3 -2
  72. package/src/sap/fe/test/builder/VMBuilder.js +3 -2
  73. package/src/sap/fe/test/internal/FEArrangements.js +3 -2
  74. package/src/sap/fe/test/internal/FEJourneyRunner.js +9 -5
  75. package/src/sap/fe/test/library.js +4 -3
  76. package/src/sap/fe/test/massEdit.js +3 -2
  77. package/ui5.yaml +0 -3
@@ -1,29 +1,28 @@
1
1
  import { PhantomUtil } from "sap/fe/macros";
2
- import { _MetadataRequestor } from "sap/ui/model/odata/v4/lib";
3
- import { ODataMetaModel } from "sap/ui/model/odata/v4";
4
- import { XMLPreprocessor } from "sap/ui/core/util";
5
- import { Log } from "sap/base";
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 { BindingParser } from "sap/ui/base";
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 { JSONModel } from "sap/ui/model/json";
14
- import { InvisibleText } from "sap/ui/core";
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 { merge } from "sap/base/util";
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 csn = compileSources({ "string.cds": cdsString }, {});
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
- export const evaluateBindingWithModel = function(bindingString: string | undefined, modelContent: any) {
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
- text.setModel(jsonModel);
209
- text.setBindingContext(jsonModel.createBindingContext("/"));
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 Tempalted fragment as string
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<object> },
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<object>();
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
- return formatXml(resultDoc.innerHTML, {
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
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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 = Utils.getParametersArray(iJourneyParameterIndex, arguments),
90
- bAsync = mSettings.async,
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
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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.ui.mdc.link.PanelListItem")
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
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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 "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem";
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 OpaBuilder.create(this)
301
- .hasType("sap.m.ColumnListItem")
302
- .hasAggregationProperties("cells", { text: sText })
303
- .isDialogElement()
304
- .doPress("selectMulti")
305
- .description("The CheckBox for link " + sText + " is selected")
306
- .execute();
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.ui.mdc.link.PanelListItem")
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
- return (
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")
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  /**
6
7
  * Actions and assertions to be used with a page hosted in an FCL
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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
  [
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
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 "(Unnamed Object)";
135
+ return "Unnamed Object";
135
136
  }
136
137
  });
137
138
  }