diff --git a/Functions/DCIM/DCIM.ps1 b/Functions/DCIM/DCIM.ps1 index 6363424..9b53432 100644 --- a/Functions/DCIM/DCIM.ps1 +++ b/Functions/DCIM/DCIM.ps1 @@ -129,13 +129,13 @@ function ValidateDCIMChoice { #region GET Commands function Get-NetboxDCIMDevice { [CmdletBinding()] - #region Parameters param ( [uint16]$Limit, [uint16]$Offset, + [Parameter(ValueFromPipelineByPropertyName = $true)] [uint16[]]$Id, [string]$Query, @@ -196,6 +196,7 @@ function Get-NetboxDCIMDevice { [switch]$Raw ) + #endregion Parameters if ($null -ne $Status) { @@ -307,6 +308,88 @@ function Get-NetboxDCIMDeviceRole { } } } + +function Get-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [uint16]$Name, + + [object]$Form_Factor, + + [bool]$Enabled, + + [uint16]$MTU, + + [bool]$MGMT_Only, + + [string]$Device, + + [uint16]$Device_Id, + + [uint16]$Type, + + [uint16]$LAG_Id, + + [string]$MAC_Address, + + [switch]$Raw + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} + +function Get-NetboxDCIMInterfaceConnection { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$Id, + + [object]$Connection_Status, + + [uint16]$Site, + + [uint16]$Device, + + [switch]$Raw + ) + + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} + #endregion GET Commands @@ -388,6 +471,78 @@ function New-NetboxDCIMDevice { InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST } +function Add-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$Device, + + [Parameter(Mandatory = $true)] + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST +} + + #endregion ADD/NEW commands @@ -474,6 +629,91 @@ function Set-NetboxDCIMDevice { } } +function Set-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [uint16]$Device, + + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + begin { + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + + end { + + } +} + #endregion SET Commands @@ -533,6 +773,62 @@ function Remove-NetboxDCIMDevice { } } + +function Remove-NetboxDCIMInterface { +<# + .SYNOPSIS + Removes an interface + + .DESCRIPTION + Removes an interface by ID from a device + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Force + A description of the Force parameter. + + .EXAMPLE + PS C:\> Remove-NetboxDCIMInterface -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentInterface.Name) | ID: $($CurrentInterface.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } +} + #endregion REMOVE commands diff --git a/NetboxPS.psproj b/NetboxPS.psproj index a036551..a356252 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -30,6 +30,7 @@ Tests\VirtualizationChoices.json Functions\DCIM\DCIM.ps1 Tests\DCIM.Devices.Tests.ps1 + Tests\DCIM.Interfaces.Tests.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file diff --git a/Tests/DCIM.Devices.Tests.ps1 b/Tests/DCIM.Devices.Tests.ps1 index 4ede912..53fecb4 100644 --- a/Tests/DCIM.Devices.Tests.ps1 +++ b/Tests/DCIM.Devices.Tests.ps1 @@ -20,7 +20,7 @@ if (Test-Path $ModulePath) { Import-Module $ModulePath -ErrorAction Stop } -Describe -Name "DCIM Tests" -Tag 'DCIM', 'Devices' -Fixture { +Describe -Name "DCIM Devices Tests" -Tag 'DCIM', 'Devices' -Fixture { Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { return $true } @@ -109,6 +109,18 @@ Describe -Name "DCIM Tests" -Tag 'DCIM', 'Devices' -Fixture { $Result.Headers.Keys.Count | Should -BeExactly 1 } + It "Should request a device by ID from the pipeline" { + $Result = [pscustomobject]@{ + 'id' = 10 + } | Get-NetboxDCIMDevice + + Assert-VerifiableMock + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + It "Should request with multiple IDs" { $Result = Get-NetboxDCIMDevice -Id 10, 12, 15 diff --git a/Tests/DCIM.Interfaces.Tests.ps1 b/Tests/DCIM.Interfaces.Tests.ps1 new file mode 100644 index 0000000..d57f7fe --- /dev/null +++ b/Tests/DCIM.Interfaces.Tests.ps1 @@ -0,0 +1,358 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 + Created on: 5/24/2018 10:50 AM + Created by: Ben Claussen + Organization: NEOnet + Filename: DCIM.Interfaces.Tests.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + +Import-Module Pester +Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue + +$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" + +if (Test-Path $ModulePath) { + Import-Module $ModulePath -ErrorAction Stop +} + +Describe -Name "DCIM Interfaces Tests" -Tag 'DCIM', 'Interfaces' -Fixture { + Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { + return $true + } + + Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { + # Return a hashtable of the items we would normally pass to Invoke-RestMethod + return [ordered]@{ + 'Method' = $Method + 'Uri' = $Uri + 'Headers' = $Headers + 'Timeout' = $Timeout + 'ContentType' = $ContentType + 'Body' = $Body + } + } + + Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { + return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) + } + + Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { + return 'netbox.domain.com' + } + + InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { + $script:NetboxConfig.Choices.DCIM = (Get-Content "$PSScriptRoot\DCIMChoices.json" -ErrorAction Stop | ConvertFrom-Json) + + Context -Name "Get-NetboxDCIMInterface" -Fixture { + It "Should request the default number of interfaces" { + $Result = Get-NetboxDCIMInterface + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request with a limit and offset" { + $Result = Get-NetboxDCIMInterface -Limit 10 -Offset 100 + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/?offset=100&limit=10' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request with enabled" { + $Result = Get-NetboxDCIMInterface -Enabled $true + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/?enabled=True' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request with a form factor name" { + $Result = Get-NetboxDCIMInterface -Form_Factor '10GBASE-T (10GE)' + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/?form_factor=1150' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should throw for an invalid form factor" { + { + Get-NetboxDCIMInterface -Form_Factor 'Fake' + } | Should -Throw + } + + It "Should request devices that are mgmt only" { + $Result = Get-NetboxDCIMInterface -MGMT_Only $True + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/?mgmt_only=True' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request an interface from the pipeline" { + $Result = [pscustomobject]@{ + 'Id' = 1234 + } | Get-NetboxDCIMInterface + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/1234/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + } + + Mock -CommandName "Get-NetboxDCIMInterface" -ModuleName "NetboxPS" -MockWith { + return [pscustomobject]@{ + 'Id' = $Id + } + } + + Context -Name "Add-NetboxDCIMInterface" -Fixture { + It "Should add a basic interface to a device" { + $Result = Add-NetboxDCIMInterface -Device 111 -Name "TestInterface" + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'POST' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + $Result.Body | Should -Be '{"name":"TestInterface","device":111}' + } + + It "Should add an interface to a device with lots of properties" { + $paramAddNetboxDCIMInterface = @{ + Device = 123 + Name = "TestInterface" + Form_Factor = '10GBASE-T (10GE)' + MTU = 9000 + MGMT_Only = $true + Description = 'Test Description' + Mode = 'Access' + } + + $Result = Add-NetboxDCIMInterface @paramAddNetboxDCIMInterface + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'POST' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + $Result.Body | Should -Be '{"mtu":9000,"mgmt_only":true,"description":"Test Description","mode":100,"name":"TestInterface","device":123,"form_factor":1150}' + } + + It "Should add an interface with multiple tagged VLANs" { + $Result = Add-NetboxDCIMInterface -Device 444 -Name "TestInterface" -Mode 'Tagged' -Tagged_VLANs 1, 2, 3, 4 + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'POST' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + $Result.Body | Should -Be '{"mode":200,"name":"TestInterface","device":444,"tagged_vlans":[1,2,3,4]}' + } + + It "Should throw for invalid mode" { + { + Add-NetboxDCIMInterface -Device 321 -Name "Test123" -Mode 'Fake' + } | Should -Throw + } + + It "Should throw for out of range VLAN" { + { + Add-NetboxDCIMInterface -Device 321 -Name "Test123" -Untagged_VLAN 4100 + } | Should -Throw + } + } + + Context -Name "Set-NetboxDCIMInterface" -Fixture { + It "Should set an interface to a new name" { + $Result = Set-NetboxDCIMInterface -Id 123 -Name "TestInterface" + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 1 -Exactly -Scope 'It' + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'PATCH' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/123/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + $Result.Body | Should -Be '{"name":"TestInterface"}' + } + + It "Should set multiple interfaces to a new name" { + $Result = Set-NetboxDCIMInterface -Id 456, 789 -Name "TestInterface" + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'PATCH', 'PATCH' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/456/', 'https://netbox.domain.com/api/dcim/interfaces/789/' + $Result.Headers.Keys.Count | Should -BeExactly 2 + $Result.Body | Should -Be '{"name":"TestInterface"}', '{"name":"TestInterface"}' + } + + It "Should set multiple interfaces to a new name from the pipeline" { + $Result = @( + [pscustomobject]@{ + 'Id' = 1234 + }, + [pscustomobject]@{ + 'Id' = 4231 + } + ) | Set-NetboxDCIMInterface -Name "TestInterface" + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'PATCH', 'PATCH' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/1234/', 'https://netbox.domain.com/api/dcim/interfaces/4231/' + $Result.Headers.Keys.Count | Should -BeExactly 2 + $Result.Body | Should -Be '{"name":"TestInterface"}', '{"name":"TestInterface"}' + } + + It "Should throw for invalid form factor" { + { + Set-NetboxDCIMInterface -Id 1234 -Form_Factor 'fake' + } | Should -Throw + } + } + + Context -Name "Remove-NetboxDCIMInterface" -Fixture { + It "Should remove an interface" { + $Result = Remove-NetboxDCIMInterface -Id 10 -Force + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 1 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'DELETE' + $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/10/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should remove multiple interfaces" { + $Result = Remove-NetboxDCIMInterface -Id 10, 12 -Force + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'DELETE', 'DELETE' + $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/10/', 'https://netbox.domain.com/api/dcim/interfaces/12/' + $Result.Headers.Keys.Count | Should -BeExactly 2 + } + + It "Should remove an interface from the pipeline" { + $Result = Get-NetboxDCIMInterface -Id 20 | Remove-NetboxDCIMInterface -Force + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'DELETE' + $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/20/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should remove mulitple interfaces from the pipeline" { + $Result = @( + [pscustomobject]@{ + 'Id' = 30 + }, + [pscustomobject]@{ + 'Id' = 40 + } + ) | Remove-NetboxDCIMInterface -Force + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' + + $Result.Method | Should -Be 'DELETE', 'DELETE' + $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/30/', 'https://netbox.domain.com/api/dcim/interfaces/40/' + $Result.Headers.Keys.Count | Should -BeExactly 2 + } + } + + Context -Name "Get-NetboxDCIMInterfaceConnection" -Fixture { + It "Should request the default number of interface connections" { + $Result = Get-NetboxDCIMInterfaceConnection + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request with a limit and offset" { + $Result = Get-NetboxDCIMInterfaceConnection -Limit 10 -Offset 100 + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/?offset=100&limit=10' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should request connected interfaces" { + $Result = Get-NetboxDCIMInterfaceConnection -Connection_Status 'Connected' + + Assert-VerifiableMock + Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly + + $Result.Method | Should -Be 'GET' + $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/?connection_status=True' + $Result.Headers.Keys.Count | Should -BeExactly 1 + } + + It "Should throw for an invalid connection status" { + { + Get-NetboxDCIMInterfaceConnection -Connection_Status 'Fake' + } | Should -Throw + } + } + } +} + + + + + + + + + + + + + + + + +