Tests/Integration/Arcade.Test1s.ps1


$modulePath = Resolve-Path -Path "$PSScriptRoot\..\..\.." | Select-Object -ExpandProperty Path
$moduleName = Resolve-Path -Path "$PSScriptRoot\..\.." | Get-Item | Select-Object -ExpandProperty BaseName

Remove-Module -Name $moduleName -Force -ErrorAction SilentlyContinue
Import-Module -Name "$modulePath\$moduleName" -Force

Describe 'Arcade' {

    Context 'Session' {

        It 'Should not return the adb session' {

            # Act
            $actual = Adb\Get-AdbSession

            # Assert
            $actual | Should -BeNullOrEmpty
        }

        It 'Should conncet to the adb server' {

            # Arrange
            $uri        = 'https://adb-test.arcade.ch'
            $credential = Use-VaultCredential -TargetName $uri

            # Act
            $actual = Adb\Connect-AdbServer -Uri $uri -Credential $credential -PassThru

            # Assert
            $actual.PSObject.TypeNames[0] | Should -Be 'Adb.Session'
            $actual.Type                  | Should -Be 'Credential'
            $actual.Uri                   | Should -Be "$uri/api/v1"
            $actual.Token                 | Should -Not -BeNullOrEmpty
        }

        It 'Should return the adb session' {

            # Arrange
            $uri = 'https://adb-test.arcade.ch'

            # Act
            $actual = Adb\Get-AdbSession

            # Assert
            $actual.PSObject.TypeNames[0] | Should -Be 'Adb.Session'
            $actual.Type                  | Should -Be 'Credential'
            $actual.Uri                   | Should -Be "$uri/api/v1"
            $actual.Token                 | Should -Not -BeNullOrEmpty
        }

        It 'Should disconnect from the adb server' {

            # Act & Assert
            { Adb\Disconnect-AdbServer } | Should -Not -Throw
        }
    }

    Context 'User' {

        BeforeAll {

            $uri        = 'https://adb-test.arcade.ch'
            $credential = Use-VaultCredential -TargetName $uri

            Adb\Connect-AdbServer -Uri $uri -Credential $credential
        }

        AfterAll {

            Adb\Disconnect-AdbServer
        }

        It 'Should return the correct user' {

            # Arrange
            $expectedUser = $credential.UserName

            # Act
            $actual = Adb\Get-AdbUser

            # Assert
            $actual.User    | Should -Be $expectedUser
            $actual.Role[0] | Should -Be 'admin'
        }
    }

    Context 'Item' {

        $namePipeline  = 't_{0}' -f [System.Guid]::NewGuid()
        $nameParameter = 't_{0}' -f [System.Guid]::NewGuid()

        BeforeAll {

            $uri        = 'https://adb-test.arcade.ch'
            $credential = Use-VaultCredential -TargetName $uri

            Adb\Connect-AdbServer -Uri $uri -Credential $credential
        }

        AfterAll {

            Adb\Disconnect-AdbServer
        }

        It 'Should create and return an item piped via pipeline' {

            # Act
            Adb\New-AdbResource -Type 'Item' -Resource @{ name = $namePipeline }
            $actual = Adb\Get-AdbItem -Name $namePipeline

            # Assert
            $actual.name | Should -Be $namePipeline
        }

        It 'Should create and return an item specified via parameter' {

            # Act
            Adb\New-AdbResource -Type 'Item' -Resource @{ name = $nameParameter }
            $actual = Adb\Get-AdbItem -Name $nameParameter

            # Assert
            $actual.name | Should -Be $nameParameter
        }

        It 'Should update the pipeline item' {

            # Act
            $item = Adb\Get-AdbItem -Name $namePipeline
            $item.properties | Add-Member 'demo' 'foo bar'
            $item | Adb\Set-AdbResource
            $actual = Adb\Get-AdbItem -Name $namePipeline

            # Assert
            $actual.name                     | Should -Be $namePipeline
            $actual.properties.net_ipaddress | Should -Be 'foo bar'
        }

        It 'Should update the parameter item' {
        }



        It 'Should create and delete an item specified via paramter' {

            # Act
            Adb\New-AdbResource -Type 'Item' -Resource @{ name = $nameParameter }
            $actual = Adb\Get-AdbItem -Name $nameParameter
            Adb\Remove-AdbResource -Name $nameParameter -Type 'Item'

            # Assert
            $actual.name                             | Should -Be $nameParameter
            { Adb\Get-AdbItem -Name $nameParameter } | Should -Throw
        }


        It 'Should create and delete an item piped via pipeline' {

            # Arrange
            $name = 'z_test_{0}' -f [System.Guid]::NewGuid()

            # Act
            New-AdbResource -Type 'Item' -Resource @{ name = $name }
            $actual = Adb\Get-AdbItem -Name $name
            Adb\Get-AdbItem -Name $name | Adb\Remove-AdbResource

            # Assert
            $actual.name                    | Should -Be $name
            { Adb\Get-AdbItem -Name $name } | Should -Throw
        }

    }

    Context 'Validation' {

        BeforeAll {

            $uri        = 'https://adb-test.arcade.ch'
            $credential = Use-VaultCredential -TargetName $uri

            Adb\Connect-AdbServer -Uri $uri -Credential $credential
        }

        AfterAll {

            Adb\Disconnect-AdbServer
        }

        It 'Should validate a valid object and return a result object' {

            # Act
            $actual = Adb\Test-AdbItemValidation -Template 'g_customer' -Name 'g_customer_lab'

            # Assert
            $actual.Result  | Should -BeTrue
            $actual.Message | Should -BeNullOrEmpty
        }

        It 'Should validate a valid object and return nothing' {

            # Act & Assert
            { Adb\Test-AdbItemValidation -Template 'g_customer' -Name 'g_customer_lab' -Quiet } | Should -Not -Throw
        }

        It 'Should return an error for a invalid objectand return a result object' {

            # Act
            $actual = Adb\Test-AdbItemValidation -Template 'g_customer' -Name 'c_automation'

            # Assert
            $actual.Result  | Should -BeFalse
            $actual.Message | Should -Be 'path ".name": should match pattern "^g_customer_.*$", path ".properties": should have required property ''customer'', path ".properties": should have required property ''customer_short'''
        }

        It 'Should return an error for a invalid object' {

            # Act & Assert
            { Adb\Test-AdbItemValidation -Template 'g_customer' -Name 'c_automation' -Quiet } | Should -Throw
        }
    }
}