public async Task GetValueAsync_PocoWithTable_QueriesCorrectTable()
        {
            // Arrange
            var handler = new TestHandler("{}");

            var attribute = new MobileTableAttribute
            {
                TableName = "SomeOtherTable",
                Id        = "abc123"
            };

            var context = new MobileTableContext
            {
                ResolvedAttribute = attribute,
                Client            = new MobileServiceClient("https://someuri", handler)
            };

            var binder = new MobileTableItemValueBinder <TodoItem>(context);

            // Act
            var value = await binder.GetValueAsync();

            // Assert
            Assert.NotNull(value);
            Assert.Equal("https://someuri/tables/SomeOtherTable/abc123", handler.IssuedRequest.RequestUri.ToString());
        }
        public async Task SetAsync_Poco_Throws_IfIdChanges()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);

            TodoItem original = new TodoItem
            {
                Id = "abc123",
            };

            TodoItem updated = new TodoItem
            {
                Id = "def456",
            };

            var context = new MobileTableContext
            {
                Client = mockClient.Object,
            };

            var originalJson = JObject.FromObject(original);

            // Act
            var ex = await Assert.ThrowsAsync <InvalidOperationException>(
                () => MobileTableItemValueBinder <TodoItem> .SetValueInternalAsync(originalJson, updated, context));

            // Assert
            Assert.Equal("Cannot update the 'Id' property.", ex.Message);
            mockClient.Verify();
        }
        public async Task SetValue_PocoWithTable_UpdatesCorrectTable()
        {
            // Arrange
            var handler = new TestHandler("{}");

            var attribute = new MobileTableAttribute
            {
                TableName = "SomeOtherTable"
            };

            var context = new MobileTableContext
            {
                ResolvedAttribute = attribute,
                Client            = new MobileServiceClient("https://someuri", handler)
            };

            var original = JObject.Parse("{'Id':'abc123'}");
            var updated  = new TodoItem {
                Id = "abc123", Text = "updated"
            };

            // Act
            await MobileTableItemValueBinder <TodoItem> .SetValueInternalAsync(original, updated, context);

            // Assert
            Assert.Equal("https://someuri/tables/SomeOtherTable/abc123", handler.IssuedRequest.RequestUri.ToString());
        }
        public async Task SetAsync_JObject_SkipsUpdate_IfSame()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);

            JObject original = new JObject();

            original["id"]   = "abc123";
            original["data"] = "hello";

            JObject updated = original.DeepClone() as JObject;

            var attribute = new MobileTableAttribute
            {
                TableName = "TodoItem"
            };

            var context = new MobileTableContext
            {
                Client            = mockClient.Object,
                ResolvedAttribute = attribute
            };

            // Act
            await MobileTableItemValueBinder <JObject> .SetValueInternalAsync(original, updated, context);

            // Assert
            mockClient.VerifyAll();
        }
        public async Task SetAsync_JObject_Throws_IfIdChanges()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);

            JObject original = new JObject();

            original["id"]   = "abc123";
            original["data"] = "hello";

            JObject updated = original.DeepClone() as JObject;

            original["id"] = "def456";

            var attribute = new MobileTableAttribute
            {
                TableName = "TodoItem"
            };

            var context = new MobileTableContext
            {
                Client            = mockClient.Object,
                ResolvedAttribute = attribute
            };

            // Act
            var ex = await Assert.ThrowsAsync <InvalidOperationException>(
                () => MobileTableItemValueBinder <JObject> .SetValueInternalAsync(original, updated, context));

            // Assert
            Assert.Equal("Cannot update the 'Id' property.", ex.Message);
            mockClient.Verify();
        }
        public async Task SetAsync_Poco_SkipsUpdate_IfSame()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);

            TodoItem original = new TodoItem
            {
                Id   = "abc123",
                Text = "hello"
            };

            TodoItem updated = new TodoItem
            {
                Id   = "abc123",
                Text = "hello"
            };

            var context = new MobileTableContext
            {
                Client = mockClient.Object,
            };

            JObject clonedOrig = MobileTableItemValueBinder <object> .CloneItem(original);

            // Act
            await MobileTableItemValueBinder <TodoItem> .SetValueInternalAsync(clonedOrig, updated, context);

            // Assert

            // nothing on the client should be called
            mockClient.VerifyAll();
        }
        public void GetId_CaseInsensitive(string idKey)
        {
            // Arrange
            var token = JObject.Parse(string.Format("{{{0}:'abc123'}}", idKey));

            // Act
            var id = MobileTableItemValueBinder <object> .GetId(token);

            // Assert
            Assert.Equal("abc123", id);
        }
        public void CloneItem_JObject_CorrectlySerializes()
        {
            // Arrange
            var jObject = new JObject();

            jObject["id"]            = "abc123";
            jObject["text"]          = "hello";
            jObject["complete"]      = false;
            jObject["completedDate"] = DateTimeOffset.Now;

            // Act
            JObject cloned = MobileTableItemValueBinder <object> .CloneItem(jObject);

            // Assert
            Assert.NotSame(jObject, cloned);
            Assert.True(JToken.DeepEquals(jObject, cloned));
        }
        public async Task SetAsync_JObject_Updates_IfPropertyChanges()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            var mockTable  = new Mock <IMobileServiceTable>(MockBehavior.Strict);

            JObject original = new JObject();

            original["id"]   = "abc123";
            original["data"] = "hello";

            JObject updated = original.DeepClone() as JObject;

            original["data"] = "goodbye";

            mockTable
            .Setup(m => m.UpdateAsync(updated))
            .Returns(Task.FromResult <JToken>(null));

            mockClient
            .Setup(m => m.GetTable("TodoItem"))
            .Returns(mockTable.Object);

            var attribute = new MobileTableAttribute
            {
                TableName = "TodoItem"
            };

            var context = new MobileTableContext
            {
                Client            = mockClient.Object,
                ResolvedAttribute = attribute
            };

            // Act
            await MobileTableItemValueBinder <JObject> .SetValueInternalAsync(original, updated, context);

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        public async Task SetAsync_Poco_Updates_IfPropertyChanges()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            var mockTable  = new Mock <IMobileServiceTable <TodoItem> >(MockBehavior.Strict);

            TodoItem original = new TodoItem
            {
                Id   = "abc123",
                Text = "hello"
            };

            TodoItem updated = new TodoItem
            {
                Id   = "abc123",
                Text = "goodbye"
            };

            mockTable
            .Setup(m => m.UpdateAsync(updated))
            .Returns(Task.FromResult <TodoItem>(null));

            mockClient
            .Setup(m => m.GetTable <TodoItem>())
            .Returns(mockTable.Object);

            var context = new MobileTableContext
            {
                Client = mockClient.Object,
            };

            JObject clonedOrig = MobileTableItemValueBinder <object> .CloneItem(original);

            // Act
            await MobileTableItemValueBinder <TodoItem> .SetValueInternalAsync(clonedOrig, updated, context);

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        public void CloneItem_Poco_CorrectlySerializes()
        {
            // Arrange
            TodoItem todoItem = new TodoItem
            {
                Id            = "abc123",
                Text          = "hello",
                Complete      = false,
                CompletedDate = DateTimeOffset.Now
            };

            // Act
            JObject cloned = MobileTableItemValueBinder <object> .CloneItem(todoItem);

            TodoItem deserialized = cloned.ToObject <TodoItem>();

            // Assert
            Assert.Equal(todoItem.Id, deserialized.Id);
            Assert.Equal(todoItem.Text, deserialized.Text);
            Assert.Equal(todoItem.Complete, deserialized.Complete);
            Assert.Equal(todoItem.CompletedDate, deserialized.CompletedDate);
        }
コード例 #12
0
        public void GetValue_Poco_QueriesCorrectTable()
        {
            // Arrange
            var handler   = new TestHandler("{}");
            var attribute = new MobileTableAttribute
            {
                Id = "abc123"
            };
            var context = new MobileTableContext
            {
                Client            = new MobileServiceClient("https://someuri", handler),
                ResolvedAttribute = attribute
            };
            var binder = new MobileTableItemValueBinder <TodoItem>(context);

            // Act
            var value = binder.GetValue();

            // Assert
            Assert.NotNull(value);
            Assert.Equal("https://someuri/tables/TodoItem/abc123", handler.IssuedRequest.RequestUri.ToString());
        }