Test/public/integrations/update-ProjectItemsStatusOnDueDate.test.ps1

function Test_UpdateProjectItemStatusOnDueDate {

    Reset-InvokeCommandMock
    Mock_DatabaseRoot

    # Mock calling Toda
    MockCallToString -Command "Get-Date -Format yyyy-MM-dd" -OutString "2025-03-15"

    $mp = Get-Mock_Project_625 ; $owner = $mp.owner ; $projectNumber = $mp.number
    MockCall_GetProject -MockProject $mp -Cache

    $p = $mp.updateStatusOnDueDate
    $statusFieldId = $p.fields.status.id
    $otherDone = $p.statusDoneOther

    # Act and Assert
    function Assert-DueDateStaged{
        param(
            [Parameter()][object]$Expected,
            [Parameter(Position=1)][bool]$AnyStatus,
            [Parameter(Position=2)][bool]$IncludeDoneItems,
            [Parameter(Position=3)][string]$StatusDone
        )

        Reset-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber
        $params = @{
            Owner            = $owner
            ProjectNumber    = $projectNumber
            StatusFieldName  = $p.fields.status.name
            DateFieldName    = $p.fields.dueDate.name
            StatusAction     = $p.statusAction
            StatusPlanned    = $p.statusPlanned
            IncludeDoneItems = $IncludeDoneItems
            StatusDone       = $StatusDone
            AnyStatus        = $AnyStatus
        }

        # Act
        $result = Update-ProjectItemsStatusOnDueDate @params

        # Result is null
        Assert-IsNull -Object $result -Comment "Result is null"

        # Assert
        $staged = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber

        # Items edited to ActionRequired or Planned
        $total = $Expected.Count
        Assert-AreEqual -Expected $total -Presented $staged.Count
        foreach($id in $Expected.Keys){
            foreach($field in $Expected.$id.Keys){
                Assert-AreEqual -Expected $Expected.$id.$field -Presented $staged.$id.$field.Value -Comment "Item $id Field $field"
            }
        }
    }

    # Assert of the combination of the three parameters

    # AnyStatus | IncludeDoneItems | DoneOther | Expected
    Assert-DueDateStaged   $true         $true           ""          -Expected ($p.staged + $p.anyStatus                      + $p.includeDone  )
    Assert-DueDateStaged   $false        $true           ""          -Expected ($p.staged                                     + $p.includeDone  )
    Assert-DueDateStaged   $true         $false          ""          -Expected ($p.staged + $p.anyStatus                                        )
    Assert-DueDateStaged   $false        $false          ""          -Expected ($p.staged                                                       )
    Assert-DueDateStaged   $true         $true          $otherDone   -Expected ($p.staged + $p.anyStatus_and_includeDoneOther + $p.includeDone  )
    Assert-DueDateStaged   $false        $true          $otherDone   -Expected ($p.staged               + $p.includeDoneOther + $p.includeDone  )
    Assert-DueDateStaged   $true         $false         $otherDone   -Expected ($p.staged + $p.anyStatus_and_includeDoneOther                   )
    Assert-DueDateStaged   $false        $false         $otherDone   -Expected ($p.staged               + $p.includeDoneOther                   )

}