public void Verify_Search_WithPaging_Should_ReturnAListOfIssuesWithDataMatchingSearchParameters()
        {
            // Arrange
            Mock <IDbSet <Issue> > mockSetIssues;
            var mockContext = IssuesMockingSetup.DoMockingSetupForContext(true, out mockSetIssues);
            var repository  = new IssuesRepository(mockContext.Object);
            var searchModel = new IssueSearchModel {
                Paging = new Paging {
                    Skip = 1, Take = 1
                }
            };
            // Act
            var issues = repository.Search(searchModel /*.Object*/).ToArray();

            // Assert
            Assert.Equal(1, issues.Length);
            Assert.Equal(2, issues[0].Id);
            Assert.Equal("/TEST/NIVEN-LARRY", issues[0].ApiDetailUrl);
            // Stephen King was filtered out because he was Skipped
        }
        public void Verify_Search_WithModifiedSince_Should_ReturnAListOfIssuesWithDataMatchingSearchParameters()
        {
            // Arrange
            Mock <IDbSet <Issue> > mockSetIssues;
            var mockContext = IssuesMockingSetup.DoMockingSetupForContext(true, out mockSetIssues, true);
            var repository  = new IssuesRepository(mockContext.Object);
            var createDate  = new System.DateTime(2015, 05, 28, 10, 45, 00).AddDays(1).AddMinutes(-1);
            //var searchModel = new Mock<IIssueSearchModel>();
            //searchModel.Setup(m => m.ModifiedSince).Returns(() => createDate);
            var searchModel = new IssueSearchModel {
                ModifiedSince = createDate
            };
            // Act
            var issues = repository.Search(searchModel /*.Object*/).ToArray();

            // Assert
            Assert.Equal(1, issues.Length);
            Assert.Equal(2, issues[0].Id);
            Assert.Equal("/TEST/NIVEN-LARRY", issues[0].ApiDetailUrl);
            // Stephen King was filtered out because he was created before the modified since date
        }
 public void Verify_Search_WithPaging_Should_ReturnAListOfIssuesWithDataMatchingSearchParameters()
 {
     // Arrange
     Mock<IDbSet<Issue>> mockSetIssues;
     var mockContext = IssuesMockingSetup.DoMockingSetupForContext(true, out mockSetIssues);
     var repository = new IssuesRepository(mockContext.Object);
     var searchModel = new IssueSearchModel { Paging = new Paging { Skip = 1, Take = 1 } };
     // Act
     var issues = repository.Search(searchModel/*.Object*/).ToArray();
     // Assert
     Assert.Equal(1, issues.Length);
     Assert.Equal(2, issues[0].Id);
     Assert.Equal("/TEST/NIVEN-LARRY", issues[0].ApiDetailUrl);
     // Stephen King was filtered out because he was Skipped
 }
 public void Verify_Search_WithModifiedSince_Should_ReturnAListOfIssuesWithDataMatchingSearchParameters()
 {
     // Arrange
     Mock<IDbSet<Issue>> mockSetIssues;
     var mockContext = IssuesMockingSetup.DoMockingSetupForContext(true, out mockSetIssues, true);
     var repository = new IssuesRepository(mockContext.Object);
     var createDate = new System.DateTime(2015, 05, 28, 10, 45, 00).AddDays(1).AddMinutes(-1);
     //var searchModel = new Mock<IIssueSearchModel>();
     //searchModel.Setup(m => m.ModifiedSince).Returns(() => createDate);
     var searchModel = new IssueSearchModel { ModifiedSince = createDate };
     // Act
     var issues = repository.Search(searchModel/*.Object*/).ToArray();
     // Assert
     Assert.Equal(1, issues.Length);
     Assert.Equal(2, issues[0].Id);
     Assert.Equal("/TEST/NIVEN-LARRY", issues[0].ApiDetailUrl);
     // Stephen King was filtered out because he was created before the modified since date
 }
Beispiel #5
0
        public async Task <IActionResult> Search([FromQuery] string q = "watched:yes")
        {
            if (q == null)
            {
                q = "";
            }
            IssueSearchModel model = new IssueSearchModel();

            model.SearchString = q;
            IQueryable <Issue> searchQuery = Db.Issues
                                             .Include(x => x.Assignee)
                                             .Include(x => x.Project);
            bool orderDescending = true;

            foreach (string sub in q.Split(' ', StringSplitOptions.RemoveEmptyEntries))
            {
                if (sub.StartsWith("#"))
                {
                    string tagName = sub.Substring(1);
                    searchQuery = searchQuery.Where(x => x.Tags.Contains(tagName, StringComparison.InvariantCultureIgnoreCase));
                }
                else if (sub.StartsWith("!#"))
                {
                    string tagName = sub.Substring(2);
                    searchQuery = searchQuery.Where(x => !x.Tags.Contains(tagName, StringComparison.InvariantCultureIgnoreCase));
                }
                else if (sub.StartsWith("status:"))
                {
                    IssueStatus status;
                    if (!Enum.TryParse(sub.Substring("status:".Length), true, out status))
                    {
                        continue;
                    }
                    searchQuery = searchQuery.Where(x => x.Status == status);
                }
                else if (sub.StartsWith("!status:"))
                {
                    IssueStatus status;
                    if (!Enum.TryParse(sub.Substring("!status:".Length), true, out status))
                    {
                        continue;
                    }
                    searchQuery = searchQuery.Where(x => x.Status != status);
                }
                else if (sub.StartsWith("project:"))
                {
                    string projectId = sub.Substring("project:".Length);
                    searchQuery = searchQuery.Where(x => x.Project.ShortProjectId == projectId);
                }
                else if (sub.StartsWith("!project:"))
                {
                    string projectId = sub.Substring("!project:".Length);
                    searchQuery = searchQuery.Where(x => x.Project.ShortProjectId != projectId);
                }
                else if (sub.StartsWith("assignee:"))
                {
                    string assigneeName = sub.Substring("assignee:".Length);
                    if (assigneeName == "me")
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee != null && x.Assignee.Id == HttpContext.User.GetUserId());
                    }
                    else if (assigneeName == "none")
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee == null);
                    }
                    else
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee != null && x.Assignee.Username == assigneeName);
                    }
                }
                else if (sub.StartsWith("!assignee:"))
                {
                    string assigneeName = sub.Substring("!assignee:".Length);
                    if (assigneeName == "me")
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee == null || x.Assignee.Id != HttpContext.User.GetUserId());
                    }
                    else if (assigneeName == "none")
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee != null);
                    }
                    else
                    {
                        searchQuery = searchQuery.Where(x => x.Assignee == null || x.Assignee.Username != assigneeName);
                    }
                }
                else if (sub.StartsWith("author:"))
                {
                    string authorName = sub.Substring("author:".Length);
                    if (authorName == "me")
                    {
                        searchQuery = searchQuery.Where(x => x.Author.Id == HttpContext.User.GetUserId());
                    }
                    else
                    {
                        searchQuery = searchQuery.Where(x => x.Author.Username == authorName);
                    }
                }
                else if (sub.StartsWith("!author:"))
                {
                    string authorName = sub.Substring("!author:".Length);
                    if (authorName == "me")
                    {
                        searchQuery = searchQuery.Where(x => x.Author.Id != HttpContext.User.GetUserId());
                    }
                    else
                    {
                        searchQuery = searchQuery.Where(x => x.Author.Username != authorName);
                    }
                }
                else if (sub.StartsWith("watched:"))
                {
                    int  userId  = HttpContext.User.GetUserId();
                    bool watched = sub.Substring("watched:".Length) == "yes";
                    searchQuery = searchQuery.Where(x =>
                                                    watched == (x.AssigneeId == userId || x.Watchers.Any(w => w.WatcherId == userId)));
                }
                else if (sub.StartsWith("order:"))
                {
                    string order = sub.Substring("order:".Length);
                    if (Regex.IsMatch(order, ".*asc.*"))
                    {
                        orderDescending = false;
                    }
                }
                else if (sub.StartsWith("!"))
                {
                    searchQuery = searchQuery.Where(x => !x.Name.Contains(sub.Substring(1), StringComparison.InvariantCultureIgnoreCase));
                }
                else
                {
                    searchQuery = searchQuery.Where(x => x.Name.Contains(sub, StringComparison.InvariantCultureIgnoreCase));
                }
            }
            if (orderDescending)
            {
                searchQuery = searchQuery.OrderByDescending(x => x.Id);
            }
            else
            {
                searchQuery = searchQuery.OrderBy(x => x.Id);
            }

            model.FoundIssues = await searchQuery
                                .ToArrayAsync();

            return(View(model));
        }