feat(Page): add tests
refactor(Page): convert functions to be usable with pipelines this isn't complete though, will finish this tomorrow
This commit is contained in:
parent
3882b1089e
commit
40c988ee45
2 changed files with 635 additions and 181 deletions
443
PSConfluencePublisher/Page.Tests.ps1
Executable file
443
PSConfluencePublisher/Page.Tests.ps1
Executable file
|
|
@ -0,0 +1,443 @@
|
|||
#!/usr/bin/env pwsh
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
BeforeAll {
|
||||
Import-Module (Join-Path $PSScriptRoot 'PSConfluencePublisher.psd1') -Force
|
||||
}
|
||||
|
||||
|
||||
AfterAll {
|
||||
|
||||
}
|
||||
|
||||
|
||||
Describe 'Get-CachedPageMeta' `
|
||||
{
|
||||
Context 'Parameterized' `
|
||||
{
|
||||
It 'returns page meta when title exists' `
|
||||
{
|
||||
$mockPageName = 'Testitest'
|
||||
|
||||
$mockPageMeta = @{
|
||||
'foo' = 'bar'
|
||||
}
|
||||
|
||||
$mockManifest = @{
|
||||
'pages' = @{
|
||||
$mockPageName = $mockPageMeta
|
||||
}
|
||||
}
|
||||
|
||||
$meta = Get-CachedPageMeta `
|
||||
-Title $mockPageName `
|
||||
-Manifest $mockManifest
|
||||
|
||||
$meta | Should -Be $mockPageMeta
|
||||
}
|
||||
|
||||
It 'returns null of title does not exist' `
|
||||
{
|
||||
$mockPageName = 'Testitest'
|
||||
|
||||
|
||||
$mockManifest = @{
|
||||
'pages' = @{}
|
||||
}
|
||||
|
||||
$meta = Get-CachedPageMeta `
|
||||
-Title $mockPageName `
|
||||
-Manifest $mockManifest
|
||||
|
||||
$meta | Should -Be $null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Describe 'Get-PageMeta' `
|
||||
{
|
||||
Context 'Parameterized' `
|
||||
{
|
||||
It 'returns cache when present' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockPageMeta = @{
|
||||
'foo' = 'bar'
|
||||
}
|
||||
|
||||
Mock Get-CachedPageMeta {
|
||||
$mockPageMeta
|
||||
}
|
||||
|
||||
$meta = Get-PageMeta `
|
||||
-Host 'foobar' `
|
||||
-Title 'foobar' `
|
||||
-Space 'foobar' `
|
||||
-Manifest @{}
|
||||
|
||||
$meta | Should -Be $mockPageMeta
|
||||
}
|
||||
}
|
||||
|
||||
It 'gets a page id remotely if there is exactly one result' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockPageMeta = @{
|
||||
'PageId' = 'page_id'
|
||||
'Version' = 'version'
|
||||
'Hash' = 'hash'
|
||||
'Ref' = 'ref'
|
||||
}
|
||||
|
||||
Mock Get-PersonalAccessToken {"012345678901234567890"}
|
||||
|
||||
Mock Update-PageMeta {
|
||||
#FIXME: wrong scope
|
||||
Should -Invoke 'Update-PageMeta' -Exactly -Times 1
|
||||
|
||||
$PageId | Should -Be '123'
|
||||
|
||||
$Version | Should -Be 9
|
||||
|
||||
$Title | Should -Be 'foobar'
|
||||
|
||||
$mockPageMeta
|
||||
}
|
||||
|
||||
Mock Invoke-WebRequest {
|
||||
@{
|
||||
'Content' = '{"results": [{"id": "123","_expandable":{"version": 9}}]}'
|
||||
}
|
||||
}
|
||||
|
||||
$meta = Get-PageMeta `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Title 'foobar' `
|
||||
-Space 'foobar' `
|
||||
-Manifest @{'Pages'= {}}
|
||||
|
||||
$meta | Should -Be $mockPageMeta
|
||||
}
|
||||
}
|
||||
|
||||
It 'throws an exception, if there is more than one result' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
Mock Get-PersonalAccessToken {"012345678901234567890"}
|
||||
|
||||
Mock Invoke-WebRequest {
|
||||
@{
|
||||
'Content' = '{"results": [{}, {}]}'
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Get-PageMeta `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Title 'foobar' `
|
||||
-Space 'foobar' `
|
||||
-Manifest @{'Pages'= {}}
|
||||
} | Should -Throw
|
||||
}
|
||||
}
|
||||
|
||||
It 'throws an exception, if there is no result' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
Mock Get-PersonalAccessToken {"012345678901234567890"}
|
||||
|
||||
Mock Invoke-WebRequest {
|
||||
@{
|
||||
'Content' = '{"results": [{}, {}]}'
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Get-PageMeta `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Title 'foobar' `
|
||||
-Space 'foobar' `
|
||||
-Manifest @{'Pages'= {}}
|
||||
} | Should -Throw
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Describe 'Update-PageMeta' `
|
||||
{
|
||||
Context 'Parameterized' `
|
||||
{
|
||||
It 'fails, if page meta index does not exist' `
|
||||
{
|
||||
{
|
||||
Update-PageMeta `
|
||||
-PageId 'foobar' `
|
||||
-Title 'foobar' `
|
||||
-Manifest @{}
|
||||
} | Should -Throw
|
||||
}
|
||||
|
||||
It 'fails, if page title is not indexed' `
|
||||
{
|
||||
{
|
||||
Update-PageMeta `
|
||||
-PageId 'foobar' `
|
||||
-Title 'foobar' `
|
||||
-Manifest @{'Pages' = @{}}
|
||||
} | Should -Throw
|
||||
}
|
||||
|
||||
It 'updates minimal' `
|
||||
{
|
||||
$mockManifest = @{'Pages' = @{'foobar' = @{}}}
|
||||
|
||||
Update-PageMeta `
|
||||
-Title 'foobar' `
|
||||
-PageId 'pageId' `
|
||||
-Manifest $mockManifest
|
||||
|
||||
$mockManifest.Pages.foobar.PageId | Should -Be 'pageId'
|
||||
}
|
||||
|
||||
It 'updates extended' `
|
||||
{
|
||||
$mockManifest = @{'Pages' = @{'foobar' = @{}}}
|
||||
|
||||
Update-PageMeta `
|
||||
-Title 'foobar' `
|
||||
-PageId 'pageId' `
|
||||
-Version 9001 `
|
||||
-AncestorTitle 'ancestorTitle' `
|
||||
-Hash 'hash' `
|
||||
-Manifest $mockManifest
|
||||
|
||||
$mockManifest.Pages.foobar.PageId | Should -Be 'pageId'
|
||||
|
||||
$mockManifest.Pages.foobar.Version | Should -Be 9001
|
||||
|
||||
$mockManifest.Pages.foobar.AncestorTitle | Should -Be 'ancestorTitle'
|
||||
|
||||
$mockManifest.Pages.foobar.Hash | Should -Be 'hash'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Describe 'New-Page' `
|
||||
{
|
||||
Context 'Parameterized' `
|
||||
{
|
||||
It 'fails, if page meta index does not exist' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockManifest = @{
|
||||
'Pages' = @{
|
||||
'title' = @{
|
||||
'Ref' = 'pages/320okffs.xml'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Mock Get-Content {
|
||||
$Path | Should -Be 'pages/320okffs.xml'
|
||||
|
||||
'foobar'
|
||||
}
|
||||
|
||||
Mock Get-PersonalAccessToken {
|
||||
'01234567890123456789'
|
||||
}
|
||||
|
||||
Mock Invoke-WebRequest {
|
||||
$Uri | Should -Be 'https://confluence.contoso.com/rest/api/content'
|
||||
|
||||
$body_ = $Body | ConvertFrom-JSON
|
||||
|
||||
$body_.type | Should -Be 'page'
|
||||
|
||||
$body_.body.storage.representation | Should -Be 'storage'
|
||||
|
||||
$body_.body.storage.value | Should -Be 'foobar'
|
||||
|
||||
$body_.space.key | Should -Be 'testitest'
|
||||
|
||||
$body_.title | Should -Be 'title'
|
||||
|
||||
@{
|
||||
'Content' = '{"Id": "123", "version": {"number": "1"}}'
|
||||
}
|
||||
}
|
||||
|
||||
New-Page `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Space 'testitest' `
|
||||
-Title 'title' `
|
||||
-Manifest $mockManifest
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Describe 'Update-Page' `
|
||||
{
|
||||
Context 'Parameterized' `
|
||||
{
|
||||
It 'succeeds' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockManifest = @{
|
||||
'Pages' = @{
|
||||
'mockTitle' = @{
|
||||
'Ref' = 'pages/320okffs.xml'
|
||||
'Id' = '0123456789'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Mock Get-Content {
|
||||
$Path | Should -Be 'pages/320okffs.xml'
|
||||
|
||||
'foobar'
|
||||
}
|
||||
|
||||
Mock Get-FileHash {
|
||||
$Path | Should -Be 'pages/320okffs.xml'
|
||||
|
||||
$Algorithm | Should -Be 'SHA256'
|
||||
|
||||
@{
|
||||
'Hash' = 'HASH0123456789'
|
||||
}
|
||||
}
|
||||
|
||||
Mock Get-PersonalAccessToken {
|
||||
'01234567890123456789'
|
||||
}
|
||||
|
||||
Mock Invoke-WebRequest {
|
||||
$Uri | Should -Be 'https://confluence.contoso.com/rest/api/content/'
|
||||
|
||||
$body_ = $Body | ConvertFrom-JSON
|
||||
|
||||
$body_.type | Should -Be 'page'
|
||||
|
||||
$body_.body.storage.representation | Should -Be 'storage'
|
||||
|
||||
$body_.body.storage.value | Should -Be 'foobar'
|
||||
|
||||
$body_.space.key | Should -Be 'testitest'
|
||||
|
||||
$body_.title | Should -Be 'mockTitle'
|
||||
|
||||
@{
|
||||
'Content' = '{"Id": "123", "version": {"number": 2}}'
|
||||
}
|
||||
}
|
||||
|
||||
Update-Page `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Space 'testitest' `
|
||||
-Title 'mockTitle' `
|
||||
-Manifest $mockManifest
|
||||
|
||||
$mockMeta = $mockManifest.Pages.mockTitle
|
||||
|
||||
$mockMeta.Hash | Should -Be 'HASH0123456789'
|
||||
|
||||
$mockMeta.Version | Should -Be 2
|
||||
}
|
||||
}
|
||||
|
||||
It 'skips, if hash unchanged' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockManifest = @{
|
||||
'Pages' = @{
|
||||
'mockTitle' = @{
|
||||
'Ref' = 'pages/320okffs.xml'
|
||||
'Id' = '0123456789'
|
||||
'Hash' = 'HASH0123456789'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Mock Get-Content {
|
||||
$Path | Should -Be 'pages/320okffs.xml'
|
||||
|
||||
'foobar'
|
||||
}
|
||||
|
||||
Mock Get-FileHash {
|
||||
$Path | Should -Be 'pages/320okffs.xml'
|
||||
|
||||
$Algorithm | Should -Be 'SHA256'
|
||||
|
||||
@{
|
||||
'Hash' = 'HASH0123456789'
|
||||
}
|
||||
}
|
||||
|
||||
Update-Page `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Space 'testitest' `
|
||||
-Title 'mockTitle' `
|
||||
-Manifest $mockManifest
|
||||
}
|
||||
}
|
||||
|
||||
It 'fails, if page meta has no reference' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockManifest = @{
|
||||
'Pages' = @{
|
||||
'mockTitle' = @{
|
||||
'Id' = '0123456789'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Update-Page `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Space 'testitest' `
|
||||
-Title 'mockTitle' `
|
||||
-Manifest $mockManifest
|
||||
} | Should -Throw
|
||||
}
|
||||
}
|
||||
|
||||
It 'fails, if page meta has no id' `
|
||||
{
|
||||
InModuleScope Page `
|
||||
{
|
||||
$mockManifest = @{
|
||||
'Pages' = @{
|
||||
'mockTitle' = @{
|
||||
'Ref' = 'pages/320okffs.xml'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Update-Page `
|
||||
-Host 'confluence.contoso.com' `
|
||||
-Space 'testitest' `
|
||||
-Title 'mockTitle' `
|
||||
-Manifest $mockManifest
|
||||
} | Should -Throw
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue