From 3035c910f284ee9acbd6499188e9625c6b5d6d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Thu, 19 Feb 2026 06:53:30 +0100 Subject: [PATCH] feat(Get-ProjectItemUrl): add functions to retrieve project item URLs --- Test/public/project_item.test.ps1 | 72 +++++++++++++++++++++++++++++++ public/items/project_item.ps1 | 27 +++++++++++- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/Test/public/project_item.test.ps1 b/Test/public/project_item.test.ps1 index df6a952..18501cd 100644 --- a/Test/public/project_item.test.ps1 +++ b/Test/public/project_item.test.ps1 @@ -107,6 +107,78 @@ function Test_GetProjectItem_Staged_Body{ Assert-AreEqual -Expected $newBody -Presented $result.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 + + # Act + $result = Get-ProjectItemUrl -Owner $owner -ProjectNumber $projectNumber -ItemId $i.id + + # Assert + Assert-AreEqual -Expected $i.url -Presented $result +} + +function Test_GetProjectItemUrl_SUCCESS_FromApiWhenMissingInCache { + + # Arrange + Reset-InvokeCommandMock + $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number + $itemId = "id1" + MockCall_GetProject -MockProject $p -SkipItems + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-id1.json" + + # Act + $result = Get-ProjectItemUrl -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId + + # Assert + Assert-IsTrue -Condition ($result.Count -gt 0) + Assert-IsTrue -Condition (($result -join " ") -like "*github.com/orgs/octodemo/projects/625*") +} + +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 + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-id2.json" + + # Act + $result = Get-ProjectItemUrl -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId + + # Assert + Assert-IsNull -Object $result +} + +function Test_GetProjectItemUrl_SUCCESS_PipelineItems { + + # Arrange + Reset-InvokeCommandMock + $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number + MockCall_GetProject -MockProject $p -Cache + + $withUrl = @(Search-ProjectItem -Owner $owner -ProjectNumber $projectNumber -PassThru | Where-Object { -not [string]::IsNullOrWhiteSpace($_.url) } | Select-Object -First 2) + Assert-Count -Expected 2 -Presented $withUrl + + $items = @( + [pscustomobject]@{ id = $withUrl[0].id } + [pscustomobject]@{ id = $withUrl[1].id } + ) + + # Act + $result = $items | Get-ProjectItemUrl -Owner $owner -ProjectNumber $projectNumber + + # Assert + Assert-Count -Expected 2 -Presented $result + Assert-Contains -Expected $withUrl[0].url -Presented $result + Assert-Contains -Expected $withUrl[1].url -Presented $result +} + function Test_TestProjectItem_Success{ $p = Get-Mock_Project_700 ; $Owner = $p.owner ; $projectNumber = $p.number diff --git a/public/items/project_item.ps1 b/public/items/project_item.ps1 index b2ac986..c484c2f 100644 --- a/public/items/project_item.ps1 +++ b/public/items/project_item.ps1 @@ -52,7 +52,6 @@ function Get-ProjectItem { function Get-ProjectItemByUrl{ [CmdletBinding()] - [Alias ("gpiu")] param( [Parameter(Mandatory, ValueFromPipeline, Position = 0)][string]$Url, [Parameter()][string]$Owner, @@ -94,7 +93,31 @@ function Get-ProjectItemByUrl{ } return $ret } -} Export-ModuleMember -Function Get-ProjectItemByUrl -Alias "gpiu" +} Export-ModuleMember -Function Get-ProjectItemByUrl + +function Get-ProjectItemUrl{ + [CmdletBinding()] + [Alias ("gpiu")] + param( + [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0)][Alias("id")][string]$ItemId, + [Parameter()][string]$Owner, + [Parameter()][string]$ProjectNumber, + [Parameter()][switch]$Force + ) + + process{ + + $item = Get-ProjectItem -ItemId $ItemId -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force + + if($item){ + return $item.url + } else { + "Item [$ItemId] not found" | Write-MyError + return $null + } + + } +} Export-ModuleMember -Function Get-ProjectItemUrl -Alias "gpiu" function Test-ProjectItem { [CmdletBinding()]