예제 #1
0
        public async Task AddAsync_Object_InsertsItem()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            var mockTable  = new Mock <IMobileServiceTable>(MockBehavior.Strict);
            var item       = new { id = "abc123", text = "123abc" };

            mockTable
            .Setup(m => m.InsertAsync(It.Is <JObject>(j => j["id"].ToString() == "abc123" && j["text"].ToString() == "123abc")))
            .Returns(Task.FromResult(JToken.Parse("{}")));

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

            var context = new EasyTableContext
            {
                ResolvedTableName = "Item",
                Client            = mockClient.Object,
            };

            IAsyncCollector <object> collector = new EasyTableAsyncCollector <object>(context);

            // Act
            await collector.AddAsync(item);

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        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 EasyTableContext
            {
                Client = mockClient.Object,
            };

            var originalJson = JObject.FromObject(original);

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

            // Assert
            Assert.Equal("Cannot update the 'Id' property.", ex.Message);
            mockClient.Verify();
        }
예제 #3
0
        public void ResolveId_CreatesExpectedString(string token, string expected)
        {
            // Arrange
            ParameterInfo parameter = EasyTableTestHelper.GetValidInputItemParameters().First();

            var easyTableContext = new EasyTableContext()
            {
                ResolvedId = token
            };

            var bindingContract = new Dictionary <string, Type>();

            bindingContract.Add("MyItemId", typeof(string));

            var bindingProviderContext = new BindingProviderContext(parameter, bindingContract, CancellationToken.None);

            var binding = new EasyTableItemBinding(parameter, easyTableContext, bindingProviderContext);

            var bindingData = new Dictionary <string, object>();

            bindingData.Add("MyItemId", "abc123");

            // Act
            var resolved = binding.ResolveId(bindingData);

            // Assert
            Assert.Equal(expected, resolved);
        }
        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 context = new EasyTableContext
            {
                Client            = mockClient.Object,
                ResolvedTableName = "TodoItem"
            };

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

            // Assert
            Assert.Equal("Cannot update the 'Id' property.", ex.Message);
            mockClient.Verify();
        }
예제 #5
0
        public async Task AddAsync_JObject_InsertsItem()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            var mockTable  = new Mock <IMobileServiceTable>(MockBehavior.Strict);
            var item       = new JObject();

            mockTable
            .Setup(m => m.InsertAsync(item))
            .Returns(Task.FromResult(item as JToken));

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

            var context = new EasyTableContext
            {
                Client            = mockClient.Object,
                ResolvedTableName = "TodoItem"
            };

            IAsyncCollector <JObject> collector = new EasyTableAsyncCollector <JObject>(context);

            // Act
            await collector.AddAsync(item);

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        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 EasyTableContext
            {
                Client = mockClient.Object,
            };

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

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

            // Assert

            // nothing on the client should be called
            mockClient.VerifyAll();
        }
예제 #7
0
        public async Task AddAsync_Poco_InsertsItem()
        {
            // Arrange
            var mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            var mockTable  = new Mock <IMobileServiceTable <TodoItem> >(MockBehavior.Strict);
            var item       = new TodoItem();

            mockTable
            .Setup(m => m.InsertAsync(item))
            .Returns(Task.FromResult(item));

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

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

            IAsyncCollector <TodoItem> collector = new EasyTableAsyncCollector <TodoItem>(context);

            // Act
            await collector.AddAsync(item);

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
예제 #8
0
        private static IAsyncCollector <T> CreateCollector <T>(HttpMessageHandler handler, string tableName)
        {
            var context = new EasyTableContext
            {
                ResolvedTableName = tableName,
                Client            = new MobileServiceClient("https://someuri", handler)
            };

            return(new EasyTableAsyncCollector <T>(context));
        }
예제 #9
0
        public async Task BindAsync_Returns_CorrectValueProvider(ParameterInfo parameter, Type expectedType)
        {
            // Arrange
            var easyTableContext = new EasyTableContext();
            var binding          = new EasyTableTableBinding(parameter, easyTableContext);

            // Act
            var valueProvider = await binding.BindAsync(null, null);

            // Assert
            Assert.Equal(expectedType, valueProvider.GetType());
        }
예제 #10
0
        public async Task BindAsync_Returns_CorrectValueProvider(ParameterInfo parameter, Type expectedType)
        {
            // Arrange
            var easyTableContext       = new EasyTableContext();
            var bindingProviderContext = new BindingProviderContext(parameter, null, CancellationToken.None);
            var binding = new EasyTableItemBinding(parameter, easyTableContext, bindingProviderContext);

            // Act
            var valueProvider = await binding.BindAsync("abc123", null);

            // Assert
            Assert.Equal(expectedType, valueProvider.GetType());
        }
예제 #11
0
        [InlineData(typeof(IMobileServiceTable <object>), "Item", false)] // object only works for output binding
        public void IsMobileServiceTableType_CorrectlyValidates(Type tableType, string tableName, bool expected)
        {
            // Arrange
            var context = new EasyTableContext {
                ResolvedTableName = tableName
            };

            // Act
            bool result = EasyTableTableBinding.IsMobileServiceTableType(tableType, context);

            // Assert
            Assert.Equal(expected, result);
        }
예제 #12
0
        [InlineData(typeof(IMobileServiceTable <object>), "Item", false)] // object only works for output binding
        public void IsValidQueryType_ValidatesCorrectly(Type parameterType, string tableName, bool expected)
        {
            // Arrange
            var context = new EasyTableContext {
                ResolvedTableName = tableName
            };

            // Act
            bool result = EasyTableQueryBinding.IsValidQueryType(parameterType, context);

            // Assert
            Assert.Equal(expected, result);
        }
        public void IsValidEasyTableType_CorrectlyEvaluates(Type typeToEvaluate, string tableName, bool expected)
        {
            // Arrange
            var context = new EasyTableContext {
                ResolvedTableName = tableName
            };

            // Act
            bool result = EasyTableUtility.IsValidItemType(typeToEvaluate, context);

            // Assert
            Assert.Equal(expected, result);
        }
        public void GetValue_ReturnsCorrectType()
        {
            var parameter = EasyTableTestHelper.GetValidInputQueryParameters().Single();
            var context = new EasyTableContext()
            {
                Client = new MobileServiceClient("http://someuri")
            };
            var provider = new EasyTableQueryValueProvider<TodoItem>(parameter, context);

            var value = provider.GetValue();

            Assert.True(typeof(IMobileServiceTableQuery<TodoItem>).IsAssignableFrom(value.GetType()));
        }
예제 #15
0
        public async Task BindAsync_Returns_CorrectValueProvider()
        {
            // Arrange
            var parameter        = EasyTableTestHelper.GetValidInputQueryParameters().Single();
            var expectedType     = typeof(EasyTableQueryValueProvider <TodoItem>);
            var easyTableContext = new EasyTableContext();
            var binding          = new EasyTableQueryBinding(parameter, easyTableContext);

            // Act
            var valueProvider = await binding.BindAsync(null, null);

            // Assert
            Assert.Equal(expectedType, valueProvider.GetType());
        }
        public void IsValidCollectorType_ValidatesCorrectly(Type parameterType, string tableName, bool isOutParameter, bool expected)
        {
            // Arrange
            Type typeToTest = isOutParameter ? parameterType.MakeByRefType() : parameterType;
            var  context    = new EasyTableContext {
                ResolvedTableName = tableName
            };

            // Act
            bool result = EasyTableOutputBindingProvider.IsValidCollectorType(typeToTest, context);

            // Assert
            Assert.Equal(expected, result);
        }
        public void GetValue_WithTableName_ReturnsCorrectType()
        {
            var parameter = EasyTableTestHelper.GetValidInputQueryParameters().Single();
            var context = new EasyTableContext()
            {
                Client = new MobileServiceClient("http://someuri"),
                ResolvedTableName = "SomeOtherTable"
            };
            var provider = new EasyTableQueryValueProvider<TodoItem>(parameter, context);

            var value = provider.GetValue() as IMobileServiceTableQuery<TodoItem>;

            Assert.NotNull(value);
            Assert.Equal("SomeOtherTable", value.Table.TableName);
        }
        private static IValueBinder CreatePocoBinder(ParameterInfo parameter, out Mock <IMobileServiceClient> mockClient, out Mock <IMobileServiceTable <TodoItem> > mockTable)
        {
            mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            mockTable  = new Mock <IMobileServiceTable <TodoItem> >(MockBehavior.Strict);

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

            var context = new EasyTableContext
            {
                Client = mockClient.Object
            };

            return(new EasyTableItemValueBinder <TodoItem>(parameter, context, "abc123"));
        }
        private static IValueBinder CreateJObjectBinder(ParameterInfo parameter, out Mock <IMobileServiceClient> mockClient, out Mock <IMobileServiceTable> mockTable)
        {
            mockClient = new Mock <IMobileServiceClient>(MockBehavior.Strict);
            mockTable  = new Mock <IMobileServiceTable>(MockBehavior.Strict);

            mockClient
            .Setup(m => m.GetTable(It.IsAny <string>()))
            .Returns(mockTable.Object);

            var context = new EasyTableContext
            {
                Client            = mockClient.Object,
                ResolvedTableName = "TodoItem"
            };

            return(new EasyTableItemValueBinder <JObject>(parameter, context, "abc123"));
        }
        public void GetValue_Poco_QueriesCorrectTable()
        {
            // Arrange
            var handler = new TestHandler("{}");
            var context = new EasyTableContext
            {
                Client = new MobileServiceClient("https://someuri", handler)
            };
            var parameter = EasyTableTestHelper.GetInputParameter <TodoItem>();
            var binder    = new EasyTableItemValueBinder <TodoItem>(parameter, context, "abc123");

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

            // Assert
            Assert.NotNull(value);
            Assert.Equal("https://someuri/tables/TodoItem/abc123", handler.IssuedRequest.RequestUri.ToString());
        }
        public async Task SetValue_Poco_UpdatesCorrectTable()
        {
            // Arrange
            var handler = new TestHandler("{}");
            var context = new EasyTableContext
            {
                Client = new MobileServiceClient("https://someuri", handler)
            };
            var original = JObject.Parse("{'Id':'abc123'}");
            var updated  = new TodoItem {
                Id = "abc123", Text = "updated"
            };

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

            // Assert
            Assert.Equal("https://someuri/tables/TodoItem/abc123", handler.IssuedRequest.RequestUri.ToString());
        }
        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 EasyTableContext
            {
                Client = mockClient.Object,
            };

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

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

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        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 context = new EasyTableContext
            {
                Client            = mockClient.Object,
                ResolvedTableName = "TodoItem"
            };

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

            // Assert
            mockClient.VerifyAll();
            mockTable.VerifyAll();
        }
        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 context = new EasyTableContext
            {
                Client            = mockClient.Object,
                ResolvedTableName = "TodoItem"
            };

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

            // Assert
            mockClient.VerifyAll();
        }