Tests/Unit/Get-SPCVersionWaste.Tests.ps1

#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0.0' }

BeforeAll {
    . (Join-Path $PSScriptRoot '../../Private/PnPWrappers.ps1')
    . (Join-Path $PSScriptRoot '../../Private/Test-SPCConnection.ps1')
    . (Join-Path $PSScriptRoot '../../Private/Connect-SPCSiteInternal.ps1')
    . (Join-Path $PSScriptRoot '../../Public/Scan/Get-SPCVersionWaste.ps1')

    $script:SPCContext = [PSCustomObject]@{
        TenantName       = 'contoso'
        GraphAccessToken = 'mock_token'
        PnPContext       = [PSCustomObject]@{}
    }
}

Describe 'Get-SPCVersionWaste Unit Tests' -Tag 'Scan', 'Versions' {
    Context 'AC-05: Version Sprawl and Recoverable Storage Analysis' {
        It 'AC-05: Should accurately calculate recoverable version storage per document library' {
            Mock Connect-SPCSiteInternal { [PSCustomObject]@{} }
            Mock Get-PnPList {
                @(
                    [PSCustomObject]@{ Title = 'Documents'; BaseTemplate = 101; Hidden = $false; MajorVersionLimit = 500; ItemCount = 1 }
                )
            }
            Mock Get-PnPListItem {
                @( [PSCustomObject]@{ FileSystemObjectType = 'File'; 'FileRef' = '/sites/Eng/Docs/spec.docx'; 'FileLeafRef' = 'spec.docx' } )
            }
            Mock Get-PnPProperty {
                param($ClientObject, $Property, $Connection)
                if ($Property -eq 'File') {
                    return [PSCustomObject]@{ Length = 1048576 }
                }
                if ($Property -eq 'Versions') {
                    $now = (Get-Date).ToUniversalTime()
                    $vers = [System.Collections.Generic.List[object]]::new()
                    1..100 | ForEach-Object {
                        $created = if ($_ -le 50) { $now.AddDays(-120) } else { $now.AddDays(-10) }
                        $vers.Add([PSCustomObject]@{ VersionLabel = "$_.0"; Length = 1048576; Created = $created })
                    }
                    return $vers
                }
            }

            $result = Get-SPCVersionWaste -SiteUrl 'https://contoso.sharepoint.com/sites/Eng' -KeepVersions 50 -OlderThanDays 90

            $result.LibraryTitle | Should -Be 'Documents'
            $result.RecoverableStorageMB | Should -Be 50.0
            $result.ConfiguredMaxVersions | Should -Be 500
            $result.SimulatedKeepVersions | Should -Be 50
        }

        It 'AC-05: Should exclude system libraries like FormServerTemplates and Site Assets' {
            Mock Connect-SPCSiteInternal { [PSCustomObject]@{} }
            Mock Get-PnPList {
                @(
                    [PSCustomObject]@{ Title = 'FormServerTemplates'; BaseTemplate = 101; Hidden = $false; MajorVersionLimit = 500; ItemCount = 10 },
                    [PSCustomObject]@{ Title = 'Site Assets'; BaseTemplate = 101; Hidden = $false; MajorVersionLimit = 500; ItemCount = 10 },
                    [PSCustomObject]@{ Title = 'Shared Documents'; BaseTemplate = 101; Hidden = $false; MajorVersionLimit = 500; ItemCount = 0 }
                )
            }
            Mock Get-PnPListItem { @() }

            $result = Get-SPCVersionWaste -SiteUrl 'https://contoso.sharepoint.com/sites/Test'

            $result.Count | Should -Be 1
            $result.LibraryTitle | Should -Be 'Shared Documents'
        }
    }
}