public async Task AggregatesWorkitemsFromHierarchicalQuery() { var workitemLinks = new[] { new WorkItemLink(new WorkItemReference(1), new WorkItemReference(2), "forward"), new WorkItemLink(new WorkItemReference(1), new WorkItemReference(3), "forward"), new WorkItemLink(new WorkItemReference(2), new WorkItemReference(4), "forward"), new WorkItemLink(new WorkItemReference(5), new WorkItemReference(6), "forward"), }; var queryResult = new HierarchicalWorkItemsQueryResult { QueryType = "tree", WorkItemRelations = workitemLinks }; HttpClientMock.Setup(c => c.ExecuteGet <JObject>(It.IsAny <string>(), CancellationToken)) .ReturnsAsync(JObject.FromObject(queryResult)); var workitems = workitemLinks.SelectMany(l => new[] { l.Source, l.Target }) .Distinct() .Select(r => new WorkItem { Id = r.Id }); SetupGetCollectionOf <WorkItem>(url => url.Contains("$expand=All")) .ReturnsAsync(new CollectionResponse <WorkItem> { Value = workitems }); var result = await Client.GetWorkItemsAsync(Guid.NewGuid(), true, CancellationToken); result.Should().NotBeEmpty(); result.Should().BeEquivalentTo(workitems); HttpClientMock.VerifyAll(); }
private int[] GetWorkitemIdsFromQuery(HierarchicalWorkItemsQueryResult query) { var targetIds = query.WorkItemRelations.Select(w => w.Target.Id); var sourceIds = query.WorkItemRelations.Select(w => w.Source.Id); return sourceIds.Union(targetIds) .Distinct() .ToArray(); }
private async Task RunHierarchicalQuery(Func <Task <WorkItemsQueryResult> > queryExecutor, bool expand) { var workitems = new[] { new WorkItem { Id = 1 }, new WorkItem() { Id = 2 }, new WorkItem { Id = 3 } }; var workitemLinks = new[] { new WorkItemLink(new WorkItemReference(1), new WorkItemReference(2), "Parent"), new WorkItemLink(new WorkItemReference(2), new WorkItemReference(3), "Parent"), new WorkItemLink(new WorkItemReference(1), new WorkItemReference(3), "Related") }; var expectedQueryResult = new HierarchicalWorkItemsQueryResult { QueryType = QueryType.Tree, WorkItemRelations = workitemLinks, Columns = new[] { new ColumnReference("Id", "System.Id"), new ColumnReference("Title", "System.Title") }, SortColumns = new[] { new SortColumn { Field = new ColumnReference("Title", "System.Title") } } }; HttpClientMock.Setup(c => c.ExecutePost <JObject>(It.IsAny <string>(), It.IsAny <WorkItemsQuery>(), CancellationToken)) .ReturnsAsync(JObject.FromObject(expectedQueryResult)); HttpClientMock.Setup(c => c.ExecuteGet <JObject>(It.IsAny <string>(), CancellationToken)) .ReturnsAsync(JObject.FromObject(expectedQueryResult)); SetupGetCollectionOf <WorkItem>(url => GetWorkitemsUrlPredicate(url, expand)) .ReturnsAsync(new CollectionResponse <WorkItem> { Value = workitems }); var result = await queryExecutor(); result.Should().BeOfType <HierarchicalWorkItemsQueryResultWithWorkItems>(); var hierarchicalQueryResult = result.As <HierarchicalWorkItemsQueryResultWithWorkItems>(); hierarchicalQueryResult.WorkItems.Should().BeEquivalentTo(workitems); hierarchicalQueryResult.WorkItemRelations.Should().BeEquivalentTo(workitemLinks); hierarchicalQueryResult.QueryType.Should().Be(expectedQueryResult.QueryType); hierarchicalQueryResult.Columns.Should().BeEquivalentTo(expectedQueryResult.Columns); hierarchicalQueryResult.SortColumns.Should().BeEquivalentTo(expectedQueryResult.SortColumns); }
public async Task GetWorkItemsShouldComposeCorrectUrlForTreeQueries() { var query = WorkItemsQuery.Get("Dummy query", isHierarchical: true); var queryResult = new HierarchicalWorkItemsQueryResult { Columns = new[] { new ColumnReference("Id", "System.Id"), new ColumnReference("Title", "System.Title") }, WorkItemRelations = new[] { new WorkItemLink(new WorkItemReference(2), new WorkItemReference(34), "foo"), new WorkItemLink(new WorkItemReference(2), new WorkItemReference(2), "foo"), new WorkItemLink(new WorkItemReference(2), new WorkItemReference(56), "foo") } }; var fields = queryResult.Columns.Select(c => c.ReferenceName); var ids = queryResult.WorkItemRelations.Select(w => w.Source.Id) .Union(queryResult.WorkItemRelations.Select(w => w.Target.Id)) .Distinct() .ToArray(); var workItems = ids.Select(i => new WorkItem { Id = i }); HttpClientMock.Setup(c => c.ExecutePost <HierarchicalWorkItemsQueryResult>(It.IsAny <string>(), It.Is <WorkItemsQuery>(q => q.IsHierarchical), CancellationToken)) .ReturnsAsync(queryResult) .Verifiable(); HttpClientMock.Setup(c => c.ExecuteGet <CollectionResponse <WorkItem> >(It.Is <string>(u => VerifyWorkItemsUrl(u, fields, ids)), CancellationToken)) .ReturnsAsync(new CollectionResponse <WorkItem> { Value = workItems }) .Verifiable(); var result = await Client.GetWorkItemsAsync(query, false, CancellationToken); result.Should().HaveCount(workItems.Count()); result.Should().BeEquivalentTo(workItems); HttpClientMock.Verify(); }