tests/PSTS.library.Tests.ps1

if ($PSScriptRoot -eq $null) {
    $PSScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
}

. "$PSScriptRoot\helper.ps1"

describe 'Get-PSTSSecureFile' {

    # Arrange
    $data = @([SecureFile]::new(); [SecureFile]::new())

    $expectedResult = New-Object -TypeName "PSObject"

    $expectedResult | Add-Member -MemberType NoteProperty "Count" -Value $data.Count
    $expectedResult | Add-Member -MemberType NoteProperty "value" -Value $data

    arrange -result $expectedResult

    # Act
    $result = Get-PSTSSecureFile -project fakeProject

    #Assert
    it "should return $($expectedResult.value)" {
        $result.Count | should be $expectedResult.value.Count
    }

    It "Uses the mock" {
        Assert-VerifiableMock
    }
}

describe 'Update-PSTSSecureFiles' {

     # Arrange
     Mock -Verifiable Update-PSTSSecureFiles
     # Act
     Update-PSTSSecureFiles -project fakeProject -path fakePath
 
     #Assert
     It "Uses the mock" {
         Assert-VerifiableMock
     }
    
}


Describe 'Remove-PSTSSecureFile' {
    
    # Arrange
    Mock -Verifiable Remove-PSTSSecureFile
    # Act
    Remove-PSTSSecureFile -project fakeProject -id fakeId

    #Assert
    It "Uses the mock" {
        Assert-VerifiableMock
    }
}


describe 'Get-PSTSVariablesGroup' {

    # Arrange
    $data = @([VariableGroup]::new(); [VariableGroup]::new())

    $expectedResult = New-Object -TypeName "PSObject"

    $expectedResult | Add-Member -MemberType NoteProperty "Count" -Value $data.Count
    $expectedResult | Add-Member -MemberType NoteProperty "value" -Value $data

    arrange -result $expectedResult

    # Act
    $result = Get-PSTSVariablesGroup -project fakeProject

    #Assert
    it "should return $($expectedResult.value)" {
        $result.Count | should be $expectedResult.value.Count
    }

    It "Uses the mock" {
        Assert-VerifiableMock
    }

}



describe 'Add-PSTSSecureFile' {

    # Arrange
    $expectedResult = [SecureFile]::new()

    $expectedResult.name = "fakeName"
    arrange -result $expectedResult

    # Act
    $result = Add-PSTSSecureFile `
    -project fakeProject `
    -name fakeName `
    -file "$PSScriptRoot\helper.ps1"

    #Assert
    it "should return $($expectedResult)" {
        $result.name | should be $expectedResult.name
    }

    It "Uses the mock" {
        Assert-VerifiableMock
    }

    it "should throw if file invalid" {
        $invalidFile = "invalidFile.txt"
        { Add-PSTSSecureFile -project fakeProject -name fakeName -file $invalidFile } | Should Throw "the file $invalidFile could not be found"
    }

}

describe 'Add-PSTSVariableGroup' {
    # Test Set 1

    # Arrange
    $expectedResult = [VariableGroup]::new()
    $expectedResult.variables = @{}

    $expectedResult.variables.add("key1", "val1")
    $expectedResult.variables.add("key2", "val2")

    arrange -result $expectedResult

    # Act
    $result = Add-PSTSVariableGroup `
       -project fakeProject `
       -name "fakeName" `
       -variables @{"key1"="val1"; "key2"="val2"}

    # Assert
    It "should return $($expectedResult)" {
        $result.GetType() | should be $expectedResult.GetType()
    }
    It "Uses the mock" {
        Assert-VerifiableMock
    }

}

describe 'Add-PSTSVariableGroup' {
    # Test Set 2

    # Arrange
    $expectedResult = [VariableGroup]::new()
    $expectedResult.variables = @{}

    $expectedResult.variables.Add("fakeVaultKey", "")
    $expectedResult.variables.Add("fakeVaultKey2", "")

    $expectedResult.providerData = [ProviderData]::new(0, $vault)

    arrange -result $expectedResult

    # Act
    $result = Add-PSTSVariableGroup `
       -project fakeProject `
       -name "fakeName" `
       -vault "fakeVault" `
       -serviceEndpoint "fakeServiceEndPointId" `
       -vaultKeys @("fakeVaultKey"; "fakeVaultKey2")

    # Assert
    It "should return $($expectedResult)" {
        $result.GetType() | should be $expectedResult.GetType()
    }
    It "Uses the mock" {
        Assert-VerifiableMock
    }


}

describe 'Link-PSTSVariableGroup' {

    # Arrange
    $expectedResult = [Object]@{
        variableGroups = 12
    }

    arrange -result $expectedResult

    $obj = [Object]@{
        variableGroups = ""
    }

    # Act
    $result = Link-PSTSVariableGroup `
    -variableGroup 12 `
    -definition $obj

    # Assert
    it "should append id to variableGroups" {
        $result.value | should -Be $expectedResult.value
    }
}

describe 'Link-PSTSVariableGroup' {

    # Arrange
    $obj = [BuildDefinition]@{
        quality = "fakeQuality"
        authoredBy = $null
        drafts = $null
        queue = $null
        id = 1
        name = "fakeName"
        _links = $null
        url = $null
        uri = $null
        path = $null
        type = $null
        queueStatus = $null
        revision = $null
        createdDate = Get-Date
        project = $null
        variableGroup = 12
    }::new()

    # Act
    $result = Link-PSTSVariableGroup `
    -variableGroup 12 `
    -definition $obj

    # Assert
    it "should return $($obj)" {
        $result.value | Should -Be $obj.value
    }
}

describe 'Update-PSTSVariableGroup' {
    # Test Set 1

    # Arrange

    $variableGroup = [VariableGroup]@{
        variables = [hashtable]::new()
        id = 1
        type = $null
        name = "fakeName"
        providerData = $null
        createdOn = Get-Date
        createdBy = $null
        modifiedOn = Get-Date
        modifiedBy = $null
        isShared = $true
    }

    $variablesTable = @{
        variable1 = "value1"
    }

    $expectedResult = [VariableGroup]@{
        variables = [hashtable]::new()
        id = 1
        type = $null
        name = "fakeName"
        providerData = $null
        createdOn = $variableGroup.createdOn
        createdBy = $null
        modifiedOn = $variableGroup.modifiedOn
        modifiedBy = $null
        isShared = $true
    }
    $expectedResult.variables.add("variable1", "value1")

    arrange -result $expectedResult

    # Act
    $result = Update-PSTSVariableGroup `
    -project fakeProject `
    -variableGroup $variableGroup `
    -variables $variablesTable


    # Assert
    It "should return $($expectedResult)" {
        $result.name | Should be $expectedResult.name
    }

    It "Uses the mock" {
        Assert-VerifiableMock
    }

}

describe 'Update-PSTSVariableGroup' {
    # Test Set 2

    # Arrange

    $variableGroup = [VariableGroup]@{
        variables = [hashtable]::new()
        id = 1
        type = $null
        name = "fakeName"
        providerData = $null
        createdOn = Get-Date
        createdBy = $null
        modifiedOn = Get-Date
        modifiedBy = $null
        isShared = $true
    }

    $vaultKeys = @("fakeVaultKey"; "fakeVaultKey2")

    $expectedResult = [VariableGroup]@{
        variables = [hashtable]::new()
        id = 1
        type = $null
        name = "fakeName"
        providerData = $null
        createdOn = $variableGroup.createdOn
        createdBy = $null
        modifiedOn = $variableGroup.modifiedOn
        modifiedBy = $null
        isShared = $true
    }
    $expectedResult.variables.add("fakeVaultKey", "")
    $expectedResult.variables.add("fakeVaultKey2", "")

    arrange -result $expectedResult

    # Act
    $result = Update-PSTSVariableGroup `
    -project fakeProject `
    -variableGroup $variableGroup `
    -vaultKeys $vaultKeys


    # Assert
    It "should return $($expectedResult)" {
        $result.name | Should be $expectedResult.name
    }

    It "Uses the mock" {
        Assert-VerifiableMock
    }

}