-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathPack.tests.ps1
145 lines (116 loc) · 4.23 KB
/
Pack.tests.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#Requires -Module @{ModuleName = 'Pester'; ModuleVersion = '5.0.0'}
<#
.SYNOPSIS
Test file for Pester that will verify that the catalog files are in a valid state and meet all defined guidelines. Pull requests that have failing tests are unlikely to be accepted.
#>
BeforeDiscovery {
$indexFileName = "Index.json"
$packFileName = "details.json"
$location = Split-Path $PSCommandPath
$packFiles = Get-ChildItem $location -Recurse -Filter $packFileName
$indexPath = Join-Path $location "\$indexFileName"
$index = get-content $indexPath -Raw
}
$testCases = @(
$packFiles.foreach({@{
name = $_.name
fullName = $_.fullname
file = $_
directory = $_.directory
directoryName = $_.directory.name
index = $index
}})
)
Describe '<directoryName>' -Tag $directory,'PackTests' -ForEach $testCases {
Context 'Pack listing' -Tag $directory,'PackTests','PackListing' {
It "Appears in the index" {
$regex = '"ManagementPackSystemName"\s*:\s*"' + $directoryName + '"'
$index -match $regex |
Should -BeTrue
}
It "Has a details.json (case-sensitive)" {
$FullName |
Should -Exist
$Name |
Should -BeExactly "details.json"
}
It "Has a ReadMe.md (case-sensitive)" {
$readme = $fullName -replace $name, 'ReadMe.md'
$readme |
Should -Exist
# Get-ChildItem is used as Get-Item returns the same case it is passed.
(Get-ChildItem -Path $directory.fullname -Filter "readme.md").Name |
Should -BeExactly "ReadMe.md"
}
}
Context 'details.json' -Tag $directory,'PackTests','PackDetails' {
BeforeAll {
$contents = Get-Content $fullName -Raw -ErrorAction SilentlyContinue
# Even with ErrorAction Silent, this could still throw terminating exceptions
$json = $null
try { $json = $contents | ConvertFrom-Json -ErrorAction SilentlyContinue } catch {}
}
It "Is valid json" {
{$contents | ConvertFrom-Json } |
Should -Not -Throw
}
It "Has content" {
$contents |
Should -Not -BeNullOrEmpty
}
It "Has a valid ManagementPackSystemName" {
$json.ManagementPackSystemName |
Should -Not -BeNullOrEmpty
$json.ManagementPackSystemName |
Should -Match '^[A-Za-z_][A-Za-z0-9_\.]{0,255}$'
}
It "ManagementPackSystemName matches folder name" {
$json.ManagementPackSystemName |
Should -Be $directoryName
}
It "Has a ManagementPackDisplayName" {
$json.ManagementPackDisplayName |
Should -Not -BeNullOrEmpty
}
It "Has a valid URL" {
$json.URL |
Should -Not -BeNullOrEmpty
[uri]::IsWellFormedUriString($json.URL, [system.urikind]::Absolute) |
Should -BeTrue
}
It "Has a valid Version" {
$json.Version |
Should -Not -BeNullOrEmpty
{ [System.Version]::Parse($json.Version) } |
Should -Not -Throw
}
It "Has a Description" {
$json.Description |
Should -Not -BeNullOrEmpty
}
It "Has an Author" {
$json.Author |
Should -Not -BeNullOrEmpty
}
It "Has IsFree" {
$IsFree = $null
# Treat as false if not specified, as the catalog does
if (($json.PSObject.Properties | Select-Object -ExpandProperty Name) -notcontains 'IsFree') {
$IsFree = $false
} else {
$IsFree = $json.IsFree
}
$IsFree |
Should -BeOfType System.Boolean
}
It "Has an array of Tags" {
# Explicitly wrap to stop PowerShell from unwrapping during pipeline
@(,$json.Tags) |
Should -BeOfType System.Array
}
It "Has at least one tag" {
($json.Tags | Measure-object).Count |
Should -BeGreaterThan 0
}
}
}