@sapui5/sap.fe.test 1.93.3 → 1.96.2
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 +2 -2
- package/src/sap/fe/test/.library +1 -1
- package/src/sap/fe/test/Flexibility.js +33 -8
- package/src/sap/fe/test/JestTemplatingHelper.js +32 -7
- package/src/sap/fe/test/JestTemplatingHelper.ts +23 -6
- package/src/sap/fe/test/ListReport.js +20 -3
- package/src/sap/fe/test/ObjectPage.js +52 -0
- package/src/sap/fe/test/Shell.js +16 -11
- package/src/sap/fe/test/TemplatePage.js +48 -0
- package/src/sap/fe/test/UI5MockHelper.js +218 -0
- package/src/sap/fe/test/UI5MockHelper.ts +137 -0
- package/src/sap/fe/test/Utils.js +5 -1
- package/src/sap/fe/test/api/BaseAPI.js +10 -0
- package/src/sap/fe/test/api/ChartActions.js +11 -0
- package/src/sap/fe/test/api/ChartAssertions.js +35 -7
- package/src/sap/fe/test/api/DialogAPI.js +82 -37
- package/src/sap/fe/test/api/DialogActions.js +27 -0
- package/src/sap/fe/test/api/DialogAssertions.js +33 -0
- package/src/sap/fe/test/api/DialogCreateActions.js +3 -1
- package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
- package/src/sap/fe/test/api/FilterBarActions.js +21 -15
- package/src/sap/fe/test/api/FilterBarAssertions.js +38 -6
- package/src/sap/fe/test/api/FormActions.js +33 -9
- package/src/sap/fe/test/api/HeaderAssertions.js +29 -12
- package/src/sap/fe/test/api/KPICardAPI.js +28 -0
- package/src/sap/fe/test/api/KPICardAssertions.js +204 -0
- package/src/sap/fe/test/api/TableActions.js +49 -0
- package/src/sap/fe/test/api/TableAssertions.js +27 -0
- package/src/sap/fe/test/builder/KPIBuilder.js +60 -4
- package/src/sap/fe/test/builder/MacroFieldBuilder.js +2 -0
- package/src/sap/fe/test/builder/MdcTableBuilder.js +63 -0
- package/src/sap/fe/test/library.js +1 -1
- package/src/sap/fe/test/massEdit.js +33 -16
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define([], function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
|
|
10
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
11
|
+
|
|
12
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
13
|
+
|
|
14
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
15
|
+
|
|
16
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Mock class for a V4 Context
|
|
20
|
+
*/
|
|
21
|
+
var MockContext = function MockContext(oValues, oBinding) {
|
|
22
|
+
var _this = this;
|
|
23
|
+
|
|
24
|
+
_classCallCheck(this, MockContext);
|
|
25
|
+
|
|
26
|
+
_defineProperty(this, "getProperty", jest.fn(function (key) {
|
|
27
|
+
return _this.oValues[key];
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
_defineProperty(this, "getObject", jest.fn(function (key) {
|
|
31
|
+
return _this.oValues[key];
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
_defineProperty(this, "getPath", jest.fn(function () {
|
|
35
|
+
return _this.oValues["$path"];
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
_defineProperty(this, "getBinding", jest.fn(function () {
|
|
39
|
+
return _this.oBinding;
|
|
40
|
+
}));
|
|
41
|
+
|
|
42
|
+
this.oValues = oValues;
|
|
43
|
+
this.oBinding = oBinding;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
_exports.MockContext = MockContext;
|
|
47
|
+
|
|
48
|
+
var MockControl = function MockControl() {
|
|
49
|
+
_classCallCheck(this, MockControl);
|
|
50
|
+
|
|
51
|
+
_defineProperty(this, "getBindingInfo", jest.fn());
|
|
52
|
+
|
|
53
|
+
_defineProperty(this, "getBinding", jest.fn());
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Mock class for OData V4 ListBinding
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
_exports.MockControl = MockControl;
|
|
61
|
+
|
|
62
|
+
var MockListBinding = /*#__PURE__*/function () {
|
|
63
|
+
function MockListBinding(aContexts) {
|
|
64
|
+
var _this2 = this;
|
|
65
|
+
|
|
66
|
+
_classCallCheck(this, MockListBinding);
|
|
67
|
+
|
|
68
|
+
_defineProperty(this, "setAggregation", jest.fn());
|
|
69
|
+
|
|
70
|
+
_defineProperty(this, "filter", jest.fn());
|
|
71
|
+
|
|
72
|
+
_defineProperty(this, "sort", jest.fn());
|
|
73
|
+
|
|
74
|
+
_defineProperty(this, "requestContexts", jest.fn(function () {
|
|
75
|
+
return Promise.resolve(_this2.aMockContexts);
|
|
76
|
+
}));
|
|
77
|
+
|
|
78
|
+
_defineProperty(this, "getCurrentContexts", jest.fn(function () {
|
|
79
|
+
return _this2.aMockContexts;
|
|
80
|
+
}));
|
|
81
|
+
|
|
82
|
+
aContexts = aContexts || [];
|
|
83
|
+
this.aMockContexts = aContexts.map(function (context) {
|
|
84
|
+
return new MockContext(context, _this2);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
_exports.MockListBinding = MockListBinding;
|
|
89
|
+
|
|
90
|
+
_createClass(MockListBinding, [{
|
|
91
|
+
key: "isA",
|
|
92
|
+
value: function isA(sClassName) {
|
|
93
|
+
return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
|
|
94
|
+
} // Mocked API
|
|
95
|
+
|
|
96
|
+
}]);
|
|
97
|
+
|
|
98
|
+
return MockListBinding;
|
|
99
|
+
}();
|
|
100
|
+
|
|
101
|
+
_exports.MockListBinding = MockListBinding;
|
|
102
|
+
|
|
103
|
+
var MockContextBinding = /*#__PURE__*/function () {
|
|
104
|
+
function MockContextBinding(oContext) {
|
|
105
|
+
var _this3 = this;
|
|
106
|
+
|
|
107
|
+
_classCallCheck(this, MockContextBinding);
|
|
108
|
+
|
|
109
|
+
_defineProperty(this, "getBoundContext", jest.fn(function () {
|
|
110
|
+
return _this3.oMockContext;
|
|
111
|
+
}));
|
|
112
|
+
|
|
113
|
+
_defineProperty(this, "attachEventOnce", jest.fn());
|
|
114
|
+
|
|
115
|
+
this.oMockContext = new MockContext(oContext || {}, this);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
_exports.MockContextBinding = MockContextBinding;
|
|
119
|
+
|
|
120
|
+
_createClass(MockContextBinding, [{
|
|
121
|
+
key: "isA",
|
|
122
|
+
value: function isA(sClassName) {
|
|
123
|
+
return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
|
|
124
|
+
}
|
|
125
|
+
}, {
|
|
126
|
+
key: "getInternalMockContext",
|
|
127
|
+
value: function getInternalMockContext() {
|
|
128
|
+
return this.oMockContext;
|
|
129
|
+
} // Mocked API
|
|
130
|
+
|
|
131
|
+
}]);
|
|
132
|
+
|
|
133
|
+
return MockContextBinding;
|
|
134
|
+
}();
|
|
135
|
+
/**
|
|
136
|
+
* Mock class for OData V4 MetaModel
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
_exports.MockContextBinding = MockContextBinding;
|
|
141
|
+
|
|
142
|
+
var MockMetaModel = function MockMetaModel(oMetaData) {
|
|
143
|
+
var _this4 = this;
|
|
144
|
+
|
|
145
|
+
_classCallCheck(this, MockMetaModel);
|
|
146
|
+
|
|
147
|
+
_defineProperty(this, "getMetaContext", jest.fn(function (sPath) {
|
|
148
|
+
return new MockContext({
|
|
149
|
+
$path: sPath
|
|
150
|
+
});
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
_defineProperty(this, "getObject", jest.fn(function (sPath) {
|
|
154
|
+
return _this4.oMetaContext.getProperty(sPath);
|
|
155
|
+
}));
|
|
156
|
+
|
|
157
|
+
this.oMetaContext = new MockContext(oMetaData || {});
|
|
158
|
+
} // Mocked API
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
160
|
+
;
|
|
161
|
+
/**
|
|
162
|
+
* Mock class for OData V4 Model
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
_exports.MockMetaModel = MockMetaModel;
|
|
167
|
+
|
|
168
|
+
var MockModel = /*#__PURE__*/function () {
|
|
169
|
+
function MockModel(mockListBinding, mockContextBinding) {
|
|
170
|
+
var _this5 = this;
|
|
171
|
+
|
|
172
|
+
_classCallCheck(this, MockModel);
|
|
173
|
+
|
|
174
|
+
_defineProperty(this, "bindList", jest.fn(function () {
|
|
175
|
+
return _this5.mockListBinding;
|
|
176
|
+
}));
|
|
177
|
+
|
|
178
|
+
_defineProperty(this, "bindContext", jest.fn(function () {
|
|
179
|
+
return _this5.mockContextBinding;
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
_defineProperty(this, "getMetaModel", jest.fn(function () {
|
|
183
|
+
return _this5.oMetaModel;
|
|
184
|
+
}));
|
|
185
|
+
|
|
186
|
+
this.mockListBinding = mockListBinding;
|
|
187
|
+
this.mockContextBinding = mockContextBinding;
|
|
188
|
+
} // Factories
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
_exports.MockModel = MockModel;
|
|
192
|
+
|
|
193
|
+
_createClass(MockModel, [{
|
|
194
|
+
key: "setMetaModel",
|
|
195
|
+
value: function setMetaModel(oMetaModel) {
|
|
196
|
+
this.oMetaModel = oMetaModel;
|
|
197
|
+
} // Mocked API
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
199
|
+
|
|
200
|
+
}], [{
|
|
201
|
+
key: "modelFromListBinding",
|
|
202
|
+
value: function modelFromListBinding(mockListBinding) {
|
|
203
|
+
return new MockModel(mockListBinding);
|
|
204
|
+
}
|
|
205
|
+
}, {
|
|
206
|
+
key: "modelFromContextBinding",
|
|
207
|
+
value: function modelFromContextBinding(mockContextBinding) {
|
|
208
|
+
return new MockModel(undefined, mockContextBinding);
|
|
209
|
+
}
|
|
210
|
+
}]);
|
|
211
|
+
|
|
212
|
+
return MockModel;
|
|
213
|
+
}();
|
|
214
|
+
|
|
215
|
+
_exports.MockModel = MockModel;
|
|
216
|
+
return _exports;
|
|
217
|
+
}, false);
|
|
218
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJNb2NrQ29udHJvbCIsIk1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0cyIsIlByb21pc2UiLCJyZXNvbHZlIiwiYU1vY2tDb250ZXh0cyIsIm1hcCIsImNvbnRleHQiLCJzQ2xhc3NOYW1lIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwic1BhdGgiLCIkcGF0aCIsIm9NZXRhQ29udGV4dCIsImdldFByb3BlcnR5IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwib01ldGFNb2RlbCIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFGQTtBQUNBO0FBQ0E7TUFJYUEsVyxHQUNaLHFCQUEyQkMsT0FBM0IsRUFBaURDLFFBQWpELEVBQWlFO0FBQUE7O0FBQUE7O0FBQUEseUNBRTVDQyxJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWlCO0FBQzdDLGFBQU8sS0FBSSxDQUFDSixPQUFMLENBQWFJLEdBQWIsQ0FBUDtBQUNBLEtBRm9CLENBRjRDOztBQUFBLHVDQUs5Q0YsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUMzQyxhQUFPLEtBQUksQ0FBQ0osT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUZrQixDQUw4Qzs7QUFBQSxxQ0FRaERGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDOUIsYUFBTyxLQUFJLENBQUNILE9BQUwsQ0FBYSxPQUFiLENBQVA7QUFDQSxLQUZnQixDQVJnRDs7QUFBQSx3Q0FZN0NFLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDakMsYUFBTyxL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T0FGb0IsQ0FwQjBGOztBQUFBLDRDQXVCekZ2QixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQ25DLGVBQVEsTUFBSSxDQUFDdUIsVUFBYjtBQUNBLE9BRnFCLENBdkJ5Rjs7QUFBQSxXQUFwRkYsZUFBb0YsR0FBcEZBLGVBQW9GO0FBQUEsV0FBekNDLGtCQUF5QyxHQUF6Q0Esa0JBQXlDO0FBQUUsSyxDQUVqSDs7Ozs7OzthQVFBLHNCQUFvQkMsVUFBcEIsRUFBK0M7QUFDOUMsYUFBS0EsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxPLENBRUQ7QUFDQTs7OzthQVpBLDhCQUE0QkYsZUFBNUIsRUFBeUU7QUFDeEUsZUFBTyxJQUFJRCxTQUFKLENBQWNDLGVBQWQsQ0FBUDtBQUNBOzs7YUFDRCxpQ0FBK0JDLGtCQUEvQixFQUFrRjtBQUNqRixlQUFPLElBQUlGLFNBQUosQ0FBY0ksU0FBZCxFQUF5QkYsa0JBQXpCLENBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuXG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YUxpc3RCaW5kaW5nLCBPRGF0YUNvbnRleHRCaW5kaW5nLCBPRGF0YU1ldGFNb2RlbCwgT0RhdGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9WYWx1ZXM6IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIHtcblx0cHVibGljIGdldEJpbmRpbmdJbmZvID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10pIHtcblx0XHRhQ29udGV4dHMgPSBhQ29udGV4dHMgfHwgW107XG5cblx0XHR0aGlzLmFNb2NrQ29udGV4dHMgPSBhQ29udGV4dHMubWFwKGNvbnRleHQgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBNb2NrQ29udGV4dChjb250ZXh0LCB0aGlzKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvQ29udGV4dD86IGFueSkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvTWV0YURhdGE/OiBhbnkpIHtcblx0XHR0aGlzLm9NZXRhQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRNZXRhQ29udGV4dCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gKG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock class for a V4 Context
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Context, ODataListBinding, ODataContextBinding, ODataMetaModel, ODataModel } from "sap/ui/model/odata/v4";
|
|
6
|
+
|
|
7
|
+
export class MockContext implements Partial<Context> {
|
|
8
|
+
public constructor(private oValues: any, private oBinding?: any) {}
|
|
9
|
+
|
|
10
|
+
public getProperty = jest.fn((key: string) => {
|
|
11
|
+
return this.oValues[key];
|
|
12
|
+
});
|
|
13
|
+
public getObject = jest.fn((key: string) => {
|
|
14
|
+
return this.oValues[key];
|
|
15
|
+
});
|
|
16
|
+
public getPath = jest.fn(() => {
|
|
17
|
+
return this.oValues["$path"];
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
public getBinding = jest.fn(() => {
|
|
21
|
+
return this.oBinding;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class MockControl {
|
|
26
|
+
public getBindingInfo = jest.fn();
|
|
27
|
+
public getBinding = jest.fn();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Mock class for OData V4 ListBinding
|
|
32
|
+
*/
|
|
33
|
+
export class MockListBinding implements Partial<ODataListBinding> {
|
|
34
|
+
private aMockContexts: MockContext[];
|
|
35
|
+
|
|
36
|
+
public constructor(aContexts?: any[]) {
|
|
37
|
+
aContexts = aContexts || [];
|
|
38
|
+
|
|
39
|
+
this.aMockContexts = aContexts.map(context => {
|
|
40
|
+
return new MockContext(context, this);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public isA(sClassName: string): boolean {
|
|
45
|
+
return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Mocked API
|
|
49
|
+
public setAggregation = jest.fn();
|
|
50
|
+
public filter = jest.fn();
|
|
51
|
+
public sort = jest.fn();
|
|
52
|
+
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
54
|
+
public requestContexts = jest.fn((...args) => {
|
|
55
|
+
return Promise.resolve((this.aMockContexts as any) as Context[]);
|
|
56
|
+
});
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
58
|
+
public getCurrentContexts = jest.fn((...args) => {
|
|
59
|
+
return (this.aMockContexts as any) as Context[];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export class MockContextBinding implements Partial<ODataContextBinding> {
|
|
64
|
+
private oMockContext: MockContext;
|
|
65
|
+
|
|
66
|
+
public constructor(oContext?: any) {
|
|
67
|
+
this.oMockContext = new MockContext(oContext || {}, this);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public isA(sClassName: string): boolean {
|
|
71
|
+
return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
|
|
72
|
+
}
|
|
73
|
+
public getInternalMockContext(): MockContext {
|
|
74
|
+
return this.oMockContext;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Mocked API
|
|
78
|
+
public getBoundContext = jest.fn(() => {
|
|
79
|
+
return (this.oMockContext as any) as Context;
|
|
80
|
+
});
|
|
81
|
+
public attachEventOnce = jest.fn();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Mock class for OData V4 MetaModel
|
|
86
|
+
*/
|
|
87
|
+
export class MockMetaModel implements Partial<ODataMetaModel> {
|
|
88
|
+
private oMetaContext: MockContext;
|
|
89
|
+
|
|
90
|
+
public constructor(oMetaData?: any) {
|
|
91
|
+
this.oMetaContext = new MockContext(oMetaData || {});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Mocked API
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
96
|
+
public getMetaContext = jest.fn((sPath: string) => {
|
|
97
|
+
return (new MockContext({ $path: sPath }) as any) as Context;
|
|
98
|
+
});
|
|
99
|
+
public getObject = jest.fn((sPath: string) => {
|
|
100
|
+
return this.oMetaContext.getProperty(sPath);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Mock class for OData V4 Model
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
export class MockModel implements Partial<ODataModel> {
|
|
109
|
+
private oMetaModel?: MockMetaModel;
|
|
110
|
+
|
|
111
|
+
public constructor(private mockListBinding?: MockListBinding, private mockContextBinding?: MockContextBinding) {}
|
|
112
|
+
|
|
113
|
+
// Factories
|
|
114
|
+
static modelFromListBinding(mockListBinding: MockListBinding): MockModel {
|
|
115
|
+
return new MockModel(mockListBinding);
|
|
116
|
+
}
|
|
117
|
+
static modelFromContextBinding(mockContextBinding: MockContextBinding): MockModel {
|
|
118
|
+
return new MockModel(undefined, mockContextBinding);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public setMetaModel(oMetaModel: MockMetaModel) {
|
|
122
|
+
this.oMetaModel = oMetaModel;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Mocked API
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
127
|
+
public bindList = jest.fn((...args) => {
|
|
128
|
+
return (this.mockListBinding as any) as ODataListBinding;
|
|
129
|
+
});
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
131
|
+
public bindContext = jest.fn((...args) => {
|
|
132
|
+
return (this.mockContextBinding as any) as ODataContextBinding;
|
|
133
|
+
});
|
|
134
|
+
public getMetaModel = jest.fn(() => {
|
|
135
|
+
return (this.oMetaModel as any) as ODataMetaModel;
|
|
136
|
+
});
|
|
137
|
+
}
|
package/src/sap/fe/test/Utils.js
CHANGED
|
@@ -42,7 +42,11 @@ sap.ui.define(
|
|
|
42
42
|
if (sSingleDeltaManifest.indexOf("/") !== 0) {
|
|
43
43
|
sSingleDeltaManifest = sComponentName + "/" + sSingleDeltaManifest;
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
try {
|
|
46
|
+
oTargetManifest = mergeObjects({}, oTargetManifest, LoaderExtensions.loadResource(sSingleDeltaManifest));
|
|
47
|
+
} catch (ignore) {
|
|
48
|
+
// not always an error, e.g. when navigating to a different app that does not have the delta manifest
|
|
49
|
+
}
|
|
46
50
|
});
|
|
47
51
|
}
|
|
48
52
|
|
|
@@ -68,6 +68,16 @@ sap.ui.define(
|
|
|
68
68
|
* @public
|
|
69
69
|
*/
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* An action parameter dialog field identifier
|
|
73
|
+
*
|
|
74
|
+
* @typedef {object} ActionDialogFieldIdentifier
|
|
75
|
+
* @property {string} property The name of the field
|
|
76
|
+
*
|
|
77
|
+
* @name sap.fe.test.api.ActionDialogFieldIdentifier
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
|
|
71
81
|
function _findParentChainFunction(oResult, sChainKeyword) {
|
|
72
82
|
var oAnd = oResult.and;
|
|
73
83
|
if (sChainKeyword in oAnd) {
|
|
@@ -115,5 +115,16 @@ sap.ui.define(["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/
|
|
|
115
115
|
.execute();
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
+
Actions.prototype.iExecuteActionWithText = function(sText) {
|
|
119
|
+
return OpaBuilder.create(this)
|
|
120
|
+
.hasType("sap.m.Button")
|
|
121
|
+
.hasProperties({
|
|
122
|
+
text: sText
|
|
123
|
+
})
|
|
124
|
+
.doPress()
|
|
125
|
+
.description("Clicked on button" + sText)
|
|
126
|
+
.execute();
|
|
127
|
+
};
|
|
128
|
+
|
|
118
129
|
return Actions;
|
|
119
130
|
});
|
|
@@ -25,11 +25,26 @@ sap.ui.define(
|
|
|
25
25
|
ChartAssertions.prototype.constructor = ChartAssertions;
|
|
26
26
|
ChartAssertions.prototype.isAction = false;
|
|
27
27
|
|
|
28
|
-
ChartAssertions.prototype.iCheckItems = function(iNumberOfItems) {
|
|
28
|
+
ChartAssertions.prototype.iCheckItems = function(iNumberOfItems, sTab) {
|
|
29
29
|
return OpaBuilder.create(this)
|
|
30
|
-
.hasType("sap.ui.mdc.
|
|
31
|
-
.check(function(
|
|
32
|
-
var
|
|
30
|
+
.hasType("sap.ui.mdc.ChartNew")
|
|
31
|
+
.check(function(aCharts) {
|
|
32
|
+
var oChart;
|
|
33
|
+
if (sTab && aCharts && aCharts.length > 1) {
|
|
34
|
+
for (var i = 0; i < aCharts.length; i++) {
|
|
35
|
+
if (aCharts[i].getId().indexOf("fe::Chart::" + sTab) > -1) {
|
|
36
|
+
oChart = aCharts[i];
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
oChart = aCharts[0];
|
|
42
|
+
}
|
|
43
|
+
var aContexts = oChart
|
|
44
|
+
.getControlDelegate()
|
|
45
|
+
._getChart(oChart)
|
|
46
|
+
.getBinding("data")
|
|
47
|
+
.getContexts();
|
|
33
48
|
return (
|
|
34
49
|
(aContexts && (iNumberOfItems === undefined ? aContexts.length !== 0 : aContexts.length === iNumberOfItems)) ||
|
|
35
50
|
(!aContexts && iNumberOfItems === 0)
|
|
@@ -41,7 +56,7 @@ sap.ui.define(
|
|
|
41
56
|
|
|
42
57
|
ChartAssertions.prototype.iSeeChartType = function(sChartType) {
|
|
43
58
|
return OpaBuilder.create(this)
|
|
44
|
-
.hasType("sap.ui.mdc.
|
|
59
|
+
.hasType("sap.ui.mdc.ChartNew")
|
|
45
60
|
.check(function(oChart) {
|
|
46
61
|
return sChartType === oChart[0].getChartType();
|
|
47
62
|
}, true)
|
|
@@ -51,7 +66,7 @@ sap.ui.define(
|
|
|
51
66
|
|
|
52
67
|
ChartAssertions.prototype.iSeeChartVisible = function() {
|
|
53
68
|
return OpaBuilder.create(this)
|
|
54
|
-
.hasType("sap.ui.mdc.
|
|
69
|
+
.hasType("sap.ui.mdc.ChartNew")
|
|
55
70
|
.check(function(oChart) {
|
|
56
71
|
return oChart[0].getVisible() === true;
|
|
57
72
|
}, true)
|
|
@@ -88,13 +103,26 @@ sap.ui.define(
|
|
|
88
103
|
|
|
89
104
|
ChartAssertions.prototype.iCheckChartNoDataText = function(sNoDataText) {
|
|
90
105
|
return OpaBuilder.create(this)
|
|
91
|
-
.hasType("sap.ui.mdc.
|
|
106
|
+
.hasType("sap.ui.mdc.ChartNew")
|
|
92
107
|
.check(function(oChart) {
|
|
93
108
|
return sNoDataText === oChart[0].getNoDataText();
|
|
94
109
|
})
|
|
95
110
|
.description("No Data text is " + sNoDataText)
|
|
96
111
|
.execute();
|
|
97
112
|
};
|
|
113
|
+
|
|
114
|
+
ChartAssertions.prototype.iCheckButtonWithText = function(sText) {
|
|
115
|
+
return OpaBuilder.create(this)
|
|
116
|
+
.hasType("sap.m.Button")
|
|
117
|
+
.hasProperties({ text: sText })
|
|
118
|
+
.description("Seeing Button with text '" + sText + "'")
|
|
119
|
+
.execute();
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
ChartAssertions.prototype.iCheckMessageToastWithText = function(sText) {
|
|
123
|
+
return FEBuilder.createMessageToastBuilder(sText).execute(this);
|
|
124
|
+
};
|
|
125
|
+
|
|
98
126
|
return ChartAssertions;
|
|
99
127
|
}
|
|
100
128
|
);
|
|
@@ -2,46 +2,91 @@
|
|
|
2
2
|
* ! SAPUI5
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved.
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(
|
|
6
|
-
|
|
5
|
+
sap.ui.define(
|
|
6
|
+
[
|
|
7
|
+
"./BaseAPI",
|
|
8
|
+
"sap/fe/test/Utils",
|
|
9
|
+
"sap/fe/test/builder/FEBuilder",
|
|
10
|
+
"sap/fe/test/builder/MdcFieldBuilder",
|
|
11
|
+
"sap/fe/test/builder/DialogBuilder"
|
|
12
|
+
],
|
|
13
|
+
function(BaseAPI, Utils, FEBuilder, MdcFieldBuilder, DialogBuilder) {
|
|
14
|
+
"use strict";
|
|
7
15
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Constructs a new DialogAPI instance.
|
|
18
|
+
*
|
|
19
|
+
* @param {sap.fe.test.builder.DialogBuilder} oDialogBuilder The {@link sap.fe.test.builder.DialogBuilder} instance used to interact with the UI
|
|
20
|
+
* @param {string} [vDialogDescription] Description (optional) of the dialog to be used for logging messages
|
|
21
|
+
* @param {int} [iConfirmButtonIndex] Index of the 'confirm' button in the button aggregation; the default setting is 0 (first button from the left)
|
|
22
|
+
* @returns {sap.fe.test.api.DialogAPI} The new instance
|
|
23
|
+
* @class
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
26
|
+
var DialogAPI = function(oDialogBuilder, vDialogDescription, iConfirmButtonIndex) {
|
|
27
|
+
if (!Utils.isOfType(oDialogBuilder, DialogBuilder)) {
|
|
28
|
+
throw new Error("oDialogBuilder parameter must be a DialogBuilder instance");
|
|
29
|
+
}
|
|
30
|
+
this._iConfirmButtonIndex = iConfirmButtonIndex || 0;
|
|
31
|
+
return BaseAPI.call(this, oDialogBuilder, vDialogDescription);
|
|
32
|
+
};
|
|
33
|
+
DialogAPI.prototype = Object.create(BaseAPI.prototype);
|
|
34
|
+
DialogAPI.prototype.constructor = DialogAPI;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates a matcher for fields within action dialogs.
|
|
38
|
+
*
|
|
39
|
+
* @param {sap.fe.test.api.FieldIdentifier | string} vFieldIdentifier Identifier to be used for the matcher
|
|
40
|
+
*
|
|
41
|
+
* @returns {object} A matcher
|
|
42
|
+
*
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
DialogAPI.prototype._createFieldMatcher = function(vFieldIdentifier) {
|
|
46
|
+
var vMatcher, sFieldId;
|
|
47
|
+
if (!Utils.isOfType(vFieldIdentifier, String)) {
|
|
48
|
+
if (typeof vFieldIdentifier.property === "string") {
|
|
49
|
+
sFieldId = "APD_::" + vFieldIdentifier.property.replaceAll("/", "::");
|
|
50
|
+
} else {
|
|
51
|
+
throw new Error(
|
|
52
|
+
"The 'property' parameter for creating a control ID for a field in an action dialog is not supported: " +
|
|
53
|
+
vFieldIdentifier.property
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
vMatcher = FEBuilder.Matchers.id(new RegExp(Utils.formatMessage("{0}", sFieldId)));
|
|
57
|
+
} else {
|
|
58
|
+
// identify a field by its label
|
|
59
|
+
//vMatcher = FEBuilder.Matchers.label(vFieldIdentifier);
|
|
60
|
+
}
|
|
61
|
+
return vMatcher;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
DialogAPI.prototype._createFieldBuilder = function(vFieldIdentifier) {
|
|
65
|
+
var oMdcFieldBuilder = new MdcFieldBuilder(this.getOpaInstance());
|
|
66
|
+
return oMdcFieldBuilder
|
|
67
|
+
.isDialogElement()
|
|
68
|
+
.hasType("sap.ui.mdc.Field")
|
|
69
|
+
.has(this._createFieldMatcher(vFieldIdentifier));
|
|
70
|
+
};
|
|
27
71
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
72
|
+
DialogAPI.prototype._getConfirmButtonMatcher = function() {
|
|
73
|
+
var iConfirmButtonIndex = this._iConfirmButtonIndex;
|
|
74
|
+
return function(oButton) {
|
|
75
|
+
var aButtons = oButton.getParent().getButtons();
|
|
76
|
+
// Confirm is (usually) the first button
|
|
77
|
+
return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex);
|
|
78
|
+
};
|
|
34
79
|
};
|
|
35
|
-
};
|
|
36
80
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
81
|
+
DialogAPI.prototype._getCancelButtonMatcher = function() {
|
|
82
|
+
var iConfirmButtonIndex = this._iConfirmButtonIndex;
|
|
83
|
+
return function(oButton) {
|
|
84
|
+
var aButtons = oButton.getParent().getButtons();
|
|
85
|
+
// Cancel is (usually) right next to the first (confirm) button
|
|
86
|
+
return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex + 1);
|
|
87
|
+
};
|
|
43
88
|
};
|
|
44
|
-
};
|
|
45
89
|
|
|
46
|
-
|
|
47
|
-
}
|
|
90
|
+
return DialogAPI;
|
|
91
|
+
}
|
|
92
|
+
);
|
|
@@ -69,5 +69,32 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder"], fu
|
|
|
69
69
|
);
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Changes the content of a field in an action parameter dialog.
|
|
74
|
+
*
|
|
75
|
+
* @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
|
|
76
|
+
* @param {string} [vValue] The new target value.
|
|
77
|
+
* @param {boolean} [bClearFirst] Set to <code>true</code> to clear previously set filters, otherwise all previously set values will be kept
|
|
78
|
+
* @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, that can be used for chaining statements
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
DialogActions.prototype.iChangeActionParameterDialogField = function(vFieldIdentifier, vValue, bClearFirst) {
|
|
82
|
+
var aArguments = Utils.parseArguments([Object, String, Boolean], arguments);
|
|
83
|
+
return this.prepareResult(
|
|
84
|
+
this._createFieldBuilder(vFieldIdentifier)
|
|
85
|
+
.doChangeValue(aArguments[1], aArguments[2])
|
|
86
|
+
.description(
|
|
87
|
+
Utils.formatMessage(
|
|
88
|
+
"Changing the field '{1}' of action parameter dialog '{0}' by adding '{2}' (was cleared first: {3})",
|
|
89
|
+
this.getIdentifier(),
|
|
90
|
+
aArguments[0],
|
|
91
|
+
aArguments[1],
|
|
92
|
+
!!aArguments[2]
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
.execute()
|
|
96
|
+
);
|
|
97
|
+
};
|
|
98
|
+
|
|
72
99
|
return DialogActions;
|
|
73
100
|
});
|