public void WhenParametersAreNotSpecified_BindModel_SetsDefaultPropertyValues()
        {
            // Arrange.
            var binder = new SearchParametersBinder();

            // Act.
            Assert.IsTrue(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            var model = _bindingContext.Model as SearchParameters;

            Assert.IsNotNull(model);
            Assert.AreEqual(ProcessName, model.ProcessName);
            Assert.IsFalse(model.IncludeProcessMetadata);
            Assert.IsFalse(model.IncludeLayoutMetadata);
            Assert.IsNull(model.PageNumber);
            Assert.IsNull(model.PageSize);
            Assert.IsNull(model.SearchText);
            Assert.IsNull(model.LayoutId);
            Assert.IsNull(model.FilterId);
            Assert.IsTrue(model.ApplyDefaultFilter);
            Assert.AreEqual(0, model.FilterParameters.Count);
            Assert.AreEqual(0, model.SortDescriptors.Count);
            Assert.IsTrue(model.ApplyLayoutSortDescriptors);
            Assert.IsNull(model.Expand);
            Assert.IsNull(model.Join);
            Assert.IsNull(model.Filter);
        }
        public void WhenParametersAreSpecified_BindModel_SetsPropertyValues()
        {
            // Arrange.
            const string SearchText = "Text to search";
            const int LayoutId = 1001;
            const int FilterId = 2001;
            const string Expand = "Test expand";
            const string Join = "Test join";
            const string Filter = "Test filter";

            SetupValue("includeProcessMetadata", true);
            SetupValue("includeLayoutMetadata", true);
            SetupValue("page", 2);
            SetupValue("pageSize", 100);
            SetupValue("searchText", SearchText);
            SetupValue("layoutId", LayoutId);
            SetupValue("filterId", FilterId);

            var filterParameters = new List<object> { "test", 123, new DateTime(2015, 5, 18) };
            SetupValue("filterParameters", JsonConvert.SerializeObject(filterParameters));

            var sortDescriptors = new[] { new { Name = "Field1", Direction = "Descending" }, new { Name = "Field2", Direction = "Ascending" } };
            SetupValue("sortFields", JsonConvert.SerializeObject(sortDescriptors));

            SetupValue("$expand", Expand);
            SetupValue("$join", Join);
            SetupValue("$filter", Filter);

            var binder = new SearchParametersBinder();

            // Act.
            Assert.IsTrue(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            var model = _bindingContext.Model as SearchParameters;

            Assert.IsNotNull(model);
            Assert.AreEqual(true, model.IncludeProcessMetadata);
            Assert.AreEqual(true, model.IncludeLayoutMetadata);
            Assert.AreEqual(2, model.PageNumber);
            Assert.AreEqual(100, model.PageSize);
            Assert.AreEqual(SearchText, model.SearchText);
            Assert.AreEqual(LayoutId, model.LayoutId);
            Assert.AreEqual(FilterId, model.FilterId);
            Assert.IsFalse(model.ApplyDefaultFilter);

            Assert.AreEqual(3, model.FilterParameters.Count);
            Assert.AreEqual("test", model.FilterParameters[0]);
            Assert.AreEqual(123L, model.FilterParameters[1]);
            Assert.AreEqual(new DateTime(2015, 5, 18), model.FilterParameters[2]);

            Assert.AreEqual(2, model.SortDescriptors.Count);
            Assert.AreEqual("Field1", model.SortDescriptors[0].ColumnName);
            Assert.AreEqual(SortDirection.Descending, model.SortDescriptors[0].Direction);
            Assert.AreEqual("Field2", model.SortDescriptors[1].ColumnName);
            Assert.AreEqual(SortDirection.Ascending, model.SortDescriptors[1].Direction);
            Assert.IsFalse(model.ApplyLayoutSortDescriptors);

            Assert.AreEqual(Expand, model.Expand);
            Assert.AreEqual(Join, model.Join);
            Assert.AreEqual(Filter, model.Filter);
        }
        public void WhenFilterIdIsNull_BindModel_DisablesDefaultFilter()
        {
            // Arrange.
            var binder = new SearchParametersBinder();
            SetupValue("filterId", "null");

            // Act.
            Assert.IsTrue(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            var model = _bindingContext.Model as SearchParameters;
            Assert.IsNotNull(model);

            Assert.IsNull(model.FilterId);
            Assert.IsFalse(model.ApplyDefaultFilter);
        }
        public void WhenFilterParametersDeserializationFails_BindModel_SetsModelError()
        {
            // Arrange.
            var binder = new SearchParametersBinder();
            SetupValue("filterParameters", "not json");

            // Act.
            Assert.IsFalse(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            Assert.IsNull(_bindingContext.Model);
            Assert.IsFalse(_bindingContext.ModelState.IsValid);
            Assert.IsTrue(_bindingContext.ModelState.ContainsKey("filterParameters"));
        }
        public void WhenPageSizeIsOutOfRange_BindModel_SetsModelError()
        {
            // Arrange.
            var binder = new SearchParametersBinder();
            SetupValue("pageSize", 0);

            // Act.
            Assert.IsFalse(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            Assert.IsNull(_bindingContext.Model);
            Assert.IsFalse(_bindingContext.ModelState.IsValid);
            Assert.IsTrue(_bindingContext.ModelState.ContainsKey("pageSize"));
        }
        public void WhenParameterConversionFails_BindModel_SetsModelError()
        {
            // Arrange.
            var binder = new SearchParametersBinder();
            SetupValue("page", "not a number");

            // Act.
            Assert.IsFalse(binder.BindModel(_actionContext, _bindingContext));

            // Assert.
            Assert.IsNull(_bindingContext.Model);
            Assert.IsFalse(_bindingContext.ModelState.IsValid);
            Assert.IsTrue(_bindingContext.ModelState.ContainsKey("page"));
        }