tests/internal/functions/Test-HawkDateParameter.Tests.ps1

Describe 'Test-HawkDateParameter' {
    BeforeAll {
        # Mock Stop-PSFFunction to intercept and throw the error message directly
        Mock -ModuleName Hawk Stop-PSFFunction {
            param($Message)
            throw $Message
        }
    }

    Context 'Parameter combination validation' {
        It 'Should throw when neither StartDate nor DaysToLookBack is provided' {
            # Arrange
            $PSBoundParameters = @{}

            # Act & Assert
            { Test-HawkDateParameter -PSBoundParameters $PSBoundParameters } | 
                Should -Throw "Either StartDate or DaysToLookBack must be specified in non-interactive mode"
        }

        It 'Should process valid StartDate and EndDate combination' {
            # Arrange
            $currentDate = Get-Date
            $startDate = $currentDate.AddDays(-30)
            $endDate = $currentDate
            $PSBoundParameters = @{
                StartDate = $startDate
                EndDate = $endDate
            }

            # Act
            $result = Test-HawkDateParameter -PSBoundParameters $PSBoundParameters -StartDate $startDate -EndDate $endDate

            # Assert
            $result.StartDate | Should -Be $startDate.ToUniversalTime().Date
            $result.EndDate | Should -Be $endDate.ToUniversalTime().Date.AddDays(1)
        }
    }

    Context 'DaysToLookBack processing' {
        It 'Should correctly process DaysToLookBack with specified EndDate' {
            # Arrange
            $currentDate = Get-Date
            $endDate = $currentDate
            $daysToLook = 30
            $PSBoundParameters = @{
                DaysToLookBack = $daysToLook
                EndDate = $endDate
            }

            # Act
            $result = Test-HawkDateParameter -PSBoundParameters $PSBoundParameters -DaysToLookBack $daysToLook -EndDate $endDate

            # Assert
            $result.StartDate | Should -Be $endDate.ToUniversalTime().Date.AddDays(-$daysToLook)
            $result.EndDate | Should -Be $endDate.ToUniversalTime().Date.AddDays(1)
        }

        It 'Should calculate correct dates when only DaysToLookBack is provided' {
            # Arrange
            $currentDate = Get-Date
            $daysToLook = 30
            $PSBoundParameters = @{
                DaysToLookBack = $daysToLook
            }

            # Act
            $result = Test-HawkDateParameter -PSBoundParameters $PSBoundParameters -DaysToLookBack $daysToLook

            # Assert
            $result.EndDate | Should -Be $currentDate.ToUniversalTime().Date.AddDays(1)
            $result.StartDate | Should -Be $currentDate.ToUniversalTime().Date.AddDays(-$daysToLook)
        }
    }

    Context 'UTC conversion' {
        It 'Should convert dates to UTC and handle end date adjustment' {
            # Arrange
            $currentDate = Get-Date
            $startDate = $currentDate.AddDays(-30)
            $endDate = $currentDate
            $PSBoundParameters = @{
                StartDate = $startDate
                EndDate = $endDate
            }

            # Act
            $result = Test-HawkDateParameter -PSBoundParameters $PSBoundParameters -StartDate $startDate -EndDate $endDate

            # Assert
            $result.StartDate | Should -Be $startDate.ToUniversalTime().Date
            $result.EndDate | Should -Be $endDate.ToUniversalTime().Date.AddDays(1)
        }
    }


}