Skip to content

Commit

Permalink
xSQLServerRSConfig: Added integration test (#834)
Browse files Browse the repository at this point in the history
- Changes to xSQLServerRSConfig
  - Added integration test (issue #753).
  • Loading branch information
johlju committed Sep 22, 2017
1 parent d35a63d commit 9ce87a8
Show file tree
Hide file tree
Showing 3 changed files with 287 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -104,6 +104,7 @@
- Now the resource will restart the Reporting Services service after
initializing ([issue #592](https://github.com/PowerShell/xSQLServer/issues/592)).
This will enable the Reports site to work.
- Added integration test ([issue #753](https://github.com/PowerShell/xSQLServer/issues/753)).

## 8.1.0.0

Expand Down
155 changes: 155 additions & 0 deletions Tests/Integration/MSFT_xSQLServerRSConfig.Integration.Tests.ps1
@@ -0,0 +1,155 @@
$script:DSCModuleName = 'xSQLServer'
$script:DSCResourceFriendlyName = 'xSQLServerRSConfig'
$script:DSCResourceName = "MSFT_$($script:DSCResourceFriendlyName)"

if (-not $env:APPVEYOR -eq $true)
{
Write-Warning -Message ('Integration test for {0} will be skipped unless $env:APPVEYOR equals $true' -f $script:DSCResourceName)
return
}

#region HEADER
# Integration Test Template Version: 1.1.2
[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or `
(-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) )
{
& git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))
}

Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force
$TestEnvironment = Initialize-TestEnvironment `
-DSCModuleName $script:DSCModuleName `
-DSCResourceName $script:DSCResourceName `
-TestType Integration

#endregion

$mockSqlInstallAccountPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force
$mockSqlInstallAccountUserName = "$env:COMPUTERNAME\SqlInstall"
$mockSqlInstallCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $mockSqlInstallAccountUserName, $mockSqlInstallAccountPassword

$mockSqlAdminAccountPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force
$mockSqlAdminAccountUserName = "$env:COMPUTERNAME\SqlAdmin"
$mockSqlAdminCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $mockSqlAdminAccountUserName, $mockSqlAdminAccountPassword

$mockReportingServicesServiceAccountPassword = ConvertTo-SecureString -String 'yig-C^Equ3' -AsPlainText -Force
$mockReportingServicesServiceAccountUserName = "$env:COMPUTERNAME\svc-Reporting"
$mockReportingServicesServiceCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $mockReportingServicesServiceAccountUserName, $mockReportingServicesServiceAccountPassword

try
{
$configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName).config.ps1"
. $configFile

$mockInstanceName = $ConfigurationData.AllNodes.InstanceName
$mockRSSQLServer = $ConfigurationData.AllNodes.RSSQLServer
$mockRSSQLInstanceName = $ConfigurationData.AllNodes.RSSQLInstanceName

Describe "$($script:DSCResourceName)_Integration" {
BeforeAll {
$resourceId = "[$($script:DSCResourceFriendlyName)]Integration_Test"
}

$configurationName = "$($script:DSCResourceName)_InstallReportingServices_Config"

Context ('When using configuration {0}' -f $configurationName) {
It 'Should compile and apply the MOF without throwing' {
{
$configurationParameters = @{
SqlInstallCredential = $mockSqlInstallCredential
SqlAdministratorCredential = $mockSqlAdminCredential
ReportingServicesServiceCredential = $mockReportingServicesServiceCredential
OutputPath = $TestDrive
# The variable $ConfigurationData was dot-sourced above.
ConfigurationData = $ConfigurationData
}

& $configurationName @configurationParameters

$startDscConfigurationParameters = @{
Path = $TestDrive
ComputerName = 'localhost'
Wait = $true
Verbose = $true
Force = $true
ErrorAction = 'Stop'
}

Start-DscConfiguration @startDscConfigurationParameters
} | Should Not Throw
}

It 'Should be able to call Get-DscConfiguration without throwing' {
{ Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not Throw
}

It 'Should have set the resource and all the parameters should match' {
$currentConfiguration = Get-DscConfiguration

$resourceCurrentState = $currentConfiguration | Where-Object -FilterScript {
$_.ConfigurationName -eq $configurationName
} | Where-Object -FilterScript {
$_.ResourceId -eq $resourceId
}

$resourceCurrentState.InstanceName | Should Be $mockInstanceName
$resourceCurrentState.RSSQLServer | Should Be $mockRSSQLServer
$resourceCurrentState.RSSQLInstanceName | Should Be $mockRSSQLInstanceName
$resourceCurrentState.IsInitialized | Should Be $true
}

It 'Should be able to access the ReportServer site without any error' {
$reportServerUri = 'http://{0}/ReportServer_{1}' -f $env:COMPUTERNAME, $mockInstanceName

try
{
$webRequestReportServer = Invoke-WebRequest -Uri $reportServerUri -UseDefaultCredentials
# if the request finishes successfully this should return status code 200.
$webRequestStatusCode = $webRequestReportServer.StatusCode -as [int]
}
catch
{
<#
If the request generated an exception i.e. "HTTP Error 503. The service is unavailable."
we can pull the status code from the Exception.Response property.
#>
$webRequestResponse = $_.Exception.Response
$webRequestStatusCode = $webRequestResponse.StatusCode -as [int]
}

$webRequestStatusCode | Should BeExactly 200
}

It 'Should be able to access the Reports site without any error' {
$reportsUri = 'http://{0}/Reports_{1}' -f $env:COMPUTERNAME, $mockInstanceName

try
{
$webRequestReportServer = Invoke-WebRequest -Uri $reportsUri -UseDefaultCredentials
# if the request finishes successfully this should return status code 200.
$webRequestStatusCode = $webRequestReportServer.StatusCode -as [int]
}
catch
{
<#
If the request generated an exception i.e. "HTTP Error 503. The service is unavailable."
we can pull the status code from the Exception.Response property.
#>
$webRequestResponse = $_.Exception.Response
$webRequestStatusCode = $webRequestResponse.StatusCode -as [int]
}

$webRequestStatusCode | Should BeExactly 200
}
}
}
}
finally
{
#region FOOTER

Restore-TestEnvironment -TestEnvironment $TestEnvironment

#endregion
}
131 changes: 131 additions & 0 deletions Tests/Integration/MSFT_xSQLServerRSConfig.config.ps1
@@ -0,0 +1,131 @@
# This is used to make sure the integration test run in the correct order.
[Microsoft.DscResourceKit.IntegrationTest(OrderNumber = 2)]
param()

# Get a spare drive letter
$mockLastDrive = ((Get-Volume).DriveLetter | Sort-Object | Select-Object -Last 1)
$mockIsoMediaDriveLetter = [char](([int][char]$mockLastDrive) + 1)

$ConfigurationData = @{
AllNodes = @(
@{
NodeName = 'localhost'

InstanceName = 'DSCRS2016'
Features = 'RS'
InstallSharedDir = 'C:\Program Files\Microsoft SQL Server'
InstallSharedWOWDir = 'C:\Program Files (x86)\Microsoft SQL Server'
UpdateEnabled = 'False'
SuppressReboot = $true # Make sure we don't reboot during testing.
ForceReboot = $false

ImagePath = "$env:TEMP\SQL2016.iso"
DriveLetter = $mockIsoMediaDriveLetter

RSSQLServer = $env:COMPUTERNAME
RSSQLInstanceName = 'DSCSQL2016'

PSDscAllowPlainTextPassword = $true
}
)
}

Configuration MSFT_xSQLServerRSConfig_InstallReportingServices_Config
{
param
(
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.PSCredential]
$SqlInstallCredential,

[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.PSCredential]
$ReportingServicesServiceCredential,

[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.Management.Automation.PSCredential]
$SqlAdministratorCredential
)

Import-DscResource -ModuleName 'PSDscResources'
Import-DscResource -ModuleName 'xStorage'
Import-DscResource -ModuleName 'xSQLServer'

node localhost {
xMountImage 'MountIsoMedia'
{
ImagePath = $Node.ImagePath
DriveLetter = $Node.DriveLetter
Ensure = 'Present'
}

xWaitForVolume 'WaitForMountOfIsoMedia'
{
DriveLetter = $Node.DriveLetter
RetryIntervalSec = 5
RetryCount = 10
}

User 'CreateReportingServicesServiceAccount'
{
Ensure = 'Present'
UserName = Split-Path -Path $ReportingServicesServiceCredential.UserName -Leaf
Password = $ReportingServicesServiceCredential
}

WindowsFeature 'NetFramework45'
{
Name = 'NET-Framework-45-Core'
Ensure = 'Present'
}

xSQLServerSetup 'InstallReportingServicesInstance'
{
InstanceName = $Node.InstanceName
Features = $Node.Features
SourcePath = "$($Node.DriveLetter):\"
BrowserSvcStartupType = 'Automatic'
RSSvcAccount = $ReportingServicesServiceCredential
InstallSharedDir = $Node.InstallSharedDir
InstallSharedWOWDir = $Node.InstallSharedWOWDir
UpdateEnabled = $Node.UpdateEnabled
SuppressReboot = $Node.SuppressReboot
ForceReboot = $Node.ForceReboot

# This must be set if using SYSTEM account to install.
SQLSysAdminAccounts = @(
$SqlAdministratorCredential.UserName
)

DependsOn = @(
'[xMountImage]MountIsoMedia'
'[User]CreateReportingServicesServiceAccount'
'[WindowsFeature]NetFramework45'
)

PsDscRunAsCredential = $SqlInstallCredential
}

xSQLServerRSConfig 'Integration_Test'
{
# Instance name for the Reporting Services.
InstanceName = $Node.InstanceName

<#
Instance for Reporting Services databases.
Note: This instance is created in a prior integration test.
#>
RSSQLServer = $Node.RSSQLServer
RSSQLInstanceName = $Node.RSSQLInstanceName

PsDscRunAsCredential = $SqlInstallCredential

DependsOn = @(
'[xSQLServerSetup]InstallReportingServicesInstance'
)
}
}
}

0 comments on commit 9ce87a8

Please sign in to comment.