Exemplo n.º 1
0
        public async Task SystemPropertiesArePreserved_OnlyWhenReturnedFromServer()
        {
            ResetDatabase(TestTable);

            var hijack = new TestHttpHandler();
            var store  = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            IMobileServiceClient service = await CreateClient(hijack, store);

            IMobileServiceSyncTable <ToDoWithSystemPropertiesType> table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            // first insert an item
            var updatedItem = new ToDoWithSystemPropertiesType()
            {
                Id        = "b",
                String    = "Hey",
                Version   = "abc",
                CreatedAt = new DateTime(2013, 1, 1, 1, 1, 1, DateTimeKind.Utc),
                UpdatedAt = new DateTime(2013, 1, 1, 1, 1, 2, DateTimeKind.Utc)
            };
            await table.UpdateAsync(updatedItem);

            var lookedupItem = await table.LookupAsync("b");

            Assert.Equal("Hey", lookedupItem.String);
            Assert.Equal("abc", lookedupItem.Version);
            // we ignored the sys properties on the local object
            Assert.Equal(lookedupItem.CreatedAt, new DateTime(0, DateTimeKind.Utc));
            Assert.Equal(lookedupItem.UpdatedAt, new DateTime(0, DateTimeKind.Utc));

            Assert.Equal(1L, service.SyncContext.PendingOperations); // operation pending

            hijack.OnSendingRequest = async req =>
            {
                string content = await req.Content.ReadAsStringAsync();

                Assert.Equal(@"{""id"":""b"",""String"":""Hey""}", content); // the system properties are not sent to server
                return(req);
            };
            string updateResult = "{\"id\":\"b\",\"String\":\"Wow\",\"version\":\"def\",\"createdAt\":\"2014-01-29T23:01:33.444Z\", \"updatedAt\":\"2014-01-30T23:01:33.444Z\"}";

            hijack.Responses.Add(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(updateResult)
            });                                                                                                             // push
            await service.SyncContext.PushAsync();

            Assert.Equal(0L, service.SyncContext.PendingOperations); // operation removed

            lookedupItem = await table.LookupAsync("b");

            Assert.Equal("Wow", lookedupItem.String);
            Assert.Equal("def", lookedupItem.Version);
            // we preserved the system properties returned from server on update
            Assert.Equal(lookedupItem.CreatedAt.ToUniversalTime(), new DateTime(2014, 01, 29, 23, 1, 33, 444, DateTimeKind.Utc));
            Assert.Equal(lookedupItem.UpdatedAt.ToUniversalTime(), new DateTime(2014, 01, 30, 23, 1, 33, 444, DateTimeKind.Utc));
        }
Exemplo n.º 2
0
        public async Task TruncateAsync_DeletesAllTheRows()
        {
            string tableName = "stringId_test_table";

            ResetDatabase(tableName);

            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            var hijack = new TestHttpHandler();

            hijack.AddResponseContent(@"{""id"": ""123"", ""version"": ""xyz""}");
            hijack.AddResponseContent(@"{""id"": ""134"", ""version"": ""ghi""}");

            IMobileServiceClient service = await CreateClient(hijack, store);

            var table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            var items = new ToDoWithSystemPropertiesType[]
            {
                new ToDoWithSystemPropertiesType()
                {
                    Id      = "123",
                    Version = "abc",
                    String  = "def"
                },
                new ToDoWithSystemPropertiesType()
                {
                    Id      = "134",
                    Version = "ghi",
                    String  = "jkl"
                }
            };

            foreach (var inserted in items)
            {
                await table.InsertAsync(inserted);
            }

            var result = await table.IncludeTotalCount().Take(0).ToCollectionAsync();

            Assert.Equal(2L, result.TotalCount);

            await service.SyncContext.PushAsync();

            await table.PurgeAsync();

            result = await table.IncludeTotalCount().Take(0).ToCollectionAsync();

            Assert.Equal(0L, result.TotalCount);
        }
Exemplo n.º 3
0
        public async Task PushAsync_DiscardsOperationAndDeletesTheItem_WhenCancelAndDiscardItemAsync()
        {
            ResetDatabase(TestTable);

            var    hijack         = new TestHttpHandler();
            string conflictResult = "{\"id\":\"b\",\"String\":\"Wow\",\"version\":\"def\"}";

            hijack.Responses.Add(new HttpResponseMessage(HttpStatusCode.PreconditionFailed)
            {
                Content = new StringContent(conflictResult)
            });                                                                                                                               // first push

            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            IMobileServiceClient service = await CreateClient(hijack, store);

            IMobileServiceSyncTable <ToDoWithSystemPropertiesType> table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            // first insert an item
            var updatedItem = new ToDoWithSystemPropertiesType()
            {
                Id = "b", String = "Hey", Version = "abc"
            };
            await table.UpdateAsync(updatedItem);

            // then push it to server
            var ex = await Assert.ThrowsAsync <MobileServicePushFailedException>(service.SyncContext.PushAsync);

            Assert.NotNull(ex.PushResult);
            MobileServiceTableOperationError error = ex.PushResult.Errors.FirstOrDefault();

            Assert.NotNull(error);

            Assert.Equal(1L, service.SyncContext.PendingOperations); // operation is not removed
            updatedItem = await table.LookupAsync("b");

            Assert.Equal("Hey", updatedItem.String); // item is not updated

            await error.CancelAndDiscardItemAsync();

            Assert.Equal(0L, service.SyncContext.PendingOperations); // operation is removed
            updatedItem = await table.LookupAsync("b");

            Assert.Null(updatedItem); // item is deleted
        }
        public async Task Insert_ThenStartPush_ThenDelete_ThenEndPush_ThenPush()
        {
            string tableName = "stringId_test_table";

            ResetDatabase(tableName);
            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            Action beginDeleteItem = null;
            Task   deleting        = null;
            var    hijack          = new TestHttpHandler {
                OnSendingRequest = r => { beginDeleteItem(); return(Task.FromResult(r)); }
            };

            hijack.AddResponseContent("{\"id\":\"b\",\"String\":\"Hey\",\"version\":\"def\",\"createdAt\":\"2014-01-29T23:01:33.444Z\", \"updatedAt\":\"2014-01-30T23:01:33.444Z\"}"); // insert response
            var service = await CreateClient(hijack, store);

            var table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            // first, insert an item
            var item = new ToDoWithSystemPropertiesType("b")
            {
                String = "Hey"
            };
            await table.InsertAsync(item);

            beginDeleteItem = () => deleting = table.DeleteAsync(item);

            // then start pushing it
            await service.SyncContext.PushAsync();

            // on 'insert' request is sent (that is while push is in progress), delete the record while it doesn't have the 'version'
            // wait until deleting locally is complete
            await deleting;

            // push again to send the Delete request
            await service.SyncContext.PushAsync();

            Assert.Equal("\"def\"", hijack.Requests[1].Headers.IfMatch.ToString());
        }
Exemplo n.º 5
0
        public async Task ReadAsync_WithSystemPropertyType_Generic()
        {
            string tableName = "stringId_test_table";

            ResetDatabase(tableName);

            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            var hijack = new TestHttpHandler();

            hijack.AddResponseContent(@"{""id"": ""123"", ""version"": ""xyz""}");
            IMobileServiceClient service = await CreateClient(hijack, store);

            var table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            var inserted = new ToDoWithSystemPropertiesType()
            {
                Id      = "123",
                Version = "abc",
                String  = "def"
            };
            await table.InsertAsync(inserted);

            Assert.Equal("abc", inserted.Version);

            await service.SyncContext.PushAsync();

            ToDoWithSystemPropertiesType rehydrated = await table.LookupAsync(inserted.Id);

            Assert.Equal("xyz", rehydrated.Version);

            string expectedRequestContent = @"{""id"":""123"",""String"":""def""}";

            // version should not be sent with insert request
            Assert.Equal(hijack.RequestContents[0], expectedRequestContent);
        }
Exemplo n.º 6
0
        public async Task ReadAsync_StringCompare_WithSpecialChars()
        {
            ResetDatabase("stringId_test_table");

            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            IMobileServiceClient service = await CreateClient(new TestHttpHandler(), store);

            var table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            var inserted = new ToDoWithSystemPropertiesType()
            {
                Id      = "123",
                Version = "abc",
                String  = "*****@*****.**"
            };
            await table.InsertAsync(inserted);

            ToDoWithSystemPropertiesType rehydrated = (await table.Where(t => t.String == "*****@*****.**").ToListAsync()).FirstOrDefault();

            Assert.Equal("*****@*****.**", rehydrated.String);
        }
Exemplo n.º 7
0
        public async Task PushAsync_RetriesOperation_WhenConflictOccursInLastPush()
        {
            ResetDatabase(TestTable);

            var    hijack         = new TestHttpHandler();
            string conflictResult = "{\"id\":\"b\",\"String\":\"Hey\",\"version\":\"def\"}";

            hijack.Responses.Add(new HttpResponseMessage(HttpStatusCode.PreconditionFailed)
            {
                Content = new StringContent(conflictResult)
            });                                                                                                                               // first push
            string successResult = "{\"id\":\"b\",\"String\":\"Wow\",\"version\":\"def\"}";

            hijack.Responses.Add(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(successResult)
            });                                                                                                              // second push

            var store = new MobileServiceSQLiteStore(TestDbName);

            store.DefineTable <ToDoWithSystemPropertiesType>();

            IMobileServiceClient service = await CreateClient(hijack, store);

            IMobileServiceSyncTable <ToDoWithSystemPropertiesType> table = service.GetSyncTable <ToDoWithSystemPropertiesType>();

            // first insert an item
            var updatedItem = new ToDoWithSystemPropertiesType()
            {
                Id = "b", String = "Hey", Version = "abc"
            };
            await table.UpdateAsync(updatedItem);

            // then push it to server
            var ex = await Assert.ThrowsAsync <MobileServicePushFailedException>(service.SyncContext.PushAsync);

            Assert.NotNull(ex.PushResult);
            Assert.Equal(MobileServicePushStatus.Complete, ex.PushResult.Status);
            Assert.Single(ex.PushResult.Errors);
            MobileServiceTableOperationError error = ex.PushResult.Errors.FirstOrDefault();

            Assert.NotNull(error);
            Assert.False(error.Handled);
            Assert.Equal(MobileServiceTableOperationKind.Update, error.OperationKind);
            Assert.Equal(error.RawResult, conflictResult);
            Assert.Equal(error.TableName, TestTable);
            Assert.Equal(HttpStatusCode.PreconditionFailed, error.Status);

            var errorItem = error.Item.ToObject <ToDoWithSystemPropertiesType>(JsonSerializer.Create(service.SerializerSettings));

            Assert.Equal(errorItem.Id, updatedItem.Id);
            Assert.Equal(errorItem.String, updatedItem.String);
            Assert.Equal(errorItem.Version, updatedItem.Version);
            Assert.Equal(errorItem.CreatedAt, updatedItem.CreatedAt);
            Assert.Equal(errorItem.UpdatedAt, updatedItem.UpdatedAt);

            Assert.Equal(error.Result.ToString(Formatting.None), conflictResult);

            Assert.Equal(1L, service.SyncContext.PendingOperations); // operation not removed
            updatedItem = await table.LookupAsync("b");

            Assert.Equal("Hey", updatedItem.String); // item is not updated

            await service.SyncContext.PushAsync();

            Assert.Equal(0L, service.SyncContext.PendingOperations); // operation now succeeds

            updatedItem = await table.LookupAsync("b");

            Assert.Equal("Wow", updatedItem.String); // item is updated
        }
        public async Task UndeleteAsync()
        {
            TestHttpHandler hijack = new TestHttpHandler();

            hijack.SetResponseContent("{\"id\":\"an id\",\"String\":\"Hey\"}");
            hijack.OnSendingRequest = req =>
            {
                Assert.AreEqual(req.Method, HttpMethod.Post);
                // only id and version should be sent
                Assert.IsNull(req.Content);
                Assert.AreEqual(req.Headers.IfMatch.First().Tag, "\"abc\"");
                return Task.FromResult(req);
            };
            IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack);

            IMobileServiceTable<ToDoWithSystemPropertiesType> table = service.GetTable<ToDoWithSystemPropertiesType>();

            var obj = new ToDoWithSystemPropertiesType();
            obj.Id = "an id";
            obj.String = "new";
            obj.Version = "abc";

            await table.UndeleteAsync(obj, null);

            Assert.AreEqual("an id", obj.Id);
            Assert.AreEqual("Hey", obj.String);
        }