Exemple #1
0
        public async Task PushItemsAsync_SingleTable_HandlesUpdateOperation_Conflict()
        {
            await table.ServiceClient.InitializeOfflineStoreAsync();

            var itemToUpdate = new ClientMovie {
                Id = Guid.NewGuid().ToString(), Version = "1", Title = "The Big Test"
            };
            var instance = table.ServiceClient.Serializer.Serialize(itemToUpdate) as JObject;

            store.Upsert("movies", new[] { instance });

            var updatedItem = itemToUpdate.Clone();

            updatedItem.Title = "Modified";
            var mInstance = table.ServiceClient.Serializer.Serialize(updatedItem) as JObject;

            var returnedItem = itemToUpdate.Clone();

            returnedItem.Version = "2";
            var expectedInstance = table.ServiceClient.Serializer.Serialize(returnedItem) as JObject;

            MockHandler.AddResponse(HttpStatusCode.Conflict, returnedItem);

            await table.ReplaceItemAsync(mInstance);

            var ex = await Assert.ThrowsAsync <PushFailedException>(() => table.PushItemsAsync());

            Assert.Single(MockHandler.Requests);
            var request = MockHandler.Requests[0];

            Assert.Equal(HttpMethod.Put, request.Method);
            Assert.Equal($"/tables/movies/{itemToUpdate.Id}", request.RequestUri.PathAndQuery);
            Assert.Equal("\"1\"", request.Headers.IfMatch.First().Tag);
            var requestObj = JObject.Parse(await request.Content.ReadAsStringAsync());

            AssertEx.JsonEqual(mInstance, requestObj);

            Assert.Equal(PushStatus.Complete, ex.PushResult.Status);
            Assert.Single(ex.PushResult.Errors);
            Assert.Equal("movies", ex.PushResult.Errors.First().TableName);
            Assert.Equal(itemToUpdate.Id, ex.PushResult.Errors.First().Item.Value <string>("id"));

            Assert.Single(store.TableMap[SystemTables.OperationsQueue]);
            var op = TableOperation.Deserialize(store.TableMap[SystemTables.OperationsQueue].Values.First());

            Assert.Equal(TableOperationState.Failed, op.State);

            Assert.Single(store.TableMap[SystemTables.SyncErrors]);
        }
Exemple #2
0
        public async Task PushItemsAsync_SingleTable_HandlesInsertOperation()
        {
            await table.ServiceClient.InitializeOfflineStoreAsync();

            var item = new ClientMovie {
                Id = Guid.NewGuid().ToString(), Title = "The Big Test"
            };
            var returnedItem = item.Clone();

            returnedItem.UpdatedAt = DateTimeOffset.Now;
            returnedItem.Version   = "1";
            var expectedContent = $"{{\"bestPictureWinner\":false,\"duration\":0,\"rating\":null,\"releaseDate\":\"0001-01-01T00:00:00.000Z\",\"title\":\"The Big Test\",\"year\":0,\"id\":\"{item.Id}\"}}";
            var instance        = (JObject)table.ServiceClient.Serializer.Serialize(item);

            MockHandler.AddResponse(HttpStatusCode.OK, returnedItem);

            await table.InsertItemAsync(instance);

            await table.PushItemsAsync();

            Assert.Empty(store.TableMap[SystemTables.OperationsQueue]);
            Assert.Single(MockHandler.Requests);

            var request = MockHandler.Requests[0];

            Assert.Equal(HttpMethod.Post, request.Method);
            Assert.Equal("/tables/movies", request.RequestUri.PathAndQuery);
            Assert.Equal(expectedContent, await request.Content.ReadAsStringAsync());

            Assert.True(store.TableMap["movies"].ContainsKey(item.Id));
            var storedItem = store.TableMap["movies"][item.Id];

            Assert.Equal(storedItem.Value <DateTime>("updatedAt").Ticks, returnedItem.UpdatedAt?.Ticks);
            Assert.Equal(storedItem.Value <string>("version"), returnedItem.Version);
        }
Exemple #3
0
        public async Task PushItemsAsync_SingleTable_HandlesUpdateOperation_WithVersion()
        {
            await table.ServiceClient.InitializeOfflineStoreAsync();

            var itemToUpdate = new ClientMovie {
                Id = Guid.NewGuid().ToString(), Version = "1", Title = "The Big Test"
            };
            var instance = table.ServiceClient.Serializer.Serialize(itemToUpdate) as JObject;

            store.Upsert("movies", new[] { instance });

            var updatedItem = itemToUpdate.Clone();

            updatedItem.Title = "Modified";
            var mInstance = table.ServiceClient.Serializer.Serialize(updatedItem) as JObject;

            var returnedItem = itemToUpdate.Clone();

            returnedItem.Version = "2";
            MockHandler.AddResponse(HttpStatusCode.OK, returnedItem);

            await table.ReplaceItemAsync(mInstance);

            await table.PushItemsAsync();

            // Request was a PUT
            Assert.Single(MockHandler.Requests);
            var request = MockHandler.Requests[0];

            Assert.Equal(HttpMethod.Put, request.Method);
            Assert.Equal($"/tables/movies/{itemToUpdate.Id}", request.RequestUri.PathAndQuery);
            Assert.Equal("\"1\"", request.Headers.IfMatch.First().Tag);
            var requestObj = JObject.Parse(await request.Content.ReadAsStringAsync());

            AssertEx.JsonEqual(mInstance, requestObj);

            // Queue is empty
            Assert.Empty(store.TableMap[SystemTables.OperationsQueue]);

            // Item in the store has been updated.
            Assert.True(store.TableMap["movies"].ContainsKey(itemToUpdate.Id));
            Assert.Equal("2", store.TableMap["movies"][itemToUpdate.Id].Value <string>("version"));
        }