public async Task GroupSearch_Index_SearchByIdRedirectsToDetailPage()
        {
            var grs     = new Mock <IGroupReadService>(MockBehavior.Strict);
            var gds     = new Mock <IGroupDownloadService>();
            var cls     = new Mock <ICachedLookupService>();
            var request = new Mock <HttpRequestBase>();
            var context = new Mock <HttpContextBase>();

            var principal = new GenericPrincipal(new GenericIdentity("bob"), new[] { "superhuman" });

            request.SetupGet(x => x.QueryString).Returns(HttpUtility.ParseQueryString(string.Empty));
            context.SetupGet(x => x.Request).Returns(request.Object);
            context.SetupGet(x => x.User).Returns(principal);

            grs.Setup(x => x.SearchByIdsAsync(It.IsAny <string>(), It.Is <int?>(i => i == 1000), It.IsAny <string>(), It.IsAny <int?>(), It.Is <IPrincipal>(p => p == principal))).ReturnsAsync(() => new ApiPagedResult <SearchGroupDocument>(1, new List <SearchGroupDocument>()
            {
                new SearchGroupDocument {
                    Name = "Group 1000", GroupUId = 1000
                }
            }));

            var subject = new GroupSearchController(grs.Object, gds.Object, cls.Object);

            subject.ControllerContext = new ControllerContext(context.Object, new RouteData(), subject);

            var vm = new GroupSearchViewModel();

            vm.GroupSearchModel.Text = "1000";
            var result = (RedirectToRouteResult)await subject.Index(vm);

            Assert.That(result.RouteValues["action"], Is.EqualTo("Details"));
            Assert.That(result.RouteValues["controller"], Is.EqualTo("Group"));
            Assert.That(result.RouteValues["id"], Is.EqualTo(1000));
            Assert.That(result.RouteValues["area"], Is.EqualTo("Groups"));
        }
        public async Task <ActionResult> ResultsPartial(GroupSearchViewModel model)
        {
            var result = await SearchGroups(model);

            HttpContext.Response.Headers.Add("x-count", model.Count.ToString());
            return(PartialView("Partials/_GroupSearchResults", model));
        }
        public async Task GroupSearch_Index_ReturnsAllGroupsByDefault()
        {
            var grs     = new Mock <IGroupReadService>();
            var gds     = new Mock <IGroupDownloadService>();
            var cls     = new Mock <ICachedLookupService>();
            var request = new Mock <HttpRequestBase>();
            var context = new Mock <HttpContextBase>();

            request.SetupGet(x => x.QueryString).Returns(HttpUtility.ParseQueryString(string.Empty));
            context.SetupGet(x => x.Request).Returns(request.Object);
            context.SetupGet(x => x.User).Returns(new GenericPrincipal(new GenericIdentity("bob"), new[] { "superhuman" }));

            grs.Setup(x => x.SearchAsync(It.IsAny <GroupSearchPayload>(), It.IsAny <IPrincipal>())).ReturnsAsync(() => new ApiPagedResult <SearchGroupDocument>(2, new List <SearchGroupDocument>()
            {
                new SearchGroupDocument {
                    Name = "Group 1"
                },
                new SearchGroupDocument {
                    Name = "Group 2"
                }
            }));

            var subject = new GroupSearchController(grs.Object, gds.Object, cls.Object);

            subject.ControllerContext = new ControllerContext(context.Object, new RouteData(), subject);

            var vm     = new GroupSearchViewModel();
            var result = (ViewResult)await subject.Index(vm);

            Assert.That(result.ViewName, Is.EqualTo("GroupResults"));
        }
 private GroupSearchPayload CreateSearchPayload(GroupSearchViewModel model) => new GroupSearchPayload(model.StartIndex, model.PageSize)
 {
     Text           = model.GroupSearchModel.Text.Clean(),
     GroupTypeIds   = model.SelectedGroupTypeIds.ToArray(),
     GroupStatusIds = (User.Identity.IsAuthenticated) ? model.SelectedGroupStatusIds.ToArray() : null,
     SortBy         = model.SortOption
 };
        private async Task <ActionResult> SearchGroups(GroupSearchViewModel model)
        {
            if (model.SearchType == eSearchType.Group &&
                model.GroupSearchModel.Text.IsNullOrEmpty())
            {
                return(RedirectToSearchPage(model));
            }

            if (model.GroupSearchModel.AutoSuggestValueAsInt.HasValue)
            {
                return(RedirectToDetailPage(model.GroupSearchModel.AutoSuggestValueAsInt.Value));
            }
            else
            {
                model.SearchQueryString = Request.QueryString.ToString();
                var text = model.GroupSearchModel.Text.Clean();
                model.GroupTypes    = (await _lookupService.GroupTypesGetAllAsync()).Select(x => new LookupItemViewModel(x)).ToList();
                model.GroupStatuses = (await _lookupService.GroupStatusesGetAllAsync()).Select(x => new LookupItemViewModel(x)).ToList();

                ApiPagedResult <SearchGroupDocument> results = null;
                if (text != null)
                {
                    results = await _groupReadService.SearchByIdsAsync(text, text.ToInteger(), text, text.ToInteger(), User);
                }

                if (results != null && results.Count > 0)
                {
                    model.Results.Add(results.Items[0]);
                    model.Count = 1;
                }
                else
                {
                    var payload = CreateSearchPayload(model);
                    results = await _groupReadService.SearchAsync(payload, User);

                    model.Results = results.Items;
                    if (model.StartIndex == 0)
                    {
                        model.Count = results.Count;
                    }
                }

                if (model.Count == 1)
                {
                    return(RedirectToDetailPage(model.Results.Single().GroupUId));
                }
                if (model.Count == 0)
                {
                    return(RedirectToSearchPage(model));
                }

                return(View("GroupResults", model));
            }
        }
        private ActionResult RedirectToSearchPage(GroupSearchViewModel model)
        {
            var routeDictionary = new RouteValueDictionary
            {
                { "action", "Index" },
                { "controller", "Search" },
                { "area", string.Empty },
                { "SelectedTab", SearchViewModel.Tab.Groups },
                { "SearchType", model.SearchType },
                { "GroupSearchModel.Text", model.GroupSearchModel.Text },
                { "NoResults", "True" }
            };

            return(new RedirectResult(Url.RouteUrl(routeDictionary)));
        }
        public async Task GroupSearch_Index_AutosuggestRedirectsToDetailPage()
        {
            var grs     = new Mock <IGroupReadService>(MockBehavior.Strict);
            var gds     = new Mock <IGroupDownloadService>(MockBehavior.Strict);
            var cls     = new Mock <ICachedLookupService>(MockBehavior.Strict);
            var request = new Mock <HttpRequestBase>(MockBehavior.Strict);
            var context = new Mock <HttpContextBase>(MockBehavior.Strict);

            var subject = new GroupSearchController(grs.Object, gds.Object, cls.Object);

            var vm = new GroupSearchViewModel();

            vm.GroupSearchModel.AutoSuggestValue = "1000";
            var result = (RedirectToRouteResult)await subject.Index(vm);

            Assert.That(result.RouteValues["action"], Is.EqualTo("Details"));
            Assert.That(result.RouteValues["controller"], Is.EqualTo("Group"));
            Assert.That(result.RouteValues["id"], Is.EqualTo(1000));
            Assert.That(result.RouteValues["area"], Is.EqualTo("Groups"));
        }
 public async Task <ActionResult> Index(GroupSearchViewModel model) => await SearchGroups(model);