Tests/functions/_indice/New-ElasticIndex.Tests.ps1

$Global:ElasticModule = 'PSElastic'
$Global:ElasticFunction = ($MyInvocation.MyCommand.Name).Split('.')[0]
$Global:ElasticModuleLocation = (Get-Item (Split-Path -parent $MyInvocation.MyCommand.Path)).parent.parent.parent.FullName
$Global:ElasticMockDataLocation = "$ElasticModuleLocation\Tests\mock_data"

Get-Module $ElasticModule | Remove-Module
Import-Module "$ElasticModuleLocation\$ElasticModule.psd1"

InModuleScope $ElasticModule {
    Describe "New-ElasticIndex Unit Tests" -Tag 'Unit' {
        Context "$ElasticFunction return value validation" {
            # Prepare
            Mock Write-ElasticLog -Verifiable -MockWith {} -ParameterFilter {$message -eq $ElasticFunction}

            Mock Get-ElasticConnection -MockWith {
                $properties = [ordered]@{
                    BaseUrl = 'https://mockBaseUrl:9200'
                    Header = @{'Authorization' = 'mockAuth'}
                }

                return New-Object psobject -Property $properties
            }

            $mockData = Import-CliXML -Path "$ElasticMockDataLocation\New-ElasticIndex.Mock"
            Mock Invoke-ElasticRequest -Verifiable -MockWith {
                return $mockData
            }

            # Act
            $result = New-ElasticIndex -Name 'mock'

            # Assert
            It "Verifiable mocks are called" {
                Assert-VerifiableMock
            }
            It "Returns a value" {
                $result | Should -not -BeNullOrEmpty
            }
            It "Returns the expected type" {
                $result -is [object] | Should -Be $true
            }
            It "Correctly Validates the index name" {
                # Must be Lowercase
                { New-ElasticIndex -Name 'Mock' } | Should -Throw

                # Must not contain illegal characters
                foreach ($illegalCharacterName in @('\', '/', '*', '?', '"', '<', '>', '|', ' ', ',', '#', ':')) {
                    { New-ElasticIndex -Name $illegalCharacterName } | Should -Throw
                }

                # Must not start with illegal characters
                foreach ($illegalCharacterName in @('-mock', '_mock', '+mock')) {
                    { New-ElasticIndex -Name $illegalCharacterName } | Should -Throw
                }

                # Cannot be . or ..
                { New-ElasticIndex -Name '.' } | Should -Throw
                { New-ElasticIndex -Name '..' } | Should -Throw

                # Cannot be longer than 255 bytes
                { New-ElasticIndex -Name ('m'*256) } | Should -Throw
            }
            It "Calls Write-ElasticLog and is only invoked once" {
                Assert-MockCalled -CommandName Write-ElasticLog -Times 1 -Exactly
            }
            It "Calls Get-ElasticConnection and is only invoked once" {
                Assert-MockCalled -CommandName Get-ElasticConnection -Times 1 -Exactly
            }
            It "Calls Invoke-ElasticRequest and is only invoked once" {
                Assert-MockCalled -CommandName Invoke-ElasticRequest -Times 1 -Exactly
            }
        }
    }
}