Tests/CatalogItems/New-RsDataSource.Tests.ps1

# Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
# Licensed under the MIT License (MIT)

Function Create-PSCredential
{
    param(
            [Parameter(Mandatory = $True)]
            [string]$UserName,
            [Parameter(Mandatory = $True)]
            [string]$Password
        )
       $SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
       $ps_credential = New-Object System.Management.Automation.PSCredential ($UserName, $SecurePassword)
       Return $ps_credential 
}

Function Get-ExistingDataExtension
{
        $proxy = New-RsWebServiceProxy
        return $proxy.ListExtensions("Data")[0].Name
}

Describe "New-RsDataSource" {
    Context "Create RsDataSource with minimun parameters"{
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSourceMinParameters' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'None'
        $dataSourcePath = '/' + $dataSourceName
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval
        $dataSource = Get-RsDataSource -Path $dataSourcePath
        It "Should be a new data source" {
            $dataSource.Count | Should Be 1
            $dataSource.Extension | Should Be $extension
            $dataSource.CredentialRetrieval | Should Be $credentialRetrieval

        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource with ReportServerUri parameter"{
        # Declare datasource Name, Extension, CredentialRetrieval, ReportServerUri and DataSource path.
        $dataSourceName = 'SutDataSourceReportServerUriParameter' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'None'
        $reportServerUri = 'http://localhost/reportserver'
        $dataSourcePath = '/' + $dataSourceName
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -ReportServerUri $reportServerUri
        It "Should be a new data source" {
            {Get-RsDataSource -Path $dataSourcePath } | Should not throw
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource with Proxy parameter"{
        # Declare datasource Name, Extension, CredentialRetrieval, Proxy and DataSource path.
        $dataSourceName = 'SutDataSourceProxyParameter' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'None'
        $proxy = New-RsWebServiceProxy 
        $dataSourcePath = '/' + $dataSourceName
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -Proxy $proxy
        It "Should be a new data source" {
            {Get-RsDataSource -Path $dataSourcePath } | Should not throw
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource with connection string parameter"{
        # Declare datasource Name, Extension, CredentialRetrieval, Connection String and DataSource path.
        $dataSourceName = 'SutDataSourceConnectionStringParameter' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'None'
        $connectionString =  'Data Source=localhost;Initial Catalog=ReportServer'
        $dataSourcePath = '/' + $dataSourceName
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -ConnectionString $connectionString
        $dataSource = Get-RsDataSource -Path $dataSourcePath
        It "Should be a new data source" {
            $dataSource.Count | Should Be 1
            $dataSource.Extension | Should Be $extension
            $dataSource.CredentialRetrieval | Should Be $credentialRetrieval
            $dataSource.ConnectString | Should Be $connectionString
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource with Proxy and ReportServerUri parameters"{
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSourceProxyAndReportServerUriParameters' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'None'
        $proxy = New-RsWebServiceProxy 
        $dataSourcePath = '/' + $dataSourceName
        $reportServerUri = 'http://localhost/reportserver'
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -Proxy $proxy -ReportServerUri $reportServerUri
        It "Should be a new data source" {
            {Get-RsDataSource -Path $dataSourcePath } | Should not throw
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

     Context "Create RsDataSource with unsupported RsDataSource Extension validation"{
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSurceExtensionException' + [guid]::NewGuid()
        $extension = 'InvalidExtension'
        $credentialRetrieval = 'Integrated'
        $dataSourcePath = '/' + $dataSourceName
        It "Should throw an exception when datasource is failed to be create" {
             { New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval } | Should throw 
             { Get-RsDataSource -Path $dataSourcePath } | Should throw
        }
    }

    Context "Create RsDataSource with STORE credential validation" {
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSurceStoreException' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'Store'
        $dataSourcePath = '/' + $dataSourceName
        It "Should throw an exception when Store credential retrieval are given without providing credential" {
            { New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval } | Should throw 
            { Get-RsDataSource -Path $dataSourcePath } | Should throw
        }
    }

    Context "Create RsDataSource with Data Source Credentials" {
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSurceCredentials' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'Store'
        $dataSourcePath = '/' + $dataSourceName
        # Creation of PSCredentials
        $password ='MyPassword'
        $userName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
        $dataSourceCredentials = Create-PSCredential -User $userName -Password $password
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -DatasourceCredentials $dataSourceCredentials
        It "Should be a new data source" {
            {Get-RsDataSource -Path $dataSourcePath } | Should not throw
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    # Impersonate parameter doesn´t change
    # Context "Create RsDataSource with ImpersonateUser Parameter"{
    # # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
    # $dataSourceName = 'SutDataSurceImpersonateUser' + [guid]::NewGuid()
    # $extension = Get-ExistingDataExtension
    # $credentialRetrieval = 'Store'
    # $dataSourcePath = '/' + $dataSourceName
    # # Creation of PSCredentials
    # $password ='MyPassword'
    # $userName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
    # $dataSourceCredentials = Create-PSCredential -User $userName -Password $password
    # New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -DatasourceCredentials $dataSourceCredentials -ImpersonateUser
    # $dataSource = Get-RsDataSource -Path $dataSourcePath
    # It "Should be a new data source" {
    # $dataSource.Count | Should Be 1
    # $dataSource.ImpersonateUser | Should Be $true
    # }
    # # Removing folders used for testing
    # Remove-RsCatalogItem -RsFolder $dataSourcePath
    # }

    Context "Create RsDataSource with Windows Credentials Parameter"{
        # Declare datasource Name, Extension, CredentialRetrieval, and DataSource path.
        $dataSourceName = 'SutDataSurceWindowsCredentials' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'Store'
        $dataSourcePath = '/' + $dataSourceName
        # Creation of PSCredentials
        $password ='MyPassword'
        $userName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
        $dataSourceCredentials = Create-PSCredential -User $userName -Password $password
        # Test if the DataSource is created
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -DatasourceCredentials $dataSourceCredentials -WindowsCredentials
        $dataSource = Get-RsDataSource -Path $dataSourcePath
        It "Should be a new data source" {
            $dataSource.Count | Should Be 1
            $dataSource.WindowsCredentials | Should Be $true
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource with Prompt Credentials Retrieval"{
        # Declare datasource Name, Extension, CredentialRetrieval (Prompt), and DataSource path.
        $dataSourceName = 'SutDataSurcePrompt' + [guid]::NewGuid()
        $extension = Get-ExistingDataExtension
        $credentialRetrieval = 'Prompt'
        $dataSourcePath = '/' + $dataSourceName
        $prompt = "Please enter your username and password"
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval -Prompt $prompt
        It "Should be a new data source" {
            {Get-RsDataSource -Path $dataSourcePath } | Should not throw
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }

    Context "Create RsDataSource and Overwrite it"{
        # Declare datasource name, extension, credential retrieval, and data source path.
        $dataSourceName = 'SutDataSourceOverwrite' + [guid]::NewGuid()
        $extension = 'SQL'
        $credentialRetrieval = 'Integrated'
        $dataSourcePath = '/' + $dataSourceName
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrieval
        # Overwrite the existing RsDataSource
        $credentialRetrievalChange = 'None'
        New-RsDataSource -RsFolder '/' -Name $dataSourceName -Extension $extension -CredentialRetrieval $credentialRetrievalChange -Overwrite
        $dataSource = Get-RsDataSource -Path $dataSourcePath
        It "Should overwrite a datasource" {
            $dataSource.CredentialRetrieval | Should be  $credentialRetrievalChange 
            $dataSource.Count | Should Be 1
        }
        # Removing folders used for testing
        Remove-RsCatalogItem -RsFolder $dataSourcePath
    }
}