Test/public/project_item.searchprojectitem.test.ps1

# Tests for Search-ProjectItem

function Test_SearchProjectItem_Basic_SUCCESS {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    MockCall_GetProject_700

    $p = Get-Mock_Project_700
    $Owner = $p.owner
    $ProjectNumber = $p.number
    $filter = $p.searchInTitle.titleFilter
    $expected = $p.searchInTitle.Titles.Count

    $result = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter $filter
    Assert-Count -Expected $expected -Presented $result

    # Default attributes should be id + Title
    foreach($r in $result){
        $props = $r.PSObject.Properties.Name
        Assert-Count -Expected 2 -Presented $props
        Assert-Contains -Expected "id" -Presented $props
        Assert-Contains -Expected "Title" -Presented $props
    }
}

function Test_SearchProjectItem_PassThru_SUCCESS {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    MockCall_GetProject_700

    $p = Get-Mock_Project_700
    $Owner = $p.owner
    $ProjectNumber = $p.number
    $filter = $p.searchInTitle.titleFilter
    $expected = $p.searchInTitle.Titles.Count

    $attributes = $p.searchInTitle.attributesDefault

    $raw = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter $filter -PassThru
    Assert-Count -Expected $expected -Presented $raw

    # Show (non PassThru) should produce PSCustomObject projection
    $shown = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter $filter -Attributes $attributes
    Assert-Count -Expected $expected -Presented $shown

    # Compare one item type difference
    Assert-IsTrue -Condition ($raw[0] -is [hashtable])
    Assert-IsTrue -Condition ($shown[0] -is [pscustomobject])
    Assert-Count -Expected $attributes.Count -Presented $($shown[0].PSObject.Properties.Name)

}

function Test_SearchProjectItem_SortByTitle_SUCCESS {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    MockCall_GetProject_700

    $p = Get-Mock_Project_700
    $Owner = $p.owner
    $ProjectNumber = $p.number
    $filter = $p.searchInTitle.titleFilter

    $result = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter $filter
    $titles = $result | ForEach-Object { $_.Title }
    $sorted = $titles | Sort-Object
    # Ensure already sorted (function sorts when Title in attributes)
    for($i=0;$i -lt $titles.Count;$i++){
        Assert-AreEqual -Expected $sorted[$i] -Presented $titles[$i] -Comment "Titles should be sorted alphabetically"
    }
}

function Test_SearchProjectItem_CustomAttributes_SUCCESS {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    MockCall_GetProject_700

    $p = Get-Mock_Project_700
    $Owner = $p.owner
    $ProjectNumber = $p.number
    $filter = $p.searchInTitle.titleFilter

    $attrs = $p.searchInTitle.attributes
    $result = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter $filter -Attributes $attrs
    foreach($r in $result){
        $props = $r.PSObject.Properties.Name
        Assert-Count -Expected $attrs.Count -Presented $props
        for($i=0;$i -lt $attrs.Count;$i++){
            Assert-AreEqual -Expected $attrs[$i] -Presented $props[$i] -Comment "Property order should match passed attributes"
        }
    }
}

function Test_SearchProjectItem_NoMatch {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    MockCall_GetProject_700

    $p = Get-Mock_Project_700
    $Owner = $p.owner
    $ProjectNumber = $p.number

    $result = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter "___DefinitelyNotInAnyTitle___"
    Assert-Count -Expected 0 -Presented $result
}

function Test_SearchProjectItem_AND_Filter_SUCCESS {
    Reset-InvokeCommandMock
    Mock_DatabaseRoot
    
    $p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number
    MockCall_GetProject $p -Cache

    $i = $p.issue 
    $str = '"Title": "{title}",' -replace "{title}",$i.title
    $newStr = '"Title": "{title} UniqueSearchAlpha UniqueSearchBeta",' -replace "{title}",$i.title

    # Add content to the title of a file
    $dbpathh = Invoke-MyCommand -Command "Invoke-ProjectHelperGetDatabaseStorePath" | Join-Path -ChildPath octodemo_700.json
    $content = Get-Content $dbpathh
    $content = $content -replace $str,$newStr
    $content | Set-Content $dbpathh

    # Act
    $found = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter "UniqueSearchAlpha","UniqueSearchBeta"
    Assert-Count -Expected 1 -Presented $found
    Assert-AreEqual -Expected $i.id -Presented $found[0].id

    # Negative: second token missing
    $notFound = Search-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -Filter "UniqueSearchAlpha","MissingZeta"
    Assert-Count -Expected 0 -Presented $notFound
}