Test/PSModule/PSModule.Get.Tests.ps1

#
# Copyright (c) Microsoft Corporation.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
$CurrentDirectory = Split-Path -Parent $MyInvocation.MyCommand.Path

.  "$CurrentDirectory\..\OneGetTestHelper.ps1"

#
# Pre-Requisite: MyTestModule 1.1, 1.1.2, 3.2.1 are available under the $LocalRepositoryPath for testing purpose only.
# It's been taken care of by SetupPSModuleTest
#

# Calling the setup function
SetupPSModuleTest

Describe -Name  "PSModule Get-TargetResource Basic Tests" -Tags "BVT" {

    BeforeEach {

        # Remove all left over files if exists
        Remove-Item "$($InstallationFolder)\MyTestModule" -Recurse -Force  -ErrorAction SilentlyContinue      
    }

    AfterEach {

    }     


    # Register a local module repository to make the test run faster. This gets called once per Describe.
    RegisterRepository -Name "LocalRepository" -InstallationPolicy Trusted -Ensure Present

    It "Get-TargetResource with the Mandatory Parameters: Check Present" {            
            
            # Calling Set-TargetResource to install the MyTestModule
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "3.2.1" -Ensure "Present" -Verbose

            # Calling Get-TargetResource in the PSModule resource
            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository 

            # Validate the result
            $result.Ensure | should be "Present"
        }

    It -Skip "Get-TargetResource given the different versions of modules on the same repository: Check Present" {            
           
            #Calling Set-TargetResource to install the module
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "3.2.1" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1" -Ensure "Present" -Verbose

            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository 

            #Validate the returned results. You can also use "Get-Module -ListAvailable -name MyTestModule" to find these info
            $result.Ensure | should be "Present"
            $result.Name | should be "MyTestModule"
            $result.Repository | should be $LocalRepository
            $result.InstalledVersion | should be "3.2.1"
            $result.InstallationPolicy | should be "Trusted"
            ($result.Author.Length -ne 0)  | should be $true 
            $result.ModuleType | should be "Manifest"
            $result.ModuleBase.StartsWith($InstallationFolder ) | should be $true         
            ($result.Description.Length -ne 0)  | should be $true  
        }

    It "Get-TargetResource with RequiredVersion: Check Present" {
            
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose

            # Provide a req version that exists, expect ensure=Present
            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2"

            #Validate the returned results
            $result.Ensure | should be "Present"
            $result.Name | should be "MyTestModule"
            $result.InstalledVersion | should be "1.1.2"    
        }

    It "Get-TargetResource with Non-exist RequiredVersion: Check Absent" {
            
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository  -RequiredVersion "1.1.2" -Ensure "Present" -Verbose

            #Provide a req version does not exist, expect Ensure=Absent
            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository -RequiredVersion "10.11.12"

            #Validate the returned results
            $result.Ensure | should be "Absent"  
        }

    It -Skip "Get-TargetResource with MaximumVersion: Check Present" {
            
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "3.2.1" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose

            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository  -MaximumVersion "2.0"
                
            $result.Ensure | should be "Present"         
            $result.InstalledVersion | should be "1.1.2"  #1.1.2 is the only module -le maximumversion
        }

    It -Skip "Get-TargetResource MinimumVersion: Check Present" {
            
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1"   -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "3.2.1" -Ensure "Present" -Verbose

            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository  -MinimumVersion "1.1.1"

            $result.Ensure | should be "Present"
            $result.InstalledVersion | should be "3.2.1"  #Here two modules: 1.1.1 and 3.2.1 are qualified. Get-Target will return the latest
        }

    It -Skip "Get-TargetResource MinimumVersion and MaximumVersion: Check Present" {
            
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1" -Ensure "Present" -Verbose
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "3.2.1" -Ensure "Present" -Verbose

            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository  -MinimumVersion "1.0"  -MaximumVersion "2.0"

            $result.Ensure | should be "Present"
            $result.InstalledVersion | should be "1.1.2"  
        }
        
}#Describe

Describe -Name "PSModule Get-TargetResource Error Cases" -Tags "RI" {

    BeforeEach {

        #Remove all left over files if exists
        Remove-Item "$($InstallationFolder)\MyTestModule" -Recurse -Force  -ErrorAction SilentlyContinue
    }

    AfterEach {

    }

    #Register a local module repository to make the test run faster. This gets called once per Describe.
    RegisterRepository -Name "LocalRepository" -InstallationPolicy Trusted -Ensure Present

    # Not allow Max, Req and Min co-existance
    It "Get-TargetResource with Max, Req and Min Verion: Check Absent" {
      
        Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose

        $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository  `
                                        -MinimumVersion "1.0" -RequiredVersion "1.1.1" -MaximumVersion "2.3.5"                                     
       
        # Get-Target does not throw, so check 'Absent' is enough here
        $result.Ensure | should be "Absent"
    }
    
    # Min should le Max
    It "Get-TargetResource with Max le Min Verion: Check Absent" {

      
            Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose
            
            $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository $LocalRepository  `
                                         -MinimumVersion "5.0" -MaximumVersion "2.5"                                    

           $result.Ensure | should be "Absent"                
    }

    It "Get-TargetResource with NoneExistRepository: Check Absent" {

        Set-TargetResource -name "MyTestModule" -Repository $LocalRepository -RequiredVersion "1.1.2" -Ensure "Present" -Verbose
            
        $result = MSFT_PSModule\Get-TargetResource -Name "MyTestModule" -Repository "NoneExistRepository"  `
                                        -MinimumVersion "1.0" -MaximumVersion "2.5"

        $result.Ensure | should be "Absent"
    }
}