/// <summary> /// Create batch. /// </summary> /// <param name="batch">List of usages.</param> /// <returns>Id of new created batch - Guid.</returns> public static async Task <ODataSingleValueResponse <Guid> > PostBatch(APBatch batch) { await SetAuthHeader(); var content = new StringContent(Serialize(batch), Encoding.UTF8, "application/json"); var response = await Client.PostAsync($"/odata/Batches", content); return(JsonConvert.DeserializeObject <ODataSingleValueResponse <Guid> >(await response.Content.ReadAsStringAsync())); }
public async Task MultiCallerWithUserUpdateTest() { var user = await UserHelper.CreateNewUserAsync(); user.SetAttribute("IsTestUser", "true"); APBatch batch = new APBatch(); batch.SaveObject(user); await batch.ExecuteAsync(); Assert.AreEqual(1, batch.UpdatedObjects.Count()); }
public async Task MulticallerCanOnlyBeExecutedOnceTest() { var newObj = ObjectHelper.NewInstance(); APBatch batch = new APBatch(); batch.SaveObject(newObj); await batch.ExecuteAsync(); try { await batch.ExecuteAsync(); Assert.Fail("This should have failed."); } catch (AppacitiveRuntimeException) { } }
public void HasBatchReferencesShouldBeTrueForConnectionsWithBatchReferences() { APBatch batch = new APBatch(); var obj = ObjectHelper.NewInstance(); var objReference = batch.SaveObject(obj); var connA = new APConnection("type", "labelA", "IdA", "labelB", "idB"); var connB = new APConnection("type", "labelA", obj, "labelB", obj); var connC = new APConnection("type", "labelA", obj, "labelB", "IdB"); var connD = new APConnection("type", "labelA", "IdA", "labelB", objReference); var connE = new APConnection("type", "labelA", objReference, "labelB", objReference); var connF = new APConnection("type", "labelA", obj, "labelB", objReference); Assert.IsFalse(connA.Endpoints.HasBatchReference); Assert.IsFalse(connB.Endpoints.HasBatchReference); Assert.IsFalse(connC.Endpoints.HasBatchReference); Assert.IsTrue(connD.Endpoints.HasBatchReference); Assert.IsTrue(connE.Endpoints.HasBatchReference); Assert.IsTrue(connF.Endpoints.HasBatchReference); }
public async Task AllMultiCallerOperationsTest() { var newObj = ObjectHelper.NewInstance(); var existing = await ObjectHelper.CreateNewAsync(); var objToBeDeleted = await ObjectHelper.CreateNewAsync(); var newConn = APConnection.New("sibling") .FromNewObject("object", ObjectHelper.NewInstance()) .ToNewObject("object", ObjectHelper.NewInstance()); var existingConn = await APConnection.New("sibling") .FromNewObject("object", ObjectHelper.NewInstance()) .ToNewObject("object", ObjectHelper.NewInstance()) .SaveAsync(); var toBeDeletedConn = await APConnection.New("sibling") .FromNewObject("object", ObjectHelper.NewInstance()) .ToNewObject("object", ObjectHelper.NewInstance()) .SaveAsync(); existing.Set("textfield", Guid.NewGuid().ToString()); existingConn.SetAttribute("testAttr", Guid.NewGuid().ToString()); APBatch batch = new APBatch(); batch.SaveObject(newObj); batch.SaveObject(existing); batch.SaveConnection(newConn); batch.SaveConnection(existingConn); batch.DeleteObject(objToBeDeleted); batch.DeleteConnection(toBeDeletedConn); await batch.ExecuteAsync(); Assert.AreEqual(1, batch.CreatedObjects.Count()); Assert.AreEqual(1, batch.CreatedConnections.Count()); Assert.AreEqual(1, batch.UpdatedObjects.Count()); Assert.AreEqual(1, batch.UpdatedConnections.Count()); Assert.AreEqual(1, batch.DeletedObjects.Count()); Assert.AreEqual(1, batch.DeletedConnections.Count()); }
/// <summary> /// Batches the example. /// </summary> /// <returns>Task.</returns> private static async Task BatchExample() { var batchUrl = $"{_baseAddress}/odata/$batches"; // Global batch request var batchRequest = new HttpRequestMessage(HttpMethod.Post, batchUrl); batchRequest.Headers.Authorization = new AuthenticationHeaderValue("bearer", (await GetToken()).AccessToken); //POST Request //Create Batch Model var newBatch = new APBatch { BatchNo = "Batch No" }; //Send request var batchPK = (await PostBatch(newBatch)).Value; // Multiple GET Requests var batchContent = new MultipartContent("mixed", $"batches_{Guid.NewGuid()}") { ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("4311192f-c46f-4655-8d51-fc2f49aabf78")})"), ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("71395601-8db7-4f3a-b466-106663990c90")})"), ComposeGetContent($"{_baseAddress}/odata/Inventory({new Guid("2a3e66aa-2e15-4035-8534-cb8a2280beea")})") }; // Multiple POST Requests // multi-part content that represents the change-set container MultipartContent changeSet = new MultipartContent("mixed", $"changeset_{Guid.NewGuid()}"); // Add POST content to the change-set var content1 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json"); var content2 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json"); var content3 = new StringContent(Serialize(GetNewInventory()), Encoding.UTF8, "application/json"); changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content1)); changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content2)); changeSet.Add(ComposePostContent($"{_baseAddress}/odata/Inventory", content3)); // Add the change-set to the batch content batchContent.Add(changeSet); batchRequest.Content = batchContent; var http = new HttpClient(); HttpResponseMessage response = await http.SendAsync(batchRequest); var result = await response.Content.ReadAsMultipartAsync(); // Batch response handling foreach (HttpContent currentContent in result.Contents) { // 1. a "single" response if (currentContent.Headers.ContentType.MediaType.Equals("application/http", StringComparison.OrdinalIgnoreCase) && !currentContent.Headers.ContentType.Parameters.Any(parameter => parameter.Name.Equals("msgtype", StringComparison.OrdinalIgnoreCase) && parameter.Value.Equals("response", StringComparison.OrdinalIgnoreCase))) { currentContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("msgtype", "response")); await currentContent.ReadAsHttpResponseMessageAsync(); // The workingResponse object contains a classic exploitable HttpResponseMessage (with IsSuccessStatusCode, Content.ReadAsStringAsync().Result, etc.) } // 2. a change-set response with multi-part content else { var subMultipartContent = await currentContent.ReadAsMultipartAsync(); foreach (HttpContent currentSubContent in subMultipartContent.Contents) { currentSubContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("msgtype", "response")); await currentSubContent.ReadAsHttpResponseMessageAsync(); // Same here, the workingResponse object contains a classic exploitable HttpResponseMessage } } } }
public async Task MultiCallerWithInternalReferenceTest() { APBatch batch = new APBatch(); var newObj = ObjectHelper.NewInstance(); var objReference = batch.SaveObject(newObj); var newConn = APConnection.New("sibling") .FromNewObject("object", ObjectHelper.NewInstance()) .ToBatchObjectReference("object", objReference); var connReference = batch.SaveConnection(newConn); await batch.ExecuteAsync(); Assert.AreEqual(1, batch.CreatedObjects.Count()); Assert.AreEqual(1, batch.CreatedConnections.Count()); Assert.IsNotNull(batch.CreatedObjects[objReference]); Assert.IsNotNull(batch.CreatedConnections[connReference]); }
public async Task SaveForConnectionWithBatchReferenceShouldFaultTest() { APBatch batch = new APBatch(); var obj = ObjectHelper.NewInstance(); var objReference = batch.SaveObject(obj); var conn = APConnection .New("siblings") .FromNewObject("object", ObjectHelper.NewInstance()) .ToBatchObjectReference("object", objReference); try { await conn.SaveAsync(); Assert.Fail("This should have failed."); } catch (AppacitiveRuntimeException) { } }