From e81559bef431e75a635698c072e355db9a670242 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Tue, 23 Sep 2025 10:53:19 -0400 Subject: [PATCH] Fix issue with default parent When an item wasn't in a semester, and it had no tag for a given section, the parent defaulted to 0, not the default parent ID in the config. Update tests to catch that, then update code to match the new behavior. --- actions/sequester/ImportIssues/Program.cs | 1 + .../Quest2GitHub.Tests/BuildExtendedPropertiesTests.cs | 10 +++++----- .../Quest2GitHub/Models/WorkItemProperties.cs | 3 ++- .../sequester/Quest2GitHub/Options/ImportOptions.cs | 5 +++++ actions/sequester/Quest2GitHub/QuestGitHubService.cs | 5 +++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/actions/sequester/ImportIssues/Program.cs b/actions/sequester/ImportIssues/Program.cs index 25a6aed4..23c2e73f 100644 --- a/actions/sequester/ImportIssues/Program.cs +++ b/actions/sequester/ImportIssues/Program.cs @@ -119,6 +119,7 @@ private static async Task CreateService(ImportOptions option options.ImportedLabel, options.UnlinkLabel, options.ParentNodes, + options.DefaultParentNode, options.WorkItemTags, options.TeamGitHubLogins, options.CopilotIssueTag); diff --git a/actions/sequester/Quest2GitHub.Tests/BuildExtendedPropertiesTests.cs b/actions/sequester/Quest2GitHub.Tests/BuildExtendedPropertiesTests.cs index 1c33fc78..4c4f4253 100644 --- a/actions/sequester/Quest2GitHub.Tests/BuildExtendedPropertiesTests.cs +++ b/actions/sequester/Quest2GitHub.Tests/BuildExtendedPropertiesTests.cs @@ -671,7 +671,7 @@ public static void BuildExtensionForOpenIssueSinglePastProject() Assert.Equal("Content\\Future", extendedProperties.IterationPath); Assert.Equal("New", extendedProperties.WorkItemState); Assert.Empty(extendedProperties.Tags); - Assert.Equal(0, extendedProperties.ParentNodeId); + Assert.Equal(33, extendedProperties.ParentNodeId); } [Fact] @@ -698,7 +698,7 @@ public static void BuildExtensionForOpenIssueMultiplePastProject() Assert.Equal("Content\\Future", extendedProperties.IterationPath); Assert.Equal("New", extendedProperties.WorkItemState); Assert.Equal(["content-curation"], extendedProperties.Tags); - Assert.Equal(0, extendedProperties.ParentNodeId); + Assert.Equal(33, extendedProperties.ParentNodeId); } [Fact] @@ -712,7 +712,7 @@ public static void BuildExtensionForNoProject() Assert.Equal("Content\\Future", extendedProperties.IterationPath); Assert.Equal("New", extendedProperties.WorkItemState); Assert.Empty(extendedProperties.Tags); - Assert.Equal(0, extendedProperties.ParentNodeId); + Assert.Equal(33, extendedProperties.ParentNodeId); } [Fact] @@ -726,7 +726,7 @@ public static void BuildExtensionForNoProjectClosed() Assert.Equal("Content\\Future", extendedProperties.IterationPath); Assert.Equal("Closed", extendedProperties.WorkItemState); Assert.Empty(extendedProperties.Tags); - Assert.Equal(0, extendedProperties.ParentNodeId); + Assert.Equal(33, extendedProperties.ParentNodeId); } private static WorkItemProperties CreateIssueObject(string jsonDocument) @@ -738,7 +738,7 @@ private static WorkItemProperties CreateIssueObject(string jsonDocument) issueNumber = 1111 }; JsonElement element = JsonDocument.Parse(jsonDocument).RootElement; - return new WorkItemProperties(QuestIssue.FromJsonElement(element, variables), _allIterations, _tagMap, _parentMap, "copilotTag"); + return new WorkItemProperties(QuestIssue.FromJsonElement(element, variables), _allIterations, _tagMap, _parentMap, _defaultParentId, "copilotTag"); } } diff --git a/actions/sequester/Quest2GitHub/Models/WorkItemProperties.cs b/actions/sequester/Quest2GitHub/Models/WorkItemProperties.cs index 8f37b828..a06184e4 100644 --- a/actions/sequester/Quest2GitHub/Models/WorkItemProperties.cs +++ b/actions/sequester/Quest2GitHub/Models/WorkItemProperties.cs @@ -22,6 +22,7 @@ public WorkItemProperties (QuestIssueOrPullRequest issue, IEnumerable iterations, IEnumerable tags, IEnumerable parentNodes, + int defaultParentNodeId, string copilotTag) { StoryPointSize? storySize = LatestStoryPointSize(issue); @@ -41,7 +42,7 @@ public WorkItemProperties (QuestIssueOrPullRequest issue, }; IterationPath = latestIteration.Path; - ParentNodeId = 0; + ParentNodeId = defaultParentNodeId; if (WorkItemState is not "New") { diff --git a/actions/sequester/Quest2GitHub/Options/ImportOptions.cs b/actions/sequester/Quest2GitHub/Options/ImportOptions.cs index ddc16cc3..d01331b7 100644 --- a/actions/sequester/Quest2GitHub/Options/ImportOptions.cs +++ b/actions/sequester/Quest2GitHub/Options/ImportOptions.cs @@ -72,6 +72,11 @@ public sealed record class ImportOptions /// public List ParentNodes { get; init; } = []; + /// + /// The default parent node ID to use when no other parent has been configured. + /// + public int DefaultParentNode { get; init; } = 0; + /// /// A map of GitHub labels to Azure DevOps tags. /// diff --git a/actions/sequester/Quest2GitHub/QuestGitHubService.cs b/actions/sequester/Quest2GitHub/QuestGitHubService.cs index 51e5e5a8..ebebc314 100644 --- a/actions/sequester/Quest2GitHub/QuestGitHubService.cs +++ b/actions/sequester/Quest2GitHub/QuestGitHubService.cs @@ -40,6 +40,7 @@ public class QuestGitHubService( string importedLabelText, string removeLinkItemText, List parentNodes, + int defaultParentNodeId, IEnumerable tagMap, IEnumerable gitHubLogins, string copilotTag) : IDisposable @@ -97,7 +98,7 @@ async Task ProcessItems(IAsyncEnumerable items) QuestWorkItem? questItem = (request || sequestered || vanquished) ? await FindLinkedWorkItemAsync(item) : null; - var issueProperties = new WorkItemProperties(item, _allIterations, tagMap, parentNodes, copilotTag); + var issueProperties = new WorkItemProperties(item, _allIterations, tagMap, parentNodes, defaultParentNodeId, copilotTag); Console.WriteLine($"{item.Number}: {item.Title}, {issueProperties.IssueLogString}"); Task workDone = (request, sequestered, vanquished, questItem) switch @@ -184,7 +185,7 @@ public async Task ProcessIssue(string gitHubOrganization, string gitHubRepositor ? await FindLinkedWorkItemAsync(ghIssue) : null; - var issueProperties = new WorkItemProperties(ghIssue, _allIterations, tagMap, parentNodes, copilotTag); + var issueProperties = new WorkItemProperties(ghIssue, _allIterations, tagMap, parentNodes, defaultParentNodeId, copilotTag); Task workDone = (request, sequestered, vanquished, questItem) switch {