internal/functions/Get-ReadmeContent.Tests.ps1

Describe 'Get-ReadmeContent' -Tag 'Unit' {
  BeforeAll {
    $ModuleRootPath = Split-Path -Parent $PSCommandPath |
      Split-Path -Parent |
      Split-Path -Parent
    Import-Module "$ModuleRootPath/Puppet.Dsc.psd1"
    . $PSCommandPath.Replace('.Tests.ps1', '.ps1')
  }

  InModuleScope Puppet.Dsc {
    Context 'Basic verification' {
      BeforeAll {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = 'foo_bar'
        }
        $Result = Get-ReadmeContent @Parameters
      }
      It 'Has the puppet module name as the title' {
        $Result | Should -MatchExactly "# $($Parameters.PuppetModuleName)"
      }
      It 'Includes the link to the builder, the upstream module, and the module version in the first para' {
        $Result | Should -MatchExactly '\[Puppet DSC Builder\]\(.+\)'
        $Result | Should -MatchExactly "\[$($Parameters.PowerShellModuleName)\]\($($Parameters.PowerShellModuleGalleryUri)\)"
        $Result | Should -MatchExactly "v$([Regex]::Escape($Parameters.PowerShellModuleVersion))"
      }
      It 'Includes the module description as a quote' {
        $Result | Should -MatchExactly "> _$($Parameters.PowerShellModuleDescription)_"
      }
      It 'Links to the Resource API and pwshlib dependencies' {
        $Result | Should -MatchExactly '\[Puppet Resource API\]\(.+\)'
        $Result | Should -MatchExactly '\[puppetlabs/pwshlib\]\(.+\)'
      }
      It 'Links to the base provider on github' {
        $Result | Should -MatchExactly '\(https://github.com/.+/dsc_base_provider.rb\)'
      }
      It 'Links to further narrative documentation' {
        $Result | Should -MatchExactly '\[narrative documentation\]\(.+\)'
      }
      It 'Links to the issues page for the builder, the pwslib module, and the upstream module' {
        $Result | Should -MatchExactly '\[file an issue\]\(.+puppetlabs/Puppet.Dsc/issues/new/choose\)'
        $Result | Should -MatchExactly '\[file an issue\]\(.+puppetlabs/ruby-pwsh/issues/new/choose\)'
        $Result | Should -MatchExactly "\[file an issue\]\($($Parameters.PowerShellModuleProjectUri)\)"
      }
    }
    Context 'Parameter handling' {
      It 'Marks the PowerShellModuleName parameter as mandatory' {
        (Get-Command -Name Get-ReadmeContent).Parameters['PowerShellModuleName'].Attributes |
          Where-Object -FilterScript { $_ -is [parameter] } |
          Select-Object -ExpandProperty Mandatory | Should -Be $true
      }
      It 'Marks the PuppetModuleName parameter as mandatory' {
        (Get-Command -Name Get-ReadmeContent).Parameters['PuppetModuleName'].Attributes |
          Where-Object -FilterScript { $_ -is [parameter] } |
          Select-Object -ExpandProperty Mandatory | Should -Be $true
      }
      It 'Errors if the PowerShellModuleName is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = ''
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = 'foo_bar'
        }
        { Get-ReadmeContent @Parameters } | Should -Throw "Cannot validate argument on parameter 'PowerShellModuleName'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again."
      }
      It 'Errors if the PowerShellModuleDescription is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = ''
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = 'foo_bar'
        }
        { Get-ReadmeContent @Parameters } | Should -Throw "Cannot validate argument on parameter 'PowerShellModuleDescription'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again."
      }
      It 'Errors if the PowerShellModuleGalleryUri is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = ''
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = 'foo_bar'
        }
        { Get-ReadmeContent @Parameters } | Should -Throw "Cannot validate argument on parameter 'PowerShellModuleGalleryUri'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again."
      }
      It 'Uses the PowerShellModuleGalleryUri for the PowerShellModuleProjectUri if the PowerShellModuleProjectUri is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = ''
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = 'foo_bar'
        }
        $Result = Get-ReadmeContent @Parameters
        $Result | Should -MatchExactly "\[file an issue\]\($($Parameters.PowerShellModuleGalleryUri)\)"
      }
      It 'Errors if the PowerShellModuleVersion is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = ''
          PuppetModuleName            = 'foo_bar'
        }
        { Get-ReadmeContent @Parameters } | Should -Throw "Cannot validate argument on parameter 'PowerShellModuleVersion'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again."
      }
      It 'Errors if the PuppetModuleName is specified as an empty string' {
        $Parameters = @{
          PowerShellModuleName        = 'Foo.Bar'
          PowerShellModuleDescription = 'Foo and bar and baz!'
          PowerShellModuleGalleryUri  = 'https://powershellgallery.com/Foo.Bar/1.0.0'
          PowerShellModuleProjectUri  = 'https://github.com/Baz/Foo.Bar'
          PowerShellModuleVersion     = '1.0.0'
          PuppetModuleName            = ''
        }
        { Get-ReadmeContent @Parameters } | Should -Throw "Cannot validate argument on parameter 'PuppetModuleName'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again."
      }
    }
  }
}