From d5c4d6a7cfc145ebeb17f376453a4ffe206e65b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 12:22:38 +0100 Subject: [PATCH 01/10] feat(New-ProjectIssue): update parameter attributes for RepoOwner and RepoName --- public/issues/New-ProjectIssue.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/issues/New-ProjectIssue.ps1 b/public/issues/New-ProjectIssue.ps1 index 520caf7..0188de2 100644 --- a/public/issues/New-ProjectIssue.ps1 +++ b/public/issues/New-ProjectIssue.ps1 @@ -50,8 +50,8 @@ function New-ProjectIssue { #ProjectOwner [Parameter()][string]$ProjectOwner, [Parameter()][string]$ProjectNumber, - [Parameter(Mandatory, Position = 1)][string]$RepoOwner, - [Parameter(Mandatory, Position = 2)][string]$RepoName, + [Parameter(Mandatory,ValueFromPipelineByPropertyName, Position = 1)][Alias("Owner")][string]$RepoOwner, + [Parameter(Mandatory,ValueFromPipelineByPropertyName, Position = 2)][string]$RepoName, [Parameter(Mandatory, Position = 3)][string]$Title, [Parameter(Position = 4)][string]$Body, [Parameter()][switch]$OpenOnCreation From 290e0a8d7e285af1d209bc5263a63c77680d0f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 15:29:04 +0100 Subject: [PATCH 02/10] feat(project): add Update-ProjectItem function for item updates --- public/items/project_item.ps1 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/public/items/project_item.ps1 b/public/items/project_item.ps1 index 0ec8aac..b095397 100644 --- a/public/items/project_item.ps1 +++ b/public/items/project_item.ps1 @@ -49,6 +49,23 @@ function Get-ProjectItem { } Export-ModuleMember -Function Get-ProjectItem -Alias "gpi" +function Update-ProjectItem { + [CmdletBinding()] + [Alias ("upi")] + param( + [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0)][Alias("id")][string]$ItemId, + [Parameter()][string]$Owner, + [Parameter()][string]$ProjectNumber + ) + + process{ + $item = Get-ProjectItem -ItemId $ItemId -Owner $Owner -ProjectNumber $ProjectNumber -Force + + return $item.id + } + +} Export-ModuleMember -Function Update-ProjectItem -Alias "upi" + function Get-ProjectItemByUrl{ [CmdletBinding()] param( From 555e7c596f19a6f1387e6caa7297dbfb2def87d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 15:56:42 +0100 Subject: [PATCH 03/10] fix(project): rename Update-ProjectItem function to UpdateProjectItem --- private/projectDatabase/project_database_Async.ps1 | 2 +- private/projectDatabase/project_database_Sync.ps1 | 4 ++-- private/projectDatabase/project_database_call.ps1 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/private/projectDatabase/project_database_Async.ps1 b/private/projectDatabase/project_database_Async.ps1 index fe33fcf..6c61058 100644 --- a/private/projectDatabase/project_database_Async.ps1 +++ b/private/projectDatabase/project_database_Async.ps1 @@ -72,7 +72,7 @@ function Sync-ProjectAsync { # "Calling [$($params.Database.ProjectId)/$($params.ItemId)/$($params.FieldId) ($($params.FieldType)) = $($params.Value) ] ..." | Write-MyHost -NoNewLine - $call = Update-ProjectItem @params -Async + $call = UpdateProjectItem @params -Async $calls += $call $callsBatch += $call diff --git a/private/projectDatabase/project_database_Sync.ps1 b/private/projectDatabase/project_database_Sync.ps1 index a0519cd..3876d9d 100644 --- a/private/projectDatabase/project_database_Sync.ps1 +++ b/private/projectDatabase/project_database_Sync.ps1 @@ -64,11 +64,11 @@ function Sync-Project{ "Saving [$($params.Database.ProjectId)/$($params.ItemId)/$($params.FieldId) ($($params.FieldName)) = ""$($params.Value)"" ] ..." | Write-MyHost - $call = Update-ProjectItem @params + $call = UpdateProjectItem @params if ( ! (Test-UpdateProjectItemCall $call) ) { "FAILED !!" | Write-MyHost - Write-MyDebug -section "Sync-Project" -Message "Update-ProjectItem call failed" -Object $call + Write-MyDebug -section "Sync-Project" -Message "UpdateProjectItem call failed" -Object $call continue } diff --git a/private/projectDatabase/project_database_call.ps1 b/private/projectDatabase/project_database_call.ps1 index 238346d..2c48c37 100644 --- a/private/projectDatabase/project_database_call.ps1 +++ b/private/projectDatabase/project_database_call.ps1 @@ -13,7 +13,7 @@ Set-MyInvokeCommandAlias -Alias GitHub_ClearProjectV2ItemFieldValue -Comma Set-MyInvokeCommandAlias -Alias AddComment -Command 'Invoke-AddComment -SubjectId {subjectid} -Comment "{comment}"' Set-MyInvokeCommandAlias -Alias AddCommentAsync -Command 'Import-Module {projecthelper} ; Invoke-AddComment -SubjectId {subjectid} -Comment "{comment}"' -function Update-ProjectItem { +function UpdateProjectItem { [CmdletBinding()] param( [Parameter(Mandatory, Position = 0)][object]$Database, From a0d9013d822e9f2a4a1d76a05913cff0382ee927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 16:47:39 +0100 Subject: [PATCH 04/10] fix(mocks): update "Todo" status to "In Progress" in project item fields --- ...GitHubOrgProjectWithFields-octodemo-700-caseSensitive.json | 2 +- ...ke-GitHubOrgProjectWithFields-octodemo-700-singleItem.json | 2 +- .../mocks/invoke-GitHubOrgProjectWithFields-octodemo-700.json | 2 +- ..._lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json | 2 +- ..._lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json | 4 ++-- ...ADOAlIw4c4BCe3Vzgeio4o-PVTSSF_lADOAlIw4c4BCe3Vzg0rhno.json | 2 +- .../mocks/invoke-getitem-PVTI_lADOAlIw4c4BCe3Vzgeio4o.json | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-caseSensitive.json b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-caseSensitive.json index 98bddb6..11cc0d7 100644 --- a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-caseSensitive.json +++ b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-caseSensitive.json @@ -3904,7 +3904,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", diff --git a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-singleItem.json b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-singleItem.json index 4e6bbdf..71e9c9c 100644 --- a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-singleItem.json +++ b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700-singleItem.json @@ -118,7 +118,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", diff --git a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700.json b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700.json index 5385d6a..1979b45 100644 --- a/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700.json +++ b/Test/private/mocks/invoke-GitHubOrgProjectWithFields-octodemo-700.json @@ -4106,7 +4106,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", diff --git a/Test/private/mocks/invoke-GitHubUpdateItemValue-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json b/Test/private/mocks/invoke-GitHubUpdateItemValue-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json index dd64af6..b21cc2b 100644 --- a/Test/private/mocks/invoke-GitHubUpdateItemValue-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json +++ b/Test/private/mocks/invoke-GitHubUpdateItemValue-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json @@ -53,7 +53,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", diff --git a/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json b/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json index f33b57b..5777fd9 100644 --- a/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json +++ b/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTF_lADOAlIw4c4BCe3Vzg0rhko.json @@ -53,7 +53,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", @@ -62,7 +62,7 @@ "options": [ { "id": "f75ad846", - "name": "Todo" + "name": "In Progress" }, { "id": "47fc9ee4", diff --git a/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTSSF_lADOAlIw4c4BCe3Vzg0rhno.json b/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTSSF_lADOAlIw4c4BCe3Vzg0rhno.json index 1ae4d2a..52671cf 100644 --- a/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTSSF_lADOAlIw4c4BCe3Vzg0rhno.json +++ b/Test/private/mocks/invoke-clearProjectV2ItemFieldValue-PVT_kwDOAlIw4c4BCe3V-PVTI_lADOAlIw4c4BCe3Vzgeio4o-PVTSSF_lADOAlIw4c4BCe3Vzg0rhno.json @@ -53,7 +53,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", diff --git a/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4BCe3Vzgeio4o.json b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4BCe3Vzgeio4o.json index 01f63b3..533ea4a 100644 --- a/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4BCe3Vzgeio4o.json +++ b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4BCe3Vzgeio4o.json @@ -100,7 +100,7 @@ }, { "__typename": "ProjectV2ItemFieldSingleSelectValue", - "name": "Todo", + "name": "In Progress", "field": { "__typename": "ProjectV2SingleSelectField", "id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U", From 009201015874bdae1c04ab34a661dc4e697a3fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 16:48:57 +0100 Subject: [PATCH 05/10] fix(database): update alias for GetDatabaseStorePath command and ser variable to null --- private/database/databaseV2.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/private/database/databaseV2.ps1 b/private/database/databaseV2.ps1 index 1c5d0f3..f01301e 100644 --- a/private/database/databaseV2.ps1 +++ b/private/database/databaseV2.ps1 @@ -1,7 +1,9 @@ # Not using Include version as we moved away from the generic include version # Invoke to allow mockig the store path on testing -Set-MyInvokeCommandAlias -Alias GetDatabaseStorePath -Command "Invoke-ProjectHelperGetDatabaseStorePath" + +$aliasName = $MODULE_NAME+ "GetDatabaseStorePath" +Set-MyInvokeCommandAlias -Alias "$aliasName" -Command "Invoke-ProjectHelperGetDatabaseStorePath" $DATABASE_ROOT = [System.Environment]::GetFolderPath('UserProfile') | Join-Path -ChildPath ".helpers" -AdditionalChildPath $MODULE_NAME, "databaseCache" @@ -20,6 +22,8 @@ function Reset-DatabaseStore { New-Item -Path $databaseRoot -ItemType Directory + $script:databaseRoot = $null + } Export-ModuleMember -Function Reset-DatabaseStore function Get-DatabaseStore { @@ -29,7 +33,7 @@ function Get-DatabaseStore { ) if ($Force -or -Not $script:databaseRoot) { - $script:databaseRoot = Invoke-MyCommand -Command GetDatabaseStorePath + $script:databaseRoot = Invoke-MyCommand -Command $aliasName "Using DatabaseStore path: $script:databaseRoot" | Write-MyDebug -Section DatabaseStore } From b418599fbbff48c7b3b9b6a3f356c6c64e85dbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 16:49:10 +0100 Subject: [PATCH 06/10] feat(project): add Get-ProjectParameters function to retrieve project details --- public/environment/projectParameters.ps1 | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/public/environment/projectParameters.ps1 b/public/environment/projectParameters.ps1 index 86ff7e2..b5d32bd 100644 --- a/public/environment/projectParameters.ps1 +++ b/public/environment/projectParameters.ps1 @@ -61,4 +61,27 @@ function Set-ProjectParameters { Set-ProjectHelperEnvironment -Owner $Owner -ProjectNumber $ProjectNumber -ProjectTitle $ProjectTitle } -} Export-ModuleMember -Function Set-ProjectParameters -Alias "Set-Project","spp" \ No newline at end of file +} Export-ModuleMember -Function Set-ProjectParameters -Alias "Set-Project","spp" + +function Get-ProjectParameters { + [CmdletBinding()] + [Alias("gpp")] + param() + + $result =Get-ProjectHelperEnvironment + + $ret = @{ + Owner = $result.Owner + ProjectNumber = $result.ProjectNumber + ProjectTitle = $result.ProjectTitle + } + $ret.Owner = $result.Owner + $ret.ProjectNumber = $result.ProjectNumber + + $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -ErrorAction SilentlyContinue -skipItems + + $ret.ProjectTitle = $db.title + + return $ret + +} Export-ModuleMember -Function Get-ProjectParameters -Alias "gpp" \ No newline at end of file From f4544dfcb0c5fb1bbf3818d68c564f8858b517a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 18:34:33 +0100 Subject: [PATCH 07/10] feat(items): Edit-ProjectItem with rich parameters for standard projects --- include/getLongText.ps1 | 44 ++++++ public/fields/getValidNames.ps1 | 26 +++ public/items/edit_project_item.ps1 | 246 +++++++++++++++++++++++++++++ public/items/project_item.ps1 | 51 ------ 4 files changed, 316 insertions(+), 51 deletions(-) create mode 100644 include/getLongText.ps1 create mode 100644 public/fields/getValidNames.ps1 create mode 100644 public/items/edit_project_item.ps1 diff --git a/include/getLongText.ps1 b/include/getLongText.ps1 new file mode 100644 index 0000000..7f1cdd6 --- /dev/null +++ b/include/getLongText.ps1 @@ -0,0 +1,44 @@ + +$EditFileAlias = $MODULE_NAME + "_EditFile" +$EditFileAliasCode = $MODULE_NAME + "_EditFileCode" +Set-MyInvokeCommandAlias -Alias $EditFileAliasCode -Command 'code -w "{path}"' +Set-MyInvokeCommandAlias -Alias $EditFileAlias -Command "$MODULE_NAME\Invoke-$($MODULE_NAME)EditFile -Text '{text}'" + +function Invoke-GetLongText{ + [CmdletBinding()] + param( + [Parameter(Position = 0)][string]$Text + ) + + $tmpFilePath = "temp:" | Convert-Path | Join-Path -ChildPath "LongText_$([Guid]::NewGuid().ToString()).md" + + New-Item -Path $tmpFilePath -ItemType File -Force | Out-Null + + if( -not [string]::IsNullOrWhiteSpace($Text)){ + # Join string array to single string + $joinedValue = $Text -join [Environment]::NewLine + + # Write content without trailing newline + Set-Content -Path $tmpFilePath -Value $joinedValue -NoNewline + } + + Invoke-MyCommand -Command $EditFileAliasCode -Parameters @{ path = $tmpFilePath } + + $content = Get-Content $tmpFilePath -Raw + + Microsoft.PowerShell.Management\Remove-Item $tmpFilePath -Force + + return $content +} Export-ModuleMember -Function Invoke-GetLongText + +function Get-LongText{ + [CmdletBinding()] + param( + [Parameter(Position = 0)][string]$Text + ) + + $ret = Invoke-MyCommand -Command $EditFileAliasCode -Parameters @{ text = $Text } + + return $ret + +} \ No newline at end of file diff --git a/public/fields/getValidNames.ps1 b/public/fields/getValidNames.ps1 new file mode 100644 index 0000000..a1c03ae --- /dev/null +++ b/public/fields/getValidNames.ps1 @@ -0,0 +1,26 @@ +class ValidFields : System.Management.Automation.IValidateSetValuesGenerator { + [String[]] GetValidValues() { return @( "Status" ) } +} + +function Get-ValidNames{ + [CmdletBinding()] + param ( + [Parameter(Mandatory, Position = 0)][ValidateSet([ValidFields])][string]$FieldName + ) + + ($owner, $projectNumber) = Resolve-ProjectParameters -Owner $Owner -ProjectNumber $ProjectNumber -DoNotThrow + + if ($null -eq $owner -or $null -eq $projectNumber) { + return $null + } + + $field = Get-ProjectFields -Owner $owner -ProjectNumber $projectNumber -Name $FieldName + + if($field.dataType -eq "SINGLE_SELECT"){ + $ret = $field.MoreInfo + } else { + throw "Get-ValidNames only supports fields with SINGLE_SELECT dataType. Field $FieldName has $($field.dataType) dataType." + } + + return $ret +} \ No newline at end of file diff --git a/public/items/edit_project_item.ps1 b/public/items/edit_project_item.ps1 new file mode 100644 index 0000000..7b6988a --- /dev/null +++ b/public/items/edit_project_item.ps1 @@ -0,0 +1,246 @@ + +class ValidStatus : System.Management.Automation.IValidateSetValuesGenerator { + [String[]] GetValidValues() { + # TODO : Remove this reset and reset class script variable from Reset-DatabaseStore + # We need to reset the database variable to ensure Class will reset databaseRoot and read fromthe proper place. + # This is needed for testing as we mock the databaseRoot path + # We can remove this if we figure out how to reset the class script variable when reseting the databaseRoot in Reset-DatabaseStore + $script:databaseRoot = $null + + return Get-ValidNames "Status" } +} + +function Edit-ProjectItem { + [CmdletBinding()] + [Alias("epi")] + param( + [Parameter()][string]$Owner, + [Parameter()][string]$ProjectNumber, + [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, Position = 0)][Alias("ItemId")][string]$Id, + [Parameter(Position = 1)][string]$FieldName, + [Parameter(Position = 2)][string]$Value, + + [Parameter()][Alias("MM")][switch]$Commit, + [Parameter()][Alias("F")][switch]$Force, + [Parameter()][Alias("O")][switch]$OpenInBrowser, + + # Fields + [Parameter()][hashtable]$Fields, + + # Content + [Parameter()][Alias("T")][string]$Title, + [Parameter()][Alias("B")][string]$Body, + [Parameter()][Alias("BL")][switch]$BodyLongText, + + # AddComment + [Parameter()][Alias("AC")][string]$AddComment, + [Parameter()][Alias("CL")][switch]$AddCommentLongText, + + # Status + [Parameter()][ValidateSet([ValidStatus])][Alias("St")][string]$Status, + + # Punded parameters + [Parameter()][Alias("D")][switch]$DefaultValues, + [Parameter()][switch]$Close, + [Parameter()][switch]$Backlog, + [Parameter()][switch]$Ready, + + [Parameter()][switch]$NormalizeTitle + ) + + begin{ + # Resolve project parameters + ($Owner, $ProjectNumber) = Resolve-ProjectParameters -Owner $Owner -ProjectNumber $ProjectNumber + + # Create params + $params = @{ Owner = $Owner ; ProjectNumber = $ProjectNumber } + + # Force cache update + if($Force){ Update-Project @params } + + # Centralize the editing of the value for later refactoring if needed + function edit($params) { + Edit-ProjectItemValue @params + } + # Commit check + if ($commmit) { + $staged = Get-ProjectItemStaged -Owner $Owner -ProjectNumber $ProjectNumber + + if ($staged) { + $quit = $true + throw "There are staged items. Please commit or reset them before updating items" + } + } + + if( $BodyLongText ) { + $Body = Get-LongText -Text $Body + } + + if( $AddCommentLongText ) { + $AddComment = Get-LongText -Text $AddComment + } + + # NormalizeTitle + if ($NormalizeTitle) { + if([string]::IsNullOrWhiteSpace($Title)){ + $Title = "[{{RepositoryName}}] {{Title}}" + } else { + # Editing Title at the same time + $Title = "[{{RepositoryName}}] $Title" + } + } + + # Default + if($DefaultValues){ + Write-MyWarning "No Default values are currently setup. Please use other parameters to set values or update the DefaultValues parameter with default values" + + # Do not edit but leave this parameters flow the edit process + } + + # Close + if ($Close) { + $Status = "Done" + + # Do not edit but leave this parameters flow the edit process + } + + # Backlog + if ($Backlog) { + $Status = "Todo" + + # Do not edit but leave this parameters flow the edit process + } + + # Ready + if ($Ready) { + Write-Warning "No Ready status is currently setup. Please use other parameters to set values or update the Ready parameter with a status value" + + # $Status = "ActionRequired" + + # Do not edit but leave this parameters flow the edit process + } + + } + + process{ + + # Begin determine that we should not run any pipe object + if( $quit ){ return } + + $params.ItemId = $Id + + # Status parameter + if (-Not [string]::IsNullOrWhiteSpace($Status)) { + $params.fieldname = "Status" + $params.value = "$Status" + edit $params + } + + # Title parameter + if (-Not [string]::IsNullOrWhiteSpace($Title)) { + $params.fieldname = "Title" + $params.value = "$Title" + edit $params + } + + # Body parameter + if (-Not [string]::IsNullOrWhiteSpace($Body)) { + $params.fieldname = "Body" + $params.value = "$Body" + edit $params + } + + # AddComment parameter + if (-Not [string]::IsNullOrWhiteSpace($AddComment)) { + $params.fieldname = "AddComment" + $params.value = "$AddComment" + edit $params + } + + # FieldName parameter + if (-Not [string]::IsNullOrWhiteSpace($FieldName)) { + $params.FieldName = $FieldName + $params.Value = $Value + edit $params + } + + #Fields + if ($Fields) { + foreach ($key in $Fields.Keys) { + $value = $Fields[$key] + $params.fieldname = $key + $params.value = "$value" + edit $params + } + } + + if ($OpenInBrowser) { + $item = Get-ProjectItem -ItemId $Id -Owner $Owner -ProjectNumber $ProjectNumber + if ($null -ne $item) { + Open-Url -Url $item.url + } else { + Write-Warning "Item not found. Cannot open in browser." + } + } + } + + end { + # If Commit is specified, sync the staged items + if ($Commit) { + Sync-ProjectItemStaged -Owner $Owner -ProjectNumber $ProjectNumber + } + + } +} Export-ModuleMember -Function Edit-ProjectItem -Alias "epi" + + +<# +.SYNOPSIS + Edit a project item +.EXAMPLE + Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "comment" -Value "new value of the comment" + Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "title" -Value "new value of the title" +#> +function Edit-ProjectItemValue { + [CmdletBinding()] + param( + [Parameter()][string]$Owner, + [Parameter()][string]$ProjectNumber, + [Parameter(Mandatory, ValueFromPipeline, Position = 1)][string]$ItemId, + [Parameter(Position = 2)][string]$FieldName, + [Parameter(Position = 3)][string]$Value, + [Parameter()][switch]$Force + ) + + process{ + + ($Owner, $ProjectNumber) = Resolve-ProjectParameters -Owner $Owner -ProjectNumber $ProjectNumber + + # Force cache update + # Full sync if force. Skip items if not force + $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -SkipItems:$(-not $Force) + + # Find the actual value of the item. Item+Staged + # Ignore $dirty as we are changing the db we will always save + ($item, $dirty) = Resolve-ProjectItem -Database $db -ItemId $ItemId + + # if the item is not found + if($null -eq $item){ "Item [$ItemId] not found" | Write-MyError; return $null} + + # Value transformations + $valueTransformed = Convertto-ItemTransformedValue -Item $item -Value $Value + + # Check if value is the same + if ( AreEqual -Object1:$item.$FieldName -Object2:$valueTransformed) { + "The value is the same, no need to stage it" | Write-Verbose + return + } + + # save the new value + Save-ItemFieldValue $db $itemId $FieldName $valueTransformed + + # Commit changes to the database + Save-ProjectDatabaseSafe -Database $db + } + +} \ No newline at end of file diff --git a/public/items/project_item.ps1 b/public/items/project_item.ps1 index b095397..a8aaa4f 100644 --- a/public/items/project_item.ps1 +++ b/public/items/project_item.ps1 @@ -374,57 +374,6 @@ function Open-ProjectItem { } } Export-ModuleMember -Function Open-ProjectItem -Alias "opi" -<# -.SYNOPSIS - Edit a project item -.EXAMPLE - Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "comment" -Value "new value of the comment" - Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "title" -Value "new value of the title" -#> -function Edit-ProjectItem { - [CmdletBinding()] - param( - [Parameter()][string]$Owner, - [Parameter()][string]$ProjectNumber, - [Parameter(Mandatory, ValueFromPipeline, Position = 1)][string]$ItemId, - [Parameter(Position = 2)][string]$FieldName, - [Parameter(Position = 3)][string]$Value, - [Parameter()][switch]$Force - ) - - process{ - - ($Owner, $ProjectNumber) = Resolve-ProjectParameters -Owner $Owner -ProjectNumber $ProjectNumber - - # Force cache update - # Full sync if force. Skip items if not force - $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -SkipItems:$(-not $Force) - - # Find the actual value of the item. Item+Staged - # Ignore $dirty as we are changing the db we will always save - ($item, $dirty) = Resolve-ProjectItem -Database $db -ItemId $ItemId - - # if the item is not found - if($null -eq $item){ "Item [$ItemId] not found" | Write-MyError; return $null} - - # Value transformations - $valueTransformed = Convertto-ItemTransformedValue -Item $item -Value $Value - - # Check if value is the same - if ( AreEqual -Object1:$item.$FieldName -Object2:$valueTransformed) { - "The value is the same, no need to stage it" | Write-Verbose - return - } - - # save the new value - Save-ItemFieldValue $db $itemId $FieldName $valueTransformed - - # Commit changes to the database - Save-ProjectDatabaseSafe -Database $db - } - -} Export-ModuleMember -Function Edit-ProjectItem - function Reset-ProjectItem { [CmdletBinding()] param( From b144ada15c2c6a6858f8dc4f6bd1227a5bcc5e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 18:34:51 +0100 Subject: [PATCH 08/10] feat(test): add tests for Edit-ProjectItem functionality --- Test/private/MockCall_Project700.ps1 | 2 + Test/public/items/edit_project_item.test.ps1 | 306 +++++++++++++++++++ 2 files changed, 308 insertions(+) create mode 100644 Test/public/items/edit_project_item.test.ps1 diff --git a/Test/private/MockCall_Project700.ps1 b/Test/private/MockCall_Project700.ps1 index e0ea116..62079dd 100644 --- a/Test/private/MockCall_Project700.ps1 +++ b/Test/private/MockCall_Project700.ps1 @@ -27,6 +27,7 @@ function Get-Mock_Project_700 { $fieldnumber = $pActual.fields.nodes | Where-Object { $_.name -eq "field-number" } $fielddate = $pActual.fields.nodes | Where-Object { $_.name -eq "field-date" } $fieldsingleselect = $pActual.fields.nodes | Where-Object { $_.name -eq "field-singleselect" } + $fieldStatus = $pActual.fields.nodes | Where-Object { $_.name -eq "Status" } # Repository Info $repoContent = Get-MockFileContentJson -fileName $project.repofile -AsHashtable @@ -58,6 +59,7 @@ function Get-Mock_Project_700 { $project.fieldnumber = @{ id = $fieldnumber.id ; name = $fieldnumber.name } $project.fielddate = @{ id = $fielddate.id ; name = $fielddate.name } $project.fieldsingleselect = @{ id = $fieldsingleselect.id ; name = $fieldsingleselect.name ; options = $fieldsingleselect.options } + $project.fieldStatus = @{ id = $fieldStatus.id ; name = $fieldStatus.name ; options = $fieldStatus.options } # Items $project.items = @{} diff --git a/Test/public/items/edit_project_item.test.ps1 b/Test/public/items/edit_project_item.test.ps1 new file mode 100644 index 0000000..99815d0 --- /dev/null +++ b/Test/public/items/edit_project_item.test.ps1 @@ -0,0 +1,306 @@ +function Test_EditProjectItems_FieldName{ + + #Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + $fieldComment = $p.fieldtext.name ; $fieldCommentValue = "new value of the comment 10.1" + $fieldId = $p.fieldtext.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -FieldName $fieldComment -Value $fieldCommentValue + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.Keys + Assert-AreEqual -Expected $itemId -Presented $result.Keys[0] + Assert-AreEqual -Expected $fieldComment -Presented $result.$itemId.$fieldId.Field.name + Assert-AreEqual -Expected $fieldCommentValue -Presented $result.$itemId.$fieldId.Value +} + +function Test_EditProjectItems_Fields{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + $fieldTextName = $p.fieldtext.name ; $fieldTextId = $p.fieldtext.id + $fieldNumberName = $p.fieldnumber.name ; $fieldNumberId = $p.fieldnumber.id + $fieldTextValue = "new value of the comment 10.1" + $fieldNumberValue = 42 + + $fields = @{ + $fieldTextName = $fieldTextValue + $fieldNumberName = $fieldNumberValue + } + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Fields $fields + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.Keys + Assert-AreEqual -Expected $itemId -Presented $result.Keys[0] + Assert-AreEqual -Expected $fieldTextValue -Presented $result.$itemId.$fieldTextId.Value + Assert-AreEqual -Expected $fieldNumberValue -Presented $result.$itemId.$fieldNumberId.Value +} + +function Test_EditProjectItems_Title_Body_AddComment{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + $newtitle = "Item 1 - title" + $newBody = "Item 1 - body" + $addComment = "This is a new comment added to the item." + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Title $newtitle -Body $newBody -AddComment $addComment + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-AreEqual -Expected $newtitle -Presented $result.$itemId.title.Value + Assert-AreEqual -Expected $newBody -Presented $result.$itemId.body.Value + Assert-AreEqual -Expected $addComment -Presented $result.$itemId.addcomment.Value +} + +function Test_EditProjectItems_Status{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + Set-ProjectHelperEnvironment -Owner $Owner -ProjectNumber $ProjectNumber + + $newStatus = "Todo" + $statusFieldId = $p.fieldStatus.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Status $newStatus + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-AreEqual -Expected $newStatus -Presented $result.$itemId.$statusFieldId.Value +} + +function Test_EditProjectItems_Status_Close{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + Set-ProjectHelperEnvironment -Owner $Owner -ProjectNumber $ProjectNumber + + $newStatus = "Done" + $statusFieldId = $p.fieldStatus.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Close + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $newStatus -Presented $result.$itemId.$statusFieldId.Value +} + +function Test_EditProjectItems_Status_Backlog{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + Set-ProjectHelperEnvironment -Owner $Owner -ProjectNumber $ProjectNumber + + $newStatus = "Todo" + $statusFieldId = $p.fieldStatus.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Backlog + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $newStatus -Presented $result.$itemId.$statusFieldId.Value +} + +function Test_EditProjectItems_Status_Ready{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + Set-ProjectHelperEnvironment -Owner $Owner -ProjectNumber $ProjectNumber + + $newStatus = "Todo" + $statusFieldId = $p.fieldStatus.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Backlog + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $newStatus -Presented $result.$itemId.$statusFieldId.Value +} + +function Test_EditProjectItems_AddCommentLongText{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + $commentValue = "This is a long comment added to the item. It should be added as a new comment and not override the previous one." + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + MockCallToString -Command ProjectHelper_EditFileCode -Outstring $commentValue + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -AddCommentLongText + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $commentValue -Presented $result.$itemId.addcomment.Value +} + +function Test_EditProjectItems_BodyLongText{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + $commentValue = "This is a long comment added to the item. It should be added as a new comment and not override the previous one." + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + MockCallToString -Command ProjectHelper_EditFileCode -Outstring $commentValue + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -BodyLongText + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $commentValue -Presented $result.$itemId.body.Value +} + +function Test_EditProjectItems_NormalizeTitle{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + MockCall_GetProject $p -SkipItems + + $newTitle = "[{repo}] {title}" + $newTitle = $newTitle -replace "{repo}", $i.repositoryName + $newTitle = $newTitle -replace "{title}", $i.title + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -NormalizeTitle + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 1 -Presented $result.$itemId.Keys + Assert-AreEqual -Expected $newTitle -Presented $result.$itemId.title.Value +} + +function Test_EditProjectItems_OpenInBrowser{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + MockCallToNull -Command "Invoke-ProjectHelperOpenUrl -Url ""$($i.url)""" + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -OpenInBrowser + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 0 -Presented $result +} + +function Test_EditProjectItems_Force{ + + # Arrange + $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number + MockCall_GetProject $p -skipItems + $i= $p.issue ; $itemId = $i.id + + # Mock the direct call for item + # MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # for the project sync + MockCall_GetProject $p + + # Act + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -Force + + # Assert + $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber + + Assert-Count -Expected 0 -Presented $result +} \ No newline at end of file From 786e7073f937def8c33976edd4d280147662088c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 18:35:23 +0100 Subject: [PATCH 09/10] fix(tests): fix test after product changes --- Test/public/project_item.test.ps1 | 29 ------------------- Test/public/project_item_list.test.ps1 | 25 ++++++++-------- Test/public/project_items_staged.test.ps1 | 6 ---- .../project_items_staged_Async.test.ps1 | 3 -- Test/public/run_BeforeAfter.ps1 | 5 +++- Test/traceInvoke.log | 4 +++ 6 files changed, 21 insertions(+), 51 deletions(-) diff --git a/Test/public/project_item.test.ps1 b/Test/public/project_item.test.ps1 index 4b0cd6f..4596921 100644 --- a/Test/public/project_item.test.ps1 +++ b/Test/public/project_item.test.ps1 @@ -110,7 +110,6 @@ function Test_GetProjectItem_Staged_Body{ function Test_GetProjectItemUrl_SUCCESS { # Arrange - Reset-InvokeCommandMock $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number $i = $p.issue MockCall_GetProject -MockProject $p -Cache @@ -125,7 +124,6 @@ function Test_GetProjectItemUrl_SUCCESS { function Test_GetProjectItemUrl_SUCCESS_FromApiWhenMissingInCache { # Arrange - Reset-InvokeCommandMock $p = Get-Mock_Project_625 ; $owner = $p.owner ; $projectNumber = $p.number $itemId = "id1" MockCall_GetProject -MockProject $p -SkipItems @@ -142,7 +140,6 @@ function Test_GetProjectItemUrl_SUCCESS_FromApiWhenMissingInCache { function Test_GetProjectItemUrl_NotFound { # Arrange - Reset-InvokeCommandMock $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number $itemId = "id1" MockCall_GetProject -MockProject $p -SkipItems @@ -158,7 +155,6 @@ function Test_GetProjectItemUrl_NotFound { function Test_GetProjectItemUrl_SUCCESS_PipelineItems { # Arrange - Reset-InvokeCommandMock $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number MockCall_GetProject -MockProject $p -Cache @@ -323,32 +319,7 @@ function Test_ResetProjectItem_SUCCESS{ Assert-AreEqual -Expected $f2Actual -Presented $reset.$f2 } -function Test_EditProjectItems_Direct{ - $Owner = "octodemo" ; $ProjectNumber = 700 - - # No sync of project with items allowed just with skipitems - MockCall_GetProject_700 -skipItems - - $itemId = "PVTI_lADOAlIw4c4BCe3Vzgeio4o" - $fieldComment = "field-text" ; $fieldCommentValue = "new value of the comment 10.1" - $fieldId = "PVTF_lADOAlIw4c4BCe3Vzg0rhko" - - # Mock the direct call for item - MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" - - # Direct edit of the item - Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -FieldName $fieldComment -Value $fieldCommentValue - - # Get the staged item - $result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber - - Assert-Count -Expected 1 -Presented $result.Keys - Assert-AreEqual -Expected $itemId -Presented $result.Keys[0] - Assert-AreEqual -Expected $fieldComment -Presented $result.$itemId.$fieldId.Field.name - Assert-AreEqual -Expected $fieldCommentValue -Presented $result.$itemId.$fieldId.Value - -} function Test_UpdateProjectDatabase_Fail_With_Staged{ # When changes are staged list update should fail. diff --git a/Test/public/project_item_list.test.ps1 b/Test/public/project_item_list.test.ps1 index 5b2276b..d9a7e76 100644 --- a/Test/public/project_item_list.test.ps1 +++ b/Test/public/project_item_list.test.ps1 @@ -15,26 +15,27 @@ function Test_GetProjetItems_SUCCESS{ $randomItem = $result | Where-Object {$_.id -eq $i.id} - Assert-AreEqual -Presented $randomItem.Title -Expected "Issue for development" - Assert-AreEqual -Presented $randomItem.Body -Expected "Body of issue for development" + Assert-AreEqual -Presented $randomItem.projectId -Expected $p.id + Assert-AreEqual -Presented $randomItem.projectUrl -Expected $p.url + + Assert-AreEqual -Presented $randomItem.id -Expected $i.id + Assert-AreEqual -Presented $randomItem.number -Expected $i.number + Assert-AreEqual -Presented $randomItem.contentId -Expected $i.contentId + Assert-AreEqual -Presented $randomItem.Title -Expected $i.title + Assert-AreEqual -Presented $randomItem.Body -Expected $i.body + Assert-AreEqual -Presented $randomItem.url -Expected $i.url + Assert-AreEqual -Presented $randomItem.Status -Expected $i.status Assert-AreEqual -Presented $randomItem.state -Expected "OPEN" - Assert-AreEqual -Presented $randomItem.id -Expected "PVTI_lADOAlIw4c4BCe3Vzgeio4o" Assert-AreEqual -Presented $randomItem.type -Expected "Issue" - Assert-AreEqual -Presented $randomItem.Status -Expected "Todo" Assert-AreEqual -Presented $randomItem.Milestone -Expected "Milestone 3: Quality and Deployment" Assert-AreEqual -Presented $randomItem.Repository -Expected "https://github.com/octodemo/rulasg-dev-1" - Assert-AreEqual -Presented $randomItem."field-text" -Expected "text3" + Assert-AreEqual -Presented $randomItem."field-text" -Expected $i.fieldtext Assert-AreEqual -Presented $randomItem."field-number" -Expected "333" - Assert-AreEqual -Presented $randomItem."field-singleselect" -Expected "option-3" + Assert-AreEqual -Presented $randomItem."field-singleselect" -Expected $i.fieldsingleselect.name Assert-AreEqual -Presented $randomItem.databaseId -Expected "128099210" - Assert-AreEqual -Presented $randomItem.projectUrl -Expected "https://github.com/orgs/octodemo/projects/700" # Assert-AreEqual -Presented $randomItem.updatedAt -Expected "9/11/2025 1:06:24 PM" - Assert-AreEqual -Presented $randomItem.number -Expected "26" - Assert-AreEqual -Presented $randomItem.contentId -Expected "I_kwDOPrRnkc7KkwSq" - Assert-AreEqual -Presented $randomItem.projectId -Expected "PVT_kwDOAlIw4c4BCe3V" - Assert-AreEqual -Presented $randomItem.urlContent -Expected "https://github.com/octodemo/rulasg-dev-1/issues/26" + Assert-AreEqual -Presented $randomItem.urlContent -Expected $i.url Assert-AreEqual -Presented $randomItem.urlPanel -Expected "https://github.com/orgs/octodemo/projects/700/views/1?pane=issue&itemId=128099210" - Assert-AreEqual -Presented $randomItem.url -Expected "https://github.com/octodemo/rulasg-dev-1/issues/26" # Assert-AreEqual -Presented $randomItem.createdAt -Expected "9/9/2025 2:01:17 PM" # Assert-AreEqual -Presented $randomItem."field-iteration" -Expected "" diff --git a/Test/public/project_items_staged.test.ps1 b/Test/public/project_items_staged.test.ps1 index 082dbda..5579934 100644 --- a/Test/public/project_items_staged.test.ps1 +++ b/Test/public/project_items_staged.test.ps1 @@ -1044,8 +1044,6 @@ function Test_Sync_ProjectDatabase_ClearValues{ function Test_ResetProjectItemStaged_SUCCESS_AllItems { # Arrange - Reset-InvokeCommandMock - $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number $item1 = $p.issue $item2 = $p.pullrequest @@ -1072,8 +1070,6 @@ function Test_ResetProjectItemStaged_SUCCESS_AllItems { function Test_ResetProjectItemStaged_SUCCESS_SingleItem { # Arrange - Reset-InvokeCommandMock - $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number $item1 = $p.issue $item2 = $p.pullrequest @@ -1102,8 +1098,6 @@ function Test_ResetProjectItemStaged_SUCCESS_SingleItem { function Test_ResetProjectItemStaged_SUCCESS_Pipeline { # Arrange - Reset-InvokeCommandMock - $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number $item1 = $p.issue $item2 = $p.pullrequest diff --git a/Test/public/project_items_staged_Async.test.ps1 b/Test/public/project_items_staged_Async.test.ps1 index 04099fc..25b4623 100644 --- a/Test/public/project_items_staged_Async.test.ps1 +++ b/Test/public/project_items_staged_Async.test.ps1 @@ -594,9 +594,6 @@ function Test_SyncProjectItemsStaged_Async_SUCCESS_Content_DraftIssue { function Test_SyncProjectItemsStaged_Async_FAIL_Content_DraftIssue { # Arrange - Reset-InvokeCommandMock - Enable-InvokeCommandAliasModule - $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number MockCall_GetProject -MockProject $p -skipItems diff --git a/Test/public/run_BeforeAfter.ps1 b/Test/public/run_BeforeAfter.ps1 index 0a1ebc7..bfc1d62 100644 --- a/Test/public/run_BeforeAfter.ps1 +++ b/Test/public/run_BeforeAfter.ps1 @@ -17,7 +17,10 @@ function Run_BeforeEach{ Write-Verbose "Run_BeforeEach" - Reset_Test_Mock + # Reset_Test_Mock + Reset-InvokeCommandMock + Mock_DatabaseRoot -NotReset:$NoResetDatabase + Mock_Today } # function Run_AfterEach{ diff --git a/Test/traceInvoke.log b/Test/traceInvoke.log index 41188c6..c7bf901 100644 --- a/Test/traceInvoke.log +++ b/Test/traceInvoke.log @@ -83,3 +83,7 @@ Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterField Invoke-ProjectHelperOpenUrl -Url https://github.com/octodemo/rulasg-dev-1/issues/26 echo ProjecthelperPromoptSettings Invoke-CreateIssue -RepositoryId R_kgDOPrRnkQ -Title "Issue for development" -Body "Body of issue for development" +Invoke-ProjectHelperOpenUrl -Url "https://github.com/octodemo/rulasg-dev-1/issues/26" +Invoke-ProjectHelperOpenUrl -Url "https://github.com/orgs/octodemo/projects/700/views/1?pane=issue&itemId=128098775" +ProjectHelper_EditFile +ProjectHelper_EditFileCode From e2de8a7bce0e5788227fff5a59dd32c1abeb0e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Wed, 4 Mar 2026 18:35:28 +0100 Subject: [PATCH 10/10] refactor(getproject): reorder parameter positions for clarity --- public/project/getproject.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/project/getproject.ps1 b/public/project/getproject.ps1 index c287d2f..cff6374 100644 --- a/public/project/getproject.ps1 +++ b/public/project/getproject.ps1 @@ -1,8 +1,8 @@ function Get-Project { [CmdletBinding()] param( - [Parameter()][string]$Owner, - [Parameter()][string]$ProjectNumber, + [Parameter(Position=0)][string]$Owner, + [Parameter(Position=1)][string]$ProjectNumber, [Parameter()][switch]$SkipItems, [Parameter()][switch]$Force )