Functions/Get-JiraProject.Tests.ps1

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"

InModuleScope PSJira {

    $jiraServer = 'http://jiraserver.example.com'

    $projectKey = 'IT'
    $projectId = '10003'
    $projectName = 'Information Technology'

    $projectKey2 = 'TEST'
    $projectId2 = '10004'
    $projectName2 = 'Test Project'

    $restResultAll = @"
[
  {
    "self": "$jiraServer/rest/api/2/project/10003",
    "id": "$projectId",
    "key": "$projectKey",
    "name": "$projectName",
    "projectCategory": {
      "self": "$jiraServer/rest/api/2/projectCategory/10000",
      "id": "10000",
      "description": "All Project Catagories",
      "name": "All Project"
    }
  },
  {
    "self": "$jiraServer/rest/api/2/project/10121",
    "id": "$projectId2",
    "key": "$projectKey2",
    "name": "$projectName2",
    "projectCategory": {
      "self": "$jiraServer/rest/api/2/projectCategory/10000",
      "id": "10000",
      "description": "All Project Catagories",
      "name": "All Project"
    }
  }
]
"@


    $restResultOne = @"
[
  {
    "self": "$jiraServer/rest/api/2/project/10003",
    "id": "$projectId",
    "key": "$projectKey",
    "name": "$projectName",
    "projectCategory": {
      "self": "$jiraServer/rest/api/2/projectCategory/10000",
      "id": "10000",
      "description": "All Project Catagories",
      "name": "All Project"
    }
  }
]
"@


    Describe "Get-JiraProject" {
        Mock Get-JiraConfigServer -ModuleName PSJira {
            Write-Output $jiraServer
        }

        Mock Invoke-JiraMethod -ModuleName PSJira -ParameterFilter {$Method -eq 'Get' -and $URI -eq "$jiraServer/rest/api/latest/project"} {
            ConvertFrom-Json2 $restResultAll
        }

        Mock Invoke-JiraMethod -ModuleName PSJira -ParameterFilter {$Method -eq 'Get' -and $URI -eq "$jiraServer/rest/api/latest/project/${projectKey}?expand=projectKeys"} {
            ConvertFrom-Json2 $restResultOne
        }

        Mock Invoke-JiraMethod -ModuleName PSJira -ParameterFilter {$Method -eq 'Get' -and $URI -eq "$jiraServer/rest/api/latest/project/${projectId}?expand=projectKeys"} {
            ConvertFrom-Json2 $restResultOne
        }

        Mock Invoke-JiraMethod -ModuleName PSJira -ParameterFilter {$Method -eq 'Get' -and $URI -eq "$jiraServer/rest/api/latest/project/${projectKey}expand=projectKeys"} {
            ConvertFrom-Json2 $restResultOne
        }

        # Generic catch-all. This will throw an exception if we forgot to mock something.
        Mock Invoke-JiraMethod -ModuleName PSJira {
            Write-Host " Mocked Invoke-JiraMethod with no parameter filter." -ForegroundColor DarkRed
            Write-Host " [Method] $Method" -ForegroundColor DarkRed
            Write-Host " [URI] $URI" -ForegroundColor DarkRed
            throw "Unidentified call to Invoke-JiraMethod"
        }

# Mock Write-Debug {
# Write-Host "DEBUG: $Message" -ForegroundColor Yellow
# }

        #############
        # Tests
        #############

        It "Returns all projects if called with no parameters" {
            $allResults = Get-JiraProject
            $allResults | Should Not BeNullOrEmpty
            @($allResults).Count | Should Be (ConvertFrom-Json2 -InputObject $restResultAll).Count
        }

        It "Returns details about specific projects if the project key is supplied" {
            $oneResult = Get-JiraProject -Project $projectKey
            $oneResult | Should Not BeNullOrEmpty
            @($oneResult).Count | Should Be 1
        }

        It "Returns details about specific projects if the project ID is supplied" {
            $oneResult = Get-JiraProject -Project $projectId
            $oneResult | Should Not BeNullOrEmpty
            @($oneResult).Count | Should Be 1
        }

        It "Provides the key of the project" {
            $oneResult = Get-JiraProject -Project $projectKey
            $oneResult.Key | Should Be $projectKey
        }

        It "Provides the ID of the project" {
            $oneResult = Get-JiraProject -Project $projectKey
            $oneResult.Id | Should Be $projectId
        }
    }
}