Tests/EAI/EAISdtInstance.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 'Convert-EAISdtApiTimestamp helpers' {
    It 'Converts epoch seconds to UTC DateTime' {
        InModuleScope -ModuleName $script:DevModuleName {
            $result = ConvertFrom-EAISdtApiTimestamp -Value 1784649600
            $result.Kind | Should -Be 'Utc'
        }
    }

    It 'Formats API instants with millisecond precision' {
        InModuleScope -ModuleName $script:DevModuleName {
            $result = ConvertTo-EAISdtApiInstant -DateTime '2026-07-22T16:00:00Z'
            $result | Should -Be '2026-07-22T16:00:00.000Z'
        }
    }

    It 'Formats instance IDs for delete paths' {
        InModuleScope -ModuleName $script:DevModuleName {
            $result = Format-EAISdtInstanceId -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' `
                -StartTime '2026-07-22T16:00:00Z'
            $result | Should -Be '97038d1b-648a-4718-b287-33726ed49624:2026-07-22T16:00:00.000Z'
        }
    }

    It 'Normalizes instance API objects' {
        InModuleScope -ModuleName $script:DevModuleName {
            $raw = [PSCustomObject]@{
                startTime  = 1784649600
                endTime    = 1784653200
                instanceId = [PSCustomObject]@{
                    scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                    startTime  = 1784649600
                }
            }

            $result = ConvertTo-EAISdtInstanceObject -InputObject $raw

            $result.startTime | Should -BeOfType [datetime]
            $result.originalInstanceId.startTime | Should -BeOfType [datetime]
            $result.instanceId | Should -Be '97038d1b-648a-4718-b287-33726ed49624:2026-07-21T16:00:00.000Z'
        }
    }
}

Describe 'Get-EAISdtInstance' {
    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 'Queries instances with start and end time parameters' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod {
                return @(
                    [PSCustomObject]@{
                        startTime  = 1784649600
                        endTime    = 1784653200
                        status     = 'SCHEDULED'
                        instanceId = [PSCustomObject]@{
                            scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                            startTime  = 1784649600
                        }
                    }
                )
            }

            $start = [datetime]'2026-07-19T04:00:00Z'
            $end = [datetime]'2026-07-26T03:59:59Z'
            $results = Get-EAISdtInstance -ScheduleId '97038d1b-648a-4718-b287-33726ed49624' -StartTime $start -EndTime $end

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -like 'https://myorg.dexda.ai/action/sdt/97038d1b-648a-4718-b287-33726ed49624/instance?startTime=*&endTime=*' -and
                $Method -eq 'GET'
            }

            @($results).Count | Should -Be 1
            $results[0].PSTypeNames | Should -Contain 'Edwin.SDT.Instance'
        }
    }

    It 'Accepts piped Edwin.SDT objects by scheduleId' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod { return @() }

            $schedule = Add-ObjectTypeInfo -InputObject ([PSCustomObject]@{
                    scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                    name       = 'Maintenance window'
                }) -TypeName 'Edwin.SDT'

            $schedule | Get-EAISdtInstance

            Should -Invoke Invoke-EAIRestMethod -Times 1 -ParameterFilter {
                $Uri -like 'https://myorg.dexda.ai/action/sdt/97038d1b-648a-4718-b287-33726ed49624/instance?startTime=*&endTime=*' -and
                $Method -eq 'GET'
            }
        }
    }

    It 'Retrieves a single instance by ID' {
        InModuleScope -ModuleName $script:DevModuleName {
            Mock Invoke-EAIRestMethod {
                return [PSCustomObject]@{
                    startTime  = 1784649600
                    endTime    = 1784653200
                    status     = 'ACTIVE'
                    instanceId = [PSCustomObject]@{
                        scheduleId = '97038d1b-648a-4718-b287-33726ed49624'
                        startTime  = 1784649600
                    }
                }
            }

            $result = Get-EAISdtInstance -InstanceId '97038d1b-648a-4718-b287-33726ed49624:2026-07-21T16:00:00.000Z'

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

            $result.PSTypeNames | Should -Contain 'Edwin.SDT.Instance'
        }
    }
}