tests/internal/functions/Convert-HawkDaysToDate.Tests.ps1

Describe 'Convert-HawkDaysToDate' {

    Context 'When converting valid days to dates' {
        BeforeEach {
            # Get current date in UTC for consistent testing
            $script:currentDate = (Get-Date).ToUniversalTime().Date
        }

        It 'Should return correct dates for 30 days lookback' {
            # Arrange
            $expectedStartDate = $script:currentDate.AddDays(-30)
            $expectedEndDate = $script:currentDate.AddDays(1)

            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $result.StartDate | Should -Be $expectedStartDate
            $result.EndDate | Should -Be $expectedEndDate
        }

        It 'Should return correct dates for 1 day lookback' {
            # Arrange
            $expectedStartDate = $script:currentDate.AddDays(-1)
            $expectedEndDate = $script:currentDate.AddDays(1)

            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 1

            # Assert
            $result.StartDate | Should -Be $expectedStartDate
            $result.EndDate | Should -Be $expectedEndDate
        }

        It 'Should return correct dates for 365 day lookback' {
            # Arrange
            $expectedStartDate = $script:currentDate.AddDays(-365)
            $expectedEndDate = $script:currentDate.AddDays(1)

            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 365

            # Assert
            $result.StartDate | Should -Be $expectedStartDate
            $result.EndDate | Should -Be $expectedEndDate
        }
    }

    Context 'When verifying date properties' {
        It 'Should return dates in UTC format' {
            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $result.StartDate.Kind | Should -Be 'Utc'
            $result.EndDate.Kind | Should -Be 'Utc'
        }

        It 'Should return dates at midnight' {
            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $result.StartDate.TimeOfDay | Should -Be ([TimeSpan]::Zero)
            $result.EndDate.TimeOfDay | Should -Be ([TimeSpan]::Zero)
        }

        It 'Should return EndDate exactly one day after current date' {
            # Arrange
            $currentDate = (Get-Date).ToUniversalTime().Date

            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $daysDifference = ($result.EndDate - $currentDate).Days
            $daysDifference | Should -Be 1
        }
    }

    Context 'When verifying return object structure' {
        It 'Should return a PSCustomObject with expected properties' {
            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $result | Should -BeOfType [PSCustomObject]
            $result.PSObject.Properties.Name | Should -Contain 'StartDate'
            $result.PSObject.Properties.Name | Should -Contain 'EndDate'
        }

        It 'Should return DateTime objects for both dates' {
            # Act
            $result = Convert-HawkDaysToDate -DaysToLookBack 30

            # Assert
            $result.StartDate | Should -BeOfType [DateTime]
            $result.EndDate | Should -BeOfType [DateTime]
        }
    }
}