public async Task DeleteAsync_ThrowsPreconditionFailedException_WhenMergeConflictOccurs_Generic() { string id = Guid.NewGuid().ToString(); var table = GetClient().GetTable <RoundTripTableItemWithSystemPropertiesType>(); // insert a new item var item = new RoundTripTableItemWithSystemPropertiesType() { Id = id, Name = "a value" }; await table.InsertAsync(item); Assert.IsNotNull(item.CreatedAt); Assert.IsNotNull(item.UpdatedAt); Assert.IsNotNull(item.Version); string version = item.Version; // Delete with wrong version item.Version = "3q3A3g=="; item.Name = "But wait!"; MobileServicePreconditionFailedException <RoundTripTableItemWithSystemPropertiesType> expectedException = null; try { await table.DeleteAsync(item); } catch (MobileServicePreconditionFailedException <RoundTripTableItemWithSystemPropertiesType> exception) { expectedException = exception; } Assert.IsNotNull(expectedException); Assert.AreEqual(expectedException.Response.StatusCode, HttpStatusCode.PreconditionFailed); string responseContent = await expectedException.Response.Content.ReadAsStringAsync(); RoundTripTableItemWithSystemPropertiesType serverItem = expectedException.Item; string serverVersion = serverItem.Version; string stringValue = serverItem.Name; Assert.AreEqual(version, serverVersion); Assert.AreEqual(stringValue, "a value"); Assert.IsNotNull(expectedException.Item); Assert.AreEqual(version, expectedException.Item.Version); Assert.AreEqual(stringValue, expectedException.Item.Name); // Delete one last time with the version from the server item.Version = serverVersion; await table.DeleteAsync(item); Assert.IsNull(item.Id); }
public async Task AsyncTableOperationsWithSystemPropertiesSetExplicitly() { await EnsureEmptyTableAsync <RoundTripTableItemWithSystemPropertiesType>(); IMobileServiceTable <RoundTripTableItemWithSystemPropertiesType> allSystemPropertiesTable = GetClient().GetTable <RoundTripTableItemWithSystemPropertiesType>(); // Regular insert RoundTripTableItemWithSystemPropertiesType item = new RoundTripTableItemWithSystemPropertiesType() { Name = "a value" }; await allSystemPropertiesTable.InsertAsync(item); Assert.IsNotNull(item.CreatedAt); Assert.IsNotNull(item.UpdatedAt); Assert.IsNotNull(item.Version); // Explicit System Properties Read IEnumerable <RoundTripTableItemWithSystemPropertiesType> results = await allSystemPropertiesTable.Where(p => p.Id == item.Id).ToEnumerableAsync(); RoundTripTableItemWithSystemPropertiesType[] items = results.ToArray(); Assert.AreEqual(1, items.Count()); Assert.IsNotNull(items[0].CreatedAt); Assert.IsNotNull(items[0].UpdatedAt); Assert.IsNotNull(items[0].Version); // Lookup var item3 = await allSystemPropertiesTable.LookupAsync(item.Id); Assert.AreEqual(item.CreatedAt, item3.CreatedAt); Assert.AreEqual(item.UpdatedAt, item3.UpdatedAt); Assert.IsNotNull(item3.Version); await allSystemPropertiesTable.DeleteAsync(item); }
public async Task AsyncTableOperationsWithAllSystemProperties() { await EnsureEmptyTableAsync <RoundTripTableItemWithSystemPropertiesType>(); string id = Guid.NewGuid().ToString(); IMobileServiceTable <RoundTripTableItemWithSystemPropertiesType> table = GetClient().GetTable <RoundTripTableItemWithSystemPropertiesType>(); RoundTripTableItemWithSystemPropertiesType item = new RoundTripTableItemWithSystemPropertiesType() { Id = id, Name = "a value" }; await table.InsertAsync(item); Assert.IsNotNull(item.CreatedAt); Assert.IsNotNull(item.UpdatedAt); Assert.IsNotNull(item.Version); // Read IEnumerable <RoundTripTableItemWithSystemPropertiesType> results = await table.ReadAsync(); RoundTripTableItemWithSystemPropertiesType[] items = results.ToArray(); Assert.AreEqual(1, items.Count()); Assert.IsNotNull(items[0].CreatedAt); Assert.IsNotNull(items[0].UpdatedAt); Assert.IsNotNull(items[0].Version); // Filter against version // BUG #1706815 (OData query for version field (string <--> byte[] mismatch) /* * results = await table.Where(i => i.Version == items[0].Version).ToEnumerableAsync(); * RoundTripTableItemWithSystemPropertiesType[] filterItems = results.ToArray(); * * Assert.AreEqual(1, items.Count()); * Assert.AreEqual(filterItems[0].CreatedAt, items[0].CreatedAt); * Assert.AreEqual(filterItems[0].UpdatedAt, items[0].UpdatedAt); * Assert.AreEqual(filterItems[0].Version, items[0].Version); * * // Filter against createdAt * results = await table.Where(i => i.CreatedAt == items[0].CreatedAt).ToEnumerableAsync(); * RoundTripTableItemWithSystemPropertiesType[] filterItems = results.ToArray(); * * Assert.AreEqual(1, items.Count()); * Assert.AreEqual(filterItems[0].CreatedAt, items[0].CreatedAt); * Assert.AreEqual(filterItems[0].UpdatedAt, items[0].UpdatedAt); * Assert.AreEqual(filterItems[0].Version, items[0].Version); * * // Filter against updatedAt * results = await table.Where(i => i.UpdatedAt == items[0].UpdatedAt).ToEnumerableAsync(); * filterItems = results.ToArray(); * * Assert.AreEqual(1, items.Count()); * Assert.AreEqual(filterItems[0].CreatedAt, items[0].CreatedAt); * Assert.AreEqual(filterItems[0].UpdatedAt, items[0].UpdatedAt); * Assert.AreEqual(filterItems[0].Version, items[0].Version); */ // Projection var projectedResults = await table.Select(i => new { XId = i.Id, XCreatedAt = i.CreatedAt, XUpdatedAt = i.UpdatedAt, XVersion = i.Version }).ToEnumerableAsync(); var projectedItems = projectedResults.ToArray(); Assert.AreEqual(1, projectedResults.Count()); Assert.AreEqual(projectedItems[0].XId, items[0].Id); Assert.AreEqual(projectedItems[0].XCreatedAt, items[0].CreatedAt); Assert.AreEqual(projectedItems[0].XUpdatedAt, items[0].UpdatedAt); Assert.AreEqual(projectedItems[0].XVersion, items[0].Version); // Lookup item = await table.LookupAsync(id); Assert.AreEqual(id, item.Id); Assert.AreEqual(item.Id, items[0].Id); Assert.AreEqual(item.CreatedAt, items[0].CreatedAt); Assert.AreEqual(item.UpdatedAt, items[0].UpdatedAt); Assert.AreEqual(item.Version, items[0].Version); // Refresh item = new RoundTripTableItemWithSystemPropertiesType() { Id = id }; await table.RefreshAsync(item); Assert.AreEqual(id, item.Id); Assert.AreEqual(item.Id, items[0].Id); Assert.AreEqual(item.CreatedAt, items[0].CreatedAt); Assert.AreEqual(item.UpdatedAt, items[0].UpdatedAt); Assert.AreEqual(item.Version, items[0].Version); // Update item.Name = "Hello!"; await table.UpdateAsync(item); Assert.AreEqual(item.Id, items[0].Id); Assert.AreEqual(item.CreatedAt, items[0].CreatedAt); Assert.IsTrue(item.UpdatedAt >= items[0].UpdatedAt); Assert.IsNotNull(item.Version); Assert.AreNotEqual(item.Version, items[0].Version); // Read Again results = await table.ReadAsync(); items = results.ToArray(); Assert.AreEqual(id, item.Id); Assert.AreEqual(item.Id, items[0].Id); Assert.AreEqual(item.CreatedAt, items[0].CreatedAt); Assert.AreEqual(item.UpdatedAt, items[0].UpdatedAt); Assert.AreEqual(item.Version, items[0].Version); await table.DeleteAsync(item); }
public async Task UpdateAsyncWitMergeConflict_Generic() { await EnsureEmptyTableAsync <RoundTripTableItemWithSystemPropertiesType>(); string id = Guid.NewGuid().ToString(); IMobileServiceTable <RoundTripTableItemWithSystemPropertiesType> table = GetClient().GetTable <RoundTripTableItemWithSystemPropertiesType>(); RoundTripTableItemWithSystemPropertiesType item = new RoundTripTableItemWithSystemPropertiesType() { Id = id, Name = "a value" }; await table.InsertAsync(item); Assert.IsNotNull(item.CreatedAt); Assert.IsNotNull(item.UpdatedAt); Assert.IsNotNull(item.Version); string version = item.Version; // Update item.Name = "Hello!"; await table.UpdateAsync(item); Assert.IsNotNull(item.Version); Assert.AreNotEqual(item.Version, version); string newVersion = item.Version; // Update again but with the original version item.Version = version; item.Name = "But wait!"; MobileServicePreconditionFailedException <RoundTripTableItemWithSystemPropertiesType> expectedException = null; try { await table.UpdateAsync(item); } catch (MobileServicePreconditionFailedException <RoundTripTableItemWithSystemPropertiesType> exception) { expectedException = exception; } Assert.IsNotNull(expectedException); Assert.AreEqual(expectedException.Response.StatusCode, HttpStatusCode.PreconditionFailed); Assert.IsNotNull(expectedException.Item); string serverVersion = expectedException.Item.Version; string stringValue = expectedException.Item.Name; Assert.AreEqual(newVersion, serverVersion); Assert.AreEqual(stringValue, "Hello!"); // Update one last time with the version from the server item.Version = serverVersion; await table.UpdateAsync(item); Assert.IsNotNull(item.Version); Assert.AreEqual(item.Name, "But wait!"); Assert.AreNotEqual(item.Version, serverVersion); await table.DeleteAsync(item); }
public async Task AsyncFilterSelectOrderingOperationsNotImpactedBySystemProperties() { await EnsureEmptyTableAsync <RoundTripTableItemWithSystemPropertiesType>(); IMobileServiceTable <RoundTripTableItemWithSystemPropertiesType> table = GetClient().GetTable <RoundTripTableItemWithSystemPropertiesType>(); List <RoundTripTableItemWithSystemPropertiesType> items = new List <RoundTripTableItemWithSystemPropertiesType>(); // Insert some items for (int id = 0; id < 5; id++) { RoundTripTableItemWithSystemPropertiesType item = new RoundTripTableItemWithSystemPropertiesType() { Id = id.ToString(), Name = "a value" }; await table.InsertAsync(item); Assert.IsNotNull(item.CreatedAt); Assert.IsNotNull(item.UpdatedAt); Assert.IsNotNull(item.Version); items.Add(item); } // Ordering var results = await table.OrderBy(t => t.CreatedAt).ToEnumerableAsync(); // Fails here with .NET runtime. Why?? RoundTripTableItemWithSystemPropertiesType[] orderItems = results.ToArray(); for (int i = 0; i < orderItems.Length - 1; i++) { Assert.IsTrue(int.Parse(orderItems[i].Id) < int.Parse(orderItems[i + 1].Id)); } results = await table.OrderBy(t => t.UpdatedAt).ToEnumerableAsync(); orderItems = results.ToArray(); for (int i = 0; i < orderItems.Length - 1; i++) { Assert.IsTrue(int.Parse(orderItems[i].Id) < int.Parse(orderItems[i + 1].Id)); } results = await table.OrderBy(t => t.Version).ToEnumerableAsync(); orderItems = results.ToArray(); for (int i = 0; i < orderItems.Length - 1; i++) { Assert.IsTrue(int.Parse(orderItems[i].Id) < int.Parse(orderItems[i + 1].Id)); } // Filtering results = await table.Where(t => t.CreatedAt >= items[4].CreatedAt).ToEnumerableAsync(); RoundTripTableItemWithSystemPropertiesType[] filteredItems = results.ToArray(); for (int i = 0; i < filteredItems.Length - 1; i++) { Assert.IsTrue(filteredItems[i].CreatedAt >= items[4].CreatedAt); } results = await table.Where(t => t.UpdatedAt >= items[4].UpdatedAt).ToEnumerableAsync(); filteredItems = results.ToArray(); for (int i = 0; i < filteredItems.Length - 1; i++) { Assert.IsTrue(filteredItems[i].UpdatedAt >= items[4].UpdatedAt); } // TODO: Seperate to own test, to not run for .NET / Fix.Net /* * results = await table.Where(t => t.Version == items[4].Version).ToEnumerableAsync(); * filteredItems = results.ToArray(); * * for (int i = 0; i < filteredItems.Length - 1; i++) * { * Assert.IsTrue(filteredItems[i].Version == items[4].Version); * } */ // Selection var selectionResults = await table.Select(t => new { Id = t.Id, CreatedAt = t.CreatedAt }).ToEnumerableAsync(); var selectedItems = selectionResults.ToArray(); for (int i = 0; i < selectedItems.Length; i++) { var item = items.Where(t => t.Id == selectedItems[i].Id).FirstOrDefault(); Assert.IsTrue(item.CreatedAt == selectedItems[i].CreatedAt); } var selectionResults2 = await table.Select(t => new { Id = t.Id, UpdatedAt = t.UpdatedAt }).ToEnumerableAsync(); var selectedItems2 = selectionResults2.ToArray(); for (int i = 0; i < selectedItems2.Length; i++) { var item = items.Where(t => t.Id == selectedItems2[i].Id).FirstOrDefault(); Assert.IsTrue(item.UpdatedAt == selectedItems2[i].UpdatedAt); } var selectionResults3 = await table.Select(t => new { Id = t.Id, Version = t.Version }).ToEnumerableAsync(); var selectedItems3 = selectionResults3.ToArray(); for (int i = 0; i < selectedItems3.Length; i++) { var item = items.Where(t => t.Id == selectedItems3[i].Id).FirstOrDefault(); Assert.IsTrue(item.Version == selectedItems3[i].Version); } // Delete foreach (var item in items) { await table.DeleteAsync(item); } }