Tests/EAI/EAISdtOverride.Tests.ps1

BeforeAll {
    if ($Module) {
        $script:DevModuleName = Import-Module $Module -Force -PassThru | Select-Object -ExpandProperty Name
    }
    else {
        $devModule = Join-Path $PSScriptRoot '..' '..' 'Dev.Logic.Monitor.psd1'
        $script:DevModuleName = Import-Module $devModule -Force -PassThru | Select-Object -ExpandProperty Name
    }
}

Describe 'Build-EAISdtOverridePayload' {
    It 'Builds a skip override payload' {
        InModuleScope -ModuleName $script:DevModuleName {
            $result = Build-EAISdtOverridePayload -Skip -OriginalInstanceId @{
                scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                startTime  = '2026-07-21T16:00:00.000Z'
            } -Summary 'skip note'

            $result.status | Should -Be 'SKIPPED'
            $result.summary | Should -Be 'skip note'
            $result.PSObject.Properties.Name | Should -Not -Contain 'newStartTime'
            $result.PSObject.Properties.Name | Should -Not -Contain 'newEndTime'
            $result.originalInstanceId.scheduleId | Should -Be '97038d1b-648a-4718-b287-33726ed49624'
        }
    }

    It 'Builds an adjust override payload' {
        InModuleScope -ModuleName $script:DevModuleName {
            $result = Build-EAISdtOverridePayload -OriginalInstanceId @{
                scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                startTime  = '2026-07-21T16:00:00.000Z'
            } -NewStartTime '2026-07-28T16:00:00Z' -NewEndTime '2026-07-28T17:00:00Z' -Summary 'adjusted note'

            $result.status | Should -Be 'SCHEDULED'
            $result.newStartTime | Should -Be '2026-07-28T16:00:00.000Z'
            $result.newEndTime | Should -Be '2026-07-28T17:00:00.000Z'
            $result.summary | Should -Be 'adjusted note'
        }
    }

    It 'Rejects skip payloads that include new times' {
        InModuleScope -ModuleName $script:DevModuleName {
            {
                Build-EAISdtOverridePayload -OriginalInstanceId @{
                    scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                    startTime  = '2026-07-21T16:00:00.000Z'
                } -NewStartTime '2026-07-28T16:00:00Z'
            } | Should -Throw '*NewEndTime*'
        }
    }
}

Describe 'New-EAISdtOverride' {
    BeforeEach {
        Disconnect-EAIAccount
        Connect-EAIAccount -EdwinOrg 'myorg' -ClientId 'client' -ClientSecret 'secret' -SkipCredValidation
        InModuleScope -ModuleName $script:DevModuleName {
            $Script:EAIAuth.AccessToken = 'test-token' | ConvertTo-SecureString -AsPlainText -Force
            $Script:EAIAuth.TokenExpiresAt = (Get-Date).ToUniversalTime().AddHours(1)
        }
    }

    It 'Posts a skip override from a piped instance' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            $instance = Add-ObjectTypeInfo -InputObject ([PSCustomObject]@{
                    instanceId         = '97038d1b-648a-4718-b287-33726ed49624:2026-07-21T16:00:00.000Z'
                    originalInstanceId = [PSCustomObject]@{
                        scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                        startTime  = [datetime]'2026-07-21T16:00:00Z'
                    }
                }) -TypeName 'Edwin.SDT.Instance'

            $instance | New-EAISdtOverride -Skip -Summary 'skip note'

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -eq 'https://myorg.dexda.ai/action/sdt/97038d1b-648a-4718-b287-33726ed49624/override' -and
                $Method -eq 'POST' -and
                $Body -match '"status":"SKIPPED"' -and
                $Body -match '"summary":"skip note"'
            }
        }
    }

    It 'Posts an adjust override' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            New-EAISdtOverride -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' `
                -OriginalStartTime '2026-07-21T16:00:00Z' `
                -NewStartTime '2026-07-28T16:00:00Z' `
                -NewEndTime '2026-07-28T17:00:00Z' `
                -Summary 'adjusted note'

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Body -match '"status":"SCHEDULED"' -and
                $Body -match '"newStartTime":"2026-07-28T16:00:00.000Z"' -and
                $Body -match '"newEndTime":"2026-07-28T17:00:00.000Z"'
            }
        }
    }
}

Describe 'Remove-EAISdtOverride' {
    BeforeEach {
        Disconnect-EAIAccount
        Connect-EAIAccount -EdwinOrg 'myorg' -ClientId 'client' -ClientSecret 'secret' -SkipCredValidation
        InModuleScope -ModuleName $script:DevModuleName {
            $Script:EAIAuth.AccessToken = 'test-token' | ConvertTo-SecureString -AsPlainText -Force
            $Script:EAIAuth.TokenExpiresAt = (Get-Date).ToUniversalTime().AddHours(1)
        }
    }

    It 'Deletes an override by instance ID' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            Remove-EAISdtOverride -InstanceId '97038d1b-648a-4718-b287-33726ed49624:2026-07-22T16:00:00.000Z'

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -like 'https://myorg.dexda.ai/action/sdt/override/*' -and
                $Method -eq 'DELETE'
            }
        }
    }

    It 'Deletes an override from a piped instance using instanceId' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            $instance = Add-ObjectTypeInfo -InputObject ([PSCustomObject]@{
                    instanceId         = '97038d1b-648a-4718-b287-33726ed49624:2026-07-22T16:00:00.000Z'
                    originalInstanceId = [PSCustomObject]@{
                        scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                        startTime  = [datetime]'2026-07-22T16:00:00Z'
                    }
                }) -TypeName 'Edwin.SDT.Instance'

            $instance | Remove-EAISdtOverride

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -like 'https://myorg.dexda.ai/action/sdt/override/*97038d1b-648a-4718-b287-33726ed49624*' -and
                $Method -eq 'DELETE'
            }
        }
    }

    It 'Deletes an override from a piped schedule override object with epoch timestamps' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            $override = [PSCustomObject]@{
                newStartTime       = 1785342362
                newEndTime         = 1785515162
                status             = 'SCHEDULED'
                originalInstanceId = [PSCustomObject]@{
                    scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                    startTime  = 1785168000
                }
            }

            $override | Remove-EAISdtOverride

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -like 'https://myorg.dexda.ai/action/sdt/override/*97038d1b-648a-4718-b287-33726ed49624*' -and
                $Uri -like '*2026-07-27T16*' -and
                $Method -eq 'DELETE'
            }
        }
    }
}

Describe 'Set-EAISdtOverride' {
    BeforeEach {
        Disconnect-EAIAccount
        Connect-EAIAccount -EdwinOrg 'myorg' -ClientId 'client' -ClientSecret 'secret' -SkipCredValidation
        InModuleScope -ModuleName $script:DevModuleName {
            $Script:EAIAuth.AccessToken = 'test-token' | ConvertTo-SecureString -AsPlainText -Force
            $Script:EAIAuth.TokenExpiresAt = (Get-Date).ToUniversalTime().AddHours(1)
        }
    }

    It 'Replaces all overrides with a PUT request body array' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            Set-EAISdtOverride -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' -Override @(
                @{
                    originalInstanceId = @{
                        scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                        startTime  = '2026-07-21T16:00:00.000Z'
                    }
                    status  = 'SKIPPED'
                    summary = 'bulk skip'
                }
            )

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -eq 'https://myorg.dexda.ai/action/sdt/97038d1b-648a-4718-b287-33726ed49624/override' -and
                $Method -eq 'PUT' -and
                $Body -match '"status":"SKIPPED"'
            }
        }
    }

    It 'Clears all overrides with an empty array body' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            Set-EAISdtOverride -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' -Override @()

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -eq 'https://myorg.dexda.ai/action/sdt/97038d1b-648a-4718-b287-33726ed49624/override' -and
                $Method -eq 'PUT' -and
                $Body -eq '[]'
            }
        }
    }

    It 'Clears all overrides with -Clear' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return $null }

            Set-EAISdtOverride -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' -Clear

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Method -eq 'PUT' -and
                $Body -eq '[]'
            }
        }
    }
}