tests/PSTS.build.Tests.ps1

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

. "$PSScriptRoot\helper.ps1"

describe 'Get-PSTSBuildDefinition-byId' {

    # Arrange
    $data = @([BuildDefinition]::new(); [BuildDefinition]::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-PSTSBuildDefinition `
    -project fakeProject `
    -buildId fakeId

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

    it "should return $($expectedResult.value)" {
        $result.Count | should -Be $expectedResult.value.Count
    }
}

describe 'Get-PSTSBuildDefinition-byFile' {

    # Arrange
    $data = @([BuildDefinition]::new(); [BuildDefinition]::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-PSTSBuildDefinition `
    -inFile "./assets/BuildDefinition.json"

    it "should return $true" {
        $result.name | should -Be "tetris2"
    }
}

describe 'Export-PSTSBuildDefinition' {

    # Arrange
    Mock -Verifiable -ModuleName PSTS Get-PSTSBuildDefinition -MockWith {
        $obj = [PSCustomObject]@{
            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
        }::new()
        return $obj
    }

    # Act
    Export-PSTSBuildDefinition `
    -project fakeProject `
    -buildId 1 `
    -outFile ".\fakeExport.json"

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

    It "file should -Be same as result" {
        [BuildDefinition]$fileContent = Get-Content ".\fakeExport.json" | ConvertFrom-Json
        $fileContent.value | Should -Be $obj.value
    }
}

describe 'Update-PSTSAuthorizedResource' {



    # Arrange
    $data = @([AuthorizedResource]::new(); [AuthorizedResource]::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 = Update-PSTSAuthorizedResource `
    -project fakeProject `
    -authorized $true `
    -type fakeType `
    -name fakeName `
    -id fakeId

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

    it "should return $($expectedResult.value)" {
        $result.Count | should -Be $expectedResult.value.Count
    }
}


describe 'Add-PSTSBuildDefinitionProperty' {

    # Arrange
    $expectedResult = [BuildDefinition]::new()
    $expectedResult.name = "fakeName"
    arrange -result $expectedResult

    # Act
    $file = "fakepath"
    $result = Add-PSTSBuildDefinitionProperty -buildDefinition $expectedResult -name "fakeName"

    #Assert

    it "should return fakePath and fakeName" {
        $result.name | should -Be $expectedResult.name
    }
}

describe 'Add-PSTSBuildDefinition-byObject' {

    # Arrange
    $expectedResult = [BuildDefinition]::new()
    $expectedResult.name = "fakeBuild"

    arrange -result $expectedResult

    # Act
    $result = Add-PSTSBuildDefinition -project fakeProject -buildDefinition $expectedResult

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

    it "should return $($expectedResult.value)" {
        $result.name | should -Be $expectedResult.name
    }
}

describe 'Add-PSTSBuildDefinition-byFile' {

    # Arrange
    $expectedResult = [BuildDefinition]::new()
    $expectedResult.name = "fakeBuild"
    
    arrange -result $expectedResult

    # Act
    $file = "fakepath"
    $result = Add-PSTSBuildDefinition -project fakeProject -inFile $file

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

    it "should return $($expectedResult.value)" {
        $result.name | should -Be $expectedResult.name
    }
}

describe 'Add-PSTSBuildDefinitionTrigger' {

    # Arrange
    $buildDefinition = [BuildDefinition]::new()
    [BuildDefinitionTrigger]$trigger = [BuildDefinitionTrigger]::new()
    $buildDefinition.triggers+=$trigger

    arrange -result $buildDefinition

    # Act
    $result = Add-PSTSBuildDefinitionTrigger -buildDefinition $buildDefinition -environment fakeEnvironment -targetBuildName $true

    #Assert
   
   it "should return $($result)" {
     $result.triggers.branchFilters | should -HaveCount 3
     $result.triggers.branchFilters[1] | should -Contain("+fakeEnvironment")
     $result.triggers.triggerType[1] | should -Be "continuousIntegration"
     $result.triggers.branchFilters[2] | should -Contain("+refs/heads/")
     $result.triggers.triggerType[2] | should -Be "buildCompletion"
     $result.triggers[2].definition.project | should -Not -Be $null 
     $result.triggers[2].requiresSuccessfulBuild | should -Be $true
   }
}