@sapui5/sap.fe.test 1.93.3 → 1.97.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 (36) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/FCLView.js +0 -6
  4. package/src/sap/fe/test/Flexibility.js +47 -11
  5. package/src/sap/fe/test/JestTemplatingHelper.js +109 -7
  6. package/src/sap/fe/test/JestTemplatingHelper.ts +75 -6
  7. package/src/sap/fe/test/ListReport.js +20 -14
  8. package/src/sap/fe/test/ObjectPage.js +40 -26
  9. package/src/sap/fe/test/Shell.js +16 -11
  10. package/src/sap/fe/test/TemplatePage.js +48 -12
  11. package/src/sap/fe/test/UI5MockHelper.js +239 -0
  12. package/src/sap/fe/test/UI5MockHelper.ts +151 -0
  13. package/src/sap/fe/test/Utils.js +5 -1
  14. package/src/sap/fe/test/api/BaseAPI.js +31 -0
  15. package/src/sap/fe/test/api/ChartActions.js +11 -0
  16. package/src/sap/fe/test/api/ChartAssertions.js +35 -7
  17. package/src/sap/fe/test/api/DialogAPI.js +86 -37
  18. package/src/sap/fe/test/api/DialogActions.js +40 -0
  19. package/src/sap/fe/test/api/DialogAssertions.js +53 -0
  20. package/src/sap/fe/test/api/DialogCreateActions.js +3 -1
  21. package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  22. package/src/sap/fe/test/api/EditState.js +9 -0
  23. package/src/sap/fe/test/api/FilterBarActions.js +59 -19
  24. package/src/sap/fe/test/api/FilterBarAssertions.js +38 -6
  25. package/src/sap/fe/test/api/FormActions.js +33 -9
  26. package/src/sap/fe/test/api/FormAssertions.js +33 -4
  27. package/src/sap/fe/test/api/HeaderAssertions.js +29 -12
  28. package/src/sap/fe/test/api/KPICardAPI.js +28 -0
  29. package/src/sap/fe/test/api/KPICardAssertions.js +204 -0
  30. package/src/sap/fe/test/api/TableActions.js +50 -1
  31. package/src/sap/fe/test/api/TableAssertions.js +27 -0
  32. package/src/sap/fe/test/builder/KPIBuilder.js +60 -4
  33. package/src/sap/fe/test/builder/MacroFieldBuilder.js +2 -0
  34. package/src/sap/fe/test/builder/MdcTableBuilder.js +49 -0
  35. package/src/sap/fe/test/library.js +1 -1
  36. package/src/sap/fe/test/massEdit.js +33 -16
@@ -16,7 +16,8 @@ sap.ui.define(
16
16
  "sap/fe/test/api/FooterActionsBase",
17
17
  "sap/fe/test/api/FooterAssertionsBase",
18
18
  "sap/fe/test/api/HeaderActionsLR",
19
- "sap/fe/test/api/HeaderAssertionsLR"
19
+ "sap/fe/test/api/HeaderAssertionsLR",
20
+ "sap/fe/test/api/KPICardAssertions"
20
21
  ],
21
22
  function(
22
23
  Utils,
@@ -31,7 +32,8 @@ sap.ui.define(
31
32
  FooterActionsBase,
32
33
  FooterAssertionsBase,
33
34
  HeaderActionsLR,
34
- HeaderAssertionsLR
35
+ HeaderAssertionsLR,
36
+ KPICardAssertions
35
37
  ) {
36
38
  "use strict";
37
39
 
@@ -218,6 +220,12 @@ sap.ui.define(
218
220
  .doSelectVariant(sVariantName)
219
221
  .description(Utils.formatMessage("Selecting variant '{1}' from '{0}'", "Page Variant", sVariantName))
220
222
  .execute();
223
+ },
224
+ iOpenKPICard: function(sTitle) {
225
+ return KPIBuilder.create(this)
226
+ .clickKPITag(sTitle)
227
+ .description("Opening card for KPI '" + sTitle + "'")
228
+ .execute();
221
229
  }
222
230
  },
223
231
  /**
@@ -284,6 +292,9 @@ sap.ui.define(
284
292
  onHeader: function() {
285
293
  return new HeaderAssertionsLR(_getHeaderBuilder(this, PageId), { id: PageId });
286
294
  },
295
+ onKPICard: function() {
296
+ return new KPICardAssertions(KPIBuilder.create(this));
297
+ },
287
298
  iSeeTheMessageToast: function(sText) {
288
299
  return this._iSeeTheMessageToast(sText);
289
300
  },
@@ -516,26 +527,21 @@ sap.ui.define(
516
527
  .description("Seeing a value list of condition operators with " + numItems + " items.")
517
528
  .execute();
518
529
  },
519
- iCheckValueForFieldInCreateDialog: function(sFieldId, sValue, bIsRequired) {
520
- return FieldBuilder.create(this)
521
- .isDialogElement()
522
- .hasId(sFieldId)
523
- .hasValue(sValue)
524
- .hasProperties({ required: !!bIsRequired })
525
- .description(
526
- Utils.formatMessage("Seeing Create dialog parameter '{0}' with value '{1}'", sFieldId, sValue)
527
- )
528
- .execute();
529
- },
530
530
  iSeeKPI: function(sTitle, oProperties) {
531
531
  var sDescription = "Seeing KPI '" + sTitle + "'";
532
532
  if (oProperties) {
533
533
  sDescription += " with properties " + JSON.stringify(oProperties);
534
534
  }
535
535
  return KPIBuilder.create(this)
536
- .checkKPI(sTitle, oProperties)
536
+ .checkKPITag(sTitle, oProperties)
537
537
  .description(sDescription)
538
538
  .execute();
539
+ },
540
+ iSeeKPICard: function() {
541
+ return KPIBuilder.create(this)
542
+ .checkKPICard()
543
+ .description("Seeing KPI Card")
544
+ .execute();
539
545
  }
540
546
  }
541
547
  }
@@ -408,16 +408,6 @@ sap.ui.define(
408
408
  .description("Comfirmed VHD opened in dialog")
409
409
  .execute();
410
410
  },
411
- iEnterValueForFieldInCreateDialog: function(sFieldId, sValue) {
412
- return OpaBuilder.create(this)
413
- .isDialogElement()
414
- .hasId(sFieldId)
415
- .doEnterText(sValue)
416
- .description(
417
- "Entering Text in the field '" + sFieldId + "'in the create dialog with value '" + sValue + "'"
418
- )
419
- .execute();
420
- },
421
411
  iClickOnMessageButton: function() {
422
412
  return OpaBuilder.create(this)
423
413
 
@@ -657,6 +647,46 @@ sap.ui.define(
657
647
  .description("FLP link with text '" + sDescription + "' is present")
658
648
  .execute();
659
649
  },
650
+ iSeeSimpleFormWithLabel: function(sDescription) {
651
+ return OpaBuilder.create(this)
652
+ .hasType("sap.m.Label")
653
+ .isDialogElement(true)
654
+ .hasProperties({ text: sDescription })
655
+ .description("SimpleForm has label '" + sDescription + "' is present")
656
+ .execute();
657
+ },
658
+ iSeeSimpleFormWithText: function(sText) {
659
+ return OpaBuilder.create(this)
660
+ .hasType("sap.ui.layout.form.SimpleForm")
661
+ .isDialogElement(true)
662
+ .doOnChildren(
663
+ OpaBuilder.create(this)
664
+ .hasType("sap.m.Text")
665
+ .hasProperties({ text: sText })
666
+ )
667
+ .description("SimpleForm has text '" + sText + "' is present")
668
+ .execute();
669
+ },
670
+ iSeeSimpleFormWithLink: function(sText) {
671
+ return OpaBuilder.create(this)
672
+ .hasType("sap.ui.layout.form.SimpleForm")
673
+ .isDialogElement(true)
674
+ .doOnChildren(
675
+ OpaBuilder.create(this)
676
+ .hasType("sap.m.Link")
677
+ .hasProperties({ text: sText })
678
+ )
679
+ .description("SimpleForm has link '" + sText + "' is present")
680
+ .execute();
681
+ },
682
+ iSeeSimpleFormWithTitle: function(sTitle) {
683
+ return OpaBuilder.create(this)
684
+ .hasType("sap.ui.core.Title")
685
+ .isDialogElement(true)
686
+ .hasProperties({ text: sTitle })
687
+ .description("SimpleForm has label '" + sTitle + "' is present")
688
+ .execute();
689
+ },
660
690
  iSeeSelectLinksDialog: function() {
661
691
  return OpaBuilder.create(this)
662
692
  .hasType("sap.m.Title")
@@ -755,21 +785,6 @@ sap.ui.define(
755
785
  .description("Seeing variant title '" + sTitle + "'")
756
786
  .execute();
757
787
  },
758
- iCheckValueOfFieldInCreateDialog: function(sFieldId, sValue, sAdditionalValue, bIsRequired) {
759
- return FieldBuilder.create(this)
760
- .isDialogElement()
761
- .hasId(sFieldId)
762
- .hasValue(sValue, sAdditionalValue)
763
- .hasProperties({ required: !!bIsRequired })
764
- .description(
765
- Utils.formatMessage(
766
- "Seeing field '{0}' with value '{1}'",
767
- sFieldId,
768
- [].concat(sValue, sAdditionalValue || [])
769
- )
770
- )
771
- .execute();
772
- },
773
788
  iSeeMessageView: function() {
774
789
  return OpaBuilder.create(this)
775
790
  .hasType("sap.m.MessageView")
@@ -810,7 +825,6 @@ sap.ui.define(
810
825
  .description("MessageItem is correctly displayed")
811
826
  .execute();
812
827
  },
813
-
814
828
  iClickBackOnMessageView: function() {
815
829
  return OpaBuilder.create(this)
816
830
  .hasType("sap.m.MessageView")
@@ -104,21 +104,26 @@ sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"
104
104
  * @public
105
105
  */
106
106
  iPressTile: function(sTarget) {
107
- return OpaBuilder.create(this)
108
- .hasType("sap.ushell.ui.launchpad.Tile")
109
- .hasProperties({
110
- target: "#" + sTarget
111
- })
112
- .doPress()
113
- .description(Utils.formatMessage("Clicking on tile with target '{0}'", sTarget))
114
- .execute();
107
+ return this.waitFor({
108
+ controlType: "sap.ushell.ui.launchpad.Tile",
109
+ matchers: function(oTile) {
110
+ return oTile.getTarget() === "#" + sTarget;
111
+ },
112
+ actions: function(oTile) {
113
+ oTile
114
+ .getTileViews()[0]
115
+ .$()
116
+ .trigger("tap");
117
+ },
118
+ success: function(oTile) {
119
+ Opa5.assert.ok(true, Utils.formatMessage("Clicking on tile with target '{0}'", sTarget));
120
+ },
121
+ errorMessage: "Could not find the tile"
122
+ });
115
123
  },
116
124
  iOpenDefaultValues: function() {
117
125
  return OpaBuilder.create(this)
118
126
  .hasId("meAreaHeaderButton")
119
- .hasProperties({
120
- icon: "sap-icon://person-placeholder"
121
- })
122
127
  .doPress()
123
128
  .description("Opening FLP Default Values dialog")
124
129
  .execute();
@@ -367,11 +367,59 @@ sap.ui.define(
367
367
  iSeeThisPage: function() {
368
368
  return OpaBuilder.create(this)
369
369
  .hasId(sViewId)
370
+ .do(
371
+ function(oControl) {
372
+ //storing the placeholder object
373
+ var oContainer = oControl.getParent().oContainer;
374
+ var oView = oContainer;
375
+ do {
376
+ oView = oView.getParent();
377
+ } while (!oView.isA("sap.ui.core.mvc.XMLView"));
378
+
379
+ this.oPlaceholder = oView.getController().oPlaceholder;
380
+ }.bind(this)
381
+ )
370
382
  .viewId(null)
371
383
  .viewName(null)
372
384
  .description(Utils.formatMessage("Seeing the page '{0}'", sViewId))
373
385
  .execute();
374
386
  },
387
+
388
+ iResetPlaceholderStatistics: function() {
389
+ return OpaBuilder.create(this)
390
+ .do(
391
+ function() {
392
+ this.oPlaceholder.resetPlaceholderDebugStats();
393
+ }.bind(this)
394
+ )
395
+ .description("Placeholder reset statistics")
396
+ .execute();
397
+ },
398
+
399
+ //this function check that the placeholder is hidden as soon as (10ms delay) the event pageReady or HeroesBatchReceived is fired
400
+ iCheckPlaceholderStatistics: function(sPlaceholderListener) {
401
+ var placeholderListener = {
402
+ pageReady: "iPageReadyEventTimestamp",
403
+ heroesBatchReceived: "iHeroesBatchReceivedEventTimestamp"
404
+ };
405
+ return OpaBuilder.create(this)
406
+ .check(
407
+ function() {
408
+ var oPlaceHolderDebugStats = this.oPlaceholder.getPlaceholderDebugStats();
409
+ var sListener = placeholderListener[sPlaceholderListener];
410
+ if (
411
+ oPlaceHolderDebugStats.iHidePlaceholderTimestamp - oPlaceHolderDebugStats[sListener] <
412
+ 10
413
+ ) {
414
+ return true;
415
+ } else {
416
+ return false;
417
+ }
418
+ }.bind(this)
419
+ )
420
+ .description("Placeholder statistics are correct")
421
+ .execute();
422
+ },
375
423
  iSeeFilterDefinedOnActionDialogValueHelp: function(sAction, sVHParameter, sFieldName, sValue) {
376
424
  return OpaBuilder.create(this)
377
425
  .hasId(sAction + "::" + sVHParameter + "::FilterBar::FilterField::" + sFieldName + "-inner")
@@ -398,18 +446,6 @@ sap.ui.define(
398
446
  )
399
447
  .execute();
400
448
  },
401
- iSeeActionParameterContent: function(sFieldName, sContent) {
402
- var sFieldId = "APD_::" + sFieldName + "-inner",
403
- oBuilder = OpaBuilder.create(this)
404
- .hasId(sFieldId)
405
- .isDialogElement()
406
- .description("Seeing Action parameter '" + sFieldName + "' with content '" + sContent + "'");
407
-
408
- if (sContent) {
409
- oBuilder.hasProperties({ value: sContent });
410
- }
411
- return oBuilder.execute();
412
- },
413
449
  iSeePageHeaderButton: function(bCollapse) {
414
450
  return OpaBuilder.create(this)
415
451
  .hasType("sap.m.Button")
@@ -0,0 +1,239 @@
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, "setProperty", jest.fn(function (key, value) {
31
+ _this.oValues[key] = value;
32
+ return _this.oValues[key];
33
+ }));
34
+
35
+ _defineProperty(this, "getObject", jest.fn(function (key) {
36
+ return _this.oValues[key];
37
+ }));
38
+
39
+ _defineProperty(this, "getPath", jest.fn(function () {
40
+ return _this.oValues["$path"];
41
+ }));
42
+
43
+ _defineProperty(this, "getBinding", jest.fn(function () {
44
+ return _this.oBinding;
45
+ }));
46
+
47
+ _defineProperty(this, "getModel", jest.fn());
48
+
49
+ this.oValues = oValues;
50
+ this.oBinding = oBinding;
51
+ };
52
+
53
+ _exports.MockContext = MockContext;
54
+
55
+ var MockControl = function MockControl() {
56
+ _classCallCheck(this, MockControl);
57
+
58
+ _defineProperty(this, "getBindingInfo", jest.fn());
59
+
60
+ _defineProperty(this, "getBinding", jest.fn());
61
+
62
+ _defineProperty(this, "data", jest.fn());
63
+
64
+ _defineProperty(this, "getModel", jest.fn());
65
+ };
66
+ /**
67
+ * Mock class for OData V4 ListBinding
68
+ */
69
+
70
+
71
+ _exports.MockControl = MockControl;
72
+
73
+ var MockListBinding = /*#__PURE__*/function () {
74
+ function MockListBinding(aContexts) {
75
+ var _this2 = this;
76
+
77
+ _classCallCheck(this, MockListBinding);
78
+
79
+ _defineProperty(this, "setAggregation", jest.fn());
80
+
81
+ _defineProperty(this, "filter", jest.fn());
82
+
83
+ _defineProperty(this, "sort", jest.fn());
84
+
85
+ _defineProperty(this, "requestContexts", jest.fn(function () {
86
+ return Promise.resolve(_this2.aMockContexts);
87
+ }));
88
+
89
+ _defineProperty(this, "getCurrentContexts", jest.fn(function () {
90
+ return _this2.aMockContexts;
91
+ }));
92
+
93
+ aContexts = aContexts || [];
94
+ this.aMockContexts = aContexts.map(function (context) {
95
+ return new MockContext(context, _this2);
96
+ });
97
+ }
98
+
99
+ _exports.MockListBinding = MockListBinding;
100
+
101
+ _createClass(MockListBinding, [{
102
+ key: "isA",
103
+ value: function isA(sClassName) {
104
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
105
+ } // Mocked API
106
+
107
+ }]);
108
+
109
+ return MockListBinding;
110
+ }();
111
+
112
+ _exports.MockListBinding = MockListBinding;
113
+
114
+ var MockContextBinding = /*#__PURE__*/function () {
115
+ function MockContextBinding(oContext) {
116
+ var _this3 = this;
117
+
118
+ _classCallCheck(this, MockContextBinding);
119
+
120
+ _defineProperty(this, "getBoundContext", jest.fn(function () {
121
+ return _this3.oMockContext;
122
+ }));
123
+
124
+ _defineProperty(this, "attachEventOnce", jest.fn());
125
+
126
+ this.oMockContext = new MockContext(oContext || {}, this);
127
+ }
128
+
129
+ _exports.MockContextBinding = MockContextBinding;
130
+
131
+ _createClass(MockContextBinding, [{
132
+ key: "isA",
133
+ value: function isA(sClassName) {
134
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
135
+ }
136
+ }, {
137
+ key: "getInternalMockContext",
138
+ value: function getInternalMockContext() {
139
+ return this.oMockContext;
140
+ } // Mocked API
141
+
142
+ }]);
143
+
144
+ return MockContextBinding;
145
+ }();
146
+ /**
147
+ * Mock class for OData V4 MetaModel
148
+ */
149
+
150
+
151
+ _exports.MockContextBinding = MockContextBinding;
152
+
153
+ var MockMetaModel = function MockMetaModel(oMetaData) {
154
+ var _this4 = this;
155
+
156
+ _classCallCheck(this, MockMetaModel);
157
+
158
+ _defineProperty(this, "getMetaContext", jest.fn(function (sPath) {
159
+ return new MockContext({
160
+ $path: sPath
161
+ });
162
+ }));
163
+
164
+ _defineProperty(this, "getObject", jest.fn(function (sPath) {
165
+ return _this4.oMetaContext.getProperty(sPath);
166
+ }));
167
+
168
+ _defineProperty(this, "requestObject", jest.fn());
169
+
170
+ _defineProperty(this, "createBindingContext", jest.fn());
171
+
172
+ _defineProperty(this, "getMetaPath", jest.fn());
173
+
174
+ this.oMetaContext = new MockContext(oMetaData || {});
175
+ } // Mocked API
176
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
177
+ ;
178
+ /**
179
+ * Mock class for OData V4 Model
180
+ */
181
+
182
+
183
+ _exports.MockMetaModel = MockMetaModel;
184
+
185
+ var MockModel = /*#__PURE__*/function () {
186
+ function MockModel(mockListBinding, mockContextBinding) {
187
+ var _this5 = this;
188
+
189
+ _classCallCheck(this, MockModel);
190
+
191
+ _defineProperty(this, "bindList", jest.fn(function () {
192
+ return _this5.mockListBinding;
193
+ }));
194
+
195
+ _defineProperty(this, "bindContext", jest.fn(function () {
196
+ return _this5.mockContextBinding;
197
+ }));
198
+
199
+ _defineProperty(this, "getMetaModel", jest.fn(function () {
200
+ return _this5.oMetaModel;
201
+ }));
202
+
203
+ _defineProperty(this, "getProperty", jest.fn());
204
+
205
+ _defineProperty(this, "setProperty", jest.fn());
206
+
207
+ this.mockListBinding = mockListBinding;
208
+ this.mockContextBinding = mockContextBinding;
209
+ } // Factories
210
+
211
+
212
+ _exports.MockModel = MockModel;
213
+
214
+ _createClass(MockModel, [{
215
+ key: "setMetaModel",
216
+ value: function setMetaModel(oMetaModel) {
217
+ this.oMetaModel = oMetaModel;
218
+ } // Mocked API
219
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
220
+
221
+ }], [{
222
+ key: "modelFromListBinding",
223
+ value: function modelFromListBinding(mockListBinding) {
224
+ return new MockModel(mockListBinding);
225
+ }
226
+ }, {
227
+ key: "modelFromContextBinding",
228
+ value: function modelFromContextBinding(mockContextBinding) {
229
+ return new MockModel(undefined, mockContextBinding);
230
+ }
231
+ }]);
232
+
233
+ return MockModel;
234
+ }();
235
+
236
+ _exports.MockModel = MockModel;
237
+ return _exports;
238
+ }, false);
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsIk1vY2tDb250cm9sIiwiTW9ja0xpc3RCaW5kaW5nIiwiYUNvbnRleHRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhTW9ja0NvbnRleHRzIiwibWFwIiwiY29udGV4dCIsInNDbGFzc05hbWUiLCJNb2NrQ29udGV4dEJpbmRpbmciLCJvQ29udGV4dCIsIm9Nb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJzUGF0aCIsIiRwYXRoIiwib01ldGFDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJNb2NrTW9kZWwiLCJtb2NrTGlzdEJpbmRpbmciLCJtb2NrQ29udGV4dEJpbmRpbmciLCJvTWV0YU1vZGVsIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQUZBO0FBQ0E7QUFDQTtNQUlhQSxXLEdBQ1oscUJBQTJCQyxPQUEzQixFQUFpREMsUUFBakQsRUFBaUU7QUFBQTs7QUFBQTs7QUFBQSx5Q0FFNUNDLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDN0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FBYUksR0FBYixDQUFQO0FBQ0EsS0FGb0IsQ0FGNEM7O0FBQUEseUNBSzVDRixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWNDLEtBQWQsRUFBNkI7QUFDekQsTUFBQSxLQUFJLENBQUNMLE9BQUwsQ0FBYUksR0FBYixJQUFvQkMsS0FBcEI7QUFDQSxhQUFPLEtBQUksQ0FBQ0wsT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUhvQixDQUw0Qzs7QUFBQSx1Q0FVOUNGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDM0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FBYUksR0FBYixDQUFQO0FBQ0EsS0FGa0IsQ0FWOEM7O0FBQUEscUNBYWhERixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQzlCLGFBQU8sS0FBSSxDQUFDSCxPQUFMLENBQWEsT0FBYixDQUFQO0FBQ0EsS0FGZ0IsQ0FiZ0Q7O0FBQUEsd0NBaUI3Q0UsSUFBSSxDQUFDQyxFQUFMLENBQVEsWUFBTTtBQUNqQyxhQUFPLEtBQUksQ0FBQ0YsUUFBWjtBQUNBLEtBRm1CLENBakI2Qzs7QUFBQSxzQ0FvQi9DQyxJQUFJLENBQUNDLEVBQUwsRUFwQitDOztBQUFBLFNBQXRDSCxPQUFzQyxHQUF0Q0EsT0FBc0M7QUFBQSxTQUFoQkMsUUFBZ0IsR0FBaEJBLFFBQWdCO0FBQUUsRzs7OztNQXVCdkRLLFc7Ozs0Q0FDWUosSUFBSSxDQUFDQyxFQUFMLEU7O3dDQUNKRCxJQUFJLENBQUNDLEVBQUwsRTs7a0NBQ05ELElBQUksQ0FBQ0MsRUFBTCxFOztzQ0FDSUQsSUFBSSxDQUFDQyxFQUFMLEU7O0FBR25CO0FBQ0E7QUFDQTs7Ozs7TUFDYUksZTtBQUdaLDZCQUFtQkMsU0FBbkIsRUFBc0M7QUFBQTs7QUFBQTs7QUFBQSw4Q0FhZE4sSUFBSSxDQUFDQyxFQUFMLEVBYmM7O0FBQUEsc0NBY3RCRCxJQUFJLENBQUNDLEVBQUwsRUFkc0I7O0FBQUEsb0NBZXhCRCxJQUFJLENBQUNDLEVBQUwsRUFmd0I7O0FBQUEsK0NBa0JiRCxJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFhO0FBQzdDLGVBQU9NLE9BQU8sQ0FBQ0MsT0FBUixDQUFpQixNQUFJLENBQUNDLGFBQXRCLENBQVA7QUFDQSxPQUZ3QixDQWxCYTs7QUFBQSxrREFzQlZULElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQWE7QUFDaEQsZUFBUSxNQUFJLENBQUNRLGFBQWI7QUFDQSxPQUYyQixDQXRCVTs7QUFDckNILE1BQUFBLFNBQVMsR0FBR0EsU0FBUyxJQUFJLEVBQXpCO0FBRUEsV0FBS0csYUFBTCxHQUFxQkgsU0FBUyxDQUFDSSxHQUFWLENBQWMsVUFBQUMsT0FBTyxFQUFJO0FBQzdDLGVBQU8sSUFBSWQsV0FBSixDQUFnQmMsT0FBaEIsRUFBeUIsTUFBekIsQ0FBUDtBQUNBLE9BRm9CLENBQXJCO0FBR0E7Ozs7OzthQUVELGFBQVdDLFVBQVgsRUFBd0M7QUFDdkMsZUFBT0EsVUFBVSxLQUFLLHdDQUF0QjtBQUNBLE8sQ0FFRDs7Ozs7Ozs7O01BZVlDLGtCO0FBR1osZ0NBQW1CQyxRQUFuQixFQUFtQztBQUFBOztBQUFBOztBQUFBLCtDQVlWZCxJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQ3RDLGVBQVEsTUFBSSxDQUFDYyxZQUFiO0FBQ0EsT0FGd0IsQ0FaVTs7QUFBQSwrQ0FlVmYsSUFBSSxDQUFDQyxFQUFMLEVBZlU7O0FBQ2xDLFdBQUtjLFlBQUwsR0FBb0IsSUFBSWxCLFdBQUosQ0FBZ0JpQixRQUFRLElBQUksRUFBNUIsRUFBZ0MsSUFBaEMsQ0FBcEI7QUFDQTs7Ozs7O2FBRUQsYUFBV0YsVUFBWCxFQUF3QztBQUN2QyxlQUFPQSxVQUFVLEtBQUssMkNBQXRCO0FBQ0E7OzthQUNELGtDQUE2QztBQUM1QyxlQUFPLEtBQUtHLFlBQVo7QUFDQSxPLENBRUQ7Ozs7OztBQU9EO0FBQ0E7QUFDQTs7Ozs7TUFDYUMsYSxHQUdaLHVCQUFtQkMsU0FBbkIsRUFBb0M7QUFBQTs7QUFBQTs7QUFBQSw0Q0FNWmpCLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNpQixLQUFELEVBQW1CO0FBQ2xELGFBQVEsSUFBSXJCLFdBQUosQ0FBZ0I7QUFBRXNCLFFBQUFBLEtBQUssRUFBRUQ7QUFBVCxPQUFoQixDQUFSO0FBQ0EsS0FGdUIsQ0FOWTs7QUFBQSx1Q0FTakJsQixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDaUIsS0FBRCxFQUFtQjtBQUM3QyxhQUFPLE1BQUksQ0FBQ0UsWUFBTCxDQUFrQkMsV0FBbEIsQ0FBOEJILEtBQTlCLENBQVA7QUFDQSxLQUZrQixDQVRpQjs7QUFBQSwyQ0FZYmxCLElBQUksQ0FBQ0MsRUFBTCxFQVphOztBQUFBLGtEQWFORCxJQUFJLENBQUNDLEVBQUwsRUFiTTs7QUFBQSx5Q0FjZkQsSUFBSSxDQUFDQyxFQUFMLEVBZGU7O0FBQ25DLFNBQUttQixZQUFMLEdBQW9CLElBQUl2QixXQUFKLENBQWdCb0IsU0FBUyxJQUFJLEVBQTdCLENBQXBCO0FBQ0EsRyxDQUVEO0FBQ0E7O0FBWUQ7QUFDQTtBQUNBOzs7OztNQUVhSyxTO0FBR1osdUJBQTJCQyxlQUEzQixFQUFzRUMsa0JBQXRFLEVBQStHO0FBQUE7O0FBQUE7O0FBQUEsd0NBZ0I3RnhCLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQWE7QUFDdEMsZUFBUSxNQUFJLENBQUNzQixlQUFiO0FBQ0EsT0FGaUIsQ0FoQjZGOztBQUFBLDJDQW9CMUZ2QixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFhO0FBQ3pDLGVBQVEsTUFBSSxDQUFDdUIsa0JBQWI7QUFDQSxPQUZvQixDQXBCMEY7O0FBQUEsNENBdUJ6RnhCLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDbkMsZUFBUSxNQUFJLENBQUN3QixVQUFiO0FBQ0EsT0FGcUIsQ0F2QnlGOztBQUFBLDJDQTJCMUZ6QixJQUFJLENBQUNDLEVBQUwsRUEzQjBGOztBQUFBLDJDQTRCMUZELElBQUksQ0FBQ0MsRUFBTCxFQTVCMEY7O0FBQUEsV0FBcEZzQixlQUFvRixHQUFwRkEsZUFBb0Y7QUFBQSxXQUF6Q0Msa0JBQXlDLEdBQXpDQSxrQkFBeUM7QUFBRSxLLENBRWpIOzs7Ozs7O2FBUUEsc0JBQW9CQyxVQUFwQixFQUErQztBQUM5QyxhQUFLQSxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLE8sQ0FFRDtBQUNBOzs7O2FBWkEsOEJBQTRCRixlQUE1QixFQUF5RTtBQUN4RSxlQUFPLElBQUlELFNBQUosQ0FBY0MsZUFBZCxDQUFQO0FBQ0E7OzthQUNELGlDQUErQkMsa0JBQS9CLEVBQWtGO0FBQ2pGLGVBQU8sSUFBSUYsU0FBSixDQUFjSSxTQUFkLEVBQXlCRixrQkFBekIsQ0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5cbmltcG9ydCB7IENvbnRleHQsIE9EYXRhTGlzdEJpbmRpbmcsIE9EYXRhQ29udGV4dEJpbmRpbmcsIE9EYXRhTWV0YU1vZGVsLCBPRGF0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRleHQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlczogYW55LCBwcml2YXRlIG9CaW5kaW5nPzogYW55KSB7fVxuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW1wiJHBhdGhcIl07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub0JpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbCB7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBkYXRhID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tMaXN0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFMaXN0QmluZGluZz4ge1xuXHRwcml2YXRlIGFNb2NrQ29udGV4dHM6IE1vY2tDb250ZXh0W107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFDb250ZXh0cz86IGFueVtdKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXSk7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRDdXJyZW50Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55KSBhcyBDb250ZXh0W107XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHRCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdHByaXZhdGUgb01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob0NvbnRleHQ/OiBhbnkpIHtcblx0XHR0aGlzLm9Nb2NrQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgdGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH1cblx0cHVibGljIGdldEludGVybmFsTW9ja0NvbnRleHQoKTogTW9ja0NvbnRleHQge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIGdldEJvdW5kQ29udGV4dCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTW9ja0NvbnRleHQgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tNZXRhTW9kZWwgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTWV0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob01ldGFEYXRhPzogYW55KSB7XG5cdFx0dGhpcy5vTWV0YUNvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0TWV0YUNvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGgpO1xuXHR9KTtcblx0cHVibGljIHJlcXVlc3RPYmplY3QgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBjcmVhdGVCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1ldGFQYXRoID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG5cblx0cHVibGljIGdldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG59XG4iXX0=
@@ -0,0 +1,151 @@
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 setProperty = jest.fn((key: string, value: any) => {
14
+ this.oValues[key] = value;
15
+ return this.oValues[key];
16
+ });
17
+
18
+ public getObject = jest.fn((key: string) => {
19
+ return this.oValues[key];
20
+ });
21
+ public getPath = jest.fn(() => {
22
+ return this.oValues["$path"];
23
+ });
24
+
25
+ public getBinding = jest.fn(() => {
26
+ return this.oBinding;
27
+ });
28
+ public getModel = jest.fn();
29
+ }
30
+
31
+ export class MockControl {
32
+ public getBindingInfo = jest.fn();
33
+ public getBinding = jest.fn();
34
+ public data = jest.fn();
35
+ public getModel = jest.fn();
36
+ }
37
+
38
+ /**
39
+ * Mock class for OData V4 ListBinding
40
+ */
41
+ export class MockListBinding implements Partial<ODataListBinding> {
42
+ private aMockContexts: MockContext[];
43
+
44
+ public constructor(aContexts?: any[]) {
45
+ aContexts = aContexts || [];
46
+
47
+ this.aMockContexts = aContexts.map(context => {
48
+ return new MockContext(context, this);
49
+ });
50
+ }
51
+
52
+ public isA(sClassName: string): boolean {
53
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
54
+ }
55
+
56
+ // Mocked API
57
+ public setAggregation = jest.fn();
58
+ public filter = jest.fn();
59
+ public sort = jest.fn();
60
+
61
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
62
+ public requestContexts = jest.fn((...args) => {
63
+ return Promise.resolve((this.aMockContexts as any) as Context[]);
64
+ });
65
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
66
+ public getCurrentContexts = jest.fn((...args) => {
67
+ return (this.aMockContexts as any) as Context[];
68
+ });
69
+ }
70
+
71
+ export class MockContextBinding implements Partial<ODataContextBinding> {
72
+ private oMockContext: MockContext;
73
+
74
+ public constructor(oContext?: any) {
75
+ this.oMockContext = new MockContext(oContext || {}, this);
76
+ }
77
+
78
+ public isA(sClassName: string): boolean {
79
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
80
+ }
81
+ public getInternalMockContext(): MockContext {
82
+ return this.oMockContext;
83
+ }
84
+
85
+ // Mocked API
86
+ public getBoundContext = jest.fn(() => {
87
+ return (this.oMockContext as any) as Context;
88
+ });
89
+ public attachEventOnce = jest.fn();
90
+ }
91
+
92
+ /**
93
+ * Mock class for OData V4 MetaModel
94
+ */
95
+ export class MockMetaModel implements Partial<ODataMetaModel> {
96
+ private oMetaContext: MockContext;
97
+
98
+ public constructor(oMetaData?: any) {
99
+ this.oMetaContext = new MockContext(oMetaData || {});
100
+ }
101
+
102
+ // Mocked API
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
104
+ public getMetaContext = jest.fn((sPath: string) => {
105
+ return (new MockContext({ $path: sPath }) as any) as Context;
106
+ });
107
+ public getObject = jest.fn((sPath: string) => {
108
+ return this.oMetaContext.getProperty(sPath);
109
+ });
110
+ public requestObject = jest.fn();
111
+ public createBindingContext = jest.fn();
112
+ public getMetaPath = jest.fn();
113
+ }
114
+
115
+ /**
116
+ * Mock class for OData V4 Model
117
+ */
118
+
119
+ export class MockModel implements Partial<ODataModel> {
120
+ private oMetaModel?: MockMetaModel;
121
+
122
+ public constructor(private mockListBinding?: MockListBinding, private mockContextBinding?: MockContextBinding) {}
123
+
124
+ // Factories
125
+ static modelFromListBinding(mockListBinding: MockListBinding): MockModel {
126
+ return new MockModel(mockListBinding);
127
+ }
128
+ static modelFromContextBinding(mockContextBinding: MockContextBinding): MockModel {
129
+ return new MockModel(undefined, mockContextBinding);
130
+ }
131
+
132
+ public setMetaModel(oMetaModel: MockMetaModel) {
133
+ this.oMetaModel = oMetaModel;
134
+ }
135
+
136
+ // Mocked API
137
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
138
+ public bindList = jest.fn((...args) => {
139
+ return (this.mockListBinding as any) as ODataListBinding;
140
+ });
141
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
142
+ public bindContext = jest.fn((...args) => {
143
+ return (this.mockContextBinding as any) as ODataContextBinding;
144
+ });
145
+ public getMetaModel = jest.fn(() => {
146
+ return (this.oMetaModel as any) as ODataMetaModel;
147
+ });
148
+
149
+ public getProperty = jest.fn();
150
+ public setProperty = jest.fn();
151
+ }