function fnOnStrictHandlingFailed(aMessages) {
				assert.strictEqual(aMessages.length, 1);
				assert.strictEqual(aMessages[0].getCode(), "NOTE_EMPTY");
				assert.strictEqual(aMessages[0].getMessage(), "Note is empty");
				assert.deepEqual(aMessages[0].getTargets(), ["/SalesOrderList('42')/Note"]);
				assert.strictEqual(aMessages[0].getType(), "Warning");

				// code under test
				aMessages = oContext.getMessages();
				assert.strictEqual(aMessages.length, 1);
				assert.strictEqual(aMessages[0].getCode(), "CODE");
				assert.strictEqual(aMessages[0].getMessage(), "Incorrect LifecycleStatus");
				assert.strictEqual(aMessages[0].getPersistent(), false);
				assert.deepEqual(aMessages[0].getTargets(),
					["/SalesOrderList('42')/LifecycleStatus"]);
				assert.strictEqual(aMessages[0].getType(), "Warning");

				return Promise.resolve(false);
			}
******************************************************************************************
	// Scenario: AnnotationHelper.format is called for an annotation that points to a property typed
	// with an EDM type that is not mapped to a UI5 type
	// BCP: 2080062941
	testXMLTemplating("BCP: 2080062941",
		"createSpecialCasesModel",
' template:require="{\'AnnotationHelper\':\'sap/ui/model/odata/v4/AnnotationHelper\'}">\
<template:alias name="format" value="AnnotationHelper.format">\
	<template:repeat \
		list="{meta>/special.cases.EntityWithUnsupportedEdmTypes/@com.sap.vocabularies.UI.v1.SelectionFields}"\
		var="field">\
			<Input value="{field>@@format}"/>\
	</template:repeat>\
</template:alias>', '\
<Input value="{Binary}"/>\
<Input value="{Duration}"/>');

	//*********************************************************************************************
	// Scenario: An empty $NavigationPropertyPath is annotated as a side effect target. "All
	// affected entities need to be explicitly listed. An empty path means the annotation target."
	// --> We expect the caller to map {$NavigationPropertyPath : ""} to {$PropertyPath : "*"} in
	// order to opt-in to this interpretation.
	//
	// BCP: 2070022577
	//
	// Scenario 2: Two GET requests for side effects are merged. One is expecting changes for
	// structural properties only ("*") and fails if a key predicate changes. The other allows that
	// a complete navigation property changes; it does not fail if a key predicate changes. Make
	// sure that the check for unexpected changes of key predicates does not fail due to this
	// merging.
	// BCP: 2170263464
	//
	// There is an ODCB with empty path in between, sending own requests (see "standalone"). Its
	// side effect GET must not be merged to ensure that response processing is not skipped.
	// BCP: 2180419641
	QUnit.test("requestSideEffects: {$PropertyPath : '*'}", function (assert) {
		var oContext,
			oModel = this.createSpecialCasesModel({autoExpandSelect : true}),
			sView = '\
<FlexBox binding="{/Artists(ArtistID=\'42\',IsActiveEntity=true)}" id="form">\
	<Text id="city" text="{Address/City}"/>\
	<Text id="name" text="{Name}"/>\
	<Text binding="{BestPublication}" id="price0" text="{Price}"/>\
	<FlexBox binding="{BestFriend/BestFriend}">\
		<Text id="friends_friend0" text="{Name}"/>\
		<Text binding="{BestPublication}" id="price1" text="{Price}"/>\
	</FlexBox>\
	<FlexBox binding="{path : \'\', parameters : {$$ownRequest : true}}" id="standalone">\
		<Text id="friends_friend1" text="{BestFriend/BestFriend/Name}"/>\
	</FlexBox>\
	<FlexBox binding="{}" id="section">\
		<Text binding="{path : \'DraftAdministrativeData\', parameters : {$$ownRequest : true}}"\
			id="inProcessByUser" text="{InProcessByUser}"/>\
	</FlexBox>\
	<Table id="table" items="{path : \'_Publication\', parameters : {$$ownRequest : true}}">\
		<Text id="price2" text="{Price}"/>\
	</Table>\
</FlexBox>',
			that = this;

		this.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)"
				+ "?$select=ArtistID,IsActiveEntity"
				+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
				+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name))", {
				ArtistID : "42",
				BestFriend : {
					ArtistID : "23",
					BestFriend : {
						ArtistID : "24",
						IsActiveEntity : true,
						Name : "Best Friend"
					},
					IsActiveEntity : true
				},
				IsActiveEntity : true
			})
			.expectChange("friends_friend1", "Best Friend")
			.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)/DraftAdministrativeData"
				+ "?$select=DraftID,InProcessByUser", {
				DraftID : "1",
				InProcessByUser : "foo"
			})
			.expectChange("inProcessByUser", "foo")
			.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)/_Publication"
				+ "?$select=Price,PublicationID&$skip=0&$top=100", {
					value : [{
						Price : "9.99",
						// Note: this key property is essential for the $filter below!
						PublicationID : "42-0"
					}]
				})
			.expectChange("price2", ["9.99"])
			.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)"
				+ "?$select=Address/City,ArtistID,IsActiveEntity,Name"
				+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
					+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name"
						+ ";$expand=BestPublication($select=Price,PublicationID)))"
				+ ",BestPublication($select=Price,PublicationID)", {
				Address : {
					City : "Heidelberg"
				},
				ArtistID : "42",
				BestFriend : {
					ArtistID : "23",
					BestFriend : {
						ArtistID : "24",
						BestPublication : {
							Price : "8.88",
							PublicationID : "24-0"
						},
						IsActiveEntity : true,
						Name : "Best Friend"
					},
					IsActiveEntity : true
				},
				BestPublication : {
					Price : "9.99",
					PublicationID : "42-0"
				},
				IsActiveEntity : true,
				Name : "Hour Frustrated"
			})
			.expectChange("city", "Heidelberg")
			.expectChange("name", "Hour Frustrated")
			.expectChange("price0", "9.99")
			.expectChange("friends_friend0", "Best Friend")
			.expectChange("price1", "8.88");

		return this.createView(assert, sView, oModel).then(function () {
			oContext = that.oView.byId("form").getBindingContext();

			// Note: BestFriend, BestPublication, and DraftAdministrativeData unaffected!
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)"
					+ "?$select=Address/City,ArtistID,IsActiveEntity,Name", {
					Address : {
						City : "Walldorf"
					},
					ArtistID : "42",
					IsActiveEntity : true,
					Name : "Minute Frustrated"
				})
				.expectChange("city", "Walldorf")
				.expectChange("name", "Minute Frustrated")
				//TODO avoid this useless GET for key properties only!
				.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)"
					+ "?$select=ArtistID,IsActiveEntity", {
					ArtistID : "42",
					IsActiveEntity : true
				});

			return Promise.all([
				// code under test
				oContext.requestSideEffects([{$PropertyPath : "*"}]),
				that.waitForChanges(assert, "*")
			]);
		}).then(function () {
			var sError = "Key predicate of 'BestFriend' changed"
					+ " from (ArtistID='23',IsActiveEntity=true)"
					+ " to (ArtistID='s.o.else',IsActiveEntity=true)";

			// Note: BestFriend/BestFriend unaffected!
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity)", {
					BestFriend : {
						ArtistID : "s.o.else", // this is NOT expected to happen --> see error below
						IsActiveEntity : true
					}
				})
				.expectMessages([{
					message : sError,
					persistent : true,
					technical : true,
					type : "Error"
				}])
				//TODO avoid this useless GET for key properties only? no changes allowed anyway!
				.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)"
					+ "?$select=BestFriend&$expand=BestFriend($select=ArtistID,IsActiveEntity)", {
					BestFriend : {
						ArtistID : "23",
						IsActiveEntity : true
					}
				});
			that.oLogMock.expects("error").withArgs("Failed to request side effects");

			return Promise.all([
				// code under test
				oContext.requestSideEffects(["BestFriend/*"])
					.then(mustFail(assert), function (oError) {
						assert.strictEqual(oError.message, sError);
					}),
				that.waitForChanges(assert, "BestFriend/*")
			]);
		}).then(function () {
			// Note: BestFriend/BestFriend's BestPublication unaffected!
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
						+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name))", {
					BestFriend : {
						ArtistID : "23",
						BestFriend : {
							ArtistID : "24",
							IsActiveEntity : true,
							Name : "TAFKAP"
						},
						IsActiveEntity : true
					}
				})
				.expectChange("friends_friend0", "TAFKAP")
				.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
						+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name))", {
					BestFriend : {
						ArtistID : "23",
						BestFriend : {
							ArtistID : "24",
							IsActiveEntity : true,
							Name : "TAFKAP"
						},
						IsActiveEntity : true
					}
				})
				.expectChange("friends_friend1", "TAFKAP");

			return Promise.all([
				// code under test
				oContext.requestSideEffects([{$PropertyPath : "BestFriend/BestFriend/*"}]),
				that.waitForChanges(assert, "BestFriend/BestFriend/*")
			]);
		}).then(function () {
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
						+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity"
							+ ";$expand=BestPublication($select=Price,PublicationID)))", {});

			return Promise.all([
				// code under test
				oContext.requestSideEffects(["BestFriend/BestFriend/BestPublication/*"]),
				that.waitForChanges(assert, "BestFriend/BestFriend/BestPublication/*")
			]);
		}).then(function () {
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)/_Publication"
					+ "?$select=Price,PublicationID&$filter=PublicationID eq '42-0'", {
					value : [{
						Price : "9.09",
						PublicationID : "42-0"
					}]
				})
				.expectChange("price2", ["9.09"]);

			return Promise.all([
				// code under test
				oContext.requestSideEffects([{$PropertyPath : "_Publication/*"}]),
				that.waitForChanges(assert, "_Publication/*")
			]);
		}).then(function () {
			var oHeaderContext = that.oView.byId("table").getBinding("items").getHeaderContext();

			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)/_Publication"
					+ "?$select=Price,PublicationID&$filter=PublicationID eq '42-0'", {
					value : [{
						Price : "9.01",
						PublicationID : "42-0"
					}]
				})
				.expectChange("price2", ["9.01"]);

			return Promise.all([
				// code under test
				oHeaderContext.requestSideEffects([{$PropertyPath : "*"}]),
				that.waitForChanges(assert, "* (@ _Publication)")
			]);
		}).then(function () {
			that.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
						+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name"
							+ ";$expand=BestPublication($select=Price,PublicationID)))"
					+ ",BestPublication($select=Price,PublicationID)", {
					BestFriend : {
						ArtistID : "23",
						BestFriend : {
							ArtistID : "42", // this change must not result in an error
							BestPublication : {
								Price : "2.22",
								PublicationID : "42-0"
							},
							IsActiveEntity : true,
							Name : "Princess"
						},
						IsActiveEntity : true
					},
					BestPublication : {
						Price : "-2.22", // unrealistic but useful, should be 2.22: see pub. "42-0"
						PublicationID : "42-0"
					}
				})
				.expectChange("price1", "2.22")
				.expectChange("friends_friend0", "Princess")
				.expectChange("price0", "-2.22")
				.expectRequest("Artists(ArtistID='42',IsActiveEntity=true)?$select=BestFriend"
					+ "&$expand=BestFriend($select=ArtistID,IsActiveEntity"
						+ ";$expand=BestFriend($select=ArtistID,IsActiveEntity,Name))", {
					BestFriend : {
						ArtistID : "23",
						BestFriend : {
							ArtistID : "42",
							IsActiveEntity : true,
							Name : "Princess"
						},
						IsActiveEntity : true
					}
				})
				.expectChange("friends_friend1", "Princess");

			return Promise.all([
				// code under test (BCP: 2170263464)
				oContext.requestSideEffects(["BestPublication/*"]),
				oContext.requestSideEffects(["BestFriend"]),
				that.waitForChanges(assert, "Scenario 2")
			]);
		});
	});

	//*********************************************************************************************
	// Scenario: Get a property value from an ODataListBinding bound to a sap.m.Table while the
	// table is reading data to grow. W/o autoExpandSelect, we just drop the key property from the
	// response in order to use indices instead of key predicates in context paths.
	// JIRA: CPOUI5ODATAV4-115
[false, true].forEach(function (bAutoExpandSelect) {
	var oSalesOrder = bAutoExpandSelect
			? {SalesOrderID : "01", Note : "Note 1"}
			: {Note : "Note 1"},
		sSelect = bAutoExpandSelect ? "$select=Note,SalesOrderID&" : "",
		sTitle = "Context#getProperty while table is reading, autoExpandSelect = "
			+ bAutoExpandSelect,
		sView = '\
<Table id="table" growing="true" growingThreshold="1"\
		items="{path : \'/SalesOrderList\', parameters : {$count : true}}">\
	<Text id="note" text="{Note}"/>\
</Table>';

	QUnit.test(sTitle, function (assert) {
		var oModel = this.createSalesOrdersModel({autoExpandSelect : bAutoExpandSelect}),
			that = this;

		this.expectRequest("SalesOrderList?$count=true&" + sSelect + "$skip=0&$top=1", {
				"@odata.count" : "42",
				value : [oSalesOrder]
			})
			.expectChange("note", ["Note 1"]);

		return this.createView(assert, sView, oModel).then(function () {
			var oTable = that.oView.byId("table"),
				oHeaderContext = oTable.getBinding("items").getHeaderContext();

			// Note: "$tail" does not yield a red test here, it's created only on demand
			["$byPredicate", "$created", "length"].forEach(function (sProperty) {
				assert.throws(function () {
					oHeaderContext.getObject(sProperty);
				}, new Error("Invalid header path: " + sProperty));
			});
			that.expectRequest("SalesOrderList?$count=true&" + sSelect + "$skip=1&$top=1", {
					"@odata.count" : "23",
					value : [{Note : "Note 2"}]
				})
				.expectChange("note", [, "Note 2"]);

			oTable.requestItems(); // show more items

			assert.strictEqual(
				// code under test
				oTable.getItems()[0].getBindingContext().getProperty("Note"),
				"Note 1");
			// code under test
			assert.strictEqual(oHeaderContext.getProperty("$count"), 42);

			return Promise.all([
				// code under test
				oHeaderContext.requestProperty("1/Note").then(mustFail(assert), function (oError) {
					assert.strictEqual(oError.message, "Invalid header path: 1/Note");
				}),
				oHeaderContext.requestProperty("$count").then(function (oResult) {
					assert.strictEqual(oResult, 23);
				}),
				that.waitForChanges(assert)
			]);
		});
	});
});

	//*********************************************************************************************
	// Scenario: list binding is used to create an entity, but the metadata could not be loaded
	// JIRA: CPOUI5ODATAV4-231
	QUnit.test("CPOUI5ODATAV4-231: ODLB#create failed due to failed $metadata", function (assert) {
		var oModel = this.createModel("/invalid/model/", {}, {
				"/invalid/model/$metadata" : {code : 500}
			}),
			that = this;

		return this.createView(assert, "", oModel).then(function () {
			var oListBinding = oModel.bindList("/People");

			that.oLogMock.expects("error")
				.withExactArgs("GET /invalid/model/$metadata",
					"Could not load metadata: 500 Internal Server Error",
					"sap.ui.model.odata.v4.lib._MetadataRequestor");
			// Note: this error message is a bit misleading ;-)
			that.oLogMock.expects("error")
				.withExactArgs("POST on 'People' failed; will be repeated automatically",
					sinon.match("Could not load metadata: 500 Internal Server Error"), sODLB);
			that.expectRequest({
					method : "POST",
					url : "People",
					payload : {}
				})
				.expectMessages([{
					message : "Could not load metadata: 500 Internal Server Error",
					persistent : true,
					technical : true,
					technicalDetails : {
						httpStatus : 500 // CPOUI5ODATAV4-428
					},
					type : "Error"
				}]);

			return Promise.all([
				oListBinding.create().created().then(mustFail(assert), function (oError) {
						assert.strictEqual(oError.message,
							"Could not load metadata: 500 Internal Server Error");
					}),
				that.waitForChanges(assert)
			]);
		});
	});

	//*********************************************************************************************
	// Scenario: A bound action is invoked, accompanied by a side effect. The action returns a
	// wrong response, but the side effect must win anyway!
	// BCP: 2070200175
	// JIRA: CPOUI5ODATAV4-288
	// Note that before the fix for BCP 2080268833 this worked more or less accidentally. The "C"
	// from the POST was not applied because the cache was busy from requestSideEffects and did not
	// deliver the old predicate, so the binding parameter was not updated.
	QUnit.test("BCP: 2070200175, CPOUI5ODATAV4-288: POST > GET", function (assert) {
		var sAction = "com.sap.gateway.default.zui5_epm_sample.v0002.SalesOrder_Confirm",
			oModel = this.createSalesOrdersModel({autoExpandSelect : true}),
			sView = '\
<FlexBox id="form" binding="{/SalesOrderList(\'1\')}">\
	<Text id="status" text="{LifecycleStatus}"/>\
	<FlexBox id="action" binding="{' + sAction + '(...)}"/>\
</FlexBox>',
			that = this;

		this.expectRequest("SalesOrderList('1')?$select=LifecycleStatus,SalesOrderID", {
				LifecycleStatus : "N",
				SalesOrderID : "1"
			})
			.expectChange("status", "N");

		return this.createView(assert, sView, oModel).then(function () {
			that.expectRequest({
					method : "POST",
					url : "SalesOrderList('1')/" + sAction,
					payload : {}
				}, {
					LifecycleStatus : "N", // Note: wrong response, should be "C"
					SalesOrderID : "1"
				})
				.expectRequest("SalesOrderList('1')?$select=LifecycleStatus", {
					LifecycleStatus : "C"
				})
				.expectChange("status", "C");

			return Promise.all([
				that.oView.byId("action").getObjectBinding().invoke(),
				that.oView.byId("form").getBindingContext().requestSideEffects(["LifecycleStatus"]),
				that.waitForChanges(assert)
			]);
		});
	});

	//*********************************************************************************************
	// Scenario: "Prefer:handling=strict"
	// Invoke an action with an fnOnStrictHandlingFailed callback given in order to have the
	// "Prefer:handling=strict" HTTP header set. bConfirm controls how the callback is resolved.
	//
	// JIRA: CPOUI5ODATAV4-943
	// BCP: 2280172148 more than one action in change set + check that the right callback is called
	//
	// Invoke three actions in a changeset, each with a fnOnStrictHandlingFailed handler. The batch
	// fails due to strict-handling and the response contains error messages for the first and
	// second request or only for the first. No error message for the third request. See that each
	// handler is called with the correct (or none) errors.
	// SNOW: DINC0032238
	//
	// ODM#setContinueOnError must not violate constraints w.r.t. change sets (SNOW: DINC0512589)
[true, false].forEach(function (bConfirm) {
	[true, false].forEach(function (bDifferentContentIDs) {
		const sTitle = "CPOUI5ODATAV4-943: handling=strict, confirm=" + bConfirm
			+ ", different content IDs=" + bDifferentContentIDs;
	QUnit.test(sTitle, function (assert) {
		var sAction = "com.sap.gateway.default.zui5_epm_sample.v0002.SalesOrder_Confirm",
			oAction0Promise,
			oAction1Promise,
			oAction2Promise,
			oErrorObject = {
				details : [{
					"@Common.numericSeverity" : 3,
					code : "CODE1",
					"@SAP__core.ContentID" : "0.0",
					message : "Note is empty",
					target : "SalesOrder/Note"
				}, {
					"@Common.numericSeverity" : 3,
					code : "CODE1",
					"@SAP__core.ContentID" : "0.0",
					message : "Note is empty",
					target : "SalesOrder/Note"
				}, {
					"@Common.numericSeverity" : 2,
					code : "CODE2",
					"@SAP__core.ContentID" : "0.0",
					message : "Some unbound info"
				}]
			},
			oError,
			oModel = this.createSalesOrdersModel({autoExpandSelect : true}),
			fnResolve0,
			fnResolve1,
			fnResolve2,
			sView = '\
<Table id="table" items="{/SalesOrderList}">\
	<Text id="status" text="{LifecycleStatus}"/>\
</Table>',
			that = this;

		function onStrictHandlingFailed0(aMessages) {
			assert.strictEqual(aMessages[0].getMessage(), "Note is empty");
			assert.strictEqual(aMessages[0].getCode(), "CODE1");
			assert.deepEqual(aMessages[0].getTargets(), ["/SalesOrderList('0')/Note"]);
			assert.strictEqual(aMessages[0].getType(), "Warning");
			if (bDifferentContentIDs) {
				assert.strictEqual(aMessages.length, 1);
			} else {
				assert.strictEqual(aMessages.length, 3);
				assert.strictEqual(aMessages[1].getMessage(), "Note is empty");
				assert.strictEqual(aMessages[1].getCode(), "CODE1");
				assert.deepEqual(aMessages[1].getTargets(), ["/SalesOrderList('0')/Note"]);
				assert.strictEqual(aMessages[1].getType(), "Warning");
				assert.strictEqual(aMessages[2].getMessage(), "Some unbound info");
				assert.strictEqual(aMessages[2].getCode(), "CODE2");
				assert.deepEqual(aMessages[2].getTargets(), [""]);
				assert.strictEqual(aMessages[2].getType(), "Information");
			}
			return new Promise(function (resolve) {
				fnResolve0 = resolve;
			});
		}

		function onStrictHandlingFailed1(aMessages) {
			if (bDifferentContentIDs) {
				assert.strictEqual(aMessages.length, 2);
				assert.strictEqual(aMessages[0].getMessage(), "Note is empty");
				assert.strictEqual(aMessages[0].getCode(), "CODE1");
				assert.deepEqual(aMessages[0].getTargets(), ["/SalesOrderList('1')/Note"]);
				assert.strictEqual(aMessages[0].getType(), "Warning");
				assert.strictEqual(aMessages[1].getMessage(), "Some unbound info");
				assert.strictEqual(aMessages[1].getCode(), "CODE2");
				assert.deepEqual(aMessages[1].getTargets(), [""]);
				assert.strictEqual(aMessages[1].getType(), "Information");
			} else {
				assert.strictEqual(aMessages.length, 0);
			}
			return new Promise(function (resolve) {
				fnResolve1 = resolve;
			});
		}

		function onStrictHandlingFailed2(aMessages) {
			assert.strictEqual(aMessages.length, 0);
			return new Promise(function (resolve) {
				fnResolve2 = resolve;
			});
		}

		// change detail ContentID from 0.0 to 1.0 for the second and third message
		if (bDifferentContentIDs) {
			oErrorObject.details[1]["@SAP__core.ContentID"] = "1.0";
			oErrorObject.details[2]["@SAP__core.ContentID"] = "1.0";
		}
		oError = createErrorInsideBatch(oErrorObject, 412);

		this.expectRequest("SalesOrderList?$select=LifecycleStatus,SalesOrderID&$skip=0&$top=100", {
				value : [{
						LifecycleStatus : "N0",
						SalesOrderID : "0"
					}, {
						LifecycleStatus : "N1",
						SalesOrderID : "1"
					}, {
						LifecycleStatus : "N2",
						SalesOrderID : "2"
				}]
			})
			.expectChange("status", ["N0", "N1", "N2"]);

		return this.createView(assert, sView, oModel).then(function () {
			that.expectRequest({
					batchNo : 2,
					changeSetNo : 1,
					headers : {
						Prefer : "handling=strict"
					},
					method : "POST",
					url : "SalesOrderList('0')/" + sAction,
					payload : {}
				}, oError, {
					"Preference-Applied" : "handling=strict"
				})
				.expectRequest({
					batchNo : 2,
					changeSetNo : 1,
					headers : {
						Prefer : "handling=strict"
					},
					method : "POST",
					url : "SalesOrderList('1')/" + sAction,
					payload : {}
				}/*response does not matter