From a983c51a4de681f0845355a64a010d24853071b9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:07:46 +0000 Subject: [PATCH 001/611] Added intial/existing copy of 'Sphenic.VstsPs' PsModule. --- .../Private/Get-SphVstsEnvironmentCode.ps1 | 18 +++ .../Private/Get-SphVstsOrganizationName.ps1 | 27 ++++ .../Private/Get-SphVstsServerApiUri.ps1 | 17 +++ .../Private/Get-VstsServerApiHeader.ps1 | 18 +++ .../Private/Get-VstsServerApiObject.ps1 | 52 +++++++ .../Private/New-VstsServerApiObject.ps1 | 65 +++++++++ .../Private/Test-SphVstsEnvironmentCode.ps1 | 15 ++ .../Private/Test-VstsOrganizationName.ps1 | 27 ++++ .../Functions/Private/Test-VstsPat.ps1 | 25 ++++ .../Functions/Private/Wait-VstsOperation.ps1 | 54 +++++++ .../Functions/Public/Get-SphVstsServerUri.ps1 | 17 +++ .../Functions/Public/Get-VstsOperation.ps1 | 22 +++ .../Functions/Public/Get-VstsProject.ps1 | 27 ++++ .../Functions/Public/Get-VstsServerApiUri.ps1 | 15 ++ .../Functions/Public/Get-VstsServerUri.ps1 | 18 +++ .../Functions/Public/New-VstsProject.ps1 | 61 ++++++++ .../Functions/Public/Test-VstsOperation.ps1 | 49 +++++++ .../Sphenic.VstsPs/Sphenic.VstsPs.psd1 | 132 ++++++++++++++++++ .../Sphenic.VstsPs/Sphenic.VstsPs.psm1 | 20 +++ 19 files changed, 679 insertions(+) create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 create mode 100644 source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 create mode 100644 source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 new file mode 100644 index 000000000..994da9345 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 @@ -0,0 +1,18 @@ +Function Get-SphVstsEnvironmentCode{ + + [CmdletBinding()] + [OutputType([string[]])] + param( + + [Alias('Code','EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] + [string]$SphVstsEnvironmentCode = '*' + ) + + [string[]]$SphVstsEnvironmentCodes = @( + 'TI', 'TS', 'LS', 'LV' + ) + + return $SphVstsEnvironmentCodes | + Where-Object -ilike $SphVstsEnvironmentCode + +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 new file mode 100644 index 000000000..7f9b0f0fc --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 @@ -0,0 +1,27 @@ +Function Get-SphVstsOrganizationName{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] + [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] + [String]$SphVstsEnvironmentCode + + ) + + [hashtable]$SphVstsEnvironmentCodeOrganisationNames = @{ + 'LV' = 'Sphenic' + 'LS' = 'Sphenic-LS' + 'TS' = 'Sphenic-TS' + 'TI' = 'Sphenic-TI' + } + + [string]$SphVstsOrganizationName = $SphVstsEnvironmentCodeOrganisationNames[$SphVstsEnvironmentCode] + + If([string]::IsNullOrWhiteSpace($SphVstsOrganizationName)){ + throw "Cannot obtain 'SphVstsOrganizationName' value for SphVstsEnvironmentCode of '$SphVstsEnvironmentCode'. Corresponding value does not exist." + } + + return $SphVstsEnvironments[$SphVstsEnvironmentCode] +} diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 new file mode 100644 index 000000000..33167a058 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 @@ -0,0 +1,17 @@ +Function Get-SphVstsServerApiUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ArgumentCompleter({Get-SphVstsEnvironmentCode})] + [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] + [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] + [String]$SphVstsEnvironmentCode + + ) + + [string]$SphVstsServerUri = Get-SphVstsServerUri -SphVstsEnvironmentCode $SphVstsEnvironmentCode + + return $SphVstsServerUri + "_apis" +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 new file mode 100644 index 000000000..d594b8538 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 @@ -0,0 +1,18 @@ +Function Get-VstsServerApiHeader{ + + [CmdletBinding()] + [OutputType([hashtable])] + param( + + [ValidateScript({Test-VstsPat -VstsPat $_ -IsValid})] + [Alias('Pat', 'PersonalAccessToken')] + [string]$VstsPat + + ) + + [hashtable]$VstsServerApiHeader = @{ + Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($VstsPat)")) + } + + return $VstsServerApiHeader +} diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 new file mode 100644 index 000000000..c6535b3ae --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 @@ -0,0 +1,52 @@ +Function Get-VstsServerApiObject{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Alias('ObjectName')] + [ValidateSet('Project')] + [string]$VstsObjectName, + + [Alias('ObjectId')] + [string]$VstsObjectId + ) + + # Remove any $VstsObjectId if using a wildcard character + # TODO: Might want to make this more generic (i.e. if !(Test-VstsObjectId $VstsObjectId -IsValid') then set to $null) + If($VstsObjectId -contains '*'){ + $VstsObjectId = $null + } + + # TODO: Need something to pluralise and lowercase this object for the URI + [string]$VstsObjectNamePluralUriString = $VstsObjectName.ToLower() + "s" + + # TODO: Need to get this from input parameter? + [string]$VstsApiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + [string]$VstsServerApiObjectUri = $VstsServerApiUri + "/$VstsObjectNamePluralUriString" + If(![string]::IsNullOrWhiteSpace($VstsObjectId)){ + $VstsServerApiObjectUri = $VstsServerApiObjectUri + "/$VstsObjectId" + } + $VstsServerApiObjectUri = $VstsServerApiObjectUri + '?' + $VstsApiVersionUriParameter + + + [string]$Method = 'Get' + [hashtable]$VstsServerApiHeader = Get-VstsServerApiHeader -VstsPat $VstsPat + + # TODO: Need to tidy up? + [object]$VstsServerApiObjects = Invoke-RestMethod -Uri $VstsServerApiObjectUri -Method $Method -Headers $VstsServerApiHeader + + # If not a single, object request, use the object(s) in the 'value' property + If([string]::IsNullOrWhiteSpace($VstsObjectId)){ + [object[]]$VstsServerApiObjects = $VstsServerApiObjects.value + } + + return $VstsServerApiObjects + } diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 new file mode 100644 index 000000000..eb1491cbd --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 @@ -0,0 +1,65 @@ +Function New-VstsServerApiObject{ + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Alias('ObjectName')] + [ValidateSet('Project')] + [PsObject]$VstsObjectName, + + [Alias('Object')] + [PsObject]$VstsObject, + + [switch]$Wait, + + [switch]$Force + ) + + [string]$VstsObjectId = $VstsObject.id + + # TODO: Need something to pluralise and lowercase this object for the URI + [string]$VstsObjectNamePluralUriString = $VstsObjectName.ToLower() + "s" + + # TODO: Need something to convert to JSON + [string]$VstsObjectJson = $VstsObject | ConvertTo-Json -Depth 10 -Compress + + # TODO: Need to get this from input parameter? + [string]$VstsApiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + [string]$VstsServerApiObjectUri = $VstsServerApiUri + "/$VstsObjectNamePluralUriString" + '?' + $VstsApiVersionUriParameter + + + [string]$Method = 'Post' + [string]$ContentType = 'application/json' + [hashtable]$VstsServerApiHeader = Get-VstsServerApiHeader -VstsPat $VstsPat + + # TODO: Need to tidy up? + + [object]$VstsServerApiOperation = $null + + if ($Force -or $PSCmdlet.ShouldProcess($VstsServerApiObjectUri,$VstsObjectName)) { + + [object]$VstsServerApiOperation = Invoke-RestMethod -Uri $VstsServerApiObjectUri -Method $Method -Headers $VstsServerApiHeader -Body $VstsObjectJson -ContentType $ContentType + + If($Wait){ + + Wait-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsOperationId $VstsOperationId ` + -IsSuccessful + + Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsObjectName $VstsObjectName ` + -VstsObjectId $VstsObjectId + } + + } + + + } diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 new file mode 100644 index 000000000..ea7ce7b1d --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 @@ -0,0 +1,15 @@ +Function Test-SphVstsEnvironmentCode{ + + [CmdletBinding()] + [OutputType([bool])] + param( + + [Parameter(Position=0, Mandatory=$true)] + [Alias('Code','VstsEnvironmentCode')] + [string]$SphVstsEnvironmentCode + ) + + [string[]]$SphVstsEnvironmentCodes = Get-SphVstsEnvironmentCode + + return $($SphVstsEnvironmentCodes -icontains $SphVstsEnvironmentCode) +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 new file mode 100644 index 000000000..c8f5b4118 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 @@ -0,0 +1,27 @@ +Function Test-VstsOrganizationName{ + + [CmdletBinding()] + [OutputType([bool])] + param( + [Alias('OrganizationName')] + [string]$VstsOrganizationName, + + [switch]$IsValid + ) + + If(!$IsValid){ + throw "The '-IsValid' switch must be used when calling 'Test-VstsOrganizationName'." + return + } + + If([string]::IsNullOrWhiteSpace($VstsOrganizationName)){ + return $false + } + ElseIf($VstsOrganizationName.Contains(' ') -or + $VstsOrganizationName.Contains('%')){ + return $false + } + + return $true +} + diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 new file mode 100644 index 000000000..16ffd2ee9 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 @@ -0,0 +1,25 @@ +Function Test-VstsPat{ + + [CmdletBinding()] + [OutputType([bool])] + param( + [Alias('Pat')] + [string]$VstsPat, + + [switch]$IsValid + ) + + If(!$IsValid){ + throw "The '-IsValid' switch must be used when calling 'Test-VstsPat'." + return + } + + If([string]::IsNullOrWhiteSpace($VstsPat)){ + return $false + } + ElseIf($VstsPat.Length -ne 52){ + return $false + } + + return $true +} diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 new file mode 100644 index 000000000..953e6c806 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 @@ -0,0 +1,54 @@ +Function Wait-VstsOperation { + + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Parameter(Mandatory)] + [Alias('Pat', 'PersonalAccessToken')] + [string]$VstsPat, + + [Parameter(Mandatory)] + [Alias('OperationId', 'Id')] + [string]$VstsOperationId, + + [Alias('IntervalMilliseconds')] + [int]$WaitIntervalMilliseconds = 500, + + [Alias('TimeoutMilliseconds')] + [int]$WaitTimeoutMilliseconds = 30000, # 30 seconds + + [Parameter(Mandatory, ParameterSetName = 'IsComplete')] + [switch]$IsComplete, + + [Parameter(Mandatory, ParameterSetName = 'IsSuccessful')] + [switch]$IsSuccessful + ) + + If (!$IsComplete -and !$IsSuccessful) { + throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + return + } + ElseIf (!$IsComplete -and !$IsSuccessful) { + throw "Only the '-IsComplete' switch or the alternative '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + return + } + + [DateTime]$WaitStartDateTime = [DateTime]::UtcNow + + while (!(Test-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsOperationId $VstsOperationId ` + -IsComplete:$IsComplete -IsSuccessful:$IsSuccessful)) { + + Start-Sleep -Milliseconds $WaitIntervalMilliseconds + + if ($(New-TimeSpan -Start $WaitStartDateTime -End $([DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) { + throw "The 'Wait-VstsOperation' operation for VstsOperationId of '$VstsOperationId' exceeded specified, maximum timeout ($WaitTimeoutMilliseconds milliseconds)" + return + } + + } + +} diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 new file mode 100644 index 000000000..f02cd908a --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 @@ -0,0 +1,17 @@ +Function Get-SphVstsServerUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] + [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] + [String]$SphVstsEnvironmentCode + + ) + + [string]$SphVstsOrganizationName = Get-SphVstsOrganizationName -SphVstsEnvironmentCode $SphVstsEnvironmentCode + [string]$SphVstsServerUri = Get-VstsServerUri -VstsOrganizationName $SphVstsOrganizationName + + return $SphVstsServerUri +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 new file mode 100644 index 000000000..f85de0ef7 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 @@ -0,0 +1,22 @@ +Function Get-VstsOperation{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Alias('OperationId','Id')] + [string]$VstsOperationId = '*' + ) + + [string]$VstsObjectName = 'Operation' + [object[]]$VstsServerApiObjects = Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsObjectName $VstsObjectName -VstsObjectId $VstsOperationId + + return $VstsServerApiObjects | + Where-Object id -ilike $VstsOperationId + } \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 new file mode 100644 index 000000000..36f75b7f5 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 @@ -0,0 +1,27 @@ +Function Get-VstsProject{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Alias('ProjectId','Id')] + [string]$VstsProjectId = '*', + + [Alias('ProjectName','Name')] + [string]$VstsProjectName = '*' + ) + + [string]$VstsObjectName = 'Project' + [object[]]$VstsServerApiObjects = Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsObjectName $VstsObjectName ` + -VstsObjectId $VstsProjectId + + return $VstsServerApiObjects | + Where-Object name -ilike $VstsProjectName | + Where-Object id -ilike $VstsProjectId + } \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 new file mode 100644 index 000000000..7f77de00b --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 @@ -0,0 +1,15 @@ +Function Get-VstsServerApiUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-VstsOrganizationName -VstsOrganizationName $_ -IsValid})] + [Alias('OrganizationName')] + [string]$VstsOrganizationName + ) + + [string]$VstsServerUri = Get-VstsServerUri -VstsOrganizationName $VstsOrganizationName + + return $VstsServerUri + "_apis" +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 new file mode 100644 index 000000000..baa166160 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 @@ -0,0 +1,18 @@ +Function Get-VstsServerUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-VstsOrganizationName -VstsOrganizationName $_ -IsValid})] + [Alias('OrganizationName')] + [string]$VstsOrganizationName + + ) + + $VstsOrganizationName = $VstsOrganizationName.ToLower() + + [string]$VstsServerUri = "https://dev.azure.com/$VstsOrganizationName/" + + return $VstsServerUri +} \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 new file mode 100644 index 000000000..7cde7e3c8 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 @@ -0,0 +1,61 @@ +Function New-VstsProject{ + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Parameter(Mandatory)] + [Alias('ProjectId','Id')] + [string]$VstsProjectId, + + [Parameter(Mandatory)] + [Alias('ProjectName','Name')] + [string]$VstsProjectName, + + [Parameter(Mandatory)] + [Alias('ProjectDescription','Description')] + [string]$VstsProjectDescription, + + [Parameter(Mandatory)] + [Alias('SourceControlType')] + [ValidateSet('Git')] + [string]$VstsSourceControlType, + + [switch]$Force + ) + + [string]$VstsObjectName = 'Project' + + [string]$VstsObjectJson = ' + { + "id": "'+ $VstsProjectId +'", + "name": "'+ $VstsProjectName +'", + "description": "'+ $VstsProjectDescription +'", + "capabilities": { + "versioncontrol": { + "sourceControlType": "'+ $VstsSourceControlType +'" + }, + "processTemplate": { + "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" + } + } + } +' + + [object]$VstsObject = $null + + if ($Force -or $PSCmdlet.ShouldProcess($VstsServerApiUri,$VstsObjectName)) { + + [object]$VstsObject = New-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsObjectName $VstsObjectName ` + -VstsObject $($VstsObjectJson | ConvertFrom-Json) ` + -Force:$Force + } + + return $VstsObject + } \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 b/source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 new file mode 100644 index 000000000..467d72052 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 @@ -0,0 +1,49 @@ +Function Test-VstsOperation{ + + [CmdletBinding()] + [OutputType([bool])] + param( + [Parameter(Mandatory)] + [Alias('Uri')] + [string]$VstsServerApiUri, + + [Parameter(Mandatory)] + [Alias('Pat','PersonalAccessToken')] + [string]$VstsPat, + + [Parameter(Mandatory)] + [Alias('OperationId','Id')] + [string]$VstsOperationId, + + [Parameter(Mandatory,ParameterSetName='IsComplete')] + [switch]$IsComplete, + + [Parameter(Mandatory,ParameterSetName='IsSuccessful')] + [switch]$IsSuccessful + ) + + If(!$IsComplete -and !$IsSuccessful){ + throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + return + } + + + + [object[]]$VstsOperation = Get-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` + -VstsOperationId $VstsOperationId + + + # Note: Operation Statuses listed here: + # https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus + If($IsSuccessful -and $VstsOperation.status -eq 'succeeded'){ + return $true + } + ElseIf($IsComplete -and $VstsOperation.status -in 'succeeded','cancelled','failed'){ + return $true + } + + # Otherwise, the status is one of 'inProgress', 'notSet' or 'queued' + return $false + + + } \ No newline at end of file diff --git a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 new file mode 100644 index 000000000..2789f5564 --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 @@ -0,0 +1,132 @@ +# +# Module manifest for module 'Sphenic.VstsPs' +# +# Generated by: Sphenic +# +# Generated on: 10/25/2020 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'Sphenic.VstsPs.psm1' + +# Version number of this module. +ModuleVersion = '0.7.0.201025008' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = '675b0777-1a06-1129-aadd-ca457d788325' + +# Author of this module +Author = 'Sphenic' + +# Company or vendor of this module +CompanyName = 'Sphenic' + +# Copyright statement for this module +Copyright = '(c) 2018 - Sphenic. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Common functions and cmdlets for use in Visual Studio Team Services (VSTS).' + +# Minimum version of the PowerShell engine required by this module +PowerShellVersion = '4.0' + +# Name of the PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# ClrVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = '*' + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + # Tags = @() + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + # ProjectUri = '' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + # Prerelease = '' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + +} # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 new file mode 100644 index 000000000..3cf4f38ba --- /dev/null +++ b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 @@ -0,0 +1,20 @@ + +# Because these functions are not loaded prior to this +$SphenicPsModuleFunctions = "$PSScriptRoot\Functions" +Write-Verbose "$SphenicPsModuleFunctionsDirectory" +$functions = Get-ChildItem -Path "$SphenicPsModuleFunctions\Public\*", "$SphenicPsModuleFunctions\Private\*" -Include "*.ps1" + +ForEach ($function in $functions) { + + Write-Verbose "Dot-sourcing '$($function.FullName)'..." + . ( + [ScriptBlock]::Create( + [Io.File]::ReadAllText($($function.FullName)) + ) + ) + + If($function.FullName -ilike "$SphenicPsModuleFunctions\Public*"){ + Write-Verbose "Exporting '$($function.BaseName)'..." + Export-ModuleMember -Function $($function.BaseName) + } +} From 8261b953348bc038bf73c97d34e3d2d0a0d756c4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:23:53 +0000 Subject: [PATCH 002/611] Updated/Moved all 'Sphenic.VstsPs' module folders/functions and manifest into 'AzureDevOpsDsc.Common' PSModule. --- .../AzureDevOpsDsc.Common.psd1 | 44 ++++++ .../AzureDevOpsDsc.Common.psm1 | 25 ++++ .../Private/Get-SphVstsEnvironmentCode.ps1 | 0 .../Private/Get-SphVstsOrganizationName.ps1 | 0 .../Private/Get-SphVstsServerApiUri.ps1 | 0 .../Private/Get-VstsServerApiHeader.ps1 | 0 .../Private/Get-VstsServerApiObject.ps1 | 0 .../Private/New-VstsServerApiObject.ps1 | 0 .../Private/Test-SphVstsEnvironmentCode.ps1 | 0 .../Private/Test-VstsOrganizationName.ps1 | 0 .../Functions/Private/Test-VstsPat.ps1 | 0 .../Functions/Private/Wait-VstsOperation.ps1 | 0 .../Functions/Public/Get-SphVstsServerUri.ps1 | 0 .../Functions/Public/Get-VstsOperation.ps1 | 0 .../Functions/Public/Get-VstsProject.ps1 | 0 .../Functions/Public/Get-VstsServerApiUri.ps1 | 0 .../Functions/Public/Get-VstsServerUri.ps1 | 0 .../Functions/Public/New-VstsProject.ps1 | 0 .../Functions/Public/Test-VstsOperation.ps1 | 0 .../Sphenic.VstsPs/Sphenic.VstsPs.psd1 | 132 ------------------ .../Sphenic.VstsPs/Sphenic.VstsPs.psm1 | 20 --- 21 files changed, 69 insertions(+), 152 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Get-SphVstsEnvironmentCode.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Get-SphVstsOrganizationName.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Get-SphVstsServerApiUri.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Get-VstsServerApiHeader.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Get-VstsServerApiObject.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/New-VstsServerApiObject.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Test-SphVstsEnvironmentCode.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Test-VstsOrganizationName.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Test-VstsPat.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Private/Wait-VstsOperation.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Get-SphVstsServerUri.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Get-VstsOperation.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Get-VstsProject.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Get-VstsServerApiUri.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Get-VstsServerUri.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/New-VstsProject.ps1 (100%) rename source/Modules/{Sphenic.VstsPs => AzureDevOpsDsc.Common}/Functions/Public/Test-VstsOperation.ps1 (100%) delete mode 100644 source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 delete mode 100644 source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 new file mode 100644 index 000000000..0b6c3dc83 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -0,0 +1,44 @@ +@{ + RootModule = 'AzureDevOpsDsc.Common.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0' + + # ID used to uniquely identify this module + GUID = 'caf65664-7dee-4767-a958-487c382a9f21' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in AzureDevOpsDsc.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 new file mode 100644 index 000000000..4a722d10b --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -0,0 +1,25 @@ + +# Obtain all functions within PSModule +$functionSubDirectoryPaths = @( + "$PSScriptRoot\Functions\Public" + "$PSScriptRoot\Functions\Private" +) +$functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" + + +# Loop through all PSModule functions and import/dot-source them (and export them if 'Public') +ForEach ($function in $functions) +{ + Write-Verbose "Dot-sourcing '$($function.FullName)'..." + . ( + [ScriptBlock]::Create( + [Io.File]::ReadAllText($($function.FullName)) + ) + ) + + If ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") + { + Write-Verbose "Exporting '$($function.BaseName)'..." + Export-ModuleMember -Function $($function.BaseName) + } +} diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsEnvironmentCode.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsOrganizationName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Get-SphVstsServerApiUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiHeader.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Get-VstsServerApiObject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/New-VstsServerApiObject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Test-SphVstsEnvironmentCode.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsOrganizationName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsPat.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Test-VstsPat.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsPat.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-VstsOperation.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Private/Wait-VstsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-VstsOperation.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Get-SphVstsServerUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerApiUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Get-VstsServerUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/New-VstsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-VstsOperation.ps1 similarity index 100% rename from source/Modules/Sphenic.VstsPs/Functions/Public/Test-VstsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-VstsOperation.ps1 diff --git a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 deleted file mode 100644 index 2789f5564..000000000 --- a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psd1 +++ /dev/null @@ -1,132 +0,0 @@ -# -# Module manifest for module 'Sphenic.VstsPs' -# -# Generated by: Sphenic -# -# Generated on: 10/25/2020 -# - -@{ - -# Script module or binary module file associated with this manifest. -RootModule = 'Sphenic.VstsPs.psm1' - -# Version number of this module. -ModuleVersion = '0.7.0.201025008' - -# Supported PSEditions -# CompatiblePSEditions = @() - -# ID used to uniquely identify this module -GUID = '675b0777-1a06-1129-aadd-ca457d788325' - -# Author of this module -Author = 'Sphenic' - -# Company or vendor of this module -CompanyName = 'Sphenic' - -# Copyright statement for this module -Copyright = '(c) 2018 - Sphenic. All rights reserved.' - -# Description of the functionality provided by this module -Description = 'Common functions and cmdlets for use in Visual Studio Team Services (VSTS).' - -# Minimum version of the PowerShell engine required by this module -PowerShellVersion = '4.0' - -# Name of the PowerShell host required by this module -# PowerShellHostName = '' - -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' - -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' - -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' - -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' - -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() - -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() - -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() - -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() - -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() - -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() - -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -FunctionsToExport = '*' - -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -CmdletsToExport = '*' - -# Variables to export from this module -VariablesToExport = '*' - -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -AliasesToExport = '*' - -# DSC resources to export from this module -# DscResourcesToExport = @() - -# List of all modules packaged with this module -# ModuleList = @() - -# List of all files packaged with this module -# FileList = @() - -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ - - PSData = @{ - - # Tags applied to this module. These help with module discovery in online galleries. - # Tags = @() - - # A URL to the license for this module. - # LicenseUri = '' - - # A URL to the main website for this project. - # ProjectUri = '' - - # A URL to an icon representing this module. - # IconUri = '' - - # ReleaseNotes of this module - # ReleaseNotes = '' - - # Prerelease string of this module - # Prerelease = '' - - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false - - # External dependent modules of this module - # ExternalModuleDependencies = @() - - } # End of PSData hashtable - -} # End of PrivateData hashtable - -# HelpInfo URI of this module -# HelpInfoURI = '' - -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' - -} - diff --git a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 b/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 deleted file mode 100644 index 3cf4f38ba..000000000 --- a/source/Modules/Sphenic.VstsPs/Sphenic.VstsPs.psm1 +++ /dev/null @@ -1,20 +0,0 @@ - -# Because these functions are not loaded prior to this -$SphenicPsModuleFunctions = "$PSScriptRoot\Functions" -Write-Verbose "$SphenicPsModuleFunctionsDirectory" -$functions = Get-ChildItem -Path "$SphenicPsModuleFunctions\Public\*", "$SphenicPsModuleFunctions\Private\*" -Include "*.ps1" - -ForEach ($function in $functions) { - - Write-Verbose "Dot-sourcing '$($function.FullName)'..." - . ( - [ScriptBlock]::Create( - [Io.File]::ReadAllText($($function.FullName)) - ) - ) - - If($function.FullName -ilike "$SphenicPsModuleFunctions\Public*"){ - Write-Verbose "Exporting '$($function.BaseName)'..." - Export-ModuleMember -Function $($function.BaseName) - } -} From 400714b52e5faf927b2695e21b4be4652fded263 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:25:17 +0000 Subject: [PATCH 003/611] Removed Sphenic-specific functions. --- .../Private/Get-SphVstsEnvironmentCode.ps1 | 18 ------------- .../Private/Get-SphVstsOrganizationName.ps1 | 27 ------------------- .../Private/Get-SphVstsServerApiUri.ps1 | 17 ------------ .../Private/Test-SphVstsEnvironmentCode.ps1 | 15 ----------- .../Functions/Public/Get-SphVstsServerUri.ps1 | 17 ------------ 5 files changed, 94 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 deleted file mode 100644 index 994da9345..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsEnvironmentCode.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -Function Get-SphVstsEnvironmentCode{ - - [CmdletBinding()] - [OutputType([string[]])] - param( - - [Alias('Code','EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] - [string]$SphVstsEnvironmentCode = '*' - ) - - [string[]]$SphVstsEnvironmentCodes = @( - 'TI', 'TS', 'LS', 'LV' - ) - - return $SphVstsEnvironmentCodes | - Where-Object -ilike $SphVstsEnvironmentCode - -} \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 deleted file mode 100644 index 7f9b0f0fc..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsOrganizationName.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -Function Get-SphVstsOrganizationName{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] - [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] - [String]$SphVstsEnvironmentCode - - ) - - [hashtable]$SphVstsEnvironmentCodeOrganisationNames = @{ - 'LV' = 'Sphenic' - 'LS' = 'Sphenic-LS' - 'TS' = 'Sphenic-TS' - 'TI' = 'Sphenic-TI' - } - - [string]$SphVstsOrganizationName = $SphVstsEnvironmentCodeOrganisationNames[$SphVstsEnvironmentCode] - - If([string]::IsNullOrWhiteSpace($SphVstsOrganizationName)){ - throw "Cannot obtain 'SphVstsOrganizationName' value for SphVstsEnvironmentCode of '$SphVstsEnvironmentCode'. Corresponding value does not exist." - } - - return $SphVstsEnvironments[$SphVstsEnvironmentCode] -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 deleted file mode 100644 index 33167a058..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-SphVstsServerApiUri.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -Function Get-SphVstsServerApiUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ArgumentCompleter({Get-SphVstsEnvironmentCode})] - [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] - [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] - [String]$SphVstsEnvironmentCode - - ) - - [string]$SphVstsServerUri = Get-SphVstsServerUri -SphVstsEnvironmentCode $SphVstsEnvironmentCode - - return $SphVstsServerUri + "_apis" -} \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 deleted file mode 100644 index ea7ce7b1d..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-SphVstsEnvironmentCode.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -Function Test-SphVstsEnvironmentCode{ - - [CmdletBinding()] - [OutputType([bool])] - param( - - [Parameter(Position=0, Mandatory=$true)] - [Alias('Code','VstsEnvironmentCode')] - [string]$SphVstsEnvironmentCode - ) - - [string[]]$SphVstsEnvironmentCodes = Get-SphVstsEnvironmentCode - - return $($SphVstsEnvironmentCodes -icontains $SphVstsEnvironmentCode) -} \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 deleted file mode 100644 index f02cd908a..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-SphVstsServerUri.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -Function Get-SphVstsServerUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-SphVstsEnvironmentCode -VstsEnvironmentCode $_})] - [Alias('EnvironmentCode','VstsEnvironmentCode','SphEnvironmentCode')] - [String]$SphVstsEnvironmentCode - - ) - - [string]$SphVstsOrganizationName = Get-SphVstsOrganizationName -SphVstsEnvironmentCode $SphVstsEnvironmentCode - [string]$SphVstsServerUri = Get-VstsServerUri -VstsOrganizationName $SphVstsOrganizationName - - return $SphVstsServerUri -} \ No newline at end of file From 603a4973794cf3bcc133241c80ed8de173b28a54 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:33:56 +0000 Subject: [PATCH 004/611] Added initial 'en-US' localized data strings (and reference to them within 'AzureDevOpsDsc.Common.psm1') --- .../Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 2 ++ .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index 4a722d10b..de070fb6a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -1,4 +1,6 @@ +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + # Obtain all functions within PSModule $functionSubDirectoryPaths = @( "$PSScriptRoot\Functions\Public" diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 new file mode 100644 index 000000000..0976b1f34 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -0,0 +1,5 @@ +# Localized resources for helper module AzureDevOpsDsc.Common. + +ConvertFrom-StringData @' + ExceptionThrown = An '{0}' was thrown by '{1}'. Exception was '{2}' (AZDEVOPSCOMMON0001) +'@ From 7bf248ecd071951e75fbcac93087d70933f38aef Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:37:09 +0000 Subject: [PATCH 005/611] Added additional reference and import to 'DscResource.Common', helper PSModule --- .../Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index de070fb6a..81b71542b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -1,6 +1,11 @@ +# Setup/Import 'DscResource.Common' helper module +$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +Import-Module -Name $script:resourceHelperModulePath + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + # Obtain all functions within PSModule $functionSubDirectoryPaths = @( "$PSScriptRoot\Functions\Public" From 38fb0b8fe35add0202a2570debc673cd5726e2ea Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:44:00 +0000 Subject: [PATCH 006/611] Replaced use of 'Vsts' with 'AzDevOps' --- .../Private/Get-AzDevOpsServerApiHeader.ps1 | 18 +++++ .../Private/Get-AzDevOpsServerApiObject.ps1 | 52 +++++++++++++++ .../Private/Get-VstsServerApiHeader.ps1 | 18 ----- .../Private/Get-VstsServerApiObject.ps1 | 52 --------------- .../Private/New-AzDevOpsServerApiObject.ps1 | 65 +++++++++++++++++++ .../Private/New-VstsServerApiObject.ps1 | 65 ------------------- .../Private/Test-AzDevOpsOrganizationName.ps1 | 27 ++++++++ ...{Test-VstsPat.ps1 => Test-AzDevOpsPat.ps1} | 10 +-- .../Private/Test-VstsOrganizationName.ps1 | 27 -------- ...eration.ps1 => Wait-AzDevOpsOperation.ps1} | 18 ++--- .../Public/Get-AzDevOpsOperation.ps1 | 22 +++++++ .../Functions/Public/Get-AzDevOpsProject.ps1 | 27 ++++++++ .../Public/Get-AzDevOpsServerApiUri.ps1 | 15 +++++ .../Public/Get-AzDevOpsServerUri.ps1 | 18 +++++ .../Functions/Public/Get-VstsOperation.ps1 | 22 ------- .../Functions/Public/Get-VstsProject.ps1 | 27 -------- .../Functions/Public/Get-VstsServerApiUri.ps1 | 15 ----- .../Functions/Public/Get-VstsServerUri.ps1 | 18 ----- .../Functions/Public/New-AzDevOpsProject.ps1 | 61 +++++++++++++++++ .../Functions/Public/New-VstsProject.ps1 | 61 ----------------- ...eration.ps1 => Test-AzDevOpsOperation.ps1} | 20 +++--- 21 files changed, 329 insertions(+), 329 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 rename source/Modules/AzureDevOpsDsc.Common/Functions/Private/{Test-VstsPat.ps1 => Test-AzDevOpsPat.ps1} (62%) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 rename source/Modules/AzureDevOpsDsc.Common/Functions/Private/{Wait-VstsOperation.ps1 => Wait-AzDevOpsOperation.ps1} (65%) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 rename source/Modules/AzureDevOpsDsc.Common/Functions/Public/{Test-VstsOperation.ps1 => Test-AzDevOpsOperation.ps1} (60%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 new file mode 100644 index 000000000..bc8669c6e --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 @@ -0,0 +1,18 @@ +Function Get-AzDevOpsServerApiHeader{ + + [CmdletBinding()] + [OutputType([hashtable])] + param( + + [ValidateScript({Test-AzDevOpsPat -AzDevOpsPat $_ -IsValid})] + [Alias('Pat', 'PersonalAccessToken')] + [string]$AzDevOpsPat + + ) + + [hashtable]$AzDevOpsServerApiHeader = @{ + Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($AzDevOpsPat)")) + } + + return $AzDevOpsServerApiHeader +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 new file mode 100644 index 000000000..44f47ffa6 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 @@ -0,0 +1,52 @@ +Function Get-AzDevOpsServerApiObject{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$AzDevOpsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$AzDevOpsPat, + + [Alias('ObjectName')] + [ValidateSet('Project')] + [string]$AzDevOpsObjectName, + + [Alias('ObjectId')] + [string]$AzDevOpsObjectId + ) + + # Remove any $AzDevOpsObjectId if using a wildcard character + # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsObjectId $AzDevOpsObjectId -IsValid') then set to $null) + If($AzDevOpsObjectId -contains '*'){ + $AzDevOpsObjectId = $null + } + + # TODO: Need something to pluralise and lowercase this object for the URI + [string]$AzDevOpsObjectNamePluralUriString = $AzDevOpsObjectName.ToLower() + "s" + + # TODO: Need to get this from input parameter? + [string]$AzDevOpsApiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + [string]$AzDevOpsServerApiObjectUri = $AzDevOpsServerApiUri + "/$AzDevOpsObjectNamePluralUriString" + If(![string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ + $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + "/$AzDevOpsObjectId" + } + $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + '?' + $AzDevOpsApiVersionUriParameter + + + [string]$Method = 'Get' + [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsServerApiHeader -AzDevOpsPat $AzDevOpsPat + + # TODO: Need to tidy up? + [object]$AzDevOpsServerApiObjects = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader + + # If not a single, object request, use the object(s) in the 'value' property + If([string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ + [object[]]$AzDevOpsServerApiObjects = $AzDevOpsServerApiObjects.value + } + + return $AzDevOpsServerApiObjects + } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 deleted file mode 100644 index d594b8538..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiHeader.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -Function Get-VstsServerApiHeader{ - - [CmdletBinding()] - [OutputType([hashtable])] - param( - - [ValidateScript({Test-VstsPat -VstsPat $_ -IsValid})] - [Alias('Pat', 'PersonalAccessToken')] - [string]$VstsPat - - ) - - [hashtable]$VstsServerApiHeader = @{ - Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($VstsPat)")) - } - - return $VstsServerApiHeader -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 deleted file mode 100644 index c6535b3ae..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-VstsServerApiObject.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -Function Get-VstsServerApiObject{ - - [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$VstsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, - - [Alias('ObjectName')] - [ValidateSet('Project')] - [string]$VstsObjectName, - - [Alias('ObjectId')] - [string]$VstsObjectId - ) - - # Remove any $VstsObjectId if using a wildcard character - # TODO: Might want to make this more generic (i.e. if !(Test-VstsObjectId $VstsObjectId -IsValid') then set to $null) - If($VstsObjectId -contains '*'){ - $VstsObjectId = $null - } - - # TODO: Need something to pluralise and lowercase this object for the URI - [string]$VstsObjectNamePluralUriString = $VstsObjectName.ToLower() + "s" - - # TODO: Need to get this from input parameter? - [string]$VstsApiVersionUriParameter = 'api-version=5.1' - - # TODO: Need to generate this from a function - [string]$VstsServerApiObjectUri = $VstsServerApiUri + "/$VstsObjectNamePluralUriString" - If(![string]::IsNullOrWhiteSpace($VstsObjectId)){ - $VstsServerApiObjectUri = $VstsServerApiObjectUri + "/$VstsObjectId" - } - $VstsServerApiObjectUri = $VstsServerApiObjectUri + '?' + $VstsApiVersionUriParameter - - - [string]$Method = 'Get' - [hashtable]$VstsServerApiHeader = Get-VstsServerApiHeader -VstsPat $VstsPat - - # TODO: Need to tidy up? - [object]$VstsServerApiObjects = Invoke-RestMethod -Uri $VstsServerApiObjectUri -Method $Method -Headers $VstsServerApiHeader - - # If not a single, object request, use the object(s) in the 'value' property - If([string]::IsNullOrWhiteSpace($VstsObjectId)){ - [object[]]$VstsServerApiObjects = $VstsServerApiObjects.value - } - - return $VstsServerApiObjects - } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 new file mode 100644 index 000000000..d65af3c4f --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -0,0 +1,65 @@ +Function New-AzDevOpsServerApiObject{ + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$AzDevOpsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$AzDevOpsPat, + + [Alias('ObjectName')] + [ValidateSet('Project')] + [PsObject]$AzDevOpsObjectName, + + [Alias('Object')] + [PsObject]$AzDevOpsObject, + + [switch]$Wait, + + [switch]$Force + ) + + [string]$AzDevOpsObjectId = $AzDevOpsObject.id + + # TODO: Need something to pluralise and lowercase this object for the URI + [string]$AzDevOpsObjectNamePluralUriString = $AzDevOpsObjectName.ToLower() + "s" + + # TODO: Need something to convert to JSON + [string]$AzDevOpsObjectJson = $AzDevOpsObject | ConvertTo-Json -Depth 10 -Compress + + # TODO: Need to get this from input parameter? + [string]$AzDevOpsApiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + [string]$AzDevOpsServerApiObjectUri = $AzDevOpsServerApiUri + "/$AzDevOpsObjectNamePluralUriString" + '?' + $AzDevOpsApiVersionUriParameter + + + [string]$Method = 'Post' + [string]$ContentType = 'application/json' + [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsServerApiHeader -AzDevOpsPat $AzDevOpsPat + + # TODO: Need to tidy up? + + [object]$AzDevOpsServerApiOperation = $null + + if ($Force -or $PSCmdlet.ShouldProcess($AzDevOpsServerApiObjectUri,$AzDevOpsObjectName)) { + + [object]$AzDevOpsServerApiOperation = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader -Body $AzDevOpsObjectJson -ContentType $ContentType + + If($Wait){ + + Wait-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsOperationId $AzDevOpsOperationId ` + -IsSuccessful + + Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsObjectName $AzDevOpsObjectName ` + -AzDevOpsObjectId $AzDevOpsObjectId + } + + } + + + } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 deleted file mode 100644 index eb1491cbd..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-VstsServerApiObject.ps1 +++ /dev/null @@ -1,65 +0,0 @@ -Function New-VstsServerApiObject{ - - [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$VstsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, - - [Alias('ObjectName')] - [ValidateSet('Project')] - [PsObject]$VstsObjectName, - - [Alias('Object')] - [PsObject]$VstsObject, - - [switch]$Wait, - - [switch]$Force - ) - - [string]$VstsObjectId = $VstsObject.id - - # TODO: Need something to pluralise and lowercase this object for the URI - [string]$VstsObjectNamePluralUriString = $VstsObjectName.ToLower() + "s" - - # TODO: Need something to convert to JSON - [string]$VstsObjectJson = $VstsObject | ConvertTo-Json -Depth 10 -Compress - - # TODO: Need to get this from input parameter? - [string]$VstsApiVersionUriParameter = 'api-version=5.1' - - # TODO: Need to generate this from a function - [string]$VstsServerApiObjectUri = $VstsServerApiUri + "/$VstsObjectNamePluralUriString" + '?' + $VstsApiVersionUriParameter - - - [string]$Method = 'Post' - [string]$ContentType = 'application/json' - [hashtable]$VstsServerApiHeader = Get-VstsServerApiHeader -VstsPat $VstsPat - - # TODO: Need to tidy up? - - [object]$VstsServerApiOperation = $null - - if ($Force -or $PSCmdlet.ShouldProcess($VstsServerApiObjectUri,$VstsObjectName)) { - - [object]$VstsServerApiOperation = Invoke-RestMethod -Uri $VstsServerApiObjectUri -Method $Method -Headers $VstsServerApiHeader -Body $VstsObjectJson -ContentType $ContentType - - If($Wait){ - - Wait-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsOperationId $VstsOperationId ` - -IsSuccessful - - Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsObjectName $VstsObjectName ` - -VstsObjectId $VstsObjectId - } - - } - - - } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 new file mode 100644 index 000000000..221ef9676 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -0,0 +1,27 @@ +Function Test-AzDevOpsOrganizationName{ + + [CmdletBinding()] + [OutputType([bool])] + param( + [Alias('OrganizationName')] + [string]$AzDevOpsOrganizationName, + + [switch]$IsValid + ) + + If(!$IsValid){ + throw "The '-IsValid' switch must be used when calling 'Test-AzDevOpsOrganizationName'." + return + } + + If([string]::IsNullOrWhiteSpace($AzDevOpsOrganizationName)){ + return $false + } + ElseIf($AzDevOpsOrganizationName.Contains(' ') -or + $AzDevOpsOrganizationName.Contains('%')){ + return $false + } + + return $true +} + diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 similarity index 62% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsPat.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index 16ffd2ee9..663aa32fa 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -1,23 +1,23 @@ -Function Test-VstsPat{ +Function Test-AzDevOpsPat{ [CmdletBinding()] [OutputType([bool])] param( [Alias('Pat')] - [string]$VstsPat, + [string]$AzDevOpsPat, [switch]$IsValid ) If(!$IsValid){ - throw "The '-IsValid' switch must be used when calling 'Test-VstsPat'." + throw "The '-IsValid' switch must be used when calling 'Test-AzDevOpsPat'." return } - If([string]::IsNullOrWhiteSpace($VstsPat)){ + If([string]::IsNullOrWhiteSpace($AzDevOpsPat)){ return $false } - ElseIf($VstsPat.Length -ne 52){ + ElseIf($AzDevOpsPat.Length -ne 52){ return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 deleted file mode 100644 index c8f5b4118..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-VstsOrganizationName.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -Function Test-VstsOrganizationName{ - - [CmdletBinding()] - [OutputType([bool])] - param( - [Alias('OrganizationName')] - [string]$VstsOrganizationName, - - [switch]$IsValid - ) - - If(!$IsValid){ - throw "The '-IsValid' switch must be used when calling 'Test-VstsOrganizationName'." - return - } - - If([string]::IsNullOrWhiteSpace($VstsOrganizationName)){ - return $false - } - ElseIf($VstsOrganizationName.Contains(' ') -or - $VstsOrganizationName.Contains('%')){ - return $false - } - - return $true -} - diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 similarity index 65% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-VstsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 index 953e6c806..e49f4e2e8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-VstsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -1,18 +1,18 @@ -Function Wait-VstsOperation { +Function Wait-AzDevOpsOperation { [CmdletBinding()] param( [Parameter(Mandatory)] [Alias('Uri')] - [string]$VstsServerApiUri, + [string]$AzDevOpsServerApiUri, [Parameter(Mandatory)] [Alias('Pat', 'PersonalAccessToken')] - [string]$VstsPat, + [string]$AzDevOpsPat, [Parameter(Mandatory)] [Alias('OperationId', 'Id')] - [string]$VstsOperationId, + [string]$AzDevOpsOperationId, [Alias('IntervalMilliseconds')] [int]$WaitIntervalMilliseconds = 500, @@ -28,24 +28,24 @@ Function Wait-VstsOperation { ) If (!$IsComplete -and !$IsSuccessful) { - throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } ElseIf (!$IsComplete -and !$IsSuccessful) { - throw "Only the '-IsComplete' switch or the alternative '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + throw "Only the '-IsComplete' switch or the alternative '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } [DateTime]$WaitStartDateTime = [DateTime]::UtcNow - while (!(Test-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsOperationId $VstsOperationId ` + while (!(Test-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsOperationId $AzDevOpsOperationId ` -IsComplete:$IsComplete -IsSuccessful:$IsSuccessful)) { Start-Sleep -Milliseconds $WaitIntervalMilliseconds if ($(New-TimeSpan -Start $WaitStartDateTime -End $([DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) { - throw "The 'Wait-VstsOperation' operation for VstsOperationId of '$VstsOperationId' exceeded specified, maximum timeout ($WaitTimeoutMilliseconds milliseconds)" + throw "The 'Wait-AzDevOpsOperation' operation for AzDevOpsOperationId of '$AzDevOpsOperationId' exceeded specified, maximum timeout ($WaitTimeoutMilliseconds milliseconds)" return } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 new file mode 100644 index 000000000..656e00a29 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -0,0 +1,22 @@ +Function Get-AzDevOpsOperation{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$AzDevOpsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$AzDevOpsPat, + + [Alias('OperationId','Id')] + [string]$AzDevOpsOperationId = '*' + ) + + [string]$AzDevOpsObjectName = 'Operation' + [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsObjectName $AzDevOpsObjectName -AzDevOpsObjectId $AzDevOpsOperationId + + return $AzDevOpsServerApiObjects | + Where-Object id -ilike $AzDevOpsOperationId + } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 new file mode 100644 index 000000000..aea5f4060 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -0,0 +1,27 @@ +Function Get-AzDevOpsProject{ + + [CmdletBinding()] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$AzDevOpsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$AzDevOpsPat, + + [Alias('ProjectId','Id')] + [string]$AzDevOpsProjectId = '*', + + [Alias('ProjectName','Name')] + [string]$AzDevOpsProjectName = '*' + ) + + [string]$AzDevOpsObjectName = 'Project' + [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsObjectName $AzDevOpsObjectName ` + -AzDevOpsObjectId $AzDevOpsProjectId + + return $AzDevOpsServerApiObjects | + Where-Object name -ilike $AzDevOpsProjectName | + Where-Object id -ilike $AzDevOpsProjectId + } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 new file mode 100644 index 000000000..30f0f2b58 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 @@ -0,0 +1,15 @@ +Function Get-AzDevOpsServerApiUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-AzDevOpsOrganizationName -AzDevOpsOrganizationName $_ -IsValid})] + [Alias('OrganizationName')] + [string]$AzDevOpsOrganizationName + ) + + [string]$AzDevOpsServerUri = Get-AzDevOpsServerUri -AzDevOpsOrganizationName $AzDevOpsOrganizationName + + return $AzDevOpsServerUri + "_apis" +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 new file mode 100644 index 000000000..8735f7bdf --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 @@ -0,0 +1,18 @@ +Function Get-AzDevOpsServerUri{ + + [CmdletBinding()] + [OutputType([string])] + param( + + [ValidateScript({Test-AzDevOpsOrganizationName -AzDevOpsOrganizationName $_ -IsValid})] + [Alias('OrganizationName')] + [string]$AzDevOpsOrganizationName + + ) + + $AzDevOpsOrganizationName = $AzDevOpsOrganizationName.ToLower() + + [string]$AzDevOpsServerUri = "https://dev.azure.com/$AzDevOpsOrganizationName/" + + return $AzDevOpsServerUri +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 deleted file mode 100644 index f85de0ef7..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsOperation.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -Function Get-VstsOperation{ - - [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$VstsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, - - [Alias('OperationId','Id')] - [string]$VstsOperationId = '*' - ) - - [string]$VstsObjectName = 'Operation' - [object[]]$VstsServerApiObjects = Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsObjectName $VstsObjectName -VstsObjectId $VstsOperationId - - return $VstsServerApiObjects | - Where-Object id -ilike $VstsOperationId - } \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 deleted file mode 100644 index 36f75b7f5..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsProject.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -Function Get-VstsProject{ - - [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$VstsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, - - [Alias('ProjectId','Id')] - [string]$VstsProjectId = '*', - - [Alias('ProjectName','Name')] - [string]$VstsProjectName = '*' - ) - - [string]$VstsObjectName = 'Project' - [object[]]$VstsServerApiObjects = Get-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsObjectName $VstsObjectName ` - -VstsObjectId $VstsProjectId - - return $VstsServerApiObjects | - Where-Object name -ilike $VstsProjectName | - Where-Object id -ilike $VstsProjectId - } \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 deleted file mode 100644 index 7f77de00b..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerApiUri.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -Function Get-VstsServerApiUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-VstsOrganizationName -VstsOrganizationName $_ -IsValid})] - [Alias('OrganizationName')] - [string]$VstsOrganizationName - ) - - [string]$VstsServerUri = Get-VstsServerUri -VstsOrganizationName $VstsOrganizationName - - return $VstsServerUri + "_apis" -} \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 deleted file mode 100644 index baa166160..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-VstsServerUri.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -Function Get-VstsServerUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-VstsOrganizationName -VstsOrganizationName $_ -IsValid})] - [Alias('OrganizationName')] - [string]$VstsOrganizationName - - ) - - $VstsOrganizationName = $VstsOrganizationName.ToLower() - - [string]$VstsServerUri = "https://dev.azure.com/$VstsOrganizationName/" - - return $VstsServerUri -} \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 new file mode 100644 index 000000000..b44e45a25 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -0,0 +1,61 @@ +Function New-AzDevOpsProject{ + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] + [OutputType([object[]])] + param( + [Alias('Uri')] + [string]$AzDevOpsServerApiUri, + + [Alias('Pat','PersonalAccessToken')] + [string]$AzDevOpsPat, + + [Parameter(Mandatory)] + [Alias('ProjectId','Id')] + [string]$AzDevOpsProjectId, + + [Parameter(Mandatory)] + [Alias('ProjectName','Name')] + [string]$AzDevOpsProjectName, + + [Parameter(Mandatory)] + [Alias('ProjectDescription','Description')] + [string]$AzDevOpsProjectDescription, + + [Parameter(Mandatory)] + [Alias('SourceControlType')] + [ValidateSet('Git')] + [string]$AzDevOpsSourceControlType, + + [switch]$Force + ) + + [string]$AzDevOpsObjectName = 'Project' + + [string]$AzDevOpsObjectJson = ' + { + "id": "'+ $AzDevOpsProjectId +'", + "name": "'+ $AzDevOpsProjectName +'", + "description": "'+ $AzDevOpsProjectDescription +'", + "capabilities": { + "versioncontrol": { + "sourceControlType": "'+ $AzDevOpsSourceControlType +'" + }, + "processTemplate": { + "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" + } + } + } +' + + [object]$AzDevOpsObject = $null + + if ($Force -or $PSCmdlet.ShouldProcess($AzDevOpsServerApiUri,$AzDevOpsObjectName)) { + + [object]$AzDevOpsObject = New-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsObjectName $AzDevOpsObjectName ` + -AzDevOpsObject $($AzDevOpsObjectJson | ConvertFrom-Json) ` + -Force:$Force + } + + return $AzDevOpsObject + } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 deleted file mode 100644 index 7cde7e3c8..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-VstsProject.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -Function New-VstsProject{ - - [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$VstsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, - - [Parameter(Mandatory)] - [Alias('ProjectId','Id')] - [string]$VstsProjectId, - - [Parameter(Mandatory)] - [Alias('ProjectName','Name')] - [string]$VstsProjectName, - - [Parameter(Mandatory)] - [Alias('ProjectDescription','Description')] - [string]$VstsProjectDescription, - - [Parameter(Mandatory)] - [Alias('SourceControlType')] - [ValidateSet('Git')] - [string]$VstsSourceControlType, - - [switch]$Force - ) - - [string]$VstsObjectName = 'Project' - - [string]$VstsObjectJson = ' - { - "id": "'+ $VstsProjectId +'", - "name": "'+ $VstsProjectName +'", - "description": "'+ $VstsProjectDescription +'", - "capabilities": { - "versioncontrol": { - "sourceControlType": "'+ $VstsSourceControlType +'" - }, - "processTemplate": { - "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" - } - } - } -' - - [object]$VstsObject = $null - - if ($Force -or $PSCmdlet.ShouldProcess($VstsServerApiUri,$VstsObjectName)) { - - [object]$VstsObject = New-VstsServerApiObject -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsObjectName $VstsObjectName ` - -VstsObject $($VstsObjectJson | ConvertFrom-Json) ` - -Force:$Force - } - - return $VstsObject - } \ No newline at end of file diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-VstsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 similarity index 60% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-VstsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index 467d72052..4b1c35a7f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-VstsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -1,19 +1,19 @@ -Function Test-VstsOperation{ +Function Test-AzDevOpsOperation{ [CmdletBinding()] [OutputType([bool])] param( [Parameter(Mandatory)] [Alias('Uri')] - [string]$VstsServerApiUri, + [string]$AzDevOpsServerApiUri, [Parameter(Mandatory)] [Alias('Pat','PersonalAccessToken')] - [string]$VstsPat, + [string]$AzDevOpsPat, [Parameter(Mandatory)] [Alias('OperationId','Id')] - [string]$VstsOperationId, + [string]$AzDevOpsOperationId, [Parameter(Mandatory,ParameterSetName='IsComplete')] [switch]$IsComplete, @@ -23,22 +23,22 @@ Function Test-VstsOperation{ ) If(!$IsComplete -and !$IsSuccessful){ - throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-VstsOperation'." + throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } - [object[]]$VstsOperation = Get-VstsOperation -VstsServerApiUri $VstsServerApiUri -VstsPat $VstsPat ` - -VstsOperationId $VstsOperationId + [object[]]$AzDevOpsOperation = Get-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + -AzDevOpsOperationId $AzDevOpsOperationId # Note: Operation Statuses listed here: # https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus - If($IsSuccessful -and $VstsOperation.status -eq 'succeeded'){ + If($IsSuccessful -and $AzDevOpsOperation.status -eq 'succeeded'){ return $true } - ElseIf($IsComplete -and $VstsOperation.status -in 'succeeded','cancelled','failed'){ + ElseIf($IsComplete -and $AzDevOpsOperation.status -in 'succeeded','cancelled','failed'){ return $true } @@ -46,4 +46,4 @@ Function Test-VstsOperation{ return $false - } \ No newline at end of file + } From 4e20be4a68bdc761e519319d5d366032139e44f2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 17:47:10 +0000 Subject: [PATCH 007/611] Included '/Services' in 'Description' property within 'AzureDevOpsDsc', PSModule manifest. --- source/AzureDevOpsDsc.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index e005e8b6b..64ef90275 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -15,7 +15,7 @@ Copyright = 'Copyright the DSC Community contributors. All rights reserved.' # Description of the functionality provided by this module - Description = 'Module with DSC resources for deployment and configuration of Azure DevOps Server.' + Description = 'Module with DSC resources for deployment and configuration of Azure DevOps Server/Services.' # Minimum version of the Windows PowerShell engine required by this module PowerShellVersion = '5.0' From 89287d62cdf04424dd82fef8a3cac73043785eec Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 18:09:22 +0000 Subject: [PATCH 008/611] Made 'Function' lowercase on a number of functions within embedded, 'AzureDevOpsDsc.Common' PSModule. --- .../Functions/Private/Get-AzDevOpsServerApiObject.ps1 | 2 +- .../Functions/Private/New-AzDevOpsServerApiObject.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsOrganizationName.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsPat.ps1 | 2 +- .../Functions/Private/Wait-AzDevOpsOperation.ps1 | 2 +- .../Functions/Public/Get-AzDevOpsOperation.ps1 | 2 +- .../Functions/Public/Get-AzDevOpsProject.ps1 | 2 +- .../Functions/Public/Get-AzDevOpsServerApiUri.ps1 | 2 +- .../Functions/Public/Get-AzDevOpsServerUri.ps1 | 2 +- .../Functions/Public/New-AzDevOpsProject.ps1 | 2 +- .../Functions/Public/Test-AzDevOpsOperation.ps1 | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 index 44f47ffa6..bfdd70926 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 @@ -1,4 +1,4 @@ -Function Get-AzDevOpsServerApiObject{ +function Get-AzDevOpsServerApiObject{ [CmdletBinding()] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 index d65af3c4f..220955434 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -1,4 +1,4 @@ -Function New-AzDevOpsServerApiObject{ +function New-AzDevOpsServerApiObject{ [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index 221ef9676..a8db0d8a8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -1,4 +1,4 @@ -Function Test-AzDevOpsOrganizationName{ +function Test-AzDevOpsOrganizationName{ [CmdletBinding()] [OutputType([bool])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index 663aa32fa..cfd3992ca 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -1,4 +1,4 @@ -Function Test-AzDevOpsPat{ +function Test-AzDevOpsPat{ [CmdletBinding()] [OutputType([bool])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 index e49f4e2e8..4da8d57f9 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -1,4 +1,4 @@ -Function Wait-AzDevOpsOperation { +function Wait-AzDevOpsOperation { [CmdletBinding()] param( diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index 656e00a29..108ca1ceb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -1,4 +1,4 @@ -Function Get-AzDevOpsOperation{ +function Get-AzDevOpsOperation{ [CmdletBinding()] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index aea5f4060..8a3b92258 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -1,4 +1,4 @@ -Function Get-AzDevOpsProject{ +function Get-AzDevOpsProject{ [CmdletBinding()] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 index 30f0f2b58..1b60ba50d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 @@ -1,4 +1,4 @@ -Function Get-AzDevOpsServerApiUri{ +function Get-AzDevOpsServerApiUri{ [CmdletBinding()] [OutputType([string])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 index 8735f7bdf..0dc41a8c1 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 @@ -1,4 +1,4 @@ -Function Get-AzDevOpsServerUri{ +function Get-AzDevOpsServerUri{ [CmdletBinding()] [OutputType([string])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index b44e45a25..d507a7b51 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -1,4 +1,4 @@ -Function New-AzDevOpsProject{ +function New-AzDevOpsProject{ [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index 4b1c35a7f..6ba7cb1c7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -1,4 +1,4 @@ -Function Test-AzDevOpsOperation{ +function Test-AzDevOpsOperation{ [CmdletBinding()] [OutputType([bool])] From 6d4dd9b4cbd3214461c3e80556191eb2050619fa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 18:11:00 +0000 Subject: [PATCH 009/611] Updated 'Get-AzDevOpsServerApiHeader' to reformat and add desciptions. --- .../Private/Get-AzDevOpsServerApiHeader.ps1 | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 index bc8669c6e..e4e6b975d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 @@ -1,18 +1,36 @@ -Function Get-AzDevOpsServerApiHeader{ +<# + .SYNOPSIS + Generates an API/HTTP request header for use when performing API/HTTP + requests/operations against the Azure DevOps API. - [CmdletBinding()] - [OutputType([hashtable])] - param( + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. - [ValidateScript({Test-AzDevOpsPat -AzDevOpsPat $_ -IsValid})] - [Alias('Pat', 'PersonalAccessToken')] - [string]$AzDevOpsPat + .EXAMPLE + Get-AzDevOpsServerApiHeader -Pat 'YourPatHere' - ) + Returns an API/HTTP request header using the 'Personal Access Token' (PAT) provided. +#> +function Get-AzDevOpsServerApiHeader +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat + ) - [hashtable]$AzDevOpsServerApiHeader = @{ - Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($AzDevOpsPat)")) - } + [Hashtable]$apiHeader = @{ + Authorization = 'Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat")) + } - return $AzDevOpsServerApiHeader + return $apiHeader } From 5214bda4a4cc77f921655fb8e89488e68d946298 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 18:12:53 +0000 Subject: [PATCH 010/611] Renamed 'Get-AzDevOpsServerApiHeader' to 'Get-AzDevOpsApiHttpRequestHeader' --- ...rverApiHeader.ps1 => Get-AzDevOpsApiHttpRequestHeader.ps1} | 4 ++-- .../Functions/Private/Get-AzDevOpsServerApiObject.ps1 | 2 +- .../Functions/Private/New-AzDevOpsServerApiObject.ps1 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename source/Modules/AzureDevOpsDsc.Common/Functions/Private/{Get-AzDevOpsServerApiHeader.ps1 => Get-AzDevOpsApiHttpRequestHeader.ps1} (90%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 similarity index 90% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 index e4e6b975d..29c11d788 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 @@ -9,11 +9,11 @@ for the subsequent operations being performed. .EXAMPLE - Get-AzDevOpsServerApiHeader -Pat 'YourPatHere' + Get-AzDevOpsApiHttpRequestHeader -Pat 'YourPatHere' Returns an API/HTTP request header using the 'Personal Access Token' (PAT) provided. #> -function Get-AzDevOpsServerApiHeader +function Get-AzDevOpsApiHttpRequestHeader { [CmdletBinding()] [OutputType([Hashtable])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 index bfdd70926..f065bc64f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 @@ -38,7 +38,7 @@ function Get-AzDevOpsServerApiObject{ [string]$Method = 'Get' - [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsServerApiHeader -AzDevOpsPat $AzDevOpsPat + [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsApiHttpRequestHeader -AzDevOpsPat $AzDevOpsPat # TODO: Need to tidy up? [object]$AzDevOpsServerApiObjects = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 index 220955434..4af3fdc91 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -38,7 +38,7 @@ function New-AzDevOpsServerApiObject{ [string]$Method = 'Post' [string]$ContentType = 'application/json' - [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsServerApiHeader -AzDevOpsPat $AzDevOpsPat + [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsApiHttpRequestHeader -AzDevOpsPat $AzDevOpsPat # TODO: Need to tidy up? From 98965706c97022fb41cbee7200740205a5fa0f06 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 18:39:48 +0000 Subject: [PATCH 011/611] Updated 'Test-AzDevOpsPat' to include description/synopsis/example, rename parameters and combine conditions determining validity of PAT. Also now outputs exception with 'New-InvalidOperationException'. --- .../Functions/Private/Test-AzDevOpsPat.ps1 | 74 +++++++++++++------ .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 2 +- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index cfd3992ca..ed205e08a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -1,25 +1,51 @@ -function Test-AzDevOpsPat{ - - [CmdletBinding()] - [OutputType([bool])] - param( - [Alias('Pat')] - [string]$AzDevOpsPat, - - [switch]$IsValid - ) - - If(!$IsValid){ - throw "The '-IsValid' switch must be used when calling 'Test-AzDevOpsPat'." - return - } - - If([string]::IsNullOrWhiteSpace($AzDevOpsPat)){ - return $false - } - ElseIf($AzDevOpsPat.Length -ne 52){ - return $false - } - - return $true +<# + .SYNOPSIS + Peforms test on a provided 'Personal Access Token' (PAT) to provide a + boolean ($true or $false) return value. + + NOTE: Use of the '-IsValid' switch is required - This will provide a return value + of $true + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'Personal Access Token' (PAT) + rather than the existence/presence/validity of the PAT itself. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsPat -Pat 'YourPatHere' -IsValid + + Returns $true if the 'Personal Access Token' (PAT) provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsPat +{ + [CmdletBinding()] + [OutputType([bool])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Pat, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + If (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + If ([string]::IsNullOrWhiteSpace($Pat) -or + $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT + { + return $false + } + + return $true } diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 index 0976b1f34..0526ce5a6 100644 --- a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -1,5 +1,5 @@ # Localized resources for helper module AzureDevOpsDsc.Common. ConvertFrom-StringData @' - ExceptionThrown = An '{0}' was thrown by '{1}'. Exception was '{2}' (AZDEVOPSCOMMON0001) + MandatoryIsValidSwitchNotUsed = The '-IsValid' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0501) '@ From a8700e22e68437feaa1aca68bdde359b6a705b74 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 18:43:06 +0000 Subject: [PATCH 012/611] Updated casing of 'if' and 'elseif' across a number of functions/scripts. --- build.ps1 | 2 +- .../AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 2 +- .../Functions/Private/Get-AzDevOpsServerApiObject.ps1 | 6 +++--- .../Functions/Private/New-AzDevOpsServerApiObject.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsOrganizationName.ps1 | 6 +++--- .../Functions/Private/Test-AzDevOpsPat.ps1 | 4 ++-- .../Functions/Private/Wait-AzDevOpsOperation.ps1 | 4 ++-- .../Functions/Public/Test-AzDevOpsOperation.ps1 | 6 +++--- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build.ps1 b/build.ps1 index 4630cb82d..a9921759f 100644 --- a/build.ps1 +++ b/build.ps1 @@ -228,7 +228,7 @@ Begin if (-not $config -or ($config -is [array] -and $config.Length -le 0)) { throw "No build configuration found. Specify path via -BuildConfig" } - elseif ($config -is [array]) { + elseIf ($config -is [array]) { if ($config.Length -gt 1) { throw "More than one build configuration found. Specify which one to use via -BuildConfig" } diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index 81b71542b..071237388 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -24,7 +24,7 @@ ForEach ($function in $functions) ) ) - If ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") + if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") { Write-Verbose "Exporting '$($function.BaseName)'..." Export-ModuleMember -Function $($function.BaseName) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 index f065bc64f..0d343248d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 @@ -19,7 +19,7 @@ function Get-AzDevOpsServerApiObject{ # Remove any $AzDevOpsObjectId if using a wildcard character # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsObjectId $AzDevOpsObjectId -IsValid') then set to $null) - If($AzDevOpsObjectId -contains '*'){ + if($AzDevOpsObjectId -contains '*'){ $AzDevOpsObjectId = $null } @@ -31,7 +31,7 @@ function Get-AzDevOpsServerApiObject{ # TODO: Need to generate this from a function [string]$AzDevOpsServerApiObjectUri = $AzDevOpsServerApiUri + "/$AzDevOpsObjectNamePluralUriString" - If(![string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ + if(![string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + "/$AzDevOpsObjectId" } $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + '?' + $AzDevOpsApiVersionUriParameter @@ -44,7 +44,7 @@ function Get-AzDevOpsServerApiObject{ [object]$AzDevOpsServerApiObjects = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader # If not a single, object request, use the object(s) in the 'value' property - If([string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ + if([string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ [object[]]$AzDevOpsServerApiObjects = $AzDevOpsServerApiObjects.value } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 index 4af3fdc91..d54128850 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -48,7 +48,7 @@ function New-AzDevOpsServerApiObject{ [object]$AzDevOpsServerApiOperation = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader -Body $AzDevOpsObjectJson -ContentType $ContentType - If($Wait){ + if($Wait){ Wait-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` -AzDevOpsOperationId $AzDevOpsOperationId ` diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index a8db0d8a8..bb644d1ee 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -9,15 +9,15 @@ function Test-AzDevOpsOrganizationName{ [switch]$IsValid ) - If(!$IsValid){ + if(!$IsValid){ throw "The '-IsValid' switch must be used when calling 'Test-AzDevOpsOrganizationName'." return } - If([string]::IsNullOrWhiteSpace($AzDevOpsOrganizationName)){ + if([string]::IsNullOrWhiteSpace($AzDevOpsOrganizationName)){ return $false } - ElseIf($AzDevOpsOrganizationName.Contains(' ') -or + elseIf($AzDevOpsOrganizationName.Contains(' ') -or $AzDevOpsOrganizationName.Contains('%')){ return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index ed205e08a..6f2e5fb89 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -35,13 +35,13 @@ function Test-AzDevOpsPat $IsValid ) - If (!$IsValid) + if (!$IsValid) { $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand New-InvalidOperationException -Message $errorMessage } - If ([string]::IsNullOrWhiteSpace($Pat) -or + if ([string]::IsNullOrWhiteSpace($Pat) -or $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT { return $false diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 index 4da8d57f9..c0663a3d3 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -27,11 +27,11 @@ function Wait-AzDevOpsOperation { [switch]$IsSuccessful ) - If (!$IsComplete -and !$IsSuccessful) { + if (!$IsComplete -and !$IsSuccessful) { throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } - ElseIf (!$IsComplete -and !$IsSuccessful) { + elseIf (!$IsComplete -and !$IsSuccessful) { throw "Only the '-IsComplete' switch or the alternative '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index 6ba7cb1c7..55f3f04c3 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -22,7 +22,7 @@ function Test-AzDevOpsOperation{ [switch]$IsSuccessful ) - If(!$IsComplete -and !$IsSuccessful){ + if(!$IsComplete -and !$IsSuccessful){ throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." return } @@ -35,10 +35,10 @@ function Test-AzDevOpsOperation{ # Note: Operation Statuses listed here: # https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus - If($IsSuccessful -and $AzDevOpsOperation.status -eq 'succeeded'){ + if($IsSuccessful -and $AzDevOpsOperation.status -eq 'succeeded'){ return $true } - ElseIf($IsComplete -and $AzDevOpsOperation.status -in 'succeeded','cancelled','failed'){ + elseIf($IsComplete -and $AzDevOpsOperation.status -in 'succeeded','cancelled','failed'){ return $true } From c04ad04a9bacfd81cc62f34044cd10c190fa6397 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 19:27:37 +0000 Subject: [PATCH 013/611] Renamed 'Get-AzDevOpsServerApiObject' to 'Get-AzDevOpsApiObject', added descriptions and updated variable names within it. --- .../Private/Get-AzDevOpsApiObject.ps1 | 99 +++++++++++++++++++ .../Private/Get-AzDevOpsServerApiObject.ps1 | 52 ---------- .../Private/New-AzDevOpsServerApiObject.ps1 | 2 +- .../Public/Get-AzDevOpsOperation.ps1 | 2 +- .../Functions/Public/Get-AzDevOpsProject.ps1 | 2 +- 5 files changed, 102 insertions(+), 55 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 new file mode 100644 index 000000000..caa9d3e64 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -0,0 +1,99 @@ +<# + .SYNOPSIS + Returns an array of objects returned from the Azure DevOps API. The type of object + returned is generic to make this function reusable across all objects from the API. + + The object type requested from the API is determined by the 'ObjectName' parameter. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ObjectName + The name of the object being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') + + .PARAMETER ObjectId + The 'id' of the object type being obtained. For example, if the 'ObjectName' parameter value + was 'Project', the 'ObjectId' value would be assumed to be the 'id' of a 'Project'. + + .EXAMPLE + Get-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' + + Returns all 'Project' objects from the Azure DevOps API related to the Organization/ApiUri + value provided. + + .EXAMPLE + Get-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -ObjectId 'YourProjectId' + + Returns the 'Project' object from the Azure DevOps API related to the Organization/ApiUri + value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). +#> +function Get-AzDevOpsApiObject +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory=$true)] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory=$true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory=$true)] + [ValidateSet('Operation','Project')] + [System.String] + $ObjectName, + + [Parameter()] + [System.String] + $ObjectId + ) + + # Remove any $ObjectId if using a wildcard character + # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsObjectId $ObjectId -IsValid') then set to $null) + if ($ObjectId -contains '*') + { + $ObjectId = $null + } + + # TODO: Need something to pluralise and lowercase this object for the URI + $objectNamePluralUriString = $ObjectName.ToLower() + "s" + + # TODO: Need to get this from input parameter? + $apiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + $apiObjectUri = $ApiUri + "/$objectNamePluralUriString" + if (![System.String]::IsNullOrWhiteSpace($ObjectId)) + { + $apiObjectUri = $apiObjectUri + "/$ObjectId" + } + $apiObjectUri = $apiObjectUri + '?' + $apiVersionUriParameter + + + + [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + + # TODO: Need to tidy up? + [System.Object[]]$apiObjects = @() + $apiObjects += Invoke-RestMethod -Uri $apiObjectUri -Method 'Get' -Headers $apiHttpRequestHeader + + # If not a single, object request, set from the object(s) in the 'value' property within the response + if ([System.String]::IsNullOrWhiteSpace($ObjectId)) + { + [System.Object[]]$apiObjects = $apiObjects.value + } + + return $apiObjects +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 deleted file mode 100644 index 0d343248d..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServerApiObject.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -function Get-AzDevOpsServerApiObject{ - - [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, - - [Alias('ObjectName')] - [ValidateSet('Project')] - [string]$AzDevOpsObjectName, - - [Alias('ObjectId')] - [string]$AzDevOpsObjectId - ) - - # Remove any $AzDevOpsObjectId if using a wildcard character - # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsObjectId $AzDevOpsObjectId -IsValid') then set to $null) - if($AzDevOpsObjectId -contains '*'){ - $AzDevOpsObjectId = $null - } - - # TODO: Need something to pluralise and lowercase this object for the URI - [string]$AzDevOpsObjectNamePluralUriString = $AzDevOpsObjectName.ToLower() + "s" - - # TODO: Need to get this from input parameter? - [string]$AzDevOpsApiVersionUriParameter = 'api-version=5.1' - - # TODO: Need to generate this from a function - [string]$AzDevOpsServerApiObjectUri = $AzDevOpsServerApiUri + "/$AzDevOpsObjectNamePluralUriString" - if(![string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ - $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + "/$AzDevOpsObjectId" - } - $AzDevOpsServerApiObjectUri = $AzDevOpsServerApiObjectUri + '?' + $AzDevOpsApiVersionUriParameter - - - [string]$Method = 'Get' - [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsApiHttpRequestHeader -AzDevOpsPat $AzDevOpsPat - - # TODO: Need to tidy up? - [object]$AzDevOpsServerApiObjects = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader - - # If not a single, object request, use the object(s) in the 'value' property - if([string]::IsNullOrWhiteSpace($AzDevOpsObjectId)){ - [object[]]$AzDevOpsServerApiObjects = $AzDevOpsServerApiObjects.value - } - - return $AzDevOpsServerApiObjects - } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 index d54128850..3916efb9f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -54,7 +54,7 @@ function New-AzDevOpsServerApiObject{ -AzDevOpsOperationId $AzDevOpsOperationId ` -IsSuccessful - Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` -AzDevOpsObjectName $AzDevOpsObjectName ` -AzDevOpsObjectId $AzDevOpsObjectId } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index 108ca1ceb..ca6fcb87a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -14,7 +14,7 @@ function Get-AzDevOpsOperation{ ) [string]$AzDevOpsObjectName = 'Operation' - [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` -AzDevOpsObjectName $AzDevOpsObjectName -AzDevOpsObjectId $AzDevOpsOperationId return $AzDevOpsServerApiObjects | diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index 8a3b92258..f6686c4fb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -17,7 +17,7 @@ function Get-AzDevOpsProject{ ) [string]$AzDevOpsObjectName = 'Project' - [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` -AzDevOpsObjectName $AzDevOpsObjectName ` -AzDevOpsObjectId $AzDevOpsProjectId From f9ba1c8ed82821c3a52939ee79032c86374dea7e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 19:30:11 +0000 Subject: [PATCH 014/611] Updated formatting of data types in 'Test-AzDevOpsPat' --- .../Functions/Private/Test-AzDevOpsPat.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index 6f2e5fb89..86ca2a163 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -24,11 +24,12 @@ function Test-AzDevOpsPat { [CmdletBinding()] - [OutputType([bool])] + [OutputType([System.Boolean])] param ( [Parameter(Mandatory = $true)] - [string]$Pat, + [System.String] + $Pat, [Parameter()] [System.Management.Automation.SwitchParameter] @@ -41,7 +42,7 @@ function Test-AzDevOpsPat New-InvalidOperationException -Message $errorMessage } - if ([string]::IsNullOrWhiteSpace($Pat) -or + if ([System.String]::IsNullOrWhiteSpace($Pat) -or $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT { return $false From ac83955b8e5168e4d656e585bae12258cca63502 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 19:41:09 +0000 Subject: [PATCH 015/611] Updated descriptions in 'Test-AzDevOpsPat' --- .../Functions/Private/Test-AzDevOpsPat.ps1 | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index 86ca2a163..82cbb56b8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -1,17 +1,16 @@ <# .SYNOPSIS Peforms test on a provided 'Personal Access Token' (PAT) to provide a - boolean ($true or $false) return value. + boolean ($true or $false) return value. Returns $true if the test is successful. - NOTE: Use of the '-IsValid' switch is required - This will provide a return value - of $true + NOTE: Use of the '-IsValid' switch is required. .PARAMETER Pat The 'Personal Access Token' (PAT) to be tested/validated. .PARAMETER IsValid Use of this switch will validate the format of the 'Personal Access Token' (PAT) - rather than the existence/presence/validity of the PAT itself. + rather than the existence/presence of the PAT itself. Failure to use this switch will throw an exception. From dbfcb4d436b3945135e6c7f471173449ab4a5622 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 19:41:49 +0000 Subject: [PATCH 016/611] Updated 'Test-AzDevOpsOrganizationName' description and formatting. Also consolidated validation criteria. --- .../Private/Test-AzDevOpsOrganizationName.ps1 | 76 ++++++++++++------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index bb644d1ee..330acfdcc 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -1,27 +1,51 @@ -function Test-AzDevOpsOrganizationName{ - - [CmdletBinding()] - [OutputType([bool])] - param( - [Alias('OrganizationName')] - [string]$AzDevOpsOrganizationName, - - [switch]$IsValid - ) - - if(!$IsValid){ - throw "The '-IsValid' switch must be used when calling 'Test-AzDevOpsOrganizationName'." - return - } - - if([string]::IsNullOrWhiteSpace($AzDevOpsOrganizationName)){ - return $false - } - elseIf($AzDevOpsOrganizationName.Contains(' ') -or - $AzDevOpsOrganizationName.Contains('%')){ - return $false - } - - return $true -} +<# + .SYNOPSIS + Peforms test on a provided 'OrganizationName' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER OrganizationName + The 'OrganizationName' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'OrganizationName' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsOrganizationName -OrganizationName 'YourOrganizationNameHere' -IsValid + Returns $true if the 'OrganizationName' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsOrganizationName +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $OrganizationName, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + if ([System.String]::IsNullOrWhiteSpace($OrganizationName) -or + ($OrganizationName.Contains(' ') -or $OrganizationName.Contains('%'))) + { + return $false + } + + return $true +} From 3c305c79403f59dcce022d17e42350a7f97f7bcb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 19:43:19 +0000 Subject: [PATCH 017/611] Renamed 'New-AzDevOpsServerApiObject' to 'New-AzDevOpsApiObject' --- .../Functions/Private/New-AzDevOpsServerApiObject.ps1 | 2 +- .../Functions/Public/New-AzDevOpsProject.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 index 3916efb9f..da96891f7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 @@ -1,4 +1,4 @@ -function New-AzDevOpsServerApiObject{ +function New-AzDevOpsApiObject{ [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] [OutputType([object[]])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index d507a7b51..4673bb80e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -51,7 +51,7 @@ function New-AzDevOpsProject{ if ($Force -or $PSCmdlet.ShouldProcess($AzDevOpsServerApiUri,$AzDevOpsObjectName)) { - [object]$AzDevOpsObject = New-AzDevOpsServerApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` + [object]$AzDevOpsObject = New-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` -AzDevOpsObjectName $AzDevOpsObjectName ` -AzDevOpsObject $($AzDevOpsObjectJson | ConvertFrom-Json) ` -Force:$Force From d32706cb0fc0717f07499d6cf852260d1f614255 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 20:16:11 +0000 Subject: [PATCH 018/611] Renamed 'New-AzDevOpsServerApiObject.ps1' to 'New-AzDevOpsApiObject.ps1', added descriptions and reformatted. --- .../Private/New-AzDevOpsApiObject.ps1 | 113 ++++++++++++++++++ .../Private/New-AzDevOpsServerApiObject.ps1 | 65 ---------- 2 files changed, 113 insertions(+), 65 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 new file mode 100644 index 000000000..79d7ed85c --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 @@ -0,0 +1,113 @@ +<# + .SYNOPSIS + Attempts to create an object within Azure DevOps. + + The type of object type created is provided in the 'ObjectName' parameter and it is + assumed that the 'Object' parameter value passed in meets the specification of the object. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ObjectName + The name of the object being created within Azure DevOps (e.g. 'Project') + + .PARAMETER Object + The object being created (typically provided by another function (e.g. 'New-AzDevOpsApiProject')). + + .EXAMPLE + New-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -Object $YourObject -Wait + + Creates the 'Project' object in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, the '-Wait' switch is provided so the function will wait for the corresponding API 'Operation' + to complete before the function completes. If the creation of the object has been successful, it will be return by the + function. If the creation of the object has failed, an exception will be thrown. + + .EXAMPLE + New-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -Object $YourObject + + Creates the 'Project' object in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, no '-Wait' switch is provided so the request is made to the API but the operation may + not complete before the function completes (and may not complete successfully at all). +#> +function New-AzDevOpsApiObject +{ + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateSet('Operation','Project')] + [System.String] + $ObjectName, + + [Parameter(Mandatory = $true)] + [System.Object] + $Object, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Wait, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + $objectId = $Object.id # TODO: Might have to remove the assumption that this works (see below also). Input object's 'id' value looks to be ignored when creating object. + + # TODO: Need something to pluralise and lowercase this object for the URI + $objectNamePluralUriString = $ObjectName.ToLower() + "s" + + # TODO: Need something to convert to JSON + $objectJson = $Object | ConvertTo-Json -Depth 10 -Compress + + # TODO: Need to get this from input parameter? + $apiVersionUriParameter = 'api-version=5.1' + + # TODO: Need to generate this from a function + $apiObjectUri = $ApiUri + "/$objectNamePluralUriString" + '?' + $apiVersionUriParameter + + + + if ($Force -or $PSCmdlet.ShouldProcess($apiObjectUri, $ObjectName)) + { + [System.Object]$apiOperation = $null + [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + + [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiObjectUri -Method 'Post' -Headers $apiHttpRequestHeader -Body $objectJson -ContentType 'application/json' + + if ($Wait) + { + # Waits for operation to complete successfully. Throws exception if operation is not successful and/or timeout is reached. + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $apiOperation.id ` + -IsSuccessful + + # Obtains and returns the new object + New-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` + -ObjectName $ObjectName ` + -ObjectId $objectId # TODO: Might have to remove the assumption that this works (see above also). Input object's 'id' value looks to be ignored when creating object. + } + } +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 deleted file mode 100644 index da96891f7..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsServerApiObject.ps1 +++ /dev/null @@ -1,65 +0,0 @@ -function New-AzDevOpsApiObject{ - - [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, - - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, - - [Alias('ObjectName')] - [ValidateSet('Project')] - [PsObject]$AzDevOpsObjectName, - - [Alias('Object')] - [PsObject]$AzDevOpsObject, - - [switch]$Wait, - - [switch]$Force - ) - - [string]$AzDevOpsObjectId = $AzDevOpsObject.id - - # TODO: Need something to pluralise and lowercase this object for the URI - [string]$AzDevOpsObjectNamePluralUriString = $AzDevOpsObjectName.ToLower() + "s" - - # TODO: Need something to convert to JSON - [string]$AzDevOpsObjectJson = $AzDevOpsObject | ConvertTo-Json -Depth 10 -Compress - - # TODO: Need to get this from input parameter? - [string]$AzDevOpsApiVersionUriParameter = 'api-version=5.1' - - # TODO: Need to generate this from a function - [string]$AzDevOpsServerApiObjectUri = $AzDevOpsServerApiUri + "/$AzDevOpsObjectNamePluralUriString" + '?' + $AzDevOpsApiVersionUriParameter - - - [string]$Method = 'Post' - [string]$ContentType = 'application/json' - [hashtable]$AzDevOpsServerApiHeader = Get-AzDevOpsApiHttpRequestHeader -AzDevOpsPat $AzDevOpsPat - - # TODO: Need to tidy up? - - [object]$AzDevOpsServerApiOperation = $null - - if ($Force -or $PSCmdlet.ShouldProcess($AzDevOpsServerApiObjectUri,$AzDevOpsObjectName)) { - - [object]$AzDevOpsServerApiOperation = Invoke-RestMethod -Uri $AzDevOpsServerApiObjectUri -Method $Method -Headers $AzDevOpsServerApiHeader -Body $AzDevOpsObjectJson -ContentType $ContentType - - if($Wait){ - - Wait-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsOperationId $AzDevOpsOperationId ` - -IsSuccessful - - Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsObjectName $AzDevOpsObjectName ` - -AzDevOpsObjectId $AzDevOpsObjectId - } - - } - - - } From 3c0cef511ed137747895241f5831a7ab9d506442 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 20:55:28 +0000 Subject: [PATCH 019/611] Updated 'Wait-AzDevOpsOperation' to add description, rename parameters and reformat. --- .../Private/Wait-AzDevOpsOperation.ps1 | 135 +++++++++++++----- .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 6 + 2 files changed, 103 insertions(+), 38 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 index c0663a3d3..a2ca76e72 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -1,54 +1,113 @@ -function Wait-AzDevOpsOperation { +<# + .SYNOPSIS + Waits for an Azure DevOps API operation. - [CmdletBinding()] - param( - [Parameter(Mandatory)] - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, + NOTE: Use of one of the '-IsSuccessful' or '-IsComplete' switch is required. - [Parameter(Mandatory)] - [Alias('Pat', 'PersonalAccessToken')] - [string]$AzDevOpsPat, + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: - [Parameter(Mandatory)] - [Alias('OperationId', 'Id')] - [string]$AzDevOpsOperationId, + https://dev.azure.com/someOrganizationName/_apis/ - [Alias('IntervalMilliseconds')] - [int]$WaitIntervalMilliseconds = 500, + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. - [Alias('TimeoutMilliseconds')] - [int]$WaitTimeoutMilliseconds = 30000, # 30 seconds + .PARAMETER OperationId + The 'id' of the Azure DevOps API operation. This is typically obtained from a response + provided by the API when a request is made to it. - [Parameter(Mandatory, ParameterSetName = 'IsComplete')] - [switch]$IsComplete, + .PARAMETER IsComplete + Use of this switch will ensure the function waits for the Azure DevOps API operation + to complete (Note: The operation could complete with error or/and without success). - [Parameter(Mandatory, ParameterSetName = 'IsSuccessful')] - [switch]$IsSuccessful - ) + Failure to use this switch or the '-IsSuccessful' one as an alternative will throw an + exception. An exception will also be thrown if the wait exceeds the timeout. - if (!$IsComplete -and !$IsSuccessful) { - throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." - return - } - elseIf (!$IsComplete -and !$IsSuccessful) { - throw "Only the '-IsComplete' switch or the alternative '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." - return - } + .PARAMETER IsSuccessful + Use of this switch will ensure the function waits for the Azure DevOps API operation + to successfully complete (Note: The operation must complete with success). - [DateTime]$WaitStartDateTime = [DateTime]::UtcNow + Failure to use this switch or the '-IsComplete' one as an alternative will throw an + exception. An exception will also be thrown if the wait exceeds the timeout. - while (!(Test-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsOperationId $AzDevOpsOperationId ` - -IsComplete:$IsComplete -IsSuccessful:$IsSuccessful)) { + .EXAMPLE + Wait-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationId' ` + -IsComplete - Start-Sleep -Milliseconds $WaitIntervalMilliseconds + Waits for the Azure DevOps 'Operation' (identified by the 'OperationId') to complete (although the + operation may not complete successfully). - if ($(New-TimeSpan -Start $WaitStartDateTime -End $([DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) { - throw "The 'Wait-AzDevOpsOperation' operation for AzDevOpsOperationId of '$AzDevOpsOperationId' exceeded specified, maximum timeout ($WaitTimeoutMilliseconds milliseconds)" - return + .EXAMPLE + Wait-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationId' ` + -IsSuccessful + + Waits for the Azure DevOps 'Operation' (identified by the 'OperationId') to complete successfully. +#> +function Wait-AzDevOpsOperation +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [Alias('Id')] + [System.String] + $OperationId, + + [Parameter()] + [Alias('Interval','IntervalMilliseconds')] + [System.UInt32] + $WaitIntervalMilliseconds = 100, + + [Parameter()] + [Alias('Timeout','TimeoutMilliseconds')] + [System.UInt32] + $WaitTimeoutMilliseconds = 10000, + + [Parameter(Mandatory = $true, ParameterSetName = 'IsComplete')] + [System.Management.Automation.SwitchParameter] + $IsComplete, + + [Parameter(Mandatory = $true, ParameterSetName = 'IsSuccessful')] + [System.Management.Automation.SwitchParameter] + $IsSuccessful + ) + + if (!$IsComplete -and !$IsSuccessful) + { + $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + elseif (!$IsComplete -and !$IsSuccessful) # Failsafe: Unlikely/Impossible to occur while both setup with different 'ParameterSetName' values + { + $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage } - } + [System.DateTime]$waitStartDateTime = [System.DateTime]::UtcNow + + while (!(Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $OperationId ` + -IsComplete:$IsComplete -IsSuccessful:$IsSuccessful)) + { + Start-Sleep -Milliseconds $WaitIntervalMilliseconds + + if ($(New-TimeSpan -Start $waitStartDateTime -End $([System.DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) + { + $errorMessage = $script:localizedData.AzDevOpsOperationTimeoutExceeded -f $MyInvocation.MyCommand, $OperationId, $WaitTimeoutMilliseconds + New-InvalidOperationException -Message $errorMessage + } + } } diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 index 0526ce5a6..a5aa003ff 100644 --- a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -1,5 +1,11 @@ # Localized resources for helper module AzureDevOpsDsc.Common. ConvertFrom-StringData @' + MandatoryIsValidSwitchNotUsed = The '-IsValid' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0501) + MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed = Either the '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0502) + MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed = Only one of the '-IsComplete' switch and the '-IsSuccessful' switch can be used when calling '{0}'. (AZDEVOPSCOMMON0503) + + AzDevOpsOperationTimeoutExceeded = The '{0}' function (using OperationId of '$OperationId') exceeded specified, maximum timeout ({2} milliseconds). (AZDEVOPSCOMMON0701) + '@ From d1da5bd44d950535bd1360dfe6a1c78550827f91 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:18:26 +0000 Subject: [PATCH 020/611] Renamed 'Get-AzDevOpsServerApiUri' to 'Get-AzDevOpsServicesApiUri' and updated formatting and descriptions. --- .../Public/Get-AzDevOpsServerApiUri.ps1 | 15 ---------- .../Public/Get-AzDevOpsServicesApiUri.ps1 | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+), 15 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 deleted file mode 100644 index 1b60ba50d..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerApiUri.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -function Get-AzDevOpsServerApiUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-AzDevOpsOrganizationName -AzDevOpsOrganizationName $_ -IsValid})] - [Alias('OrganizationName')] - [string]$AzDevOpsOrganizationName - ) - - [string]$AzDevOpsServerUri = Get-AzDevOpsServerUri -AzDevOpsOrganizationName $AzDevOpsOrganizationName - - return $AzDevOpsServerUri + "_apis" -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 new file mode 100644 index 000000000..c096eb2b0 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 @@ -0,0 +1,28 @@ +<# + .SYNOPSIS + Returns a URI for the 'Azure DevOps Services' API for the provided 'OrganizationName'. + + .PARAMETER OrganizationName + The 'OrganizationName' to obtain the 'Azure DevOps Services', API URI for. + + .EXAMPLE + Get-AzDevOpsServicesApiUri -OrganizationName 'YourOrganizationName' + + Returns the 'Azure DevOps Services', API URI associated with the 'OrganizationName' provided. +#> +function Get-AzDevOpsServicesApiUri +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsOrganizationName -OrganizationName $_ -IsValid })] + [System.String] + $OrganizationName + ) + + [System.String]$uri = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName + + return $uri + "_apis" +} From e08f587b183a2fd8b281100032ad64b45eda4ebc Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:18:42 +0000 Subject: [PATCH 021/611] Renamed 'Get-AzDevOpsServerUri' to 'Get-AzDevOpsServicesUri' and updated formatting and descriptions. --- .../Public/Get-AzDevOpsServerUri.ps1 | 18 ----------- .../Public/Get-AzDevOpsServicesUri.ps1 | 31 +++++++++++++++++++ 2 files changed, 31 insertions(+), 18 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 deleted file mode 100644 index 0dc41a8c1..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServerUri.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-AzDevOpsServerUri{ - - [CmdletBinding()] - [OutputType([string])] - param( - - [ValidateScript({Test-AzDevOpsOrganizationName -AzDevOpsOrganizationName $_ -IsValid})] - [Alias('OrganizationName')] - [string]$AzDevOpsOrganizationName - - ) - - $AzDevOpsOrganizationName = $AzDevOpsOrganizationName.ToLower() - - [string]$AzDevOpsServerUri = "https://dev.azure.com/$AzDevOpsOrganizationName/" - - return $AzDevOpsServerUri -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 new file mode 100644 index 000000000..2c5cdf66c --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 @@ -0,0 +1,31 @@ +<# + .SYNOPSIS + Returns a URI for 'Azure DevOps Services' for the provided 'OrganizationName'. + + .PARAMETER OrganizationName + The 'OrganizationName' to obtain the 'Azure DevOps Services' URI for. + + .EXAMPLE + Get-AzDevOpsServicesUri -OrganizationName 'YourOrganizationName' + + Returns the 'Azure DevOps Services' URI associated with the 'OrganizationName' provided. +#> +function Get-AzDevOpsServicesUri +{ + + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsOrganizationName -OrganizationName $_ -IsValid })] + [System.String] + $OrganizationName + ) + + $OrganizationName = $OrganizationName.ToLower() + + [System.String]$uri = "https://dev.azure.com/$OrganizationName/" + + return $uri +} From a003be5e2e7d2f1ce5e3ef52700c1a0c46bfc35c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:32:39 +0000 Subject: [PATCH 022/611] Updated 'Get-AzDevOpsOperation' to update descriptions, examples and formatting. --- .../Public/Get-AzDevOpsOperation.ps1 | 59 ++++++++++++++----- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index ca6fcb87a..79f87f7db 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -1,22 +1,51 @@ -function Get-AzDevOpsOperation{ +<# + .SYNOPSIS + Returns an Azure DevOps 'Operation' as identified by the 'OperationId' provided. + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER OperationId + The 'id' of the 'Operation' being obtained/requested. + + .EXAMPLE + Get-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationIdHere' + + Returns the 'Operation' object from Azure DevOps related to the 'OperationId' value provided. +#> +function Get-AzDevOpsOperation +{ [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, + [Parameter(Mandatory = $true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, - [Alias('OperationId','Id')] - [string]$AzDevOpsOperationId = '*' + [Parameter(Mandatory = $true)] + [Alias('Id')] + [System.String] + $OperationId ) - [string]$AzDevOpsObjectName = 'Operation' - [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsObjectName $AzDevOpsObjectName -AzDevOpsObjectId $AzDevOpsOperationId + [System.Object[]]$apiObjects = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` + -ObjectName 'Operation' ` + -ObjectId $OperationId - return $AzDevOpsServerApiObjects | - Where-Object id -ilike $AzDevOpsOperationId - } + return $apiObjects | + Where-Object id -ilike $OperationId +} From 429b4341fae31ef13fbda09d827c6e7365024e57 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:33:06 +0000 Subject: [PATCH 023/611] Updated 'Get-AzDevOpsProject' to update descriptions, examples and formatting. --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 89 +++++++++++++++---- 1 file changed, 71 insertions(+), 18 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index f6686c4fb..99a3d7091 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -1,27 +1,80 @@ -function Get-AzDevOpsProject{ +<# + .SYNOPSIS + Returns an Azure DevOps 'Project' as identified by the 'ProjectId' and/or 'ProjectName' provided. + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/Projects + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent Projects being performed. + + .PARAMETER ProjectId + The 'id' of the 'Project' being obtained/requested. Wildcards (e.g. '*') are allowed. + + .PARAMETER ProjectName + The 'name' of the 'Project' being obtained/requested. Wildcards (e.g. '*') are allowed. + + .EXAMPLE + Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' + + Returns all the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps. + + .EXAMPLE + Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectName '*' + + Returns all the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps. + + .EXAMPLE + Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectIdHere' + + Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' value provided. + + .EXAMPLE + Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectName 'YourProjectNameHere' + + Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectName' value provided. + + .EXAMPLE + Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectIdHere' -ProjectName 'YourProjectNameHere' + + Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' and 'ProjectName' value provided. +#> +function Get-AzDevOpsProject +{ [CmdletBinding()] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, + [Parameter(Mandatory = $true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, - [Alias('ProjectId','Id')] - [string]$AzDevOpsProjectId = '*', + [Parameter(Mandatory = $true)] + [Alias('Id')] + [System.String] + $ProjectId = '*', - [Alias('ProjectName','Name')] - [string]$AzDevOpsProjectName = '*' + [Parameter()] + [Alias('Name')] + [System.String] + $ProjectName = '*' ) - [string]$AzDevOpsObjectName = 'Project' - [object[]]$AzDevOpsServerApiObjects = Get-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsObjectName $AzDevOpsObjectName ` - -AzDevOpsObjectId $AzDevOpsProjectId + [object[]]$apiObjects = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` + -ObjectName 'Project' ` + -ObjectId $ProjectId - return $AzDevOpsServerApiObjects | - Where-Object name -ilike $AzDevOpsProjectName | - Where-Object id -ilike $AzDevOpsProjectId + return $apiObjects | + Where-Object name -ilike $ProjectName | + Where-Object id -ilike $ProjectId } From c7d88142b844a66e447da1abd60cb5028bf4f3ed Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:37:57 +0000 Subject: [PATCH 024/611] Added 'FunctionsToExport' functions in embedded, 'AzureDevOpsDsc.Common' PSModule. --- .../AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 index 0b6c3dc83..698558f4b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -22,6 +22,14 @@ # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. FunctionsToExport = @( + 'Get-AzDevOpsServicesUri' + 'Get-AzDevOpsServicesApiUri' + + 'Get-AzDevOpsOperation' + 'Test-AzDevOpsOperation' + + 'Get-AzDevOpsProject' + 'New-AzDevOpsProject' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. From f9cceaba10020a97b388be90e3b9ae98e52dc403 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 21:55:37 +0000 Subject: [PATCH 025/611] Updated 'Test-AzDevOpsOperation' to add descriptions and update formatting. --- .../Public/Test-AzDevOpsOperation.ps1 | 121 +++++++++++++----- 1 file changed, 88 insertions(+), 33 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index 55f3f04c3..f5885e555 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -1,49 +1,104 @@ -function Test-AzDevOpsOperation{ +<# + .SYNOPSIS + Tests the status of an Azure DevOps API operation. - [CmdletBinding()] - [OutputType([bool])] - param( - [Parameter(Mandatory)] - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, + NOTE: Use of one of the '-IsSuccessful' or '-IsComplete' switch is required. - [Parameter(Mandatory)] - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: - [Parameter(Mandatory)] - [Alias('OperationId','Id')] - [string]$AzDevOpsOperationId, + https://dev.azure.com/someOrganizationName/_apis/ - [Parameter(Mandatory,ParameterSetName='IsComplete')] - [switch]$IsComplete, + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. - [Parameter(Mandatory,ParameterSetName='IsSuccessful')] - [switch]$IsSuccessful - ) + .PARAMETER OperationId + The 'id' of the Azure DevOps API operation. This is typically obtained from a response + provided by the API when a request is made to it. - if(!$IsComplete -and !$IsSuccessful){ - throw "The '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling 'Test-AzDevOpsOperation'." - return - } + .PARAMETER IsComplete + Use of this switch will ensure the function tests for the Azure DevOps API operation + to be completed (Note: The operation could complete with error or/and without success). + + Failure to use this switch or the '-IsSuccessful' one as an alternative will throw an + exception. + + .PARAMETER IsSuccessful + Use of this switch will ensure the function tests for the Azure DevOps API operation + to be successfully completed (Note: The operation must have completed with success). + Failure to use this switch or the '-IsComplete' one as an alternative will throw an + exception. + .EXAMPLE + Test-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationId' ` + -IsComplete + + Tests that the Azure DevOps 'Operation' (identified by the 'OperationId') has completed (although the + operation may not have completed successfully). Returns $true if it has completed and returns $false + if it has not. + + .EXAMPLE + Test-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationId' ` + -IsSuccessful + + Tests that the Azure DevOps 'Operation' (identified by the 'OperationId') has completed successfully. + Returns $true if it has completely successfully and returns $false if it has not. +#> +function Test-AzDevOpsOperation +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, - [object[]]$AzDevOpsOperation = Get-AzDevOpsOperation -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsOperationId $AzDevOpsOperationId + [Parameter(Mandatory = $true)] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + [Parameter(Mandatory = $true)] + [Alias('Id')] + [System.String] + $OperationId, - # Note: Operation Statuses listed here: - # https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus - if($IsSuccessful -and $AzDevOpsOperation.status -eq 'succeeded'){ - return $true + [Parameter(Mandatory = $true, ParameterSetName = 'IsComplete')] + [System.Management.Automation.SwitchParameter] + $IsComplete, + + [Parameter(Mandatory = $true, ParameterSetName = 'IsSuccessful')] + [System.Management.Automation.SwitchParameter] + $IsSuccessful + ) + + if (!$IsComplete -and !$IsSuccessful) + { + $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage } - elseIf($IsComplete -and $AzDevOpsOperation.status -in 'succeeded','cancelled','failed'){ - return $true + elseif (!$IsComplete -and !$IsSuccessful) # Failsafe: Unlikely/Impossible to occur while both setup with different 'ParameterSetName' values + { + $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage } - # Otherwise, the status is one of 'inProgress', 'notSet' or 'queued' - return $false + [object[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $OperationId - } + + # Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus + if (($IsSuccessful -and $operation.status -eq 'succeeded') -or + ($IsComplete -and $operation.status -in 'succeeded', 'cancelled', 'failed')) + { + return $true + } + + return $false +} From 2dec7710e636cd4c2b616f83819dc3aa6ff17944 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:04:49 +0000 Subject: [PATCH 026/611] Updated 'SupportsShouldProcess' definition in 'New-AzDevOpsApiObject' --- .../Functions/Private/New-AzDevOpsApiObject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 index 79d7ed85c..22d38095e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 @@ -42,7 +42,7 @@ #> function New-AzDevOpsApiObject { - [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] [OutputType([System.Object])] param ( From b9e5f0d92443cf86040f3e269eee55fdcf5840a6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:10:21 +0000 Subject: [PATCH 027/611] Made $IsValid switch mandatory in 'Test-AzDevOpsOrganizationName'. --- .../Functions/Private/Test-AzDevOpsOrganizationName.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index 330acfdcc..f59c57534 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -30,7 +30,7 @@ function Test-AzDevOpsOrganizationName [System.String] $OrganizationName, - [Parameter()] + [Parameter(Mandatory = $true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 5a3f870d9ce3bfc722e4941cb045680a1b140872 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:10:32 +0000 Subject: [PATCH 028/611] Made $IsValid switch mandatory in 'Test-AzDevOpsPat'. --- .../Functions/Private/Test-AzDevOpsPat.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 index 82cbb56b8..ec74b65fd 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 @@ -30,7 +30,7 @@ function Test-AzDevOpsPat [System.String] $Pat, - [Parameter()] + [Parameter(Mandatory = $true)] [System.Management.Automation.SwitchParameter] $IsValid ) From fbf3715b04013d13968b3a905f2061330a846582 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:23:31 +0000 Subject: [PATCH 029/611] Updated 'New-AzDevOpsProject' to add descriptions and to reformat. --- .../Functions/Public/New-AzDevOpsProject.ps1 | 120 ++++++++++++------ 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index 4673bb80e..9395fea57 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -1,44 +1,88 @@ -function New-AzDevOpsProject{ +<# + .SYNOPSIS + Creates a new Azure DevOps 'Project' with the specified properties set by the parameters. - [CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')] - [OutputType([object[]])] - param( - [Alias('Uri')] - [string]$AzDevOpsServerApiUri, + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: - [Alias('Pat','PersonalAccessToken')] - [string]$AzDevOpsPat, + https://dev.azure.com/someOrganizationName/_apis/ - [Parameter(Mandatory)] - [Alias('ProjectId','Id')] - [string]$AzDevOpsProjectId, + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/Projects + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent Projects being performed. - [Parameter(Mandatory)] - [Alias('ProjectName','Name')] - [string]$AzDevOpsProjectName, + .PARAMETER ProjectId + The 'id' of the 'Project' being created. - [Parameter(Mandatory)] - [Alias('ProjectDescription','Description')] - [string]$AzDevOpsProjectDescription, + .PARAMETER ProjectName + The 'name' of the 'Project' being created. - [Parameter(Mandatory)] - [Alias('SourceControlType')] - [ValidateSet('Git')] - [string]$AzDevOpsSourceControlType, + .PARAMETER ProjectDescription + The 'description' of the 'Project' being created. - [switch]$Force - ) + .PARAMETER SourceControlType + The 'sourceControlType' of the 'Project' being created. + + Options are 'Tfvc' or 'Git'. Defaults to 'Git' if no value provided. + + .PARAMETER Force + When this switch is used, any confirmation will be overidden/ignored. + + .EXAMPLE + New-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ProjectId 'YourProjectIdHere' -ProjectName 'YourProjectNameHere' ` + -ProjectName 'YourProjectDescriptionHere' -SourceControlType 'Git' + + Creates a 'Project' (assocated with the Organization/ApiUrl) in Azure DevOps using project-related, parameter values provided. +#> +function New-AzDevOpsProject +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Alias('Uri')] + [System.String] + $ApiUri, + + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [Alias('Id')] + [System.String] + $ProjectId, - [string]$AzDevOpsObjectName = 'Project' + [Parameter(Mandatory = $true)] + [Alias('Name')] + [System.String] + $ProjectName, - [string]$AzDevOpsObjectJson = ' + [Parameter(Mandatory = $true)] + [Alias('Description')] + [System.String] + $ProjectDescription, + + [Parameter()] + [ValidateSet('Git','Tfvc')] + [System.String] + $SourceControlType = 'Git', + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + [string]$objectJson = ' { - "id": "'+ $AzDevOpsProjectId +'", - "name": "'+ $AzDevOpsProjectName +'", - "description": "'+ $AzDevOpsProjectDescription +'", + "id": "' + $ProjectId + '", + "name": "' + $ProjectName + '", + "description": "' + $ProjectDescription + '", "capabilities": { "versioncontrol": { - "sourceControlType": "'+ $AzDevOpsSourceControlType +'" + "sourceControlType": "' + $SourceControlType + '" }, "processTemplate": { "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" @@ -47,15 +91,15 @@ function New-AzDevOpsProject{ } ' - [object]$AzDevOpsObject = $null - - if ($Force -or $PSCmdlet.ShouldProcess($AzDevOpsServerApiUri,$AzDevOpsObjectName)) { + [System.Object]$object = $null - [object]$AzDevOpsObject = New-AzDevOpsApiObject -AzDevOpsServerApiUri $AzDevOpsServerApiUri -AzDevOpsPat $AzDevOpsPat ` - -AzDevOpsObjectName $AzDevOpsObjectName ` - -AzDevOpsObject $($AzDevOpsObjectJson | ConvertFrom-Json) ` - -Force:$Force + if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $objectName)) + { + [System.Object]$object = New-AzDevOpsApiObject -$ApiUri $ApiUri -Pat $Pat ` + -ObjectName 'Project' ` + -Object $($objectJson | ConvertFrom-Json) ` + -Force:$Force } - return $AzDevOpsObject - } + return $object +} From 5ccb8c9a83cc5e91ca85c77f6014b37ef4cb10eb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:35:01 +0000 Subject: [PATCH 030/611] Replaced 'Project' errors in descriptions with 'operation' --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 4 ++-- .../Functions/Public/New-AzDevOpsProject.ps1 | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index 99a3d7091..4da89d074 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -8,9 +8,9 @@ https://dev.azure.com/someOrganizationName/_apis/ .PARAMETER Pat - The 'Personal Access Token' (PAT) to be used by any subsequent requests/Projects + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned - for the subsequent Projects being performed. + for the subsequent operations being performed. .PARAMETER ProjectId The 'id' of the 'Project' being obtained/requested. Wildcards (e.g. '*') are allowed. diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index 9395fea57..d6946a34c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -8,9 +8,9 @@ https://dev.azure.com/someOrganizationName/_apis/ .PARAMETER Pat - The 'Personal Access Token' (PAT) to be used by any subsequent requests/Projects + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned - for the subsequent Projects being performed. + for the subsequent operations being performed. .PARAMETER ProjectId The 'id' of the 'Project' being created. @@ -42,10 +42,12 @@ function New-AzDevOpsProject [OutputType([System.Object])] param ( + [Parameter(Mandatory = $true)] [Alias('Uri')] [System.String] $ApiUri, + [Parameter(Mandatory = $true)] [Alias('PersonalAccessToken')] [System.String] $Pat, From c08a0168ae0b8a63cbb836d1a59c0840ac5ff830 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 25 Oct 2020 22:35:16 +0000 Subject: [PATCH 031/611] Added empty 'New-AzDevOpsConnection' procedure. --- .../Public/New-AzDevOpsConnection.ps1 | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 new file mode 100644 index 000000000..d204ffb8c --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 @@ -0,0 +1,56 @@ +<# + .SYNOPSIS + Creates a 'Connection' (assocated with the Organization/ApiUrl) to be used with other functions/cmdlets in this PSModule. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER Credential + The 'Credential' to be used by any subsequent requests against the Azure DevOps API. + This credential must have the relevant permissions assigned for the subsequent operations + being performed. + + .EXAMPLE + New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' + + Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'Personal Access Token' (PAT)) to be used with other functions/cmdlets in this PSModule. + + .EXAMPLE + New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Credential $YourCredentialHere + + Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'PSCredential' object) to be used with other functions/cmdlets in this PSModule. +#> +function New-AzDevOpsConnection +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true, ParameterSetName = 'Pat')] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true, ParameterSetName = 'Credential')] + [System.Management.Automation.PSCredential] + $Credential + ) + + [System.Object]$connection = $null + + # TODO! + + return $connection +} From 9124b0f1c909788750ea8a15389947ed66b4687b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 15:57:38 +0000 Subject: [PATCH 032/611] Added a number of initial 'Test-' functions to validate other function, input parameters. --- .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 48 ++++++++++++++++++ .../Private/Test-AzDevOpsCredential.ps1 | 48 ++++++++++++++++++ .../Private/Test-AzDevOpsObjectId.ps1 | 48 ++++++++++++++++++ .../Private/Test-AzDevOpsOperationId.ps1 | 50 +++++++++++++++++++ .../Private/Test-AzDevOpsProjectId.ps1 | 50 +++++++++++++++++++ .../Private/Test-AzDevOpsProjectName.ps1 | 45 +++++++++++++++++ 6 files changed, 289 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 new file mode 100644 index 000000000..3e86e0412 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -0,0 +1,48 @@ +<# + .SYNOPSIS + Peforms test on a provided URI of the Azure DevOps API to provide a + boolean ($true or $false) return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the URI of the Azure DevOps API + rather than the existence/presence of the API/URI itself. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsApiUri -ApiUri 'YourApiUriHere' -IsValid + + Returns $true if the URI of the Azure DevOps API provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsApiUri +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + # TODO: + # - Validate it's a valid URL + + return $true +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 new file mode 100644 index 000000000..a0ff38ad7 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 @@ -0,0 +1,48 @@ +<# + .SYNOPSIS + Peforms test on a provided 'Credential' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER Credential + The 'Credential' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'Credential' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsCredential -Credential 'YourCredentialHere' -IsValid + + Returns $true if the 'Credential' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsCredential +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + # TODO: + # - Validate username is 'PAT' ? + + return $true +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 new file mode 100644 index 000000000..0745f167b --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 @@ -0,0 +1,48 @@ +<# + .SYNOPSIS + Peforms test on a provided 'ObjectId' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ObjectId + The 'ObjectId' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'ObjectId' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsObjectId -ObjectId 'YourObjectIdHere' -IsValid + + Returns $true if the 'ObjectId' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsObjectId +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ObjectId, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + # TODO: + # - Validate it's a GUID? + + return $true +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 new file mode 100644 index 000000000..5757816f5 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -0,0 +1,50 @@ +<# + .SYNOPSIS + Peforms test on a provided 'OperationId' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER OperationId + The 'OperationId' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'OperationId' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsOperationId -OperationId 'YourOperationIdHere' -IsValid + + Returns $true if the 'OperationId' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsOperationId +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $OperationId, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + if (!(Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$IsValid)) + { + return $false + } + + return $true +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 new file mode 100644 index 000000000..8bec0c0c8 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -0,0 +1,50 @@ +<# + .SYNOPSIS + Peforms test on a provided 'ProjectId' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ProjectId + The 'ProjectId' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'ProjectId' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsProjectId -ProjectId 'YourProjectIdHere' -IsValid + + Returns $true if the 'ProjectId' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsProjectId +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ProjectId, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + if (!(Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$IsValid)) + { + return $false + } + + return $true +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 new file mode 100644 index 000000000..4db45f284 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -0,0 +1,45 @@ +<# + .SYNOPSIS + Peforms test on a provided 'ProjectName' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ProjectName + The 'ProjectName' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'ProjectName' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsProjectName -ProjectName 'YourProjectNameHere' -IsValid + + Returns $true if the 'ProjectName' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsProjectName +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ProjectName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + return $true +} From 14dcbaf590b53ff8f801c1f805b4674c7b740401 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 16:01:11 +0000 Subject: [PATCH 033/611] Added 'ValidateScript', parameter attributes for $ApiUri and $Pat parameters. --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 2 ++ .../Functions/Private/New-AzDevOpsApiObject.ps1 | 2 ++ .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 1 + .../Functions/Private/Wait-AzDevOpsOperation.ps1 | 2 ++ .../Functions/Public/Get-AzDevOpsOperation.ps1 | 2 ++ .../Functions/Public/Get-AzDevOpsProject.ps1 | 2 ++ .../Functions/Public/New-AzDevOpsConnection.ps1 | 2 ++ .../Functions/Public/New-AzDevOpsProject.ps1 | 2 ++ .../Functions/Public/Test-AzDevOpsOperation.ps1 | 2 ++ 9 files changed, 17 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index caa9d3e64..d06c0c95c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -41,11 +41,13 @@ function Get-AzDevOpsApiObject param ( [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 index 22d38095e..d8310ca3d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 @@ -47,11 +47,13 @@ function New-AzDevOpsApiObject param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 index 3e86e0412..9dbba5bbb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -27,6 +27,7 @@ function Test-AzDevOpsApiUri param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [System.String] $ApiUri, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 index a2ca76e72..7ecc6d067 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -51,11 +51,13 @@ function Wait-AzDevOpsOperation param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index 79f87f7db..245d97620 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -27,11 +27,13 @@ function Get-AzDevOpsOperation param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index 4da89d074..9a38995f0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -50,11 +50,13 @@ function Get-AzDevOpsProject param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 index d204ffb8c..3036aa629 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 @@ -34,11 +34,13 @@ function New-AzDevOpsConnection param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true, ParameterSetName = 'Pat')] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index d6946a34c..cff586195 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -43,11 +43,13 @@ function New-AzDevOpsProject param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index f5885e555..ad33ee74b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -54,11 +54,13 @@ function Test-AzDevOpsOperation param ( [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] [System.String] $Pat, From ddeaa2be09fa564ab66522bdeab98424d50817db Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 16:07:23 +0000 Subject: [PATCH 034/611] Added parameter 'ValidateScript' attributes testing $ObjectId, $ProductId, $ProductName, $ProjectDescription, $Credential and $OperationId --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 1 + .../Functions/Public/Get-AzDevOpsOperation.ps1 | 1 + .../Functions/Public/Get-AzDevOpsProject.ps1 | 2 ++ .../Functions/Public/New-AzDevOpsConnection.ps1 | 1 + .../Functions/Public/New-AzDevOpsProject.ps1 | 3 +++ .../Functions/Public/Test-AzDevOpsOperation.ps1 | 1 + 6 files changed, 9 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index d06c0c95c..5d7390a86 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -58,6 +58,7 @@ function Get-AzDevOpsApiObject $ObjectName, [Parameter()] + [ValidateScript({ Test-AzDevOpsObjectId -ObjectId $_ -IsValid })] [System.String] $ObjectId ) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index 245d97620..cf5247a12 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -39,6 +39,7 @@ function Get-AzDevOpsOperation $Pat, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] [Alias('Id')] [System.String] $OperationId diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index 9a38995f0..c0c5edfc1 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -62,11 +62,13 @@ function Get-AzDevOpsProject $Pat, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] [Alias('Id')] [System.String] $ProjectId = '*', [Parameter()] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] [Alias('Name')] [System.String] $ProjectName = '*' diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 index 3036aa629..3e9dcf002 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 @@ -46,6 +46,7 @@ function New-AzDevOpsConnection $Pat, [Parameter(Mandatory = $true, ParameterSetName = 'Credential')] + [ValidateScript({ Test-AzDevOpsCredential -Credential $_ -IsValid })] [System.Management.Automation.PSCredential] $Credential ) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 index cff586195..db8e3becd 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 @@ -55,16 +55,19 @@ function New-AzDevOpsProject $Pat, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] [Alias('Id')] [System.String] $ProjectId, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] [Alias('Name')] [System.String] $ProjectName, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] [Alias('Description')] [System.String] $ProjectDescription, diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 index ad33ee74b..5a717bc5d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -66,6 +66,7 @@ function Test-AzDevOpsOperation $Pat, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] [Alias('Id')] [System.String] $OperationId, From e5b06d7ef736db5caa9cbc93a38420ca475d2c8b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 16:13:14 +0000 Subject: [PATCH 035/611] Added empty, 'AzureDevOpsDsc.Server' PSModule. --- .../AzureDevOpsDsc.Server.psd1 | 42 +++++++++++++++++++ .../AzureDevOpsDsc.Server.psm1 | 32 ++++++++++++++ .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 5 +++ 3 files changed, 79 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 create mode 100644 source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 create mode 100644 source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 new file mode 100644 index 000000000..a76a0190a --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 @@ -0,0 +1,42 @@ +@{ + RootModule = 'AzureDevOpsDsc.Server.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0' + + # ID used to uniquely identify this module + GUID = 'e849d233-8ee3-47a8-aec2-e61c460bdeb8' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in AzureDevOpsDsc (specifically for the "Server" edition of Azure DevOps).' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @() + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + diff --git a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 new file mode 100644 index 000000000..25785b465 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 @@ -0,0 +1,32 @@ +# Setup/Import 'DscResource.Server' helper module +$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Server' +Import-Module -Name $script:resourceHelperModulePath + + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +# Obtain all functions within PSModule +$functionSubDirectoryPaths = @( + "$PSScriptRoot\Functions\Public" + "$PSScriptRoot\Functions\Private" +) +$functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" + + +# Loop through all PSModule functions and import/dot-source them (and export them if 'Public') +ForEach ($function in $functions) +{ + Write-Verbose "Dot-sourcing '$($function.FullName)'..." + . ( + [ScriptBlock]::Create( + [Io.File]::ReadAllText($($function.FullName)) + ) + ) + + if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") + { + Write-Verbose "Exporting '$($function.BaseName)'..." + Export-ModuleMember -Function $($function.BaseName) + } +} diff --git a/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 new file mode 100644 index 000000000..afc431975 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -0,0 +1,5 @@ +# Localized resources for helper module AzureDevOpsDsc.Server. + +ConvertFrom-StringData @' + +'@ From 060c5751ea80eefd161baaed392229536c8f9116 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 16:15:26 +0000 Subject: [PATCH 036/611] Added empty, 'AzureDevOpsDsc.Services', PSModule. --- .../AzureDevOpsDsc.Services.psd1 | 42 +++++++++++++++++++ .../AzureDevOpsDsc.Services.psm1 | 32 ++++++++++++++ .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 5 +++ 3 files changed, 79 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 create mode 100644 source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 create mode 100644 source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 new file mode 100644 index 000000000..976ef504e --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 @@ -0,0 +1,42 @@ +@{ + RootModule = 'AzureDevOpsDsc.Services.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0' + + # ID used to uniquely identify this module + GUID = '07a3beb5-6c1b-4aad-9cf3-24e98b009838' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in AzureDevOpsDsc (specifically for the cloud-hosted, "Services" edition of Azure DevOps).' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @() + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + diff --git a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 new file mode 100644 index 000000000..6746aa722 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 @@ -0,0 +1,32 @@ +# Setup/Import 'DscResource.Services' helper module +$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Services' +Import-Module -Name $script:resourceHelperModulePath + + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +# Obtain all functions within PSModule +$functionSubDirectoryPaths = @( + "$PSScriptRoot\Functions\Public" + "$PSScriptRoot\Functions\Private" +) +$functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" + + +# Loop through all PSModule functions and import/dot-source them (and export them if 'Public') +ForEach ($function in $functions) +{ + Write-Verbose "Dot-sourcing '$($function.FullName)'..." + . ( + [ScriptBlock]::Create( + [Io.File]::ReadAllText($($function.FullName)) + ) + ) + + if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") + { + Write-Verbose "Exporting '$($function.BaseName)'..." + Export-ModuleMember -Function $($function.BaseName) + } +} diff --git a/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 new file mode 100644 index 000000000..d5be1267c --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -0,0 +1,5 @@ +# Localized resources for helper module AzureDevOpsDsc.Services. + +ConvertFrom-StringData @' + +'@ From 67aab03a407acfb2998c8359fcfd1ebffb4a41dd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 16:16:33 +0000 Subject: [PATCH 037/611] Renamed localized resources files for embedded, 'AzureDevOpsDsc.Server' and 'AzureDevOpsDsc.Services' PSModules. --- ...Dsc.Common.strings.psd1 => AzureDevOpsDsc.Server.strings.psd1} | 0 ...c.Common.strings.psd1 => AzureDevOpsDsc.Services.strings.psd1} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename source/Modules/AzureDevOpsDsc.Server/en-US/{AzureDevOpsDsc.Common.strings.psd1 => AzureDevOpsDsc.Server.strings.psd1} (100%) rename source/Modules/AzureDevOpsDsc.Services/en-US/{AzureDevOpsDsc.Common.strings.psd1 => AzureDevOpsDsc.Services.strings.psd1} (100%) diff --git a/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Common.strings.psd1 rename to source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Common.strings.psd1 rename to source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 From 6a5a0a70016d1125f004a139401ecee8c004f585 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 17:13:59 +0000 Subject: [PATCH 038/611] Added empty/template 'DSC_AzDevOpsProject', DSC class resource. --- .../DSC_AzDevOpsProject.psm1 | 51 +++++++++++++++++++ .../DSC_AzDevOpsProject/README.md | 16 ++++++ .../en-US/DSC_AzDevOpsProject.strings.psd1 | 2 + 3 files changed, 69 insertions(+) create mode 100644 source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 create mode 100644 source/DSCResources/DSC_AzDevOpsProject/README.md create mode 100644 source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 new file mode 100644 index 000000000..9e59d458b --- /dev/null +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -0,0 +1,51 @@ +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +$script:azureDevOpsDscServerModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Server' +$script:azureDevOpsDscServicesModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Services' +$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' + +Import-Module -Name $script:azureDevOpsDscCommonModulePath +Import-Module -Name $script:azureDevOpsDscServerModulePath +Import-Module -Name $script:azureDevOpsDscServicesModulePath +Import-Module -Name $script:dscResourceCommonModulePath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +enum Ensure +{ + Present + Absent +} + + +[DscResource('AzDevOpsProject')] +class DSC_AzDevOpsProject +{ + + [DscProperty(Key,Mandatory)] + [Alias('Name')] + [string]$ProjectName + + [DscProperty(Mandatory)] + [Ensure]$Ensure + + [Alias('Description')] + [string]$ProjectDescription + + + [DSC_AzDevOpsProject] Get() + { + return this + } + + + [bool] Test() + { + return $true + } + + + [void] Set() {} + + +} diff --git a/source/DSCResources/DSC_AzDevOpsProject/README.md b/source/DSCResources/DSC_AzDevOpsProject/README.md new file mode 100644 index 000000000..2d691e59f --- /dev/null +++ b/source/DSCResources/DSC_AzDevOpsProject/README.md @@ -0,0 +1,16 @@ +# Description + +The `SqlAG` DSC resource is used to create, remove, and update an Always On +Availability Group. It will also manage the Availability Group replica on the +specified node. + +## Requirements + +* Target machine must be running Windows Server 2012 or later. +* Target machine must be running SQL Server Database Engine 2012 or later. +* 'NT SERVICE\ClusSvc' or 'NT AUTHORITY\SYSTEM' must have the 'Connect SQL', + 'Alter Any Availability Group', and 'View Server State' permissions. + +## Known issues + +All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/SqlServerDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+SqlAG). diff --git a/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 b/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 new file mode 100644 index 000000000..3b35d6611 --- /dev/null +++ b/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 @@ -0,0 +1,2 @@ +ConvertFrom-StringData @' +'@ From 244fc6797a0a34ec9efcf7e00bc46888735f4428 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 19:00:11 +0000 Subject: [PATCH 039/611] Renamed 'DSCResources' folder to 'DSCClassResources' --- .../DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 | 0 .../DSC_AzDevOpsProject/README.md | 0 .../DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 | 0 .../mof-resources_goes_here.txt | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 (100%) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/README.md (100%) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 (100%) rename source/{DSCResources => DSCClassResources}/mof-resources_goes_here.txt (100%) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 rename to source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 diff --git a/source/DSCResources/DSC_AzDevOpsProject/README.md b/source/DSCClassResources/DSC_AzDevOpsProject/README.md similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/README.md rename to source/DSCClassResources/DSC_AzDevOpsProject/README.md diff --git a/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 b/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 rename to source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 diff --git a/source/DSCResources/mof-resources_goes_here.txt b/source/DSCClassResources/mof-resources_goes_here.txt similarity index 100% rename from source/DSCResources/mof-resources_goes_here.txt rename to source/DSCClassResources/mof-resources_goes_here.txt From 63227621c668c1b58f422f0c1b587e1c4ff87d4c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 19:55:55 +0000 Subject: [PATCH 040/611] Added 'DSCClassResources' and 'Modules' to 'CopyPaths' within 'build.yaml' --- build.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.yaml b/build.yaml index 2741f1cf4..377b7554d 100644 --- a/build.yaml +++ b/build.yaml @@ -4,7 +4,9 @@ #################################################### CopyPaths: - en-US + - DSCClassResources - DSCResources + - Modules Encoding: UTF8 VersionedOutputDirectory: true From 5caa81576d61458699f2128db3f0827fa95536c7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 19:56:28 +0000 Subject: [PATCH 041/611] Added 'DscResource.Common' and 'PSDscResources', PSModules to 'RequiredModules.psd1' --- RequiredModules.psd1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RequiredModules.psd1 b/RequiredModules.psd1 index 1965fa900..148916393 100644 --- a/RequiredModules.psd1 +++ b/RequiredModules.psd1 @@ -20,4 +20,8 @@ 'DscResource.AnalyzerRules' = 'latest' xDscResourceDesigner = 'latest' 'DscResource.DocGenerator' = 'latest' + 'DscResource.Common' = 'latest' + + # Prerequisites modules needed for examples or integration tests + PSDscResources = '2.12.0.0' } From 6f8486593ca66e5dc58d483687531ed169dee372 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 19:57:36 +0000 Subject: [PATCH 042/611] Added 'CommonTestHelper.psm1' with 'Test-BuildCategory' and 'Test-ContinuousIntegrationTaskCategory' functions (taken from 'SqlServerDsc' project/repository. --- .../Modules/TestHelpers/CommonTestHelper.psm1 | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 new file mode 100644 index 000000000..ff7e968b0 --- /dev/null +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -0,0 +1,106 @@ + + +<# + .SYNOPSIS + Returns $true if the the environment variable APPVEYOR is set to $true, + and the environment variable CONFIGURATION is set to the value passed + in the parameter Type. + + .PARAMETER Name + Name of the test script that is called. Default value is the name of the + calling script. + + .PARAMETER Type + Type of tests in the test file. Can be set to Unit or Integration. + + .PARAMETER Category + Optional. One or more categories to check if they are set in + $env:CONFIGURATION. If this are not set, the parameter Type + is used as category. +#> +function Test-BuildCategory +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Name = $MyInvocation.PSCommandPath.Split('\')[-1], + + [Parameter(Mandatory = $true)] + [ValidateSet('Unit', 'Integration')] + [System.String] + $Type, + + [Parameter()] + [System.String[]] + $Category + ) + + # Support using only the Type parameter as category names. + if (-not $Category) + { + $Category = @($Type) + } + + $result = $true + + if ($Type -eq 'Integration' -and -not $env:CI -eq $true) + { + Write-Warning -Message ('{1} test for {0} will be skipped unless $env:CI is set to $true' -f $Name, $Type) + $result = $false + } + + <# + If running in CI then check if it should run in the + current category set in $env:CONFIGURATION. + #> + if ($env:CI -eq $true -and -not (Test-ContinuousIntegrationTaskCategory -Category $Category)) + { + Write-Verbose -Message ('{1} tests in {0} will be skipped unless $env:CONFIGURATION is set to ''{1}''.' -f $Name, ($Category -join ''', or ''')) -Verbose + $result = $false + } + + return $result +} + +<# + .SYNOPSIS + Returns $true if the the environment variable APPVEYOR is set to $true, + and the environment variable CONFIGURATION is set to the value passed + in the parameter Type. + + .PARAMETER Category + One or more categories to check if they are set in $env:CONFIGURATION. +#> +function Test-ContinuousIntegrationTaskCategory +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $Category + ) + + $result = $false + + if ($env:CI -eq $true -and $env:CONFIGURATION -in $Category) + { + $result = $true + } + + return $result +} + +<# + .SYNOPSIS + Waits for LCM to become idle. + + .NOTES + Used in integration test where integration tests run to quickly before + LCM have time to cool down. +#> From d52ce7b138bae92319f969cd7295c5228581af4d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 19:58:06 +0000 Subject: [PATCH 043/611] Removed excess comments in 'CommonTestHelper.psm1' --- tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 index ff7e968b0..83d0f70c2 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -95,12 +95,3 @@ function Test-ContinuousIntegrationTaskCategory return $result } - -<# - .SYNOPSIS - Waits for LCM to become idle. - - .NOTES - Used in integration test where integration tests run to quickly before - LCM have time to cool down. -#> From 8edaa75c00934ed9c1fc7bdc024e7231b0f003d9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 21:34:36 +0000 Subject: [PATCH 044/611] Added 'AzureDevOpsDsc.Common.Tests.ps1' with some initial, passing tests on 'Get-AzDevOpsServicesUri' --- .../AzureDevOpsDsc.Common.Tests.ps1 | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 new file mode 100644 index 000000000..be30f87d3 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 @@ -0,0 +1,94 @@ +<# + .SYNOPSIS + Automated unit test for helper functions in module AzureDevOpsDsc.Common. +#> + +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') + +if (-not (Test-BuildCategory -Type 'Unit')) +{ + return +} + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:subModuleName = 'AzureDevOpsDsc.Common' + +#region HEADER +Remove-Module -Name $script:subModuleName -Force -ErrorAction 'SilentlyContinue' + +$script:parentModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:subModulesFolder = Join-Path -Path $script:parentModule.ModuleBase -ChildPath 'Modules' + +$script:subModulePath = Join-Path -Path $script:subModulesFolder -ChildPath $script:subModuleName + +Import-Module -Name $script:subModulePath -Force -ErrorAction 'Stop' +#endregion HEADER + +# Loading mocked classes +#Add-Type -Path (Join-Path -Path (Join-Path -Path $PSScriptRoot -ChildPath 'Stubs') -ChildPath 'SomeExampleMockedClass.cs') + +InModuleScope $script:subModuleName { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesUri' -Tag 'GetAzDevOpsServicesUri' { + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called with valid "Organisation" parameter' { + + $testCasesValidOrganizationNames = @( + @{ + OrganizationName = 'Organisation1' }, + @{ + OrganizationName = 'Organisation-2' }, + @{ + OrganizationName = 'Organisation_3' } + ) + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Not -Throw + } + + It 'Should return "https://dev.azure.com//" - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName + $result | Should -Be "https://dev.azure.com/$OrganizationName/" + } + } + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "OrganizationName" parameter' { + + $testCasesInvalidOrganizationNames = @( + @{ + OrganizationName = $null }, + @{ + OrganizationName = '' }, + @{ + OrganizationName = ' ' }, + @{ + OrganizationName = '%' }, + @{ + OrganizationName = 'Organization 0' } + ) + + It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw + + } + } + } + + } +} From a7107a4d999e0af9fa33f62cbc8326029166bfdf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 21:35:09 +0000 Subject: [PATCH 045/611] Commented out import of 'DscResource.Common' in embbeded modules. --- .../Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 4 ++-- .../Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 | 4 ++-- .../AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index 071237388..c794684c1 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -1,6 +1,6 @@ # Setup/Import 'DscResource.Common' helper module -$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' -Import-Module -Name $script:resourceHelperModulePath +#$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +#Import-Module -Name $script:resourceHelperModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' diff --git a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 index 25785b465..8aebd50b5 100644 --- a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 +++ b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 @@ -1,6 +1,6 @@ # Setup/Import 'DscResource.Server' helper module -$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Server' -Import-Module -Name $script:resourceHelperModulePath +#$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Server' +#Import-Module -Name $script:resourceHelperModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' diff --git a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 index 6746aa722..527ae037c 100644 --- a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 +++ b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 @@ -1,6 +1,6 @@ # Setup/Import 'DscResource.Services' helper module -$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Services' -Import-Module -Name $script:resourceHelperModulePath +#$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Services' +#Import-Module -Name $script:resourceHelperModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' From 9d00c348aa37a6b5e6869940e6baf0414cf544a8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 21:37:07 +0000 Subject: [PATCH 046/611] Moved 'DSCClassResources' back into 'DSCResources'. --- .../DSC_AzDevOpsProject.psm1 | 31 ++++++++++++++++--- .../DSC_AzDevOpsProject/README.md | 0 .../en-US/DSC_AzDevOpsProject.strings.psd1 | 0 .../mof-resources_goes_here.txt | 0 4 files changed, 26 insertions(+), 5 deletions(-) rename source/{DSCClassResources => DSCResources}/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 (51%) rename source/{DSCClassResources => DSCResources}/DSC_AzDevOpsProject/README.md (100%) rename source/{DSCClassResources => DSCResources}/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 (100%) rename source/{DSCClassResources => DSCResources}/mof-resources_goes_here.txt (100%) diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 similarity index 51% rename from source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 rename to source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index 9e59d458b..f3bf369fa 100644 --- a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -1,12 +1,12 @@ $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' $script:azureDevOpsDscServerModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Server' $script:azureDevOpsDscServicesModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Services' -$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +#$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath Import-Module -Name $script:azureDevOpsDscServerModulePath Import-Module -Name $script:azureDevOpsDscServicesModulePath -Import-Module -Name $script:dscResourceCommonModulePath +#Import-Module -Name $script:dscResourceCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' @@ -18,24 +18,45 @@ enum Ensure } -[DscResource('AzDevOpsProject')] +[DscResource()] class DSC_AzDevOpsProject { + [DscProperty()] + [Alias('Uri')] + [string]$ApiUri + + [DscProperty()] + [Alias('PersonalAccessToken')] + [string]$Pat + + [DscProperty(Key,Mandatory)] [Alias('Name')] [string]$ProjectName - [DscProperty(Mandatory)] + [DscProperty()] [Ensure]$Ensure + [DscProperty()] [Alias('Description')] [string]$ProjectDescription + [DSC_AzDevOpsProject] Get() { - return this + $parameterSet = @{ + ApiUri = $this.ApiUri + Pat = $this.Pat + ProjectName = $this.ProjectName + } + + return [DSC_AzDevOpsProject]::new() #| + #Add-Member -NotePropertyName 'ApiUri' -NotePropertyValue $this.ApiUri -Force -PassThru | + #Add-Member -NotePropertyName 'Pat' -NotePropertyValue $this.Pat -Force -PassThru | + #Add-Member -NotePropertyName 'ProjectName' -NotePropertyValue $this.ProjectName -Force -PassThru + } diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/README.md b/source/DSCResources/DSC_AzDevOpsProject/README.md similarity index 100% rename from source/DSCClassResources/DSC_AzDevOpsProject/README.md rename to source/DSCResources/DSC_AzDevOpsProject/README.md diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 b/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 similarity index 100% rename from source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 rename to source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 diff --git a/source/DSCClassResources/mof-resources_goes_here.txt b/source/DSCResources/mof-resources_goes_here.txt similarity index 100% rename from source/DSCClassResources/mof-resources_goes_here.txt rename to source/DSCResources/mof-resources_goes_here.txt From d6baeae7f777c10bf2bd2ca3787aaac6c3968f0e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 21:37:32 +0000 Subject: [PATCH 047/611] Added initial, non-passing tests for 'DSC_AzDevOpsProject' --- .../DSC_AzDevOpsProject.Tests.ps1 | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..a8f87c0e5 --- /dev/null +++ b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 @@ -0,0 +1,178 @@ +<# + .SYNOPSIS + Automated unit test for DSC_AzDevOpsProject DSC resource. +#> + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:dscResourceName = 'DSC_AzDevOpsProject' + +function Invoke-TestSetup +{ + try + { + Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' + } + catch [System.IO.FileNotFoundException] + { + throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' + } + + $script:testEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:dscModuleName ` + -DSCResourceName $script:dscResourceName ` + -ResourceType 'Mof' ` + -TestType 'Unit' +} + +function Invoke-TestCleanup +{ + Restore-TestEnvironment -TestEnvironment $script:testEnvironment +} + +# Begin Testing + +Invoke-TestSetup + +try +{ + InModuleScope $script:dscResourceName { + Set-StrictMode -Version 1.0 + + Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { + BeforeAll { + #$mockInstanceName = 'DSCTEST' + + #Mock -CommandName Import-SQLPSModule + } + } + + Describe 'AzDevOpsProject\Get' -Tag 'Get' { + + $getProjectId = [GUID]::NewGuid() + + BeforeAll { + + $getProjectName = "ProjectName_$projectId" + $getProjectDescription = "ProjectDescription_$projectId" + + $getParameters = @{ + ProjectId = $getProjectId + ProjectName = $getProjectName + ProjectDescription = $getProjectDescription + } + + } + + + Context 'When Azure DevOps is not in the desired state' { + Context 'When the Azure DevOps "Project" does not exist' { + BeforeAll { + + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + $AzDevOpsProjectResource = $AzDevOpsProjectResource | + Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + return $null + } -Force -PassThru + + } + + It 'Should return the correct values' { + $getResult = $AzDevOpsProjectResource.Get() + + $getResult | Should -Be $null + $getResult.ProjectId | Should -Be $null + $getResult.ProjectName | Should -Be $null + $getResult.ProjectDescription | Should -Be $null + } + } + + + Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { + BeforeAll { + $differentProjectName = "z" + $getParameters.ProjectName + $getParameters.ProjectName = $differentProjectName + + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + $AzDevOpsProjectResource = $AzDevOpsProjectResource | + Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + return $getParameters + } -Force -PassThru + + } + + #$differentProjectName = "z" + $getParameters.ProjectName + #$getParameters.ProjectName = $differentProjectName + + #$AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + #$AzDevOpsProjectResource = $AzDevOpsProjectResource | + # Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + # return $getParameters + # } -Force -PassThru + + #$AzDevOpsProjectResource = $AzDevOpsProjectResource | + # Add-Member -NotePropertyName 'ApiUri' -NotePropertyValue 'https:\\someUri' -Force -PassThru + + #$AzDevOpsProjectResource = $AzDevOpsProjectResource | + # Add-Member -NotePropertyName 'Pat' -NotePropertyValue 'lxppuwlhjbxdteknmsbjfybsl6bdd5edsdisosv4hngd2rwou5pq' -Force -PassThru + + + It 'Should return the correct values' { + $getResult = $AzDevOpsProjectResource.Get() + + $getResult.ProjectId | Should -Be $getProjectId + $getResult.ProjectName | Should -Be $differentProjectName + $getResult.ProjectDescription | Should -Be $getProjectDescription + } + } + + Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { + BeforeAll { + $differentProjectDescription = "z" + $getParameters.ProjectDescription + $getParameters.ProjectDescription = $differentProjectDescription + + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + $AzDevOpsProjectResource = $AzDevOpsProjectResource | + Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + return $getParameters + } -Force -PassThru + + } + + It 'Should return the correct values' { + $getResult = $AzDevOpsProjectResource.Get() + + #$getResult.ProjectId | Should -Be $getProjectId + $getResult.ProjectName | Should -Be $getprojectName + $getResult.ProjectDescription | Should -Be $differentProjectDescription + } + } + } + + Context 'When Azure DevOps is in the desired state' { + BeforeAll { + + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + $AzDevOpsProjectResource = $AzDevOpsProjectResource | + Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + return $getParameters + } -Force -PassThru + + } + + It 'Should return the correct values' { + $getResult = [DSC_AzDevOpsProject]::Get() + + #$getResult.ProjectId | Should -Be $getProjectId + $getResult.ProjectName | Should -Be $getprojectName + $getResult.ProjectDescription | Should -Be $getProjectDescription + } + + } + } + + } +} +finally +{ + Invoke-TestCleanup +} From f6f08648450229d672aba00691fe7d09bf109ec0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 22:05:42 +0000 Subject: [PATCH 048/611] Added 'ProjectId' property to 'DSC_AzDevOpsProject' DSC resource and set 'Get()' method to loop back properties of the object. --- .../DSC_AzDevOpsProject.psm1 | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index f3bf369fa..eb275ebbb 100644 --- a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -22,6 +22,10 @@ enum Ensure class DSC_AzDevOpsProject { + [DscProperty()] + [Ensure]$Ensure + + [DscProperty()] [Alias('Uri')] [string]$ApiUri @@ -31,13 +35,14 @@ class DSC_AzDevOpsProject [string]$Pat + [DscProperty(Mandatory)] + [Alias('Id')] + [string]$ProjectId + [DscProperty(Key,Mandatory)] [Alias('Name')] [string]$ProjectName - [DscProperty()] - [Ensure]$Ensure - [DscProperty()] [Alias('Description')] [string]$ProjectDescription @@ -46,17 +51,14 @@ class DSC_AzDevOpsProject [DSC_AzDevOpsProject] Get() { - $parameterSet = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - ProjectName = $this.ProjectName - } - - return [DSC_AzDevOpsProject]::new() #| - #Add-Member -NotePropertyName 'ApiUri' -NotePropertyValue $this.ApiUri -Force -PassThru | - #Add-Member -NotePropertyName 'Pat' -NotePropertyValue $this.Pat -Force -PassThru | - #Add-Member -NotePropertyName 'ProjectName' -NotePropertyValue $this.ProjectName -Force -PassThru - + $newObject = [DSC_AzDevOpsProject]::new() + $newObject.Ensure = $this.Ensure + $newObject.ApiUri = $this.ApiUri + $newObject.Pat = $this.Pat + $newObject.ProjectName = $this.ProjectName + $newObject.ProjectDescription = $this.ProjectDescription + + return $newObject } From 84eca3996bf10ae6f9d85b6a43f0baefbf51f127 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 22:06:37 +0000 Subject: [PATCH 049/611] Added/Implemented $getApiUri and $getPat variables into 'DSC_AzDevOpsProject.Tests.ps1'; --- .../DSC_AzDevOpsProject.Tests.ps1 | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 index a8f87c0e5..9aa720f7d 100644 --- a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 @@ -52,15 +52,26 @@ try BeforeAll { + $getApiUri = "https:\\www.someUri.api" + $getPat = "1234567890123456789012345678901234567890123456789012" + $getProjectName = "ProjectName_$projectId" $getProjectDescription = "ProjectDescription_$projectId" $getParameters = @{ + ApiUri = $getApiUri + Pat = $getPat ProjectId = $getProjectId ProjectName = $getProjectName ProjectDescription = $getProjectDescription } + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() + $AzDevOpsProjectResource.ApiUri = $getApiUri + $AzDevOpsProjectResource.Pat = $getPat + $AzDevOpsProjectResource.ProjectId = $getProjectId + $AzDevOpsProjectResource.ProjectName = $getProjectName + $AzDevOpsProjectResource.ProjectDescription = $getProjectDescription } @@ -68,7 +79,6 @@ try Context 'When the Azure DevOps "Project" does not exist' { BeforeAll { - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() $AzDevOpsProjectResource = $AzDevOpsProjectResource | Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { return $null @@ -80,6 +90,8 @@ try $getResult = $AzDevOpsProjectResource.Get() $getResult | Should -Be $null + $getResult.ApiUri | Should -Be $null + $getResult.Pat | Should -Be $null $getResult.ProjectId | Should -Be $null $getResult.ProjectName | Should -Be $null $getResult.ProjectDescription | Should -Be $null @@ -92,7 +104,6 @@ try $differentProjectName = "z" + $getParameters.ProjectName $getParameters.ProjectName = $differentProjectName - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() $AzDevOpsProjectResource = $AzDevOpsProjectResource | Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { return $getParameters @@ -100,27 +111,13 @@ try } - #$differentProjectName = "z" + $getParameters.ProjectName - #$getParameters.ProjectName = $differentProjectName - - #$AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() - #$AzDevOpsProjectResource = $AzDevOpsProjectResource | - # Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { - # return $getParameters - # } -Force -PassThru - - #$AzDevOpsProjectResource = $AzDevOpsProjectResource | - # Add-Member -NotePropertyName 'ApiUri' -NotePropertyValue 'https:\\someUri' -Force -PassThru - - #$AzDevOpsProjectResource = $AzDevOpsProjectResource | - # Add-Member -NotePropertyName 'Pat' -NotePropertyValue 'lxppuwlhjbxdteknmsbjfybsl6bdd5edsdisosv4hngd2rwou5pq' -Force -PassThru - - - It 'Should return the correct values' { + It 'Should return the correct values, with "ProjectName" values different' { $getResult = $AzDevOpsProjectResource.Get() + $getResult.ApiUri | Should -Be $getApiUri + $getResult.Pat | Should -Be $getPat $getResult.ProjectId | Should -Be $getProjectId - $getResult.ProjectName | Should -Be $differentProjectName + $getResult.ProjectName | Should -Not -Be $differentProjectName # Different $getResult.ProjectDescription | Should -Be $getProjectDescription } } @@ -130,7 +127,6 @@ try $differentProjectDescription = "z" + $getParameters.ProjectDescription $getParameters.ProjectDescription = $differentProjectDescription - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() $AzDevOpsProjectResource = $AzDevOpsProjectResource | Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { return $getParameters @@ -138,12 +134,14 @@ try } - It 'Should return the correct values' { + It 'Should return the correct values, with "ProjectDescription" values different' { $getResult = $AzDevOpsProjectResource.Get() - #$getResult.ProjectId | Should -Be $getProjectId + $getResult.ApiUri | Should -Be $getApiUri + $getResult.Pat | Should -Be $getPat + $getResult.ProjectId | Should -Be $getProjectId $getResult.ProjectName | Should -Be $getprojectName - $getResult.ProjectDescription | Should -Be $differentProjectDescription + $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different } } } @@ -151,7 +149,6 @@ try Context 'When Azure DevOps is in the desired state' { BeforeAll { - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() $AzDevOpsProjectResource = $AzDevOpsProjectResource | Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { return $getParameters @@ -160,9 +157,11 @@ try } It 'Should return the correct values' { - $getResult = [DSC_AzDevOpsProject]::Get() + $getResult = $AzDevOpsProjectResource.Get() - #$getResult.ProjectId | Should -Be $getProjectId + $getResult.ApiUri | Should -Be $getApiUri + $getResult.Pat | Should -Be $getPat + $getResult.ProjectId | Should -Be $getProjectId $getResult.ProjectName | Should -Be $getprojectName $getResult.ProjectDescription | Should -Be $getProjectDescription } From 8de02b9844784c60b828a3418fda4804794a0740 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 22:17:14 +0000 Subject: [PATCH 050/611] Removed 'Get-AzDevOpsProject' call from DSC_AzDevOpsProject.Get() --- .../DSC_AzDevOpsProject.psm1 | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index eb275ebbb..29c3b05ca 100644 --- a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -13,8 +13,8 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' enum Ensure { - Present - Absent + Present + Absent } @@ -39,7 +39,7 @@ class DSC_AzDevOpsProject [Alias('Id')] [string]$ProjectId - [DscProperty(Key,Mandatory)] + [DscProperty(Key, Mandatory)] [Alias('Name')] [string]$ProjectName @@ -51,6 +51,21 @@ class DSC_AzDevOpsProject [DSC_AzDevOpsProject] Get() { + $inputParameters = @{ + #Ensure = $this.Ensure + ApiUri = $this.ApiUri + Pat = $this.Pat + ProjectName = $this.ProjectName + #ProjectDescription = $this.ProjectDescription + } + + #$project = Get-AzDevOpsProject @inputParameters + $project = $null + if ($null -eq $project) + { + return $null + } + $newObject = [DSC_AzDevOpsProject]::new() $newObject.Ensure = $this.Ensure $newObject.ApiUri = $this.ApiUri @@ -68,7 +83,9 @@ class DSC_AzDevOpsProject } - [void] Set() {} + [void] Set() + { + } } From c6128edab1f405aff8b1314fde60784d4aab4d8c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 27 Oct 2020 22:49:33 +0000 Subject: [PATCH 051/611] Added tests for 'Test-AzDevOpsPat' to 'AzureDevOpsDsc.Common.Tests.ps1' --- .../AzureDevOpsDsc.Common.Tests.ps1 | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 index be30f87d3..a1df85e93 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 @@ -91,4 +91,120 @@ InModuleScope $script:subModuleName { } } + + + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsPat' -Tag 'TestAzDevOpsPat' { + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + $testCasesEmptyPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + ) + + $testCasesInvalidPats = @( + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "Pat" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + $result = Test-AzDevOpsPat -Pat $Pat -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidPats { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsPat -Pat $Pat -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + } + + } + } + + } } From 529213d3f4c66c4ac90e9bfc4710414844565e2e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:29:52 +0000 Subject: [PATCH 052/611] Added obvious comments in 'DSC_AzDevOpsProject' --- .../DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index 29c3b05ca..08e4adde1 100644 --- a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -59,7 +59,16 @@ class DSC_AzDevOpsProject #ProjectDescription = $this.ProjectDescription } + ############################################################# + ############################################################# + # TODO: Call to this is failing ... StackOverflowException + ############################################################# + ############################################################# #$project = Get-AzDevOpsProject @inputParameters + ############################################################# + ############################################################# + ############################################################# + ############################################################# $project = $null if ($null -eq $project) { @@ -79,12 +88,14 @@ class DSC_AzDevOpsProject [bool] Test() { + #$current = $this.Get() return $true } [void] Set() { + #$current = $this.Get() } From ca6678d805fffae673c9c5851b83a1cad7ebc5e8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:30:17 +0000 Subject: [PATCH 053/611] Updated format of $AzDevOpsProjectResource assignment in 'DSC_AzDevOpsProject.Tests.ps1' --- .../Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 index 9aa720f7d..d9438ec55 100644 --- a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 @@ -66,12 +66,13 @@ try ProjectDescription = $getProjectDescription } - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]::new() - $AzDevOpsProjectResource.ApiUri = $getApiUri - $AzDevOpsProjectResource.Pat = $getPat - $AzDevOpsProjectResource.ProjectId = $getProjectId - $AzDevOpsProjectResource.ProjectName = $getProjectName - $AzDevOpsProjectResource.ProjectDescription = $getProjectDescription + $AzDevOpsProjectResource = [DSC_AzDevOpsProject]@{ + ApiUri = $getApiUri + Pat = $getPat + ProjectId = $getProjectId + ProjectName = $getProjectName + ProjectDescription = $getProjectDescription + } } From be6bad34369e557f8b9e295daed4551cc2b53f5b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:31:45 +0000 Subject: [PATCH 054/611] Updated return value format of Get() method in 'DSC_AzDevOpsProject' --- .../DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index 08e4adde1..9e7a8c8e8 100644 --- a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -75,14 +75,14 @@ class DSC_AzDevOpsProject return $null } - $newObject = [DSC_AzDevOpsProject]::new() - $newObject.Ensure = $this.Ensure - $newObject.ApiUri = $this.ApiUri - $newObject.Pat = $this.Pat - $newObject.ProjectName = $this.ProjectName - $newObject.ProjectDescription = $this.ProjectDescription - - return $newObject + return [DSC_AzDevOpsProject]@{ + Ensure = $this.Ensure + ApiUri = $this.ApiUri + Pat = $this.Pat + ProjectName = $this.ProjectName + ProjectDescription = $this.ProjectDescription + } + } From 06e0a6f9c8822eff3cb00b0b70a1788595471f7f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:38:33 +0000 Subject: [PATCH 055/611] Seperated out module tests into 'AzureDevOpsDsc.Common.TestInitialization.ps1' script and 'Get-AzDevOpsServicesUri.Tests.ps1' --- ...ureDevOpsDsc.Common.TestInitialization.ps1 | 28 +++++++++++++++++++ .../Get-AzDevOpsServicesUri.Tests.ps1} | 28 ++----------------- 2 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 rename tests/Unit/Modules/AzureDevOpsDsc.Common/{AzureDevOpsDsc.Common.Tests.ps1 => Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1} (85%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 new file mode 100644 index 000000000..1ec9cb53f --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 @@ -0,0 +1,28 @@ +<# + .SYNOPSIS + Automated unit test for helper functions in module AzureDevOpsDsc.Common. +#> + +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') + +if (-not (Test-BuildCategory -Type 'Unit')) +{ + return +} + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:subModuleName = 'AzureDevOpsDsc.Common' + +#region HEADER +Remove-Module -Name $script:subModuleName -Force -ErrorAction 'SilentlyContinue' + +$script:parentModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:subModulesFolder = Join-Path -Path $script:parentModule.ModuleBase -ChildPath 'Modules' + +$script:subModulePath = Join-Path -Path $script:subModulesFolder -ChildPath $script:subModuleName + +Import-Module -Name $script:subModulePath -Force -ErrorAction 'Stop' +#endregion HEADER + +# Loading mocked classes +#Add-Type -Path (Join-Path -Path (Join-Path -Path $PSScriptRoot -ChildPath 'Stubs') -ChildPath 'SomeExampleMockedClass.cs') diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 similarity index 85% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 index a1df85e93..429ef81ff 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 @@ -1,31 +1,7 @@ -<# - .SYNOPSIS - Automated unit test for helper functions in module AzureDevOpsDsc.Common. -#> -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 -if (-not (Test-BuildCategory -Type 'Unit')) -{ - return -} - -$script:dscModuleName = 'AzureDevOpsDsc' -$script:subModuleName = 'AzureDevOpsDsc.Common' - -#region HEADER -Remove-Module -Name $script:subModuleName -Force -ErrorAction 'SilentlyContinue' - -$script:parentModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 -$script:subModulesFolder = Join-Path -Path $script:parentModule.ModuleBase -ChildPath 'Modules' - -$script:subModulePath = Join-Path -Path $script:subModulesFolder -ChildPath $script:subModuleName - -Import-Module -Name $script:subModulePath -Force -ErrorAction 'Stop' -#endregion HEADER - -# Loading mocked classes -#Add-Type -Path (Join-Path -Path (Join-Path -Path $PSScriptRoot -ChildPath 'Stubs') -ChildPath 'SomeExampleMockedClass.cs') InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesUri' -Tag 'GetAzDevOpsServicesUri' { From a2d94d4dfe63c27cf447e85b6e74e672acb5ef09 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:49:15 +0000 Subject: [PATCH 056/611] Added trailing '/' to URI output from 'Get-AzDevOpsServicesApiUri' --- .../Functions/Public/Get-AzDevOpsServicesApiUri.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 index c096eb2b0..e19e3a649 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 @@ -24,5 +24,5 @@ function Get-AzDevOpsServicesApiUri [System.String]$uri = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName - return $uri + "_apis" + return $uri + "_apis/" } From 278b2e7391433807bc57f6cdeff3c562cd4198b9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:50:02 +0000 Subject: [PATCH 057/611] Added seperate 'Test-AzDevOpsPat.Tests.ps1' script. --- .../Private/Get-AzDevOpsPat.Tests.ps1 | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 new file mode 100644 index 000000000..0fa83ba1e --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 @@ -0,0 +1,121 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsPat' -Tag 'TestAzDevOpsPat' { + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + $testCasesEmptyPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + ) + + $testCasesInvalidPats = @( + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "Pat" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + $result = Test-AzDevOpsPat -Pat $Pat -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidPats { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsPat -Pat $Pat -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "Pat" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 549b0b0e6467bbf8e9aeb18f344d6431ab0cc734 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:51:16 +0000 Subject: [PATCH 058/611] Moved/Updated 'Get-AzDevOpsServicesUri.Tests.ps1' from 'Private' to 'Public' --- .../Private/Get-AzDevOpsServicesUri.Tests.ps1 | 186 ------------------ .../Public/Get-AzDevOpsServicesUri.Tests.ps1 | 71 +++++++ 2 files changed, 71 insertions(+), 186 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 deleted file mode 100644 index 429ef81ff..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsServicesUri.Tests.ps1 +++ /dev/null @@ -1,186 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesUri' -Tag 'GetAzDevOpsServicesUri' { - - Context 'When called with valid parameters' { - BeforeAll { - } - - Context 'When called with valid "Organisation" parameter' { - - $testCasesValidOrganizationNames = @( - @{ - OrganizationName = 'Organisation1' }, - @{ - OrganizationName = 'Organisation-2' }, - @{ - OrganizationName = 'Organisation_3' } - ) - - It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Not -Throw - } - - It 'Should return "https://dev.azure.com//" - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName - $result | Should -Be "https://dev.azure.com/$OrganizationName/" - } - } - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "OrganizationName" parameter' { - - $testCasesInvalidOrganizationNames = @( - @{ - OrganizationName = $null }, - @{ - OrganizationName = '' }, - @{ - OrganizationName = ' ' }, - @{ - OrganizationName = '%' }, - @{ - OrganizationName = 'Organization 0' } - ) - - It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw - - } - } - } - - } - - - - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsPat' -Tag 'TestAzDevOpsPat' { - - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) - - $testCasesEmptyPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - ) - - $testCasesInvalidPats = @( - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) - - Context 'When called with valid parameters' { - BeforeAll { - } - - Context 'When called using "-IsValid" switch' { - - Context 'When called with valid "Pat" parameter' { - - It 'Should not throw - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw - } - - It 'Should return $true - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) - - $result = Test-AzDevOpsPat -Pat $Pat -IsValid - $result | Should -Be $true - } - } - - Context 'When called with invalid "Pat" parameter' { - - It 'Should throw - ""' -TestCases $testCasesEmptyPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Throw - } - - It 'Should not throw - ""' -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw - } - - It 'Should return $false - ""' -TestCases $testCasesInvalidPats { - param ([string]$OrganizationName) - - $result = Test-AzDevOpsPat -Pat $Pat -IsValid - $result | Should -Be $false - } - } - - } - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called without using "-IsValid" switch' { - - Context 'When called with valid "Pat" parameter' { - - It 'Should throw - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw - } - - } - - Context 'When called with invalid "Pat" parameter' { - - It 'Should throw - ""' -TestCases $testCasesEmptyPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw - } - - It 'Should throw - ""' -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw - } - - } - - } - } - - } -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 new file mode 100644 index 000000000..afbce2cde --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -0,0 +1,71 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesUri' -Tag 'GetAzDevOpsServicesUri' { + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called with valid "Organisation" parameter' { + + $testCasesValidOrganizationNames = @( + @{ + OrganizationName = 'Organisation1' }, + @{ + OrganizationName = 'Organisation-2' }, + @{ + OrganizationName = 'Organisation_3' } + ) + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Not -Throw + } + + It 'Should return "https://dev.azure.com//" - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName + $result | Should -Be "https://dev.azure.com/$OrganizationName/" + } + } + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "OrganizationName" parameter' { + + $testCasesInvalidOrganizationNames = @( + @{ + OrganizationName = $null }, + @{ + OrganizationName = '' }, + @{ + OrganizationName = ' ' }, + @{ + OrganizationName = '%' }, + @{ + OrganizationName = 'Organization 0' } + ) + + It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw + + } + } + } + + } + +} From d76a93fef68563e7f98b5bcc95c85686fa6e1c58 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 20:51:31 +0000 Subject: [PATCH 059/611] Added 'Get-AzDevOpsServicesApiUri.Tests.ps1' --- .../Get-AzDevOpsServicesApiUri.Tests.ps1 | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 new file mode 100644 index 000000000..dbee29a99 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 @@ -0,0 +1,78 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesApiUri' -Tag 'GetAzDevOpsServicesApiUri' { + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called with valid "Organisation" parameter' { + + $testCasesValidOrganizationNames = @( + @{ + OrganizationName = 'Organisation1' }, + @{ + OrganizationName = 'Organisation-2' }, + @{ + OrganizationName = 'Organisation_3' } + ) + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Not -Throw + } + + It 'Should return "https://dev.azure.com//_apis/" - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName + $result | Should -Be "https://dev.azure.com/$OrganizationName/_apis/" + } + + It 'Should return "Get-AzDevOpsServicesUri"+"_apis/" - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName + $result | Should -Be $(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName) + '_apis/' + } + } + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "OrganizationName" parameter' { + + $testCasesInvalidOrganizationNames = @( + @{ + OrganizationName = $null }, + @{ + OrganizationName = '' }, + @{ + OrganizationName = ' ' }, + @{ + OrganizationName = '%' }, + @{ + OrganizationName = 'Organization 0' } + ) + + It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Throw + + } + } + } + + } + +} From a7905593e5b1ebc3029352a744f2976e8f0bc005 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:00:37 +0000 Subject: [PATCH 060/611] Added 'Should return URI in lowercase' tests for 'Get-AzDevOpsServicesUri' and 'Get-AzDevOpsServicesApiUri' --- .../Public/Get-AzDevOpsServicesApiUri.Tests.ps1 | 13 +++++++++++-- .../Public/Get-AzDevOpsServicesUri.Tests.ps1 | 7 +++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 index dbee29a99..3c348e33e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 @@ -34,15 +34,24 @@ InModuleScope $script:subModuleName { $result | Should -Be "https://dev.azure.com/$OrganizationName/_apis/" } - It 'Should return "Get-AzDevOpsServicesUri"+"_apis/" - ""' -TestCases $testCasesValidOrganizationNames { + It 'Should return $("Get-AzDevOpsServicesUri"+"_apis/") - ""' -TestCases $testCasesValidOrganizationNames { param ([string]$OrganizationName) $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName - $result | Should -Be $(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName) + '_apis/' + $result | Should -Be $($(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName) + '_apis/') } + + It 'Should return URI in lowercase' { + $OrganizationName = 'UPPERcasedORGANIZATIONname' + + $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName + $result | Should -BeExactly $(Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName).ToLower() + } + } + } Context 'When called with invalid parameters' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 index afbce2cde..247d32869 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -63,6 +63,13 @@ InModuleScope $script:subModuleName { { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw } + + It 'Should return URI in lowercase' { + $OrganizationName = 'UPPERcasedORGANIZATIONname' + + $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName + $result | Should -BeExactly $(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName).ToLower() + } } } From ac856f411a20d0c81b02a68c097182d16067a742 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:06:15 +0000 Subject: [PATCH 061/611] Renamed 'Get-AzDevOpsPat.Tests.ps1' to 'Test-AzDevOpsPat.Tests.ps1' --- .../{Get-AzDevOpsPat.Tests.ps1 => Test-AzDevOpsPat.Tests.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/{Get-AzDevOpsPat.Tests.ps1 => Test-AzDevOpsPat.Tests.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsPat.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 From cf98936c159bc7ed7f00c404ddfca383e26717c3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:12:41 +0000 Subject: [PATCH 062/611] Removed parameter test using 'Test-AzDevOpsApiUri' on itself ('Test-AzDevOpsApiUri') --- .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 index 9dbba5bbb..3e86e0412 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -27,7 +27,6 @@ function Test-AzDevOpsApiUri param ( [Parameter(Mandatory = $true)] - [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [System.String] $ApiUri, From 7c0f4181b3bc7d1a9b2949e851af31fe5459d09a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:22:44 +0000 Subject: [PATCH 063/611] Added functionality and tests in/for 'Test-AzDevOpsApiUri' --- .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 7 +- .../Private/Test-AzDevOpsApiUri.Tests.ps1 | 139 ++++++++++++++++++ 2 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 index 3e86e0412..70732570c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -41,8 +41,11 @@ function Test-AzDevOpsApiUri New-InvalidOperationException -Message $errorMessage } - # TODO: - # - Validate it's a valid URL + if(($ApiUri -inotlike 'http://*' -and $ApiUri -inotlike 'https://*') -or + $ApiUri -inotlike '*/_apis/') + { + return $false + } return $true } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 new file mode 100644 index 000000000..82075d85e --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -0,0 +1,139 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiUri' -Tag 'TestAzDevOpsApiUri' { + + $testCasesValidApiUris = @( + @{ + ApiUri = 'http://someuri.api/_apis/' }, + @{ + ApiUri = 'https://someuri.api/_apis/' } + ) + + $testCasesEmptyApiUris = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidApiUris = @( + @{ + ApiUri = ' ' }, + @{ + ApiUri = 'a 1' }, + + # Incorrect prefixes + @{ + ApiUri = 'ftp://someuri.api/_apis/' }, + @{ + ApiUri = 'someuri.api/_apis/' }, + + # Missing trailing '/' (after http(s)) + @{ + ApiUri = 'http:/someuri.api/_apis/' }, + @{ + ApiUri = 'https:/someuri.api/_apis/' }, + + # Missing trailing '/' + @{ + ApiUri = 'http://someuri.api/_apis' }, + @{ + ApiUri = 'https://someuri.api/_apis' }, + + # Missing trailing '/_apis/' + @{ + ApiUri = 'http://someuri.api/' }, + @{ + ApiUri = 'https://someuri.api/' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ApiUri" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidApiUris { + param ([string]$ApiUri) + + $result = Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidApiUris { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ApiUri" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ApiUri" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 9d7cba5893ffb1eca749f9edd4bf46f23adf21a4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:30:44 +0000 Subject: [PATCH 064/611] Added 'Test-AzDevOpsObjectId' functionality and tests. --- .../Private/Test-AzDevOpsObjectId.ps1 | 7 +- .../Private/Test-AzDevOpsObjectId.Tests.ps1 | 123 ++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 index 0745f167b..ffc75b3b2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 @@ -41,8 +41,11 @@ function Test-AzDevOpsObjectId New-InvalidOperationException -Message $errorMessage } - # TODO: - # - Validate it's a GUID? + + if(![guid]::TryParse($ObjectId, $([ref][guid]::Empty))){ + return $false + } + return $true } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 new file mode 100644 index 000000000..1ebaf43d7 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 @@ -0,0 +1,123 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsObjectId' -Tag 'TestAzDevOpsObjectId' { + + $testCasesValidObjectIds = @( + @{ + ObjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, + @{ + ObjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, + @{ + ObjectId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } + ) + + $testCasesEmptyObjectIds = @( + @{ + ObjectId = $null }, + @{ + ObjectId = '' } + ) + + $testCasesInvalidObjectIds = @( + @{ + ObjectId = ' ' }, + @{ + ObjectId = 'a 1' }, + @{ + ObjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, + @{ + ObjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } + @{ + ObjectId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ObjectId" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidObjectIds { + param ([string]$ObjectId) + + $result = Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ObjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidObjectIds { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ObjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ObjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidObjectIds { + param ([string]$ObjectId) + + { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 52a0f405e5a3b593d58e57584ab4fef0d30390a7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:35:13 +0000 Subject: [PATCH 065/611] Updated 'Test-AzDevOpsProjectId' functionality and related tests --- .../Private/Test-AzDevOpsProjectId.ps1 | 2 +- .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 137 ++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 index 8bec0c0c8..969c90ab0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsProjectId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$IsValid)) + if (!(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid:$IsValid)) { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 new file mode 100644 index 000000000..c52efb936 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -0,0 +1,137 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectId' -Tag 'TestAzDevOpsProjectId' { + + $testCasesValidProjectIds = @( + @{ + ProjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, + @{ + ProjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, + @{ + ProjectId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } + ) + + $testCasesEmptyProjectIds = @( + @{ + ProjectId = $null }, + @{ + ProjectId = '' } + ) + + $testCasesInvalidProjectIds = @( + @{ + ProjectId = ' ' }, + @{ + ProjectId = 'a 1' }, + @{ + ProjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, + @{ + ProjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } + @{ + ProjectId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ProjectId" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidProjectIds { + param ([string]$ProjectId) + + $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid + $result | Should -Be $true + } + + It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesValidProjectIds { + param ([string]$ProjectId) + + $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid + $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid) + } + } + + Context 'When called with invalid "ProjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectIds { + param ([string]$ProjectId) + + $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid + $result | Should -Be $false + } + + It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesInvalidProjectIds { + param ([string]$ProjectId) + + $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid + $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid) + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ProjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ProjectId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidProjectIds { + param ([string]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 3d0150fd4236ee5d1cbd9d6c42059b6967b022a2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:37:11 +0000 Subject: [PATCH 066/611] Updated erroneous $OrganizationName parameter in 'Should return $false -...' tests --- .../Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsPat.Tests.ps1 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 82075d85e..d50112f67 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -89,7 +89,7 @@ InModuleScope $script:subModuleName { } It 'Should return $false - ""' -TestCases $testCasesInvalidApiUris { - param ([string]$OrganizationName) + param ([string]$ApiUri) $result = Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid $result | Should -Be $false diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 index 1ebaf43d7..88e8a766a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 @@ -73,7 +73,7 @@ InModuleScope $script:subModuleName { } It 'Should return $false - ""' -TestCases $testCasesInvalidObjectIds { - param ([string]$OrganizationName) + param ([string]$ObjectId) $result = Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid $result | Should -Be $false diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index 0fa83ba1e..d62eb7240 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -71,7 +71,7 @@ InModuleScope $script:subModuleName { } It 'Should return $false - ""' -TestCases $testCasesInvalidPats { - param ([string]$OrganizationName) + param ([string]$Pat) $result = Test-AzDevOpsPat -Pat $Pat -IsValid $result | Should -Be $false From 80affe2b447bb3009d92f0ea81bad266cb7c2943 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:40:08 +0000 Subject: [PATCH 067/611] Corrected 'Test-AzDevOpsOperationId' and related tests --- .../Private/Test-AzDevOpsOperationId.ps1 | 2 +- .../Test-AzDevOpsOperationId.Tests.ps1 | 137 ++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 index 5757816f5..e00e3f21f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsOperationId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$IsValid)) + if (!(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid:$IsValid)) { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 new file mode 100644 index 000000000..6e722f045 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -0,0 +1,137 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOperationId' -Tag 'TestAzDevOpsOperationId' { + + $testCasesValidOperationIds = @( + @{ + OperationId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, + @{ + OperationId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, + @{ + OperationId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } + ) + + $testCasesEmptyOperationIds = @( + @{ + OperationId = $null }, + @{ + OperationId = '' } + ) + + $testCasesInvalidOperationIds = @( + @{ + OperationId = ' ' }, + @{ + OperationId = 'a 1' }, + @{ + OperationId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, + @{ + OperationId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } + @{ + OperationId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "OperationId" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidOperationIds { + param ([string]$OperationId) + + $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid + $result | Should -Be $true + } + + It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesValidOperationIds { + param ([string]$OperationId) + + $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid + $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid) + } + } + + Context 'When called with invalid "OperationId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidOperationIds { + param ([string]$OperationId) + + $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid + $result | Should -Be $false + } + + It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesInvalidOperationIds { + param ([string]$OperationId) + + $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid + $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid) + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "OperationId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "OperationId" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidOperationIds { + param ([string]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 5e9ce8850066084105ce50350dd6d1303318867f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:57:23 +0000 Subject: [PATCH 068/611] Updating formatting in 'Test-AzDevOpsObjectId' --- .../Functions/Private/Test-AzDevOpsObjectId.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 index ffc75b3b2..df96292f8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 @@ -42,7 +42,8 @@ function Test-AzDevOpsObjectId } - if(![guid]::TryParse($ObjectId, $([ref][guid]::Empty))){ + if (![guid]::TryParse($ObjectId, $([ref][guid]::Empty))) + { return $false } From 94f4bb7302af1af46edf3bbb39456c4773545f49 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 21:57:46 +0000 Subject: [PATCH 069/611] Removed $ProjectId from mandatory requirement --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index c0c5edfc1..6d0397a57 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -61,7 +61,7 @@ function Get-AzDevOpsProject [System.String] $Pat, - [Parameter(Mandatory = $true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] [Alias('Id')] [System.String] From 9cb08ad23c23c40835512906a4bfb8f9f42e6473 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 28 Oct 2020 23:08:13 +0000 Subject: [PATCH 070/611] Updated 'DSC_AzDevOpsProject' and related tests to allow tests to pass (including additional 'GetAzDevOpsObject()' method in 'DSC_AzDevOpsProject' to allow mocking. --- .../DSC_AzDevOpsProject.psm1 | 40 ++++++------ .../DSC_AzDevOpsProject.Tests.ps1 | 61 +++++++++++++------ 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index 9e7a8c8e8..d684b22b2 100644 --- a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -35,9 +35,9 @@ class DSC_AzDevOpsProject [string]$Pat - [DscProperty(Mandatory)] + [DscProperty()] [Alias('Id')] - [string]$ProjectId + [string]$ProjectId = '*' [DscProperty(Key, Mandatory)] [Alias('Name')] @@ -47,40 +47,38 @@ class DSC_AzDevOpsProject [Alias('Description')] [string]$ProjectDescription - - - [DSC_AzDevOpsProject] Get() + [hashtable]GetAzDevOpsObject() { - $inputParameters = @{ - #Ensure = $this.Ensure + $getParameters = @{ ApiUri = $this.ApiUri Pat = $this.Pat + ProjectId = $(if ([string]::IsNullOrWhiteSpace($this.ProjectId)) { [guid]::NewGuid().ToString() }else{$this.ProjectId}) ProjectName = $this.ProjectName - #ProjectDescription = $this.ProjectDescription } - ############################################################# - ############################################################# - # TODO: Call to this is failing ... StackOverflowException - ############################################################# - ############################################################# - #$project = Get-AzDevOpsProject @inputParameters - ############################################################# - ############################################################# - ############################################################# - ############################################################# - $project = $null + return Get-AzDevOpsProject @getParameters + } + + [DSC_AzDevOpsProject] Get() + { + $project = $this.GetAzDevOpsObject() + if ($null -eq $project) { return $null } return [DSC_AzDevOpsProject]@{ + + # Existing properties Ensure = $this.Ensure ApiUri = $this.ApiUri Pat = $this.Pat - ProjectName = $this.ProjectName - ProjectDescription = $this.ProjectDescription + + # Updated properties (from 'Get') + ProjectId = $project.id + ProjectName = $project.name + ProjectDescription = $project.description } } diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 index d9438ec55..9b80bd020 100644 --- a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 @@ -48,22 +48,21 @@ try Describe 'AzDevOpsProject\Get' -Tag 'Get' { - $getProjectId = [GUID]::NewGuid() + BeforeAll { - $getApiUri = "https:\\www.someUri.api" + $getApiUri = "https://www.someUri.api/_apis/" $getPat = "1234567890123456789012345678901234567890123456789012" + $getProjectId = [GUID]::NewGuid().ToString() $getProjectName = "ProjectName_$projectId" $getProjectDescription = "ProjectDescription_$projectId" - $getParameters = @{ - ApiUri = $getApiUri - Pat = $getPat - ProjectId = $getProjectId - ProjectName = $getProjectName - ProjectDescription = $getProjectDescription + $getAzDevOpsObject = @{ + id = $getProjectId + name = $getProjectName + description = $getProjectDescription } $AzDevOpsProjectResource = [DSC_AzDevOpsProject]@{ @@ -81,7 +80,7 @@ try BeforeAll { $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { return $null } -Force -PassThru @@ -100,14 +99,38 @@ try } + Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { + BeforeAll { + $differentProjectId = [GUID]::NewGuid().ToString() + $getAzDevOpsObject.ProjectId = $differentProjectId + + $AzDevOpsProjectResource = $AzDevOpsProjectResource | + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { + return $getAzDevOpsObject + } -Force -PassThru + + } + + It 'Should return the correct values, with "ProjectId" values different' { + $getResult = $AzDevOpsProjectResource.Get() + + $getResult.ApiUri | Should -Be $getApiUri + $getResult.Pat | Should -Be $getPat + $getResult.ProjectId | Should -Not -Be $differentProjectId # Different + $getResult.ProjectName | Should -Be $getProjectName + $getResult.ProjectDescription | Should -Be $getProjectDescription + } + } + + Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { BeforeAll { - $differentProjectName = "z" + $getParameters.ProjectName - $getParameters.ProjectName = $differentProjectName + $differentProjectName = "z" + $getAzDevOpsObject.ProjectName + $getAzDevOpsObject.ProjectName = $differentProjectName $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { - return $getParameters + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { + return $getAzDevOpsObject } -Force -PassThru } @@ -125,12 +148,12 @@ try Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { BeforeAll { - $differentProjectDescription = "z" + $getParameters.ProjectDescription - $getParameters.ProjectDescription = $differentProjectDescription + $differentProjectDescription = "z" + $getAzDevOpsObject.ProjectDescription + $getAzDevOpsObject.ProjectDescription = $differentProjectDescription $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { - return $getParameters + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { + return $getAzDevOpsObject } -Force -PassThru } @@ -151,8 +174,8 @@ try BeforeAll { $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'Get-AzDevOpsProject' -Value { - return $getParameters + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { + return $getAzDevOpsObject } -Force -PassThru } From 1f399d3385c9e75d5a5320d86746ffc909c21d0e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 19:55:30 +0000 Subject: [PATCH 071/611] Added tests for 'Get-AzDevOpsApiHttpRequestHeader' --- ...Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 new file mode 100644 index 000000000..8752c0bba --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -0,0 +1,84 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiHttpRequestHeader' -Tag 'GetAzDevOpsApiHttpRequestHeader' { + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called with valid "Pat" parameter' { + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + It 'Should not throw - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Not -Throw + } + + It 'Should return "hashtable" - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + $result = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + $result.GetType() | Should -Be $($([hashtable]::new()).GetType()) + } + + It 'Should return correct "Authorization" hashtable property value - ""' -TestCases $testCasesValidPats { + param ([string]$Pat) + + $result = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + $result.Authorization | Should -Be $('Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat"))) + } + + } + + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesInvalidPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Throw + + } + } + } + + } + +} From f8afffe8822aa4a56bfa59a23a859b5aaac8555d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:50:18 +0000 Subject: [PATCH 072/611] Moved 'DSC_AzDevOpsProject' into 'DSCClassResources' --- .../DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 (100%) diff --git a/source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 rename to source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 From 85ff2a0ac0c4eb48ac04a7f136dc79ec0b5521d5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:51:52 +0000 Subject: [PATCH 073/611] Moved other 'DSC_AzDevOpsProject' resource files into related 'DSCClassResources' subdirectory. --- .../DSC_AzDevOpsProject/README.md | 0 .../DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/README.md (100%) rename source/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 (100%) diff --git a/source/DSCResources/DSC_AzDevOpsProject/README.md b/source/DSCClassResources/DSC_AzDevOpsProject/README.md similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/README.md rename to source/DSCClassResources/DSC_AzDevOpsProject/README.md diff --git a/source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 b/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 similarity index 100% rename from source/DSCResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 rename to source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 From e732a8f2740995d1b002a9b5de78e33d1bf1be4a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:52:49 +0000 Subject: [PATCH 074/611] Added 'Examples' to 'build.yaml' for paths/folders copied as part of build. --- build.yaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 377b7554d..54473840a 100644 --- a/build.yaml +++ b/build.yaml @@ -3,13 +3,24 @@ # ModuleBuilder Configuration # #################################################### CopyPaths: - - en-US - DSCClassResources - DSCResources + - en-US + - Examples - Modules Encoding: UTF8 VersionedOutputDirectory: true +#################################################### +# Dependent Modules Configuration (Sampler) # +#################################################### +NestedModule: + DscResource.Common: + CopyOnly: true + Path: ./output/RequiredModules/DscResource.Common + AddToManifest: false + Exclude: PSGetModuleInfo.xml + #################################################### # Pipeline Configuration # #################################################### From 16dec114db07173d3ab96eb485cd681b7069497c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:54:13 +0000 Subject: [PATCH 075/611] Updated 'DSC_AzDevOpsProject.Tests.ps1' to use 'Class' ResourceType. --- tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 index 9b80bd020..89648b8ad 100644 --- a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 @@ -20,7 +20,7 @@ function Invoke-TestSetup $script:testEnvironment = Initialize-TestEnvironment ` -DSCModuleName $script:dscModuleName ` -DSCResourceName $script:dscResourceName ` - -ResourceType 'Mof' ` + -ResourceType 'Class' ` -TestType 'Unit' } From bd224977589362b3bc28d7c31425847bdb90a7ed Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:54:41 +0000 Subject: [PATCH 076/611] Added tests for 'Test-AzDevOpsOrganizationName' --- .../Test-AzDevOpsOrganizationName.Tests.ps1 | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 new file mode 100644 index 000000000..44a5345d0 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -0,0 +1,128 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOrganizationName' -Tag 'TestAzDevOpsOrganizationName' { + + $testCasesValidOrganizationNames = @( + @{ + OrganizationName = 'Organisation1' }, + @{ + OrganizationName = 'Organisation-2' }, + @{ + OrganizationName = 'Organisation_3' } + ) + + $testCasesEmptyOrganizationNames = @( + @{ + OrganizationName = $null }, + @{ + OrganizationName = '' } + ) + + $testCasesInvalidOrganizationNames = @( + @{ + OrganizationName = ' ' }, + @{ + OrganizationName = '%' }, + @{ + OrganizationName = 'Organization 0' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "OrganizationName" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "OrganizationName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + $result = Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + $testCasesValidOrganizationNames = @( + @{ + OrganizationName = 'Organisation1' }, + @{ + OrganizationName = 'Organisation-2' }, + @{ + OrganizationName = 'Organisation_3' } + ) + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "OrganizationName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "OrganizationName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 6b7ad34a0c80a354d570dca343c14b7d464192ee Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 22:57:10 +0000 Subject: [PATCH 077/611] Updated 'build.yaml' to remove call to 'hqrmtest' tests --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 54473840a..4004f8ddb 100644 --- a/build.yaml +++ b/build.yaml @@ -47,7 +47,7 @@ BuildWorkflow: test: - Pester_Tests_Stop_On_Fail - Pester_if_Code_Coverage_Under_Threshold - - hqrmtest + #- hqrmtest # Can't current get these working (empty parameters being passed in) publish: - Publish_release_to_GitHub From d42270b79579718a4547636e871a3098f0b2e739 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 23:33:43 +0000 Subject: [PATCH 078/611] Deleted example text file. --- source/DSCResources/mof-resources_goes_here.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 source/DSCResources/mof-resources_goes_here.txt diff --git a/source/DSCResources/mof-resources_goes_here.txt b/source/DSCResources/mof-resources_goes_here.txt deleted file mode 100644 index e69de29bb..000000000 From cd2d13184055c660bc2bf90cf714123fc18e5181 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 29 Oct 2020 23:34:00 +0000 Subject: [PATCH 079/611] Added examples for 'DSC_AzDevOpsProject' --- .../DSC_AzDevOpsProject/1-AddProject.ps1 | 40 +++++++++++++ .../DSC_AzDevOpsProject/2-RenameProject.ps1 | 41 +++++++++++++ .../DSC_AzDevOpsProject/3-DeleteProject.ps1 | 60 +++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 create mode 100644 source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 create mode 100644 source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 new file mode 100644 index 000000000..aad54740e --- /dev/null +++ b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 @@ -0,0 +1,40 @@ + +<# + .DESCRIPTION + This example shows how to ensure that the Azure DevOps project + called 'Test Project' exists (or is added if it does not exist). +#> + +Configuration Example +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Url, + + [Parameter(Mandatory = $true)] + [string] + $Pat + ) + + Import-DscResource -ModuleName 'AzureDevOpsDsc' + + node localhost + { + DSC_AzDevOpsProject 'AddProject' + { + Ensure = 'Present' + + ApiUri = $ApiUri + Pat = $Pat + + ProjectName = 'Test Project' + ProjectDescription = 'A Test Project' + + #ProjectId = 'TestProject' + #PsDscRunAsCredential = $SqlAdministratorCredential + } + + } +} diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 new file mode 100644 index 000000000..1c96fde11 --- /dev/null +++ b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 @@ -0,0 +1,41 @@ + +<# + .DESCRIPTION + This example shows how to ensure that an Azure DevOps project + with a ProjectId of '1aeda1ef-a16d-4118-8817-d2f85d4f05d1' can be + renamed to 'A New Test Project Name'. +#> + +Configuration Example +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Url, + + [Parameter(Mandatory = $true)] + [string] + $Pat + ) + + Import-DscResource -ModuleName 'AzureDevOpsDsc' + + node localhost + { + DSC_AzDevOpsProject 'RenameProject' + { + Ensure = 'Present' + + ApiUri = $ApiUri + Pat = $Pat + + ProjectId = '1aeda1ef-a16d-4118-8817-d2f85d4f05d1' # Example ProjectId (NOTE: This is mandatory for renaming a project) + ProjectName = 'A New Test Project Name' + ProjectDescription = 'A test project' + + #PsDscRunAsCredential = $SqlAdministratorCredential + } + + } +} diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 new file mode 100644 index 000000000..291de9de0 --- /dev/null +++ b/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 @@ -0,0 +1,60 @@ + +<# + .DESCRIPTION + This example shows both how to ensure that an Azure DevOps project + can be logically deleted or be unequivocally/hard deleted. +#> + +Configuration Example +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Url, + + [Parameter(Mandatory = $true)] + [string] + $Pat + ) + + Import-DscResource -ModuleName 'AzureDevOpsDsc' + + node localhost + { + + # Example: A logical delete (rename) of a project + DSC_AzDevOpsProject 'DeleteProject_Logical' + { + Ensure = 'Absent' + + ApiUri = $ApiUri + Pat = $Pat + + ProjectName = 'Test Logical Delete Project' + ProjectDescription = 'A test project to be logically deleted' + + # An optional, prefix for logically deleted Projects (default is 'zzDel_') + DeletedPrefix = 'zzDel_' + + } + + + # Example: An unequivocal delete of a project (i.e. a strong/pure/absolute delete) + DSC_AzDevOpsProject 'DeleteProject_Unequivocal' + { + Ensure = 'Absent' + + ApiUri = $ApiUri + Pat = $Pat + + ProjectName = 'Test Unequivocal Delete Project' + ProjectDescription = 'A test project to be unequivocally deleted' + + # NOTE: By specifying the Force parameter, this will perform an actual delete of the project (as opposed to a logical delete) + Force = $true + + } + + } +} From e1ce7f5313e5c81a8d47a1c4becbf0c604728699 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:09:22 +0000 Subject: [PATCH 080/611] Added tests for 'Get-AzDevOpsProject' function. --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 41 ++- .../Private/Get-AzDevOpsProject.Tests.ps1 | 334 ++++++++++++++++++ 2 files changed, 365 insertions(+), 10 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 index 6d0397a57..b41e4d25e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 @@ -63,22 +63,43 @@ function Get-AzDevOpsProject [Parameter()] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] - [Alias('Id')] + [Alias('ObjectId','Id')] [System.String] - $ProjectId = '*', + $ProjectId, [Parameter()] [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] [Alias('Name')] [System.String] - $ProjectName = '*' + $ProjectName ) - [object[]]$apiObjects = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` - -ObjectName 'Project' ` - -ObjectId $ProjectId - return $apiObjects | - Where-Object name -ilike $ProjectName | - Where-Object id -ilike $ProjectId - } + $azDevOpsApiObjectParameters = @{ + ApiUri = $ApiUri; + Pat = $Pat; + ObjectName = 'Project'} + + + If(![string]::IsNullOrWhiteSpace($ProjectId)){ + $azDevOpsApiObjectParameters.ObjectId = $ProjectId + } + + + [object[]]$apiObjects = Get-AzDevOpsApiObject @azDevOpsApiObjectParameters + + + If(![string]::IsNullOrWhiteSpace($ProjectId)){ + $apiObjects = $apiObjects | + Where-Object id -ilike $ProjectId + } + + + If(![string]::IsNullOrWhiteSpace($ProjectName)){ + $apiObjects = $apiObjects | + Where-Object name -ilike $ProjectName + } + + + return [object[]]$apiObjects +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..b404e071e --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 @@ -0,0 +1,334 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsProject' -Tag 'GetAzDevOpsProject' { + + Context 'When called with valid parameters' { + BeforeAll { + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { + return @( + @{ + id='8d4bff8d-6169-45cf-b085-fe12ad67e76b'; + name='Mock Project Name 1'; }, + @{ + id='485ab935-7de3-4894-ba6f-ed418d4eda92'; + name='Mock Project Name 2'; } + ) + } + } + + + $testCasesValidApiUris = @( + @{ + ApiUri = 'http://someuri.api/_apis/' }, + @{ + ApiUri = 'https://someuri.api/_apis/' } + ) + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { + + $apiUri = $_.ApiUri + $testCasesValidPats | ForEach-Object { + + $pat = $_.Pat + return @{ + ApiUri = $apiUri + Pat = $pat + } + } + + } + + + $testCasesValidProjectNames = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' + @{ + ProjectName = 'Mock Project Name 1' }, + @{ + ProjectName = 'Mock Project Name 2' } + ) + + $testCasesValidProjectIds = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' + @{ + ProjectId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, + @{ + ProjectId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } + ) + + $testCasesValidApiUriPatProjectNameCombined = $testCasesValidApiUriPatCombined | ForEach-Object { + + $apiUri = $_.ApiUri + $pat = $_.Pat + $testCasesValidProjectNames | ForEach-Object { + + $projectName = $_.ProjectName + return @{ + ApiUri = $apiUri + Pat = $pat + ProjectName = $projectName + } + } + + } + + $testCasesValidApiUriPatProjectIdCombined = $testCasesValidApiUriPatCombined | ForEach-Object { + + $apiUri = $_.ApiUri + $pat = $_.Pat + $testCasesValidProjectIds | ForEach-Object { + + $projectId = $_.ProjectId + return @{ + ApiUri = $apiUri + Pat = $pat + ProjectId = $projectId + } + } + + } + + + Context 'When called with no "ProjectId" parameter and no "ProjectName" parameter' { + + It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + } + + } + + + Context 'When called with no "ProjectId" parameter but with a "ProjectName" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + Context 'When a "Project" with supplied "ProjectName" parameter value exists' { + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + } + } + + Context 'When a "Project" with supplied "ProjectName" parameter value does not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName 'NonPresentProjectName' + $result | Should -Be $null + } + } + } + + + Context 'When called with no "ProjectName" parameter but with a "ProjectId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + } + + Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ProjectId" + $result | Should -Be $null + } + } + + } + + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Get-AzDevOpsProject -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { Get-AzDevOpsProject -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { Get-AzDevOpsProject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidApiUris = @( + @{ + ApiUri = ' ' }, + @{ + ApiUri = 'a 1' }, + + # Incorrect prefixes + @{ + ApiUri = 'ftp://someuri.api/_apis/' }, + @{ + ApiUri = 'someuri.api/_apis/' }, + + # Missing trailing '/' (after http(s)) + @{ + ApiUri = 'http:/someuri.api/_apis/' }, + @{ + ApiUri = 'https:/someuri.api/_apis/' }, + + # Missing trailing '/' + @{ + ApiUri = 'http://someuri.api/_apis' }, + @{ + ApiUri = 'https://someuri.api/_apis' }, + + # Missing trailing '/_apis/' + @{ + ApiUri = 'http://someuri.api/' }, + @{ + ApiUri = 'https://someuri.api/' } + ) + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Get-AzDevOpsProject -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + } + + } + +} From 693a372f5cd9030c6810276ec6d8056c1b858683 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:20:17 +0000 Subject: [PATCH 081/611] Added tests for 'Get-AzDevOpsOperation' --- .../Public/Get-AzDevOpsOperation.ps1 | 28 +- .../Private/Get-AzDevOpsOperation.Tests.ps1 | 271 ++++++++++++++++++ 2 files changed, 293 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 index cf5247a12..6ec321285 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -38,17 +38,33 @@ function Get-AzDevOpsOperation [System.String] $Pat, - [Parameter(Mandatory = $true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] [Alias('Id')] [System.String] $OperationId ) - [System.Object[]]$apiObjects = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` - -ObjectName 'Operation' ` - -ObjectId $OperationId - return $apiObjects | - Where-Object id -ilike $OperationId + $azDevOpsApiObjectParameters = @{ + ApiUri = $ApiUri; + Pat = $Pat; + ObjectName = 'Operation'} + + + If(![string]::IsNullOrWhiteSpace($OperationId)){ + $azDevOpsApiObjectParameters.ObjectId = $OperationId + } + + + [System.Object[]]$apiObjects = Get-AzDevOpsApiObject @azDevOpsApiObjectParameters + + + If(![string]::IsNullOrWhiteSpace($OperationId)){ + $apiObjects = $apiObjects | + Where-Object id -ilike $OperationId + } + + + return [object[]]$apiObjects } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..7d8ebcfbe --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1,271 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsOperation' -Tag 'GetAzDevOpsOperation' { + + Context 'When called with valid parameters' { + BeforeAll { + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { + return @( + @{ + id='8d4bff8d-6169-45cf-b085-fe12ad67e76b';}, + @{ + id='485ab935-7de3-4894-ba6f-ed418d4eda92';} + ) + } + } + + + $testCasesValidApiUris = @( + @{ + ApiUri = 'http://someuri.api/_apis/' }, + @{ + ApiUri = 'https://someuri.api/_apis/' } + ) + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { + + $apiUri = $_.ApiUri + $testCasesValidPats | ForEach-Object { + + $pat = $_.Pat + return @{ + ApiUri = $apiUri + Pat = $pat + } + } + + } + + $testCasesValidOperationIds = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' + @{ + OperationId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, + @{ + OperationId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } + ) + + $testCasesValidApiUriPatOperationIdCombined = $testCasesValidApiUriPatCombined | ForEach-Object { + + $apiUri = $_.ApiUri + $pat = $_.Pat + $testCasesValidOperationIds | ForEach-Object { + + $OperationId = $_.OperationId + return @{ + ApiUri = $apiUri + Pat = $pat + OperationId = $OperationId + } + } + + } + + + Context 'When called with no "OperationId" parameter' { + + It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat | Out-Null + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + } + + } + + + Context 'When called with a "OperationId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId | Out-Null + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + } + + Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "OperationId" + $result | Should -Be $null + } + } + + } + + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Get-AzDevOpsOperation -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { Get-AzDevOpsOperation -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { Get-AzDevOpsOperation -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidApiUris = @( + @{ + ApiUri = ' ' }, + @{ + ApiUri = 'a 1' }, + + # Incorrect prefixes + @{ + ApiUri = 'ftp://someuri.api/_apis/' }, + @{ + ApiUri = 'someuri.api/_apis/' }, + + # Missing trailing '/' (after http(s)) + @{ + ApiUri = 'http:/someuri.api/_apis/' }, + @{ + ApiUri = 'https:/someuri.api/_apis/' }, + + # Missing trailing '/' + @{ + ApiUri = 'http://someuri.api/_apis' }, + @{ + ApiUri = 'https://someuri.api/_apis' }, + + # Missing trailing '/_apis/' + @{ + ApiUri = 'http://someuri.api/' }, + @{ + ApiUri = 'https://someuri.api/' } + ) + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Get-AzDevOpsOperation -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + } + + } + +} From 7ace9a1ff89399c96c787e2174b657073ddce2ce Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:21:07 +0000 Subject: [PATCH 082/611] Moved 'Get-AzDevOpsOperation' and 'Get-AzDevOpsProject' function tests into 'Public' subdirectory. --- .../Functions/{Private => Public}/Get-AzDevOpsOperation.Tests.ps1 | 0 .../Functions/{Private => Public}/Get-AzDevOpsProject.Tests.ps1 | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/{Private => Public}/Get-AzDevOpsOperation.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/{Private => Public}/Get-AzDevOpsProject.Tests.ps1 (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 From 4400769ef08025131b5d8c5a13e3293d6df54c32 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:33:11 +0000 Subject: [PATCH 083/611] Added 'Get-AzDevOpsApiObjectName' function. --- .../Private/Get-AzDevOpsApiObjectName.ps1 | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 new file mode 100644 index 000000000..b9ac2eca2 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 @@ -0,0 +1,22 @@ +<# + .SYNOPSIS + Returns an array of all the Azure DevOps API, 'Object' names that can used/managed. + + .EXAMPLE + Get-AzDevOpsApiObjectName + + Returns all the names of the objects that can be used/managed in the Azure DevOps API. +#> +function Get-AzDevOpsApiObjectName +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param () + + [string[]]$objectNames = @( + 'Operation', + 'Project' + ) + + return $objectNames +} From 84d236e7ad6bfa8864c2ebb54f1032a89bb3648b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:39:04 +0000 Subject: [PATCH 084/611] Added 'Test-AzDevOpsObjectName' --- .../Private/Test-AzDevOpsApiObjectName.ps1 | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 new file mode 100644 index 000000000..1dcdd8e93 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 @@ -0,0 +1,52 @@ +<# + .SYNOPSIS + Peforms test on a provided 'ObjectName' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ObjectName + The 'ObjectName' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'ObjectName' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsObjectName -ObjectName 'YourObjectNameHere' -IsValid + + Returns $true if the 'ObjectName' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsObjectName +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ObjectName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + + if (!($(Get-AzDevOpsApiObjectName).Contains($ObjectName))) + { + return $false + } + + + return $true +} From a2b67e23765c63b98048fe2083df6f7b9eb0d7c9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 17:49:47 +0000 Subject: [PATCH 085/611] Added 'Test-AzDevOpsApiObjectName' tests --- .../Private/Test-AzDevOpsApiObjectName.ps1 | 4 +- .../Test-AzDevOpsApiObjectName.Tests.ps1 | 131 ++++++++++++++++++ 2 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 index 1dcdd8e93..2c2d2e3c8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 @@ -15,12 +15,12 @@ Failure to use this switch will throw an exception. .EXAMPLE - Test-AzDevOpsObjectName -ObjectName 'YourObjectNameHere' -IsValid + Test-AzDevOpsApiObjectName -ObjectName 'YourObjectNameHere' -IsValid Returns $true if the 'ObjectName' provided is of a valid format. Returns $false if it is not. #> -function Test-AzDevOpsObjectName +function Test-AzDevOpsApiObjectName { [CmdletBinding()] [OutputType([System.Boolean])] diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 new file mode 100644 index 000000000..d12b0b41a --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 @@ -0,0 +1,131 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectName' -Tag 'TestAzDevOpsApiObjectName' { + + $testCasesValidObjectNames = @( + @{ + ObjectName = 'Operation' }, + @{ + ObjectName = 'Project' } + ) + + $testCasesEmptyObjectNames = @( + @{ + ObjectName = $null }, + @{ + ObjectName = '' } + ) + + $testCasesInvalidObjectNames = @( + @{ + ObjectName = ' ' }, + @{ + ObjectName = 'a 1' }, + @{ + ObjectName = 'NonObject' }, + @{ + ObjectName = 'SomeOtherInvalidObject' } + ) + + Context 'When validating, valid "ObjectName" test cases' { + + It 'Should also be returned from "Get-AzDevOpsApiObjectName" function - ' -TestCases $testCasesValidObjectNames { + param ([string]$ObjectName) + + $($(Get-AzDevOpsApiObjectName | + Where-Object { $_ -ceq $ObjectName})) | Should -Be $ObjectName + + } + + } + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ObjectName" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidObjectNames { + param ([string]$ObjectName) + + $result = Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ObjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidObjectNames { + param ([string]$ObjectName) + + $result = Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ObjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ObjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidObjectNames { + param ([string]$ObjectName) + + { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From 482ed7286a4517357e02058e1d1aa92837f1a022 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 18:09:42 +0000 Subject: [PATCH 086/611] Added 'Get-AzDevOpsApiObjectName' tests --- .../Get-AzDevOpsApiObjectName.Tests.ps1 | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 new file mode 100644 index 000000000..29bfcce4a --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 @@ -0,0 +1,47 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiObjectName' -Tag 'GetAzDevOpsApiObjectName' { + + Context 'When called with valid parameters' { + + + BeforeAll { + + $testCasesValidObjectName = @( + @{ + ObjectName = 'Operation'}, + @{ + ObjectName = 'Project'} + ) + } + + It 'Should not throw' { + param () + + { Get-AzDevOpsApiObjectName } | Should -Not -Throw + } + + It 'Should return "object[]"' { + param () + + $result = Get-AzDevOpsApiObjectName + $result.GetType() | Should -Be @('ObjectName1','ObjectName2').GetType() + } + + It 'Should return all objects that are present in $testCasesValidObjectName variable'{ + param () + + $result = Get-AzDevOpsApiObjectName + $result.Count | Should -Be $($testCasesValidObjectName.Count) + } + + } + + } + +} From 40925488182dcf70bc5b5f76453169616c4e214d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 18:29:12 +0000 Subject: [PATCH 087/611] Commented out 'New-AzDevOpsConnection' (not used yet) --- .../Public/New-AzDevOpsConnection.ps1 | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 index 3e9dcf002..17af57686 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 @@ -1,59 +1,59 @@ -<# - .SYNOPSIS - Creates a 'Connection' (assocated with the Organization/ApiUrl) to be used with other functions/cmdlets in this PSModule. - - .PARAMETER ApiUri - The URI of the Azure DevOps API to be connected to. For example: - - https://dev.azure.com/someOrganizationName/_apis/ - - .PARAMETER Pat - The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations - against the Azure DevOps API. This PAT must have the relevant permissions assigned - for the subsequent operations being performed. - - .PARAMETER Credential - The 'Credential' to be used by any subsequent requests against the Azure DevOps API. - This credential must have the relevant permissions assigned for the subsequent operations - being performed. - - .EXAMPLE - New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' - - Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'Personal Access Token' (PAT)) to be used with other functions/cmdlets in this PSModule. - - .EXAMPLE - New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Credential $YourCredentialHere - - Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'PSCredential' object) to be used with other functions/cmdlets in this PSModule. -#> -function New-AzDevOpsConnection -{ - [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] - [OutputType([System.Object])] - param - ( - [Parameter(Mandatory = $true)] - [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] - [Alias('Uri')] - [System.String] - $ApiUri, - - [Parameter(Mandatory = $true, ParameterSetName = 'Pat')] - [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] - [Alias('PersonalAccessToken')] - [System.String] - $Pat, - - [Parameter(Mandatory = $true, ParameterSetName = 'Credential')] - [ValidateScript({ Test-AzDevOpsCredential -Credential $_ -IsValid })] - [System.Management.Automation.PSCredential] - $Credential - ) - - [System.Object]$connection = $null - - # TODO! - - return $connection -} +# <# +# .SYNOPSIS +# Creates a 'Connection' (assocated with the Organization/ApiUrl) to be used with other functions/cmdlets in this PSModule. + +# .PARAMETER ApiUri +# The URI of the Azure DevOps API to be connected to. For example: + +# https://dev.azure.com/someOrganizationName/_apis/ + +# .PARAMETER Pat +# The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations +# against the Azure DevOps API. This PAT must have the relevant permissions assigned +# for the subsequent operations being performed. + +# .PARAMETER Credential +# The 'Credential' to be used by any subsequent requests against the Azure DevOps API. +# This credential must have the relevant permissions assigned for the subsequent operations +# being performed. + +# .EXAMPLE +# New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' + +# Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'Personal Access Token' (PAT)) to be used with other functions/cmdlets in this PSModule. + +# .EXAMPLE +# New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Credential $YourCredentialHere + +# Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'PSCredential' object) to be used with other functions/cmdlets in this PSModule. +# #> +# function New-AzDevOpsConnection +# { +# [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] +# [OutputType([System.Object])] +# param +# ( +# [Parameter(Mandatory = $true)] +# [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] +# [Alias('Uri')] +# [System.String] +# $ApiUri, + +# [Parameter(Mandatory = $true, ParameterSetName = 'Pat')] +# [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] +# [Alias('PersonalAccessToken')] +# [System.String] +# $Pat, + +# [Parameter(Mandatory = $true, ParameterSetName = 'Credential')] +# [ValidateScript({ Test-AzDevOpsCredential -Credential $_ -IsValid })] +# [System.Management.Automation.PSCredential] +# $Credential +# ) + +# [System.Object]$connection = $null + +# # TODO! + +# return $connection +# } From 34d5404976b0d2f05c9a4e89655eece72d6f1e6d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:04:46 +0000 Subject: [PATCH 088/611] Renamed 'Test-AzDevOpsObjectId' to 'Test-AzDevOpsApiObjectId' --- ...Test-AzDevOpsObjectId.ps1 => Test-AzDevOpsApiObjectId.ps1} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename source/Modules/AzureDevOpsDsc.Common/Functions/Private/{Test-AzDevOpsObjectId.ps1 => Test-AzDevOpsApiObjectId.ps1} (92%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.ps1 similarity index 92% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.ps1 index df96292f8..94c26bcea 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.ps1 @@ -15,12 +15,12 @@ Failure to use this switch will throw an exception. .EXAMPLE - Test-AzDevOpsObjectId -ObjectId 'YourObjectIdHere' -IsValid + Test-AzDevOpsApiObjectId -ObjectId 'YourObjectIdHere' -IsValid Returns $true if the 'ObjectId' provided is of a valid format. Returns $false if it is not. #> -function Test-AzDevOpsObjectId +function Test-AzDevOpsApiObjectId { [CmdletBinding()] [OutputType([System.Boolean])] From 51fa5fef90fca7d83ea1bf970a7dd9ea2f33f04b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:05:49 +0000 Subject: [PATCH 089/611] Updated tests that ensure 'Get-AzDevOpsApiObject' is called so they ensure 'Exactly' 1 tme, within the 'It' context. --- .../Functions/Public/Get-AzDevOpsOperation.Tests.ps1 | 4 ++-- .../Functions/Public/Get-AzDevOpsProject.Tests.ps1 | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 index 7d8ebcfbe..8ad02d08b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -93,7 +93,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri, [string]$Pat) Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -118,7 +118,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri, [string]$Pat, [string]$OperationId) Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index b404e071e..221eebcfe 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -119,7 +119,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri, [string]$Pat) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -146,7 +146,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -181,7 +181,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Scope Context + Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { From 820d5a22aa0e7436c85935a3243338fbc063e392 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:06:58 +0000 Subject: [PATCH 090/611] Updated $ObjectName and $ObjectId parameter validation scripts within 'Get-AzDevOpsApiObject' --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index 5d7390a86..aa87ccfb0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -53,12 +53,12 @@ function Get-AzDevOpsApiObject $Pat, [Parameter(Mandatory=$true)] - [ValidateSet('Operation','Project')] + [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectId $_ -IsValid })] [System.String] $ObjectName, [Parameter()] - [ValidateScript({ Test-AzDevOpsObjectId -ObjectId $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] [System.String] $ObjectId ) From 7f056a0bbf00386a0d45dd00a5f529c506c3ddce Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:08:06 +0000 Subject: [PATCH 091/611] Corrected call to 'Test-AzDevOpsApiObjectName' in 'Get-AzDevOpsApiObject' parameter validation. --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index aa87ccfb0..fbcacc8d7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -53,7 +53,7 @@ function Get-AzDevOpsApiObject $Pat, [Parameter(Mandatory=$true)] - [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectId $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectName $_ -IsValid })] [System.String] $ObjectName, From 6f29d8db09470a7e5b942bc9b5bfab19f8272796 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:56:36 +0000 Subject: [PATCH 092/611] Renamed 'Test-AzDevOpsObjectId' tests to 'Test-AzDevOpsApiObjectId' tests --- ....ps1 => Test-AzDevOpsApiObjectId.Tests.ps1} | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/{Test-AzDevOpsObjectId.Tests.ps1 => Test-AzDevOpsApiObjectId.Tests.ps1} (78%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 similarity index 78% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 index 88e8a766a..847305853 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsObjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 @@ -5,7 +5,7 @@ InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsObjectId' -Tag 'TestAzDevOpsObjectId' { + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectId' -Tag 'TestAzDevOpsApiObjectId' { $testCasesValidObjectIds = @( @{ @@ -47,13 +47,13 @@ InModuleScope $script:subModuleName { It 'Should not throw - ""' -TestCases $testCasesValidObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw } It 'Should return $true - ""' -TestCases $testCasesValidObjectIds { param ([string]$ObjectId) - $result = Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid + $result = Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid $result | Should -Be $true } } @@ -63,19 +63,19 @@ InModuleScope $script:subModuleName { It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Throw } It 'Should not throw - ""' -TestCases $testCasesInvalidObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw } It 'Should return $false - ""' -TestCases $testCasesInvalidObjectIds { param ([string]$ObjectId) - $result = Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid + $result = Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid $result | Should -Be $false } } @@ -95,7 +95,7 @@ InModuleScope $script:subModuleName { It 'Should throw - ""' -TestCases $testCasesValidObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw } } @@ -105,13 +105,13 @@ InModuleScope $script:subModuleName { It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw } It 'Should throw - ""' -TestCases $testCasesInvalidObjectIds { param ([string]$ObjectId) - { Test-AzDevOpsObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw } } From c244c68f5507133dcacdd13a0915b44a37eb019b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:58:20 +0000 Subject: [PATCH 093/611] Updated use of 'Test-AzDevOpsObjectId' to 'Test-AzDevOpsObjectId' within functions and tests. --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsOperationId.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsProjectId.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 | 8 ++++---- .../Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 | 8 ++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index fbcacc8d7..f563a290f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -64,7 +64,7 @@ function Get-AzDevOpsApiObject ) # Remove any $ObjectId if using a wildcard character - # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsObjectId $ObjectId -IsValid') then set to $null) + # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsApiObjectId $ObjectId -IsValid') then set to $null) if ($ObjectId -contains '*') { $ObjectId = $null diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 index e00e3f21f..4dfadd237 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsOperationId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid:$IsValid)) + if (!(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid:$IsValid)) { return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 index 969c90ab0..ef608f1ad 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsProjectId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid:$IsValid)) + if (!(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid:$IsValid)) { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index 6e722f045..f4143cf36 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -57,11 +57,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $true } - It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesValidOperationIds { + It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesValidOperationIds { param ([string]$OperationId) $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid) } } @@ -86,11 +86,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $false } - It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesInvalidOperationIds { + It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesInvalidOperationIds { param ([string]$OperationId) $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $OperationId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid) } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index c52efb936..2f5ab9e22 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -57,11 +57,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $true } - It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesValidProjectIds { + It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesValidProjectIds { param ([string]$ProjectId) $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid) } } @@ -86,11 +86,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $false } - It 'Should return same as "Test-AzDevOpsObjectId" - ""' -TestCases $testCasesInvalidProjectIds { + It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesInvalidProjectIds { param ([string]$ProjectId) $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsObjectId -ObjectId $ProjectId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid) } } From e078c8dd02e85e478005f8a77fdd47cbdad3423d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 19:58:42 +0000 Subject: [PATCH 094/611] Added tests for 'Get-AzDevOpsApiObject' function --- .../Private/Get-AzDevOpsApiObject.Tests.ps1 | 332 ++++++++++++++++++ 1 file changed, 332 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 new file mode 100644 index 000000000..88687e12e --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 @@ -0,0 +1,332 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiObject' -Tag 'GetAzDevOpsApiObject' { + + Context 'When called with valid parameters' { + BeforeAll { + Mock Invoke-RestMethod { + $response = @' + { + "count": 2, + "value": [ + { + "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "name": "Test Project 1", + "description": "Test Project Description 1", + "url": "https://dev.azure.com/fabrikam/_apis/projects/8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "state": "wellFormed" + }, + { + "id": "485ab935-7de3-4894-ba6f-ed418d4eda92", + "name": "Test Project 2", + "description": "Test Project Description 2", + "url": "https://dev.azure.com/fabrikam/_apis/projects/485ab935-7de3-4894-ba6f-ed418d4eda92", + "state": "wellFormed" + } + ] + } +'@ | ConvertFrom-Json + + if ([string]::IsNullOrWhiteSpace($ObjectId)) + { + $response = $response.Value + } + else { + $response = $response.Value | + Where-Object { $_.id -eq $ObjectId } + } + + return $response + } + } + + $testCasesValidApiUris = @( + @{ + ApiUri = 'http://someuri.api/_apis/' }, + @{ + ApiUri = 'https://someuri.api/_apis/' } + ) + + $testCasesValidPats = @( + @{ + Pat = '1234567890123456789012345678901234567890123456789012' }, + @{ + Pat = '0987654321098765432109876543210987654321098765432109' }, + @{ + Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } + ) + + $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { + + $apiUri = $_.ApiUri + $testCasesValidPats | ForEach-Object { + + $pat = $_.Pat + return @{ + ApiUri = $apiUri + Pat = $pat + } + } + + } + + + $testCasesValidObjectNames = @( + @{ + ObjectName = 'Operation' }, + @{ + ObjectName = 'Project' } + ) + + $testCasesValidObjectIds = @( # Note: Same as mock for 'Invoke-RestMethod' + @{ + ObjectId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, + @{ + ObjectId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } + ) + + $testCasesValidApiUriPatObjectNameCombined = $testCasesValidApiUriPatCombined | ForEach-Object { + + $apiUri = $_.ApiUri + $pat = $_.Pat + $testCasesValidObjectNames | ForEach-Object { + + $objectName = $_.ObjectName + return @{ + ApiUri = $apiUri + Pat = $pat + ObjectName = $objectName + } + } + + } + + $testCasesValidApiUriPatObjectNameObjectIdCombined = $testCasesValidApiUriPatObjectNameCombined | ForEach-Object { + + $apiUri = $_.ApiUri + $pat = $_.Pat + $objectName = $_.ObjectName + $testCasesValidObjectIds | ForEach-Object { + + $objectId = $_.ObjectId + return @{ + ApiUri = $apiUri + Pat = $pat + ObjectName = $objectName + ObjectId = $objectId + } + } + + } + + + Context 'When called with no "ObjectId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + + { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + + $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName + #Write-Warning "x" + #Write-Warning "$ApiUri" + #Write-Warning "$Pat" + #Write-Warning "$ObjectName" + #Write-Warning "$result" + #Write-Warning "yy" + + #$result + + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + + Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName | Out-Null + Should -Invoke Invoke-RestMethod -Times 1 -Exactly -Scope It + } + + } + + + Context 'When called with an "ObjectId" parameter' { + + It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + + { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + + $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId + + $result.GetType() | Should -Be $(New-Object -TypeName PSCustomObject).GetType() + } + + It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + + Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId | Out-Null + Should -Invoke Invoke-RestMethod -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + } + + Context 'When a "Object" with supplied "ObjectId" parameter value does not exist' { + + It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + + $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ObjectId" + $result | Should -Be $null + } + } + + } + + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidPats = @( + @{ + Pat = $null }, + @{ + Pat = '' } + @{ + Pat = ' ' }, + @{ + Pat = 'a 1' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, + @{ + Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } + ) + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Get-AzDevOpsApiObject -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { Get-AzDevOpsApiObject -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { Get-AzDevOpsApiObject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = @( + @{ + ApiUri = $null }, + @{ + ApiUri = '' } + ) + + $testCasesInvalidApiUris = @( + @{ + ApiUri = ' ' }, + @{ + ApiUri = 'a 1' }, + + # Incorrect prefixes + @{ + ApiUri = 'ftp://someuri.api/_apis/' }, + @{ + ApiUri = 'someuri.api/_apis/' }, + + # Missing trailing '/' (after http(s)) + @{ + ApiUri = 'http:/someuri.api/_apis/' }, + @{ + ApiUri = 'https:/someuri.api/_apis/' }, + + # Missing trailing '/' + @{ + ApiUri = 'http://someuri.api/_apis' }, + @{ + ApiUri = 'https://someuri.api/_apis' }, + + # Missing trailing '/_apis/' + @{ + ApiUri = 'http://someuri.api/' }, + @{ + ApiUri = 'https://someuri.api/' } + ) + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Get-AzDevOpsApiObject -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + } + + } + +} From cd5e3c3534f9619693f514fbf9a77114a5f99c7b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 20:04:18 +0000 Subject: [PATCH 095/611] Corrected spellings of 'Organisation' in 'Test-AzDevOpsOrganizationName.Tests.ps1' --- .../Private/Test-AzDevOpsOrganizationName.Tests.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index 44a5345d0..9e435bc73 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -9,11 +9,11 @@ InModuleScope $script:subModuleName { $testCasesValidOrganizationNames = @( @{ - OrganizationName = 'Organisation1' }, + OrganizationName = 'Project1' }, @{ - OrganizationName = 'Organisation-2' }, + OrganizationName = 'Project-2' }, @{ - OrganizationName = 'Organisation_3' } + OrganizationName = 'Project_3' } ) $testCasesEmptyOrganizationNames = @( @@ -86,11 +86,11 @@ InModuleScope $script:subModuleName { $testCasesValidOrganizationNames = @( @{ - OrganizationName = 'Organisation1' }, + OrganizationName = 'Project1' }, @{ - OrganizationName = 'Organisation-2' }, + OrganizationName = 'Project-2' }, @{ - OrganizationName = 'Organisation_3' } + OrganizationName = 'Project_3' } ) Context 'When called without using "-IsValid" switch' { From 9b5413d43285fce118915e15e2d89ae87e1bf4eb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 20:07:01 +0000 Subject: [PATCH 096/611] Added 'Test-AzDevOpsProjectName' tests --- .../Private/Test-AzDevOpsProjectName.ps1 | 6 + .../Test-AzDevOpsProjectName.Tests.ps1 | 128 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 index 4db45f284..624bdf533 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -41,5 +41,11 @@ function Test-AzDevOpsProjectName New-InvalidOperationException -Message $errorMessage } + if ([System.String]::IsNullOrWhiteSpace($ProjectName) -or + ($ProjectName.Contains('%'))) + { + return $false + } + return $true } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 new file mode 100644 index 000000000..9ad1945af --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -0,0 +1,128 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectName' -Tag 'TestAzDevOpsProjectName' { + + $testCasesValidProjectNames = @( + @{ + ProjectName = 'Project 0' }, + @{ + ProjectName = 'Project1' }, + @{ + ProjectName = 'Project-2' }, + @{ + ProjectName = 'Project_3' } + ) + + $testCasesEmptyProjectNames = @( + @{ + ProjectName = $null }, + @{ + ProjectName = '' } + ) + + $testCasesInvalidProjectNames = @( + @{ + ProjectName = ' ' }, + @{ + ProjectName = '%' } + ) + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ProjectName" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidProjectNames { + param ([string]$ProjectName) + + $result = Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ProjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { + param ([string]$ProjectName) + + $result = Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + $testCasesValidProjectNames = @( + @{ + ProjectName = 'Project1' }, + @{ + ProjectName = 'Project-2' }, + @{ + ProjectName = 'Project_3' } + ) + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ProjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ProjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidProjectNames { + param ([string]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} From a57f3dfd850fda678eebad7a1d9f36ab4ae0899f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 20:10:35 +0000 Subject: [PATCH 097/611] Added empty tests files to be renamed/completed. --- .../Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 | 1 + .../Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 | 1 + .../Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 | 1 + .../Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 | 1 + .../Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 | 1 + .../Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 | 1 + 6 files changed, 6 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1 @@ + From 47592a05d8bdb5893f1046cc7a1ed2212ecaa2d7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 1 Nov 2020 20:12:11 +0000 Subject: [PATCH 098/611] Moved tests from 'DSCResources' to 'DSCClassResources' --- .../DSC_AzDevOpsProject.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/{DSCResources => DSCClassResources}/DSC_AzDevOpsProject.Tests.ps1 (100%) diff --git a/tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 similarity index 100% rename from tests/Unit/DSCResources/DSC_AzDevOpsProject.Tests.ps1 rename to tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 From cd5f07c2159eb6790ebd6c0b8a4f803c47e3a388 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 13:10:12 +0000 Subject: [PATCH 099/611] Added initial functions for 'Get-TestCaseValue' and 'Get-TestCase' --- .../Modules/TestHelpers/CommonTestCases.psm1 | 250 ++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 new file mode 100644 index 000000000..71109d35e --- /dev/null +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -0,0 +1,250 @@ + + +<# + .SYNOPSIS + Returns arrays of values to be used within test cases. + + .PARAMETER ScopeName + Name of the scope for which the test case values are to be returned. + + .PARAMETER TestCaseName + The name of the test case values within the scope determined by the 'ScopeName' + parameter. +#> +function Get-TestCaseValue +{ + [OutputType([hashtable[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('String','ApiUri','Pat',` + 'ProjectName','OrganizationName',` + 'ObjectId')] + [System.String] + $ScopeName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Valid','Invalid','Empty','Null','Whitespace','NullOrWhitespace')] + [System.String] + $TestCaseName + ) + + + $testCaseValues = @{} + + + # String + $testCaseValues.String = @{ + + Valid = @( + '', + ' ', + 'a', + '1', + 'a1', + 'a 1' + ' a 1' + 'a 1 ' + ' a 1 ') + + Empty = @( + '', + [string]::Empty + ) + + Null = @( + $null + ) + } + + $testCaseValues.String.Whitespace = $testCaseValues.String.Empty + @( + ' ', + ' ' + ) + + $testCaseValues.String.NullOrWhitespace = $testCaseValues.String.Null + $testCaseValues.String.Whitespace + + + # ApiUri + $testCaseValues.ApiUri = @{ + + Valid = @( + 'http://someuri.api/_apis/', + 'https://someuri.api/_apis/', + 'http://dev.azure.com/organization/_apis/', + 'https://dev.azure.com/organization/_apis/' + ) + + Invalid = @( + + # Incorrect prefixes + 'ftp://someuri.api/_apis/', + 'someuri.api/_apis/', + + # Missing trailing '/' (after http(s)) + 'http:/someuri.api/_apis/', + 'https:/someuri.api/_apis/', + + + # Missing trailing '/' (at end of URI) + 'http://someuri.api/_apis' + 'https://someuri.api/_apis', + + + # Missing trailing '/_apis/' in URI + 'http://someuri.api/' + 'https://someuri.api/' + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # Pat + $testCaseValues.Pat = @{ + + Valid = @( + '1234567890123456789012345678901234567890123456789012', + '0987654321098765432109876543210987654321098765432109', + '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' + ) + + Invalid = @( + '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3', # Too short + '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x', # Too long + '0913uhuh3wedwnd4wsni2242 sfwn4u254uhufs009oosfmikm3', # Too short and contains space + '0913uhuh3wedwnd4wsni2242 sfwn4u254uhufs009oosfmikm34x' # Too long and contains space + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # OrganizationName + $testCaseValues.OrganizationName = @{ + + Valid = @( + 'OrganizationName', + 'Organization-Name', + 'Organization_Name' + ) + + Invalid = @( + '%', # Just '%' character + '*', # Just '*' character + 'Organization%Name', # Contains '%' + 'Organization*Name', # Contains '*' + 'Organization Name', # Contains ' ' (whitespace) + ' OrganizationName', # Leading ' ' (whitespace) + 'OrganizationName ', # Trailing ' ' (whitespace) + ' OrganizationName ' # Leading and trailing ' ' (whitespace) + ) + $testCaseValues.String.Whitespace # Any that are just whitespace characters + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # ProjectName + $testCaseValues.ProjectName = @{ + + Valid = @( + 'ProjectName', + 'Project Name', + 'Project-Name', + 'Project_Name' + ) + + Invalid = @( + '%', # Just '%' character + '*', # Just '*' character + 'Project%Name', # Contains '%' + 'Project*Name' # Contains '*' + ' ProjectName', # Leading ' ' (whitespace) + 'ProjectName ', # Trailing ' ' (whitespace) + ' ProjectName ' # Leading and trailing ' ' (whitespace) + ) + $testCaseValues.String.Whitespace # Any that are just whitespace characters + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # ObjectId + $testCaseValues.ObjectId = @{ + + Valid = @( + 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3', + '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0', + '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' + ) + + Invalid = @( + 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc', # Too short + '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a', # Too long + '74cd62c6554b014f5fa986fcb4eea2c4c1d0' # No dashes + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + return $testCaseValues[$ScopeName][$TestCaseName] + +} + + +<# + .SYNOPSIS + Returns arrays of test cases (hashtables) to be used within tests. + + .PARAMETER ScopeName + Name of the scope for which the test cases are to be returned. + + .PARAMETER TestCaseName + The name of the test cases within the scope determined by the 'ScopeName' + parameter. +#> +function Get-TestCase +{ + [OutputType([hashtable[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('String','ApiUri','Pat',` + 'ProjectName','OrganizationName',` + 'ObjectId')] + [System.String] + $ScopeName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Valid','Invalid','Empty','Null','Whitespace','NullOrWhitespace')] + [System.String] + $TestCaseName + ) + + $testCaseValues = Get-TestCaseValue -ScopeName $ScopeName -TestCaseName $TestCaseName + + $testCaseValues | ForEach-Object { + + [hashtable]$testCase = @{} + $testCase[$ScopeName] = $_ + return $testCase + } + +} From f1e2c794246eea6d1043c847b4e162c448da8452 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 14:10:22 +0000 Subject: [PATCH 100/611] Added 'Join-Hashtable' and 'CartesianProduct' functions (before tidy-up) --- .../Modules/TestHelpers/CommonTestCases.psm1 | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 71109d35e..f2c86cd28 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -20,7 +20,7 @@ function Get-TestCaseValue [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','Pat',` 'ProjectName','OrganizationName',` - 'ObjectId')] + 'ObjectId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -203,6 +203,14 @@ function Get-TestCaseValue } + # OperationId (derived from ObjectId) + $testCaseValues.OperationId = $testCaseValues.ObjectId + + + # ProjectId (derived from ObjectId) + $testCaseValues.ProjectId = $testCaseValues.ObjectId + + return $testCaseValues[$ScopeName][$TestCaseName] } @@ -228,7 +236,7 @@ function Get-TestCase [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','Pat',` 'ProjectName','OrganizationName',` - 'ObjectId')] + 'ObjectId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -248,3 +256,71 @@ function Get-TestCase } } + + + +function Join-Hashtable +{ + [OutputType([hashtable[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [hashtable] + $htold, + + [Parameter(Mandatory = $true)] + [hashtable] + $htnew + ) + + $keys = $htold.getenumerator() | foreach-object {$_.key} + $keys | foreach-object { + $key = $_ + if ($htnew.containskey($key)) + { + $htold.remove($key) + } + } + $htnew = $htold + $htnew + return $htnew +} + + + +function CartesianProduct { + param( + [hashtable[][]]$HashtableArray + ) + + [hashtable[]]$previousOutputHashTableArray = @() + + [int]$currentHashtableArrayNo = 0 + [int]$noOfHashtableArrays = $HashtableArray.Count + + while ($currentHashtableArrayNo -lt $noOfHashtableArrays) + { + [hashtable[]]$currentOutputHashTableArray = @() + + if($currentHashtableArrayNo -gt 0) + { + $previousOutputHashTableArray | ForEach-Object { + $previousOutputHashTable = $_ + + $HashtableArray[$currentHashtableArrayNo] | ForEach-Object { + $currentOutputHashTable = $_ + + $currentOutputHashTableArray += Join-Hashtable -htold $previousOutputHashTable -htnew $currentOutputHashTable + } + } + } + else { + $currentOutputHashTableArray = $HashtableArray[$currentHashtableArrayNo] + } + + $previousOutputHashTableArray = $currentOutputHashTableArray + $currentHashtableArrayNo++ + } + + $previousOutputHashTableArray +} From b2d2d266f1efa834b81e1c6d54c7c3c6666f84b4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:22:33 +0000 Subject: [PATCH 101/611] Updated/Added 'Get-TestCase', 'Join-Hashtable', 'Join-HashtableArray' and 'Join-TestCaseArray' functions in 'CommonTestCases.psm1' (now "working") --- .../Modules/TestHelpers/CommonTestCases.psm1 | 72 +++++++++++++++---- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index f2c86cd28..3f2a07080 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1,5 +1,4 @@ - <# .SYNOPSIS Returns arrays of values to be used within test cases. @@ -247,18 +246,19 @@ function Get-TestCase ) $testCaseValues = Get-TestCaseValue -ScopeName $ScopeName -TestCaseName $TestCaseName + [hashtable[]]$testCases = @() $testCaseValues | ForEach-Object { [hashtable]$testCase = @{} $testCase[$ScopeName] = $_ - return $testCase + $testCases += $testCase } + return $testCases } - function Join-Hashtable { [OutputType([hashtable[]])] @@ -267,31 +267,38 @@ function Join-Hashtable ( [Parameter(Mandatory = $true)] [hashtable] - $htold, + $Hashtable1, [Parameter(Mandatory = $true)] [hashtable] - $htnew + $Hashtable2 ) - $keys = $htold.getenumerator() | foreach-object {$_.key} + $keys = $Hashtable1.getenumerator() | foreach-object {$_.key} $keys | foreach-object { $key = $_ - if ($htnew.containskey($key)) + if ($Hashtable2.containskey($key)) { - $htold.remove($key) + $Hashtable1.remove($key) } } - $htnew = $htold + $htnew - return $htnew + $Hashtable2 = $Hashtable1 + $Hashtable2 + return $Hashtable2 } -function CartesianProduct { - param( - [hashtable[][]]$HashtableArray +function Join-HashtableArray +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [hashtable[][]] + $HashtableArray ) + #Write-Verbose "$($HashtableArray[0].Count) in HashtableArray0" + #Write-Verbose "$($HashtableArray[1].Count) in HashtableArray1" [hashtable[]]$previousOutputHashTableArray = @() @@ -300,17 +307,23 @@ function CartesianProduct { while ($currentHashtableArrayNo -lt $noOfHashtableArrays) { + #Write-Verbose $currentHashtableArrayNo [hashtable[]]$currentOutputHashTableArray = @() if($currentHashtableArrayNo -gt 0) { + #Write-Verbose "$($previousOutputHashTableArray.Count) in previousOutputHashTableArray" + $previousOutputHashTableArray | ForEach-Object { $previousOutputHashTable = $_ + #Write-Verbose $previousOutputHashTable.ObjectId $HashtableArray[$currentHashtableArrayNo] | ForEach-Object { $currentOutputHashTable = $_ + #Write-Verbose $currentOutputHashTable.Pat - $currentOutputHashTableArray += Join-Hashtable -htold $previousOutputHashTable -htnew $currentOutputHashTable + $currentOutputHashTableArray += Join-Hashtable -Hashtable1 $previousOutputHashTable -Hashtable2 $currentOutputHashTable + #Write-Verbose "$($currentOutputHashTableArray.Count) objects" } } } @@ -319,8 +332,37 @@ function CartesianProduct { } $previousOutputHashTableArray = $currentOutputHashTableArray - $currentHashtableArrayNo++ + $currentHashtableArrayNo = $currentHashtableArrayNo + 1 } $previousOutputHashTableArray } + + +function Join-TestCaseArray +{ + [CmdletBinding()] + [OutputType([hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [hashtable[][]] + [Alias('TestCases')] + $TestCaseArray, + + [Parameter()] + [switch] + $Expand + ) + + + if (!$Expand) + { + throw 'Must use "-Expand" switch in "Join-TestCaseArray"' + } + else + { + Join-HashtableArray -HashtableArray $TestCaseArray + } + +} From 4844eb6a3e73653d682cf104fbdc3d6fddbeffe5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:41:59 +0000 Subject: [PATCH 102/611] Added comments/descriptions and made minor formatting changes within 'CommonTestCases.psm1' --- .../Modules/TestHelpers/CommonTestCases.psm1 | 115 +++++++++++++----- 1 file changed, 85 insertions(+), 30 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 3f2a07080..64a2df4d9 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -259,10 +259,30 @@ function Get-TestCase } +<# + .SYNOPSIS + Combines/joins 2, input hashtables into 1 output hashtable. + + All keys and their values across both input hashtables are maintained with the + exception of keys present in both hashtables. In this instance 'Hashtable2' key + values are maintained for duplicated keys. + + .PARAMETER Hashtable1 + A hash table to be joined with another provided in the 'Hashtable2' parameter. + + This hashtables keys values are overidden by the values from 'Hashtable2' if + there are keys present in both 'Hashtable1' and 'Hashtable2'. + + .PARAMETER Hashtable2 + A hash table to be joined with another provided in the 'Hashtable1' parameter + + This hashtables keys values are maintained/kept over the values from 'Hashtable1' + if there are keys present in both 'Hashtable1' and 'Hashtable2'. +#> function Join-Hashtable { - [OutputType([hashtable[]])] [CmdletBinding()] + [OutputType([hashtable[]])] param ( [Parameter(Mandatory = $true)] @@ -288,57 +308,92 @@ function Join-Hashtable +<# + .SYNOPSIS + Combines/joins multiple, hashtable arrays into a single, output hashtable array. + + .PARAMETER HashtableArray + Contains an array of hashtable arrays to be joined into a single hashtable array. + + .PARAMETER Expand + When this switch is used, a 'Cartesean Product' of input hashtables (within each + hashtable array, within the array of hashtable arrays provided in the 'HashtableArray' + parameter). + + The output from this function will contain every combination of hashtable for every + other hashtable in each of the provided hashtable arrays. +#> function Join-HashtableArray { [CmdletBinding()] + [OutputType([hashtable[]])] param ( [Parameter(Mandatory = $true)] [hashtable[][]] - $HashtableArray + $HashtableArray, + + [Parameter()] + [switch] + $Expand ) - #Write-Verbose "$($HashtableArray[0].Count) in HashtableArray0" - #Write-Verbose "$($HashtableArray[1].Count) in HashtableArray1" - [hashtable[]]$previousOutputHashTableArray = @() + if (!$Expand) + { + throw 'Must use "-Expand" switch in "Join-HashtableArray" function (within "CommonTestCases.psm1")' + } + else + { - [int]$currentHashtableArrayNo = 0 - [int]$noOfHashtableArrays = $HashtableArray.Count + [hashtable[]]$previousOutputHashTableArray = @() - while ($currentHashtableArrayNo -lt $noOfHashtableArrays) - { - #Write-Verbose $currentHashtableArrayNo - [hashtable[]]$currentOutputHashTableArray = @() + [int]$currentHashtableArrayNo = 0 + [int]$noOfHashtableArrays = $HashtableArray.Count - if($currentHashtableArrayNo -gt 0) + while ($currentHashtableArrayNo -lt $noOfHashtableArrays) { - #Write-Verbose "$($previousOutputHashTableArray.Count) in previousOutputHashTableArray" + [hashtable[]]$currentOutputHashTableArray = @() - $previousOutputHashTableArray | ForEach-Object { - $previousOutputHashTable = $_ - #Write-Verbose $previousOutputHashTable.ObjectId + if ($currentHashtableArrayNo -gt 0) + { + $previousOutputHashTableArray | ForEach-Object { + $previousOutputHashTable = $_ - $HashtableArray[$currentHashtableArrayNo] | ForEach-Object { - $currentOutputHashTable = $_ - #Write-Verbose $currentOutputHashTable.Pat + $HashtableArray[$currentHashtableArrayNo] | ForEach-Object { + $currentOutputHashTable = $_ - $currentOutputHashTableArray += Join-Hashtable -Hashtable1 $previousOutputHashTable -Hashtable2 $currentOutputHashTable - #Write-Verbose "$($currentOutputHashTableArray.Count) objects" + $currentOutputHashTableArray += Join-Hashtable -Hashtable1 $previousOutputHashTable -Hashtable2 $currentOutputHashTable + } } } - } - else { - $currentOutputHashTableArray = $HashtableArray[$currentHashtableArrayNo] + else { + $currentOutputHashTableArray = $HashtableArray[$currentHashtableArrayNo] + } + + $previousOutputHashTableArray = $currentOutputHashTableArray + $currentHashtableArrayNo++ } - $previousOutputHashTableArray = $currentOutputHashTableArray - $currentHashtableArrayNo = $currentHashtableArrayNo + 1 + return $previousOutputHashTableArray } - - $previousOutputHashTableArray } +<# + .SYNOPSIS + Combines/joins multiple, TestCase arrays into a single, output TestCase array. + + .PARAMETER TestCaseArray + Contains an array of TestCase arrays to be joined into a single TestCase array. + + .PARAMETER Expand + When this switch is used, a 'Cartesean Product' of input hashtables (within each + hashtable array, within the array of hashtable arrays provided in the 'HashtableArray' + parameter). + + The output from this function will contain every combination of hashtable for every + other hashtable in each of the provided hashtable arrays. +#> function Join-TestCaseArray { [CmdletBinding()] @@ -358,11 +413,11 @@ function Join-TestCaseArray if (!$Expand) { - throw 'Must use "-Expand" switch in "Join-TestCaseArray"' + throw 'Must use "-Expand" switch in "Join-TestCaseArray" function (within "CommonTestCases.psm1")' } else { - Join-HashtableArray -HashtableArray $TestCaseArray + Join-HashtableArray -HashtableArray $TestCaseArray -Expand:$Expand } } From 5f80eb912ec0526abdb40fdd16e478b60d93fd65 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:43:37 +0000 Subject: [PATCH 103/611] Added import of 'CommonTestCases.psm1' to 'AzureDevOpsDsc.Common.TestInitiazation.ps1' --- .../AzureDevOpsDsc.Common.TestInitialization.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 index 1ec9cb53f..830482b9a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 @@ -4,6 +4,7 @@ #> Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') if (-not (Test-BuildCategory -Type 'Unit')) { From 6da5bc477861b6b15594c4cf6ee8e359218b012e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:55:20 +0000 Subject: [PATCH 104/611] Removed $testCaseValues.String.Empty from being part of $testCaseValues.String.Whitespace (within 'Get-TestCaseValue' function) --- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 64a2df4d9..78f968af7 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -52,16 +52,16 @@ function Get-TestCaseValue [string]::Empty ) + Whitespace = @( # NOTE: $testCaseValues.String.Empty + ' ', + ' ' + ) + Null = @( $null ) } - $testCaseValues.String.Whitespace = $testCaseValues.String.Empty + @( - ' ', - ' ' - ) - $testCaseValues.String.NullOrWhitespace = $testCaseValues.String.Null + $testCaseValues.String.Whitespace From b93bb6839c57d42eb0da7a4e8c218deeb7cdae11 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:56:12 +0000 Subject: [PATCH 105/611] Updated 'Test-AzDevOpsProjectName' function and tests to use 'Get-TestCase' helper function. --- .../Private/Test-AzDevOpsProjectName.ps1 | 2 +- .../Test-AzDevOpsProjectName.Tests.ps1 | 36 +++---------------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 index 624bdf533..8a27c3647 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -42,7 +42,7 @@ function Test-AzDevOpsProjectName } if ([System.String]::IsNullOrWhiteSpace($ProjectName) -or - ($ProjectName.Contains('%'))) + ($ProjectName.Contains('%') -or $ProjectName.Contains('*') -or $ProjectName.StartsWith(' ') -or $ProjectName.EndsWith(' '))) { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index 9ad1945af..fa3b48ca1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -7,30 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectName' -Tag 'TestAzDevOpsProjectName' { - $testCasesValidProjectNames = @( - @{ - ProjectName = 'Project 0' }, - @{ - ProjectName = 'Project1' }, - @{ - ProjectName = 'Project-2' }, - @{ - ProjectName = 'Project_3' } - ) - - $testCasesEmptyProjectNames = @( - @{ - ProjectName = $null }, - @{ - ProjectName = '' } - ) - - $testCasesInvalidProjectNames = @( - @{ - ProjectName = ' ' }, - @{ - ProjectName = '%' } - ) + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesEmptyProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Empty' + $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { @@ -84,14 +63,7 @@ InModuleScope $script:subModuleName { BeforeAll { } - $testCasesValidProjectNames = @( - @{ - ProjectName = 'Project1' }, - @{ - ProjectName = 'Project-2' }, - @{ - ProjectName = 'Project_3' } - ) + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' Context 'When called without using "-IsValid" switch' { From 866eb42a4a5e47e0c024453d1d38ba0bd47db192 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 15:56:42 +0000 Subject: [PATCH 106/611] Updated '..TestInitialization' script to force import helper modules/scripts. --- .../AzureDevOpsDsc.Common.TestInitialization.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 index 830482b9a..787378387 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 @@ -3,8 +3,8 @@ Automated unit test for helper functions in module AzureDevOpsDsc.Common. #> -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -Force +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') -Force if (-not (Test-BuildCategory -Type 'Unit')) { From 49a201d5a085da77bf9ae321044d755dd52ee156 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:01:36 +0000 Subject: [PATCH 107/611] Updated 'Test-AzDevOpsOrganizationName' function and tests to use 'Get-TestCase' helper function. --- .../Private/Test-AzDevOpsOrganizationName.ps1 | 2 +- .../Test-AzDevOpsOrganizationName.Tests.ps1 | 36 +++---------------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index f59c57534..7ad2f3f72 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -42,7 +42,7 @@ function Test-AzDevOpsOrganizationName } if ([System.String]::IsNullOrWhiteSpace($OrganizationName) -or - ($OrganizationName.Contains(' ') -or $OrganizationName.Contains('%'))) + ($OrganizationName.Contains(' ') -or $OrganizationName.Contains('%') -or $OrganizationName.Contains('*') -or $OrganizationName.StartsWith(' ') -or $OrganizationName.EndsWith(' '))) { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index 9e435bc73..c524060d3 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -7,30 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOrganizationName' -Tag 'TestAzDevOpsOrganizationName' { - $testCasesValidOrganizationNames = @( - @{ - OrganizationName = 'Project1' }, - @{ - OrganizationName = 'Project-2' }, - @{ - OrganizationName = 'Project_3' } - ) - - $testCasesEmptyOrganizationNames = @( - @{ - OrganizationName = $null }, - @{ - OrganizationName = '' } - ) - - $testCasesInvalidOrganizationNames = @( - @{ - OrganizationName = ' ' }, - @{ - OrganizationName = '%' }, - @{ - OrganizationName = 'Organization 0' } - ) + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' + $testCasesEmptyOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Empty' + $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { @@ -84,14 +63,7 @@ InModuleScope $script:subModuleName { BeforeAll { } - $testCasesValidOrganizationNames = @( - @{ - OrganizationName = 'Project1' }, - @{ - OrganizationName = 'Project-2' }, - @{ - OrganizationName = 'Project_3' } - ) + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' Context 'When called without using "-IsValid" switch' { From 8ea707682479ca5cfefe3e3bcfea7d6d5fb88147 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:03:37 +0000 Subject: [PATCH 108/611] Updated 'Test-AzDevOpsProjectId' tests to make use of 'Get-TestCase' helper function. --- .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 31 ++----------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index 2f5ab9e22..66c10170b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -7,34 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectId' -Tag 'TestAzDevOpsProjectId' { - $testCasesValidProjectIds = @( - @{ - ProjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, - @{ - ProjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, - @{ - ProjectId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } - ) - - $testCasesEmptyProjectIds = @( - @{ - ProjectId = $null }, - @{ - ProjectId = '' } - ) - - $testCasesInvalidProjectIds = @( - @{ - ProjectId = ' ' }, - @{ - ProjectId = 'a 1' }, - @{ - ProjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, - @{ - ProjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } - @{ - ProjectId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } - ) + $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $testCasesEmptyProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Empty' + $testCasesInvalidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { From 9cd4c6c944dd7b2003947b2e602b14b07697dda4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:06:16 +0000 Subject: [PATCH 109/611] Updated 'Test-AzDevOpsOperationId' and 'Test-AzDevOpsPat' tests to use 'Get-TestCase' --- .../Test-AzDevOpsOperationId.Tests.ps1 | 31 ++----------------- .../Private/Test-AzDevOpsPat.Tests.ps1 | 29 ++--------------- 2 files changed, 6 insertions(+), 54 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index f4143cf36..f6ea161a1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -7,34 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOperationId' -Tag 'TestAzDevOpsOperationId' { - $testCasesValidOperationIds = @( - @{ - OperationId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, - @{ - OperationId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, - @{ - OperationId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } - ) - - $testCasesEmptyOperationIds = @( - @{ - OperationId = $null }, - @{ - OperationId = '' } - ) - - $testCasesInvalidOperationIds = @( - @{ - OperationId = ' ' }, - @{ - OperationId = 'a 1' }, - @{ - OperationId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, - @{ - OperationId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } - @{ - OperationId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } - ) + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesEmptyOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Empty' + $testCasesInvalidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index d62eb7240..18a867523 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -7,32 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsPat' -Tag 'TestAzDevOpsPat' { - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) - - $testCasesEmptyPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - ) - - $testCasesInvalidPats = @( - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { From 2f0006402b3391374286b1d9ea192b00c591909a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:13:01 +0000 Subject: [PATCH 110/611] Updated tests for 'Test-AzDevOpsApiObjectName' and 'Test-AzDevOpsApiUri' to use 'Get-TestCase' helper function --- .../Test-AzDevOpsApiObjectName.Tests.ps1 | 27 ++--------- .../Private/Test-AzDevOpsApiUri.Tests.ps1 | 47 ++----------------- .../Modules/TestHelpers/CommonTestCases.psm1 | 27 ++++++++++- 3 files changed, 31 insertions(+), 70 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 index d12b0b41a..bd7291caa 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 @@ -7,30 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectName' -Tag 'TestAzDevOpsApiObjectName' { - $testCasesValidObjectNames = @( - @{ - ObjectName = 'Operation' }, - @{ - ObjectName = 'Project' } - ) - - $testCasesEmptyObjectNames = @( - @{ - ObjectName = $null }, - @{ - ObjectName = '' } - ) - - $testCasesInvalidObjectNames = @( - @{ - ObjectName = ' ' }, - @{ - ObjectName = 'a 1' }, - @{ - ObjectName = 'NonObject' }, - @{ - ObjectName = 'SomeOtherInvalidObject' } - ) + $testCasesValidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' + $testCasesEmptyObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Empty' + $testCasesInvalidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Invalid' Context 'When validating, valid "ObjectName" test cases' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index d50112f67..86272662b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -7,50 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiUri' -Tag 'TestAzDevOpsApiUri' { - $testCasesValidApiUris = @( - @{ - ApiUri = 'http://someuri.api/_apis/' }, - @{ - ApiUri = 'https://someuri.api/_apis/' } - ) - - $testCasesEmptyApiUris = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidApiUris = @( - @{ - ApiUri = ' ' }, - @{ - ApiUri = 'a 1' }, - - # Incorrect prefixes - @{ - ApiUri = 'ftp://someuri.api/_apis/' }, - @{ - ApiUri = 'someuri.api/_apis/' }, - - # Missing trailing '/' (after http(s)) - @{ - ApiUri = 'http:/someuri.api/_apis/' }, - @{ - ApiUri = 'https:/someuri.api/_apis/' }, - - # Missing trailing '/' - @{ - ApiUri = 'http://someuri.api/_apis' }, - @{ - ApiUri = 'https://someuri.api/_apis' }, - - # Missing trailing '/_apis/' - @{ - ApiUri = 'http://someuri.api/' }, - @{ - ApiUri = 'https://someuri.api/' } - ) + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 78f968af7..8238bbd43 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -18,7 +18,7 @@ function Get-TestCaseValue ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','Pat',` - 'ProjectName','OrganizationName',` + 'ObjectName','ProjectName','OrganizationName',` 'ObjectId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -180,6 +180,29 @@ function Get-TestCaseValue } + # ObjectName + $testCaseValues.ObjectName = @{ + + Valid = @( + 'Operation', + 'Project' + ) + + Invalid = @( + 'NonObject', + 'SomeOtherInvalidObject', + 'Some Object', # Contains space + ' Some Object', # Leading space + 'Some Object ' # Trailing space + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # ObjectId $testCaseValues.ObjectId = @{ @@ -234,7 +257,7 @@ function Get-TestCase ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','Pat',` - 'ProjectName','OrganizationName',` + 'ObjectName','ProjectName','OrganizationName',` 'ObjectId','OperationId','ProjectId')] [System.String] $ScopeName, From 16bf2659f749c6c97b9bccd13875312c7049e2f1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:18:16 +0000 Subject: [PATCH 111/611] Updated tests for 'Get-AzDevOpsApiHttpRequestHeader', 'Get-AzDevOpsApiObjectName' and 'Test-AzDevOpsApiObjectId' to use 'Get-TestCase' helper function. --- ...Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 36 ++++++++----------- .../Get-AzDevOpsApiObjectName.Tests.ps1 | 7 +--- .../Test-AzDevOpsApiObjectId.Tests.ps1 | 31 ++-------------- 3 files changed, 18 insertions(+), 56 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 8752c0bba..47b14a405 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -12,14 +12,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid "Pat" parameter' { - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' It 'Should not throw - ""' -TestCases $testCasesValidPats { param ([string]$Pat) @@ -55,20 +48,7 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "Pat" parameter' { - $testCasesInvalidPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' It "Should throw - ''" -TestCases $testCasesInvalidPats { param ([string]$Pat) @@ -77,6 +57,18 @@ InModuleScope $script:subModuleName { } } + + Context 'When called with empty "Pat" parameter' { + + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + + It "Should throw - ''" -TestCases $testCasesEmptyPats { + param ([string]$Pat) + + { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Throw + + } + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 index 29bfcce4a..961caf722 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 @@ -12,12 +12,7 @@ InModuleScope $script:subModuleName { BeforeAll { - $testCasesValidObjectName = @( - @{ - ObjectName = 'Operation'}, - @{ - ObjectName = 'Project'} - ) + $testCasesValidObjectName = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' } It 'Should not throw' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 index 847305853..899fe747a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 @@ -7,34 +7,9 @@ InModuleScope $script:subModuleName { Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectId' -Tag 'TestAzDevOpsApiObjectId' { - $testCasesValidObjectIds = @( - @{ - ObjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3' }, - @{ - ObjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0' }, - @{ - ObjectId = '4fe84ba8-d9f9-4880-ad5e-e18c99a1b2b4' } - ) - - $testCasesEmptyObjectIds = @( - @{ - ObjectId = $null }, - @{ - ObjectId = '' } - ) - - $testCasesInvalidObjectIds = @( - @{ - ObjectId = ' ' }, - @{ - ObjectId = 'a 1' }, - @{ - ObjectId = 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc' }, - @{ - ObjectId = '74cd62c6-54b0-4f5f-986f-b4eea2c4c1d0a' } - @{ - ObjectId = '74cd62c6554b014f5fa986fcb4eea2c4c1d0' } - ) + $testCasesValidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Valid' + $testCasesEmptyObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Empty' + $testCasesInvalidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { From ffd3866f899d7f08dd0a31c3ad8e5f25f932dfb6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:21:57 +0000 Subject: [PATCH 112/611] Updated tests for 'Get-AzDevOpsServicesUri' and 'Get-AzDevOpsServicesApiUri' --- .../Get-AzDevOpsServicesApiUri.Tests.ps1 | 22 ++----------------- .../Public/Get-AzDevOpsServicesUri.Tests.ps1 | 22 ++----------------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 index 3c348e33e..5c297be24 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 @@ -12,14 +12,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid "Organisation" parameter' { - $testCasesValidOrganizationNames = @( - @{ - OrganizationName = 'Organisation1' }, - @{ - OrganizationName = 'Organisation-2' }, - @{ - OrganizationName = 'Organisation_3' } - ) + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { param ([string]$OrganizationName) @@ -60,18 +53,7 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "OrganizationName" parameter' { - $testCasesInvalidOrganizationNames = @( - @{ - OrganizationName = $null }, - @{ - OrganizationName = '' }, - @{ - OrganizationName = ' ' }, - @{ - OrganizationName = '%' }, - @{ - OrganizationName = 'Organization 0' } - ) + $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { param ([string]$OrganizationName) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 index 247d32869..fd96bc1cf 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -12,14 +12,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid "Organisation" parameter' { - $testCasesValidOrganizationNames = @( - @{ - OrganizationName = 'Organisation1' }, - @{ - OrganizationName = 'Organisation-2' }, - @{ - OrganizationName = 'Organisation_3' } - ) + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { param ([string]$OrganizationName) @@ -44,18 +37,7 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "OrganizationName" parameter' { - $testCasesInvalidOrganizationNames = @( - @{ - OrganizationName = $null }, - @{ - OrganizationName = '' }, - @{ - OrganizationName = ' ' }, - @{ - OrganizationName = '%' }, - @{ - OrganizationName = 'Organization 0' } - ) + $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { param ([string]$OrganizationName) From 31f49c849950f81e21e1d0edfb540710d7e776bb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:29:06 +0000 Subject: [PATCH 113/611] Updated tests for 'Get-AzDevOpsOperation' to support 'Get-TestCase' helper function. --- .../Public/Get-AzDevOpsOperation.Tests.ps1 | 130 ++---------------- 1 file changed, 15 insertions(+), 115 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 index 8ad02d08b..befbdacb0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -10,68 +10,22 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { - return @( - @{ - id='8d4bff8d-6169-45cf-b085-fe12ad67e76b';}, - @{ - id='485ab935-7de3-4894-ba6f-ed418d4eda92';} - ) + return $(Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid') | + ForEach-Object { + @{ + id = $_.OperationId + } + } } } - $testCasesValidApiUris = @( - @{ - ApiUri = 'http://someuri.api/_apis/' }, - @{ - ApiUri = 'https://someuri.api/_apis/' } - ) + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) - - $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { - - $apiUri = $_.ApiUri - $testCasesValidPats | ForEach-Object { - - $pat = $_.Pat - return @{ - ApiUri = $apiUri - Pat = $pat - } - } - - } - - $testCasesValidOperationIds = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' - @{ - OperationId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, - @{ - OperationId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } - ) - - $testCasesValidApiUriPatOperationIdCombined = $testCasesValidApiUriPatCombined | ForEach-Object { - - $apiUri = $_.ApiUri - $pat = $_.Pat - $testCasesValidOperationIds | ForEach-Object { - - $OperationId = $_.OperationId - return @{ - ApiUri = $apiUri - Pat = $pat - OperationId = $OperationId - } - } - - } + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesValidApiUriPatOperationIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidOperationIds Context 'When called with no "OperationId" parameter' { @@ -143,27 +97,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "Pat" parameter' { - $testCasesEmptyPats = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' Context 'When called without "ApiUri" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidPats { @@ -197,43 +132,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "ApiUri" parameter' { - $testCasesEmptyApiUris = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidApiUris = @( - @{ - ApiUri = ' ' }, - @{ - ApiUri = 'a 1' }, - - # Incorrect prefixes - @{ - ApiUri = 'ftp://someuri.api/_apis/' }, - @{ - ApiUri = 'someuri.api/_apis/' }, - - # Missing trailing '/' (after http(s)) - @{ - ApiUri = 'http:/someuri.api/_apis/' }, - @{ - ApiUri = 'https:/someuri.api/_apis/' }, - - # Missing trailing '/' - @{ - ApiUri = 'http://someuri.api/_apis' }, - @{ - ApiUri = 'https://someuri.api/_apis' }, - - # Missing trailing '/_apis/' - @{ - ApiUri = 'http://someuri.api/' }, - @{ - ApiUri = 'https://someuri.api/' } - ) + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' Context 'When called without "Pat" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidApiUris { From cc40a2e95a88036bc18f6391e4aeba8794b2980f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 16:38:12 +0000 Subject: [PATCH 114/611] Updated tests for 'Get-AzDevOpsProject' to use 'Get-TestCase' helper function --- .../Public/Get-AzDevOpsProject.Tests.ps1 | 156 +++--------------- 1 file changed, 19 insertions(+), 137 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index 221eebcfe..c7812fc97 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -10,94 +10,30 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { - return @( - @{ - id='8d4bff8d-6169-45cf-b085-fe12ad67e76b'; - name='Mock Project Name 1'; }, - @{ - id='485ab935-7de3-4894-ba6f-ed418d4eda92'; - name='Mock Project Name 2'; } - ) - } - } - - - $testCasesValidApiUris = @( - @{ - ApiUri = 'http://someuri.api/_apis/' }, - @{ - ApiUri = 'https://someuri.api/_apis/' } - ) - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) + $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames - $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { - - $apiUri = $_.ApiUri - $testCasesValidPats | ForEach-Object { - - $pat = $_.Pat - return @{ - ApiUri = $apiUri - Pat = $pat - } - } - - } - - - $testCasesValidProjectNames = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' - @{ - ProjectName = 'Mock Project Name 1' }, - @{ - ProjectName = 'Mock Project Name 2' } - ) - - $testCasesValidProjectIds = @( # Note: Same as mock for 'Get-AzDevOpsApiObject' - @{ - ProjectId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, - @{ - ProjectId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } - ) - - $testCasesValidApiUriPatProjectNameCombined = $testCasesValidApiUriPatCombined | ForEach-Object { - - $apiUri = $_.ApiUri - $pat = $_.Pat - $testCasesValidProjectNames | ForEach-Object { - - $projectName = $_.ProjectName - return @{ - ApiUri = $apiUri - Pat = $pat - ProjectName = $projectName + return $mockProjects | ForEach-Object { + @{ + id = $_.ProjectId + name = $_.ProjectName + } } } - } - $testCasesValidApiUriPatProjectIdCombined = $testCasesValidApiUriPatCombined | ForEach-Object { - $apiUri = $_.ApiUri - $pat = $_.Pat - $testCasesValidProjectIds | ForEach-Object { + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - $projectId = $_.ProjectId - return @{ - ApiUri = $apiUri - Pat = $pat - ProjectId = $projectId - } - } + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectNames - } + $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectIds Context 'When called with no "ProjectId" parameter and no "ProjectName" parameter' { @@ -206,27 +142,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "Pat" parameter' { - $testCasesEmptyPats = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' Context 'When called without "ApiUri" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidPats { @@ -260,43 +177,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "ApiUri" parameter' { - $testCasesEmptyApiUris = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidApiUris = @( - @{ - ApiUri = ' ' }, - @{ - ApiUri = 'a 1' }, - - # Incorrect prefixes - @{ - ApiUri = 'ftp://someuri.api/_apis/' }, - @{ - ApiUri = 'someuri.api/_apis/' }, - - # Missing trailing '/' (after http(s)) - @{ - ApiUri = 'http:/someuri.api/_apis/' }, - @{ - ApiUri = 'https:/someuri.api/_apis/' }, - - # Missing trailing '/' - @{ - ApiUri = 'http://someuri.api/_apis' }, - @{ - ApiUri = 'https://someuri.api/_apis' }, - - # Missing trailing '/_apis/' - @{ - ApiUri = 'http://someuri.api/' }, - @{ - ApiUri = 'https://someuri.api/' } - ) + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' Context 'When called without "Pat" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidApiUris { From 13eba7cd424448a09fa7d94a74175e5f8028d587 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 2 Nov 2020 18:01:17 +0000 Subject: [PATCH 115/611] Updated tests for 'Get-AzDevOpsApiObject' to use 'Get-TestCase' helper method --- .../Private/Get-AzDevOpsApiObject.Tests.ps1 | 207 ++++-------------- 1 file changed, 47 insertions(+), 160 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 index 88687e12e..938c79329 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 @@ -9,121 +9,62 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { - Mock Invoke-RestMethod { - $response = @' + + [string]$nonPresentObjectId = '114bff8d-6169-45cf-b085-fe121267e7aa' + + Mock Invoke-RestMethod -Verifiable { + + $response = @" { "count": 2, "value": [ - { - "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", - "name": "Test Project 1", - "description": "Test Project Description 1", - "url": "https://dev.azure.com/fabrikam/_apis/projects/8d4bff8d-6169-45cf-b085-fe12ad67e76b", - "state": "wellFormed" - }, - { - "id": "485ab935-7de3-4894-ba6f-ed418d4eda92", - "name": "Test Project 2", - "description": "Test Project Description 2", - "url": "https://dev.azure.com/fabrikam/_apis/projects/485ab935-7de3-4894-ba6f-ed418d4eda92", - "state": "wellFormed" - } + { + "id": "$ObjectId", + "name": "Test Project 1", + "description": "Test Project Description 1", + "url": "https://dev.azure.com/fabrikam/_apis/projects/$ObjectId", + "state": "wellFormed" + }, + { + "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "name": "Test Project 2", + "description": "Test Project Description 2", + "url": "https://dev.azure.com/fabrikam/_apis/projects/8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "state": "wellFormed" + } ] - } -'@ | ConvertFrom-Json - - if ([string]::IsNullOrWhiteSpace($ObjectId)) - { - $response = $response.Value - } - else { - $response = $response.Value | - Where-Object { $_.id -eq $ObjectId } } +"@ | ConvertFrom-Json - return $response - } - } - - $testCasesValidApiUris = @( - @{ - ApiUri = 'http://someuri.api/_apis/' }, - @{ - ApiUri = 'https://someuri.api/_apis/' } - ) - - $testCasesValidPats = @( - @{ - Pat = '1234567890123456789012345678901234567890123456789012' }, - @{ - Pat = '0987654321098765432109876543210987654321098765432109' }, - @{ - Pat = '0913uhuh3wedwndfwsni2242msfwneu254uhufs009oosfmikm34' } - ) - - $testCasesValidApiUriPatCombined = $testCasesValidApiUris | ForEach-Object { - - $apiUri = $_.ApiUri - $testCasesValidPats | ForEach-Object { - - $pat = $_.Pat - return @{ - ApiUri = $apiUri - Pat = $pat + if (![string]::IsNullOrWhiteSpace($ObjectId)) + { + $response = $response.value | + Where-Object { $_.id -eq $ObjectId} | + Where-Object { $_.id -ne $nonPresentObjectId} } - } - - } - - - $testCasesValidObjectNames = @( - @{ - ObjectName = 'Operation' }, - @{ - ObjectName = 'Project' } - ) - - $testCasesValidObjectIds = @( # Note: Same as mock for 'Invoke-RestMethod' - @{ - ObjectId = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' }, - @{ - ObjectId = '485ab935-7de3-4894-ba6f-ed418d4eda92' } - ) - $testCasesValidApiUriPatObjectNameCombined = $testCasesValidApiUriPatCombined | ForEach-Object { + #if ([string]::IsNullOrWhiteSpace($ObjectId)) + #{ + # $response = $response.Value + #} + #else { + # $response = $response.Value | + # Where-Object { $_.id -eq $ObjectId } + #} - $apiUri = $_.ApiUri - $pat = $_.Pat - $testCasesValidObjectNames | ForEach-Object { - - $objectName = $_.ObjectName - return @{ - ApiUri = $apiUri - Pat = $pat - ObjectName = $objectName - } + return $response } - } - $testCasesValidApiUriPatObjectNameObjectIdCombined = $testCasesValidApiUriPatObjectNameCombined | ForEach-Object { - - $apiUri = $_.ApiUri - $pat = $_.Pat - $objectName = $_.ObjectName - $testCasesValidObjectIds | ForEach-Object { - - $objectId = $_.ObjectId - return @{ - ApiUri = $apiUri - Pat = $pat - ObjectName = $objectName - ObjectId = $objectId - } - } + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - } + $testCasesValidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatObjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidObjectNames + $testCasesValidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Valid' + $testCasesValidApiUriPatObjectNameObjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatObjectNameCombined, $testCasesValidObjectIds Context 'When called with no "ObjectId" parameter' { @@ -187,7 +128,7 @@ InModuleScope $script:subModuleName { It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) - $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ObjectId" + $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $nonPresentObjectId # Non-present "ObjectId" $result | Should -Be $null } } @@ -204,27 +145,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "Pat" parameter' { - $testCasesEmptyPats = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidPats = @( - @{ - Pat = $null }, - @{ - Pat = '' } - @{ - Pat = ' ' }, - @{ - Pat = 'a 1' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm3' }, - @{ - Pat = '0913uhuh3wedwnd4wsni2242msfwn4u254uhufs009oosfmikm34x' } - ) + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' Context 'When called without "ApiUri" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidPats { @@ -258,43 +180,8 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "ApiUri" parameter' { - $testCasesEmptyApiUris = @( - @{ - ApiUri = $null }, - @{ - ApiUri = '' } - ) - - $testCasesInvalidApiUris = @( - @{ - ApiUri = ' ' }, - @{ - ApiUri = 'a 1' }, - - # Incorrect prefixes - @{ - ApiUri = 'ftp://someuri.api/_apis/' }, - @{ - ApiUri = 'someuri.api/_apis/' }, - - # Missing trailing '/' (after http(s)) - @{ - ApiUri = 'http:/someuri.api/_apis/' }, - @{ - ApiUri = 'https:/someuri.api/_apis/' }, - - # Missing trailing '/' - @{ - ApiUri = 'http://someuri.api/_apis' }, - @{ - ApiUri = 'https://someuri.api/_apis' }, - - # Missing trailing '/_apis/' - @{ - ApiUri = 'http://someuri.api/' }, - @{ - ApiUri = 'https://someuri.api/' } - ) + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' Context 'When called without "Pat" parameter' { It "Should throw - ''" -TestCases $testCasesInvalidApiUris { From 7572a77a58a8525ef3597c20a2e9554456ecf4ce Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 08:11:32 +0000 Subject: [PATCH 116/611] Renamed $apiHttpRequestHeader variable in 'Get-AzDevOpsApiHttpRequestHeader' function --- .../Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 index 29c11d788..4047493b0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 @@ -26,11 +26,11 @@ function Get-AzDevOpsApiHttpRequestHeader $Pat ) - [Hashtable]$apiHeader = @{ + [Hashtable]$apiHttpRequestHeader = @{ Authorization = 'Basic ' + [Convert]::ToBase64String( [Text.Encoding]::ASCII.GetBytes(":$Pat")) } - return $apiHeader + return $apiHttpRequestHeader } From a5af991c02bf8d4afd7b330b0514da50a19ba704 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 08:27:51 +0000 Subject: [PATCH 117/611] Added 'Test-AzDevOpsApiVersion' function, tests and test cases --- .../Private/Test-AzDevOpsApiVersion.ps1 | 55 +++++++++++ .../Private/Test-AzDevOpsApiVersion.Tests.ps1 | 98 +++++++++++++++++++ .../Modules/TestHelpers/CommonTestCases.psm1 | 35 ++++++- 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 new file mode 100644 index 000000000..eaaa592f4 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 @@ -0,0 +1,55 @@ +<# + .SYNOPSIS + Peforms test on a provided version of the Azure DevOps API to provide a + boolean ($true or $false) return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ApiVersion + The version of the Azure DevOps API to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format/validity of the URI of the Azure DevOps + API rather than the existence/presence of the version itself. Unsupported versions + will also return $false. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsApiVersion -ApiVersion 'YourApiVersionHere' -IsValid + + Returns $true if the version of the Azure DevOps API provided is valid/supported. + Returns $false if it is not. +#> +function Test-AzDevOpsApiVersion +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ApiVersion, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + $supportedApiVersions = @( + '6.0' + ) + + if (!$supportedApiVersions.Contains($ApiVersion)) + { + return $false + } + + return $true +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 new file mode 100644 index 000000000..70d0b34aa --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -0,0 +1,98 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiVersion' -Tag 'TestAzDevOpsApiVersion' { + + $testCasesValidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' + $testCasesEmptyApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Empty' + $testCasesInvalidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ApiVersion" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidApiVersions { + param ([string]$ApiVersion) + + $result = Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ApiVersion" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidApiVersions { + param ([string]$ApiVersion) + + $result = Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ApiVersion" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ApiVersion" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidApiVersions { + param ([string]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 8238bbd43..bb85db3dc 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -17,7 +17,7 @@ function Get-TestCaseValue param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','Pat',` + [ValidateSet('String','ApiUri','ApiVersion','Pat',` 'ObjectName','ProjectName','OrganizationName',` 'ObjectId','OperationId','ProjectId')] [System.String] @@ -103,6 +103,37 @@ function Get-TestCaseValue } + # ApiVersion + $testCaseValues.ApiVersion = @{ + + Valid = @( + '6.0' + ) + + Invalid = @( + + # API versions (currently) unsupported by this module + '4.1', + '5.0', + '5.1', + '6.1' + + # Random versions + '1', + '1 1', + '1a', + 'a', + 'a.a' + + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # Pat $testCaseValues.Pat = @{ @@ -256,7 +287,7 @@ function Get-TestCase param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','Pat',` + [ValidateSet('String','ApiUri','ApiVersion','Pat',` 'ObjectName','ProjectName','OrganizationName',` 'ObjectId','OperationId','ProjectId')] [System.String] From d10b18d68f26d758e7c7abd786b41e0c096179b4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 08:49:31 +0000 Subject: [PATCH 118/611] Added 'Get-AzDevOpsApiVersion' function and tests --- .../Private/Get-AzDevOpsApiVersion.ps1 | 41 +++++++++++ .../Private/Get-AzDevOpsApiVersion.Tests.ps1 | 72 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 new file mode 100644 index 000000000..7c750c1f0 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 @@ -0,0 +1,41 @@ +<# + .SYNOPSIS + Returns an array of all the supported, Azure DevOps API, versions that can used/managed + within this module. + + .EXAMPLE + Get-AzDevOpsApiVersion + + Returns all the names of the objects that can be used/managed in the Azure DevOps API. +#> +function Get-AzDevOpsApiVersion +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Default + ) + + [string]$defaultApiVersion = '6.0' + + [string[]]$apiVersions = @( + + #'4.0', # Not supported + #'5.0', # Not supported + #'5.1', # Not supported + '6.0' + #'6.1', # Not supported + + ) + + if ($Default) + { + $apiVersions = $apiVersions | + Where-Object { $_ -eq $defaultApiVersion} + } + + return $apiVersions +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 new file mode 100644 index 000000000..49a6eaeff --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -0,0 +1,72 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiVersion' -Tag 'GetAzDevOpsApiVersion' { + + Context 'When called with valid parameters' { + + Context 'When called without "-Default" switch' { + + BeforeAll { + + $testCasesValidApiVersion = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' + } + + It 'Should not throw' { + param () + + { Get-AzDevOpsApiVersion } | Should -Not -Throw + } + + It 'Should return "object[]" or "string"' { + param () + + $result = Get-AzDevOpsApiVersion + $result.GetType() | Should -BeIn @(@('ApiVersion1','ApiVersion2').GetType(),'ApiVersion1'.GetType()) + } + + It 'Should return all objects that are present in $testCasesValidApiVersion variable'{ + param () + + [string[]]$result = Get-AzDevOpsApiVersion + $result.Count | Should -Be $($testCasesValidApiVersion.Count) + } + } + + Context 'When called with "-Default" switch' { + + BeforeAll { + $defaultApiVersion = '6.0' # Note: This will need changing if the API version supported is updated + $testCasesValidApiVersion = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' + } + + It 'Should not throw' { + param () + + { Get-AzDevOpsApiVersion -Default } | Should -Not -Throw + } + + It 'Should return "string"' { + param () + + [string]$result = Get-AzDevOpsApiVersion -Default + $result.GetType() | Should -Be @('ApiVersion1'.GetType()) + } + + It "Should return the 'default' version ($defaultApiVersion)"{ + param () + + [string]$result = Get-AzDevOpsApiVersion -Default + $result | Should -Be $defaultApiVersion + } + } + + } + + } + +} From 62b86d3580e8cf3f1216960da01adb1f7491bb7b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 08:51:15 +0000 Subject: [PATCH 119/611] Added $ApiVersion parameter into 'Get-AzDevOpsApiObject' function --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index f563a290f..bd3c1d80f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -60,7 +60,12 @@ function Get-AzDevOpsApiObject [Parameter()] [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] [System.String] - $ObjectId + $ObjectId, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default) ) # Remove any $ObjectId if using a wildcard character @@ -74,7 +79,7 @@ function Get-AzDevOpsApiObject $objectNamePluralUriString = $ObjectName.ToLower() + "s" # TODO: Need to get this from input parameter? - $apiVersionUriParameter = 'api-version=5.1' + $apiVersionUriParameter = "api-version=$ApiVersion" # TODO: Need to generate this from a function $apiObjectUri = $ApiUri + "/$objectNamePluralUriString" From bd30ab1442284f00ebd5945fb232485399264676 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 11:10:45 +0000 Subject: [PATCH 120/611] Amended order of $ApiVersion parameter in 'Get-AzDevOpsApiObject' function. --- .../Functions/Private/Get-AzDevOpsApiObject.ps1 | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 index bd3c1d80f..9b1fb59fd 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 @@ -10,6 +10,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned @@ -46,6 +49,11 @@ function Get-AzDevOpsApiObject [System.String] $ApiUri, + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + [Parameter(Mandatory=$true)] [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] @@ -60,12 +68,7 @@ function Get-AzDevOpsApiObject [Parameter()] [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] [System.String] - $ObjectId, - - [Parameter()] - [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] - [System.String] - $ApiVersion = $(Get-AzDevOpsApiVersion -Default) + $ObjectId ) # Remove any $ObjectId if using a wildcard character From e3b62bd006157dcbc1466c44a5bb960ecbf0599d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 11:13:09 +0000 Subject: [PATCH 121/611] Added initial 'Get-AzDevOpsApiObjectUri' function. --- .../Private/Get-AzDevOpsApiObjectUri.ps1 | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 new file mode 100644 index 000000000..a7f9f9caf --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 @@ -0,0 +1,63 @@ +<# + .SYNOPSIS + Returns a full URI for the API object given the parameter values provided. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + + .PARAMETER ObjectName + The name of the object being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') + + .PARAMETER ObjectId + The 'id' of the object type being obtained. For example, if the 'ObjectName' parameter value + was 'Project', the 'ObjectId' value would be assumed to be the 'id' of a 'Project'. + + .EXAMPLE + Get-AzDevOpsApiObjectUri -ApiUri 'YourApiUriHere' -ObjectName 'Project' + + Returns a URI to obtain all 'Project' objects from the Azure DevOps API related to the Organization/ApiUri + value provided. + + .EXAMPLE + Get-AzDevOpsApiObjectUri -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -ObjectId 'YourProjectId' + + Returns a URI to obtain the 'Project' object from the Azure DevOps API related to the Organization/ApiUri + value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). +#> +function Get-AzDevOpsApiObjectUri +{ + [CmdletBinding()] + [OutputType([string])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectName $_ -IsValid })] + [System.String] + $ObjectName, + + [Parameter()] + [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] + [System.String] + $ObjectId + ) + + [string]$apiObjectUri = $ApiUri + + return $apiObjectUri +} From c35f651743d4f0b17ffcb3de45465546ff989581 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 12:43:37 +0000 Subject: [PATCH 122/611] Updated 'AzureDevOpsDsc.Common' module directory structure to seperate out related functionality into subdirectories. Also updated tests and '.psm1' file to cater for this. --- .../Get-AzDevOpsApiHttpRequestHeader.ps1 | 0 .../Private/Get-AzDevOpsApiObject.ps1 | 0 .../Private/Get-AzDevOpsApiObjectName.ps1 | 0 .../Private/Get-AzDevOpsApiObjectUri.ps1 | 0 .../Private/Get-AzDevOpsApiVersion.ps1 | 0 .../Private/New-AzDevOpsApiObject.ps1 | 0 .../Private/Test-AzDevOpsApiObjectId.ps1 | 0 .../Private/Test-AzDevOpsApiObjectName.ps1 | 0 .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 0 .../Private/Test-AzDevOpsApiVersion.ps1 | 0 .../AzureDevOpsDsc.Common.psm1 | 24 ++++++++++++++++--- .../Private/Test-AzDevOpsCredential.ps1 | 0 .../Public/New-AzDevOpsConnection.ps1 | 0 .../Private/Test-AzDevOpsOperationId.ps1 | 0 .../Private/Test-AzDevOpsOrganizationName.ps1 | 0 .../Functions/Private/Test-AzDevOpsPat.ps1 | 0 .../Private/Test-AzDevOpsProjectId.ps1 | 0 .../Private/Test-AzDevOpsProjectName.ps1 | 0 .../Private/Wait-AzDevOpsOperation.ps1 | 0 .../Public/Get-AzDevOpsOperation.ps1 | 0 .../Functions/Public/Get-AzDevOpsProject.ps1 | 0 .../Functions/Public/New-AzDevOpsProject.ps1 | 0 .../Public/Test-AzDevOpsOperation.ps1 | 0 .../Public/Get-AzDevOpsServicesApiUri.ps1 | 0 .../Public/Get-AzDevOpsServicesUri.ps1 | 0 ...Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 2 +- .../Private/Get-AzDevOpsApiObject.Tests.ps1 | 2 +- .../Get-AzDevOpsApiObjectName.Tests.ps1 | 2 +- .../Private/Get-AzDevOpsApiVersion.Tests.ps1 | 2 +- .../Test-AzDevOpsApiObjectId.Tests.ps1 | 2 +- .../Test-AzDevOpsApiObjectName.Tests.ps1 | 2 +- .../Private/Test-AzDevOpsApiUri.Tests.ps1 | 2 +- .../Private/Test-AzDevOpsApiVersion.Tests.ps1 | 2 +- .../_TODO_New-AzDevOpsApiObject.Tests.ps1 | 0 .../_TODO_New-AzDevOpsCredential.Tests.ps1 | 0 .../_TODO_New-AzDevOpsConnection.Tests.ps1 | 0 .../Test-AzDevOpsOperationId.Tests.ps1 | 2 +- .../Test-AzDevOpsOrganizationName.Tests.ps1 | 2 +- .../Private/Test-AzDevOpsPat.Tests.ps1 | 2 +- .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 2 +- .../Test-AzDevOpsProjectName.Tests.ps1 | 2 +- .../Private/_TODO_Wait-AzDevOpsOperation.ps1 | 0 .../Public/Get-AzDevOpsOperation.Tests.ps1 | 2 +- .../Public/Get-AzDevOpsProject.Tests.ps1 | 2 +- .../_TODO_New-AzDevOpsProject.Tests copy.ps1 | 0 .../_TODO_Test-AzDevOpsOperation.Tests.ps1 | 0 .../Get-AzDevOpsServicesApiUri.Tests.ps1 | 2 +- .../Public/Get-AzDevOpsServicesUri.Tests.ps1 | 2 +- 48 files changed, 38 insertions(+), 20 deletions(-) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiObject.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiObjectName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiVersion.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/New-AzDevOpsApiObject.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiObjectId.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiObjectName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiUri.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiVersion.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Connection}/Functions/Private/Test-AzDevOpsCredential.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Connection}/Functions/Public/New-AzDevOpsConnection.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsOperationId.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsOrganizationName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsPat.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsProjectId.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsProjectName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Wait-AzDevOpsOperation.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/Get-AzDevOpsOperation.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/Get-AzDevOpsProject.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/New-AzDevOpsProject.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/Test-AzDevOpsOperation.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Services}/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{ => Services}/Functions/Public/Get-AzDevOpsServicesUri.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 (97%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 (99%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 (93%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 (96%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 (97%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Api}/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Connection}/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Connection}/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsPat.Tests.ps1 (97%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 (99%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/Get-AzDevOpsProject.Tests.ps1 (99%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Objects}/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Services}/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 (97%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{ => Services}/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 (96%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiObject.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/New-AzDevOpsApiObject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiObject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index c794684c1..977cdd61e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -8,8 +8,26 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' # Obtain all functions within PSModule $functionSubDirectoryPaths = @( - "$PSScriptRoot\Functions\Public" - "$PSScriptRoot\Functions\Private" + + # Api + "$PSScriptRoot\Api\Functions\Public", + "$PSScriptRoot\Api\Functions\Private", + + # Connection + "$PSScriptRoot\Connection\Functions\Public", + "$PSScriptRoot\Connection\Functions\Private", + + # Objects + "$PSScriptRoot\Objects\Functions\Public", + "$PSScriptRoot\Objects\Functions\Private", + + # Server + "$PSScriptRoot\Server\Functions\Public", + "$PSScriptRoot\Server\Functions\Private", + + # Services + "$PSScriptRoot\Services\Functions\Public", + "$PSScriptRoot\Services\Functions\Private" ) $functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" @@ -24,7 +42,7 @@ ForEach ($function in $functions) ) ) - if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") + if ($function.FullName -ilike "$PSScriptRoot\*\Functions\Public\*") { Write-Verbose "Exporting '$($function.BaseName)'..." Export-ModuleMember -Function $($function.BaseName) diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsCredential.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsCredential.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsCredential.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsConnection.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Wait-AzDevOpsOperation.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Private/Wait-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Wait-AzDevOpsOperation.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/New-AzDevOpsProject.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/New-AzDevOpsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/New-AzDevOpsProject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Test-AzDevOpsOperation.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Test-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Test-AzDevOpsOperation.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 similarity index 97% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 47b14a405..62d1aad2e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 similarity index 99% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 index 938c79329..86587cdeb 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 similarity index 93% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 index 961caf722..7b765a112 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 similarity index 96% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 index 49a6eaeff..7cfd2faf3 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 index 899fe747a..852fd3eca 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 index bd7291caa..f7e4ce97a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 similarity index 97% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 86272662b..4e43f5b83 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index 70d0b34aa..4e0729dae 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index f6ea161a1..7d1332ef2 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index c524060d3..433dc2fba 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.Tests.ps1 similarity index 97% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index 18a867523..1906aef1e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index 66c10170b..d6560882c 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 similarity index 98% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index fa3b48ca1..cca5643e7 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 similarity index 99% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 index befbdacb0..5c1a180d1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 similarity index 99% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index c7812fc97..7f5005d53 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 similarity index 97% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 index 5c297be24..4ec8e1628 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 similarity index 96% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 index fd96bc1cf..22ab49c0e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -1,6 +1,6 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 InModuleScope $script:subModuleName { From 266706dc974279c666c66c28912d5ab44d9b347b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 13:14:42 +0000 Subject: [PATCH 123/611] Updated/Replaced use of word 'Object' to 'Resource' when concerning resources used/configured within Azure DevOps. --- .../DSC_AzDevOpsProject.psm1 | 4 +- .../Private/Get-AzDevOpsApiObject.ps1 | 110 ------------------ .../Private/Get-AzDevOpsApiObjectName.ps1 | 22 ---- .../Private/Get-AzDevOpsApiObjectUri.ps1 | 63 ---------- .../Private/Get-AzDevOpsApiResource.ps1 | 110 ++++++++++++++++++ .../Private/Get-AzDevOpsApiResourceName.ps1 | 22 ++++ .../Private/Get-AzDevOpsApiResourceUri.ps1 | 82 +++++++++++++ .../Private/Get-AzDevOpsApiVersion.ps1 | 2 +- ...Object.ps1 => New-AzDevOpsApiResource.ps1} | 54 ++++----- ...ame.ps1 => Test-AzDevOpsApiResourceId.ps1} | 18 +-- ...d.ps1 => Test-AzDevOpsApiResourceName.ps1} | 18 +-- .../AzureDevOpsDsc.Common.psm1 | 6 +- .../Private/Test-AzDevOpsOperationId.ps1 | 2 +- .../Private/Test-AzDevOpsOrganizationName.ps1 | 0 .../Functions/Private/Test-AzDevOpsPat.ps1 | 0 .../Private/Test-AzDevOpsProjectId.ps1 | 2 +- .../Private/Test-AzDevOpsProjectName.ps1 | 0 .../Private/Wait-AzDevOpsOperation.ps1 | 0 .../Public/Get-AzDevOpsOperation.ps1 | 14 +-- .../Functions/Public/Get-AzDevOpsProject.ps1 | 26 ++--- .../Functions/Public/New-AzDevOpsProject.ps1 | 14 +-- .../Public/Test-AzDevOpsOperation.ps1 | 2 +- .../DSC_AzDevOpsProject.Tests.ps1 | 30 ++--- .../Private/Get-AzDevOpsApiObject.Tests.ps1 | 88 +++++++------- .../Get-AzDevOpsApiObjectName.Tests.ps1 | 16 +-- .../Private/Get-AzDevOpsApiVersion.Tests.ps1 | 2 +- .../Test-AzDevOpsApiObjectId.Tests.ps1 | 64 +++++----- .../Test-AzDevOpsApiObjectName.Tests.ps1 | 74 ++++++------ .../Test-AzDevOpsOperationId.Tests.ps1 | 8 +- .../Test-AzDevOpsOrganizationName.Tests.ps1 | 0 .../Private/Test-AzDevOpsPat.Tests.ps1 | 0 .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 8 +- .../Test-AzDevOpsProjectName.Tests.ps1 | 0 .../Private/_TODO_Wait-AzDevOpsOperation.ps1 | 0 .../Public/Get-AzDevOpsOperation.Tests.ps1 | 10 +- .../Public/Get-AzDevOpsProject.Tests.ps1 | 14 +-- .../_TODO_New-AzDevOpsProject.Tests copy.ps1 | 0 .../_TODO_Test-AzDevOpsOperation.Tests.ps1 | 0 .../Modules/TestHelpers/CommonTestCases.psm1 | 34 +++--- 39 files changed, 469 insertions(+), 450 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 rename source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{New-AzDevOpsApiObject.ps1 => New-AzDevOpsApiResource.ps1} (52%) rename source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Test-AzDevOpsApiObjectName.ps1 => Test-AzDevOpsApiResourceId.ps1} (65%) rename source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Test-AzDevOpsApiObjectId.ps1 => Test-AzDevOpsApiResourceName.ps1} (61%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsOperationId.ps1 (93%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsOrganizationName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsPat.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsProjectId.ps1 (94%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsProjectName.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Wait-AzDevOpsOperation.ps1 (100%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/Get-AzDevOpsOperation.ps1 (79%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/Get-AzDevOpsProject.ps1 (71%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/New-AzDevOpsProject.ps1 (88%) rename source/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/Test-AzDevOpsOperation.ps1 (98%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 (89%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsPat.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 (89%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 (92%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/Get-AzDevOpsProject.Tests.ps1 (91%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Objects => Resources}/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 (100%) diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 index d684b22b2..98e73d689 100644 --- a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ b/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 @@ -47,7 +47,7 @@ class DSC_AzDevOpsProject [Alias('Description')] [string]$ProjectDescription - [hashtable]GetAzDevOpsObject() + [hashtable]GetAzDevOpsResource() { $getParameters = @{ ApiUri = $this.ApiUri @@ -61,7 +61,7 @@ class DSC_AzDevOpsProject [DSC_AzDevOpsProject] Get() { - $project = $this.GetAzDevOpsObject() + $project = $this.GetAzDevOpsResource() if ($null -eq $project) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 deleted file mode 100644 index 9b1fb59fd..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.ps1 +++ /dev/null @@ -1,110 +0,0 @@ -<# - .SYNOPSIS - Returns an array of objects returned from the Azure DevOps API. The type of object - returned is generic to make this function reusable across all objects from the API. - - The object type requested from the API is determined by the 'ObjectName' parameter. - - .PARAMETER ApiUri - The URI of the Azure DevOps API to be connected to. For example: - - https://dev.azure.com/someOrganizationName/_apis/ - - .PARAMETER ApiVersion - The version of the Azure DevOps API to use in the call/execution to/against the API. - - .PARAMETER Pat - The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations - against the Azure DevOps API. This PAT must have the relevant permissions assigned - for the subsequent operations being performed. - - .PARAMETER ObjectName - The name of the object being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') - - .PARAMETER ObjectId - The 'id' of the object type being obtained. For example, if the 'ObjectName' parameter value - was 'Project', the 'ObjectId' value would be assumed to be the 'id' of a 'Project'. - - .EXAMPLE - Get-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' - - Returns all 'Project' objects from the Azure DevOps API related to the Organization/ApiUri - value provided. - - .EXAMPLE - Get-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -ObjectId 'YourProjectId' - - Returns the 'Project' object from the Azure DevOps API related to the Organization/ApiUri - value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). -#> -function Get-AzDevOpsApiObject -{ - [CmdletBinding()] - [OutputType([System.Object[]])] - param - ( - [Parameter(Mandatory=$true)] - [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] - [Alias('Uri')] - [System.String] - $ApiUri, - - [Parameter()] - [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] - [System.String] - $ApiVersion = $(Get-AzDevOpsApiVersion -Default), - - [Parameter(Mandatory=$true)] - [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] - [Alias('PersonalAccessToken')] - [System.String] - $Pat, - - [Parameter(Mandatory=$true)] - [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectName $_ -IsValid })] - [System.String] - $ObjectName, - - [Parameter()] - [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] - [System.String] - $ObjectId - ) - - # Remove any $ObjectId if using a wildcard character - # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsApiObjectId $ObjectId -IsValid') then set to $null) - if ($ObjectId -contains '*') - { - $ObjectId = $null - } - - # TODO: Need something to pluralise and lowercase this object for the URI - $objectNamePluralUriString = $ObjectName.ToLower() + "s" - - # TODO: Need to get this from input parameter? - $apiVersionUriParameter = "api-version=$ApiVersion" - - # TODO: Need to generate this from a function - $apiObjectUri = $ApiUri + "/$objectNamePluralUriString" - if (![System.String]::IsNullOrWhiteSpace($ObjectId)) - { - $apiObjectUri = $apiObjectUri + "/$ObjectId" - } - $apiObjectUri = $apiObjectUri + '?' + $apiVersionUriParameter - - - - [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - - # TODO: Need to tidy up? - [System.Object[]]$apiObjects = @() - $apiObjects += Invoke-RestMethod -Uri $apiObjectUri -Method 'Get' -Headers $apiHttpRequestHeader - - # If not a single, object request, set from the object(s) in the 'value' property within the response - if ([System.String]::IsNullOrWhiteSpace($ObjectId)) - { - [System.Object[]]$apiObjects = $apiObjects.value - } - - return $apiObjects -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 deleted file mode 100644 index b9ac2eca2..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -<# - .SYNOPSIS - Returns an array of all the Azure DevOps API, 'Object' names that can used/managed. - - .EXAMPLE - Get-AzDevOpsApiObjectName - - Returns all the names of the objects that can be used/managed in the Azure DevOps API. -#> -function Get-AzDevOpsApiObjectName -{ - [CmdletBinding()] - [OutputType([System.Object[]])] - param () - - [string[]]$objectNames = @( - 'Operation', - 'Project' - ) - - return $objectNames -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 deleted file mode 100644 index a7f9f9caf..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectUri.ps1 +++ /dev/null @@ -1,63 +0,0 @@ -<# - .SYNOPSIS - Returns a full URI for the API object given the parameter values provided. - - .PARAMETER ApiUri - The URI of the Azure DevOps API to be connected to. For example: - - https://dev.azure.com/someOrganizationName/_apis/ - - .PARAMETER ApiVersion - The version of the Azure DevOps API to use in the call/execution to/against the API. - - .PARAMETER ObjectName - The name of the object being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') - - .PARAMETER ObjectId - The 'id' of the object type being obtained. For example, if the 'ObjectName' parameter value - was 'Project', the 'ObjectId' value would be assumed to be the 'id' of a 'Project'. - - .EXAMPLE - Get-AzDevOpsApiObjectUri -ApiUri 'YourApiUriHere' -ObjectName 'Project' - - Returns a URI to obtain all 'Project' objects from the Azure DevOps API related to the Organization/ApiUri - value provided. - - .EXAMPLE - Get-AzDevOpsApiObjectUri -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -ObjectId 'YourProjectId' - - Returns a URI to obtain the 'Project' object from the Azure DevOps API related to the Organization/ApiUri - value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). -#> -function Get-AzDevOpsApiObjectUri -{ - [CmdletBinding()] - [OutputType([string])] - param - ( - [Parameter(Mandatory=$true)] - [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] - [Alias('Uri')] - [System.String] - $ApiUri, - - [Parameter()] - [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] - [System.String] - $ApiVersion = $(Get-AzDevOpsApiVersion -Default), - - [Parameter(Mandatory=$true)] - [ValidateScript({ Test-AzDevOpsApiObjectName -ObjectName $_ -IsValid })] - [System.String] - $ObjectName, - - [Parameter()] - [ValidateScript({ Test-AzDevOpsApiObjectId -ObjectId $_ -IsValid })] - [System.String] - $ObjectId - ) - - [string]$apiObjectUri = $ApiUri - - return $apiObjectUri -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 new file mode 100644 index 000000000..1aff94046 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 @@ -0,0 +1,110 @@ +<# + .SYNOPSIS + Returns an array of resources returned from the Azure DevOps API. The type of resource + returned is generic to make this function reusable across all resources from the API. + + The resource type requested from the API is determined by the 'ResourceName' parameter. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ResourceName + The name of the resource being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') + + .PARAMETER ResourceId + The 'id' of the resource type being obtained. For example, if the 'ResourceName' parameter value + was 'Project', the 'ResourceId' value would be assumed to be the 'id' of a 'Project'. + + .EXAMPLE + Get-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' + + Returns all 'Project' resources from the Azure DevOps API related to the Organization/ApiUri + value provided. + + .EXAMPLE + Get-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -ResourceId 'YourProjectId' + + Returns the 'Project' resource from the Azure DevOps API related to the Organization/ApiUri + value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). +#> +function Get-AzDevOpsApiResource +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter()] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] + [System.String] + $ResourceId + ) + + # Remove any $ResourceId if using a wildcard character + # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsApiResourceId $ResourceId -IsValid') then set to $null) + if ($ResourceId -contains '*') + { + $ResourceId = $null + } + + # TODO: Need something to pluralise and lowercase this resource for the URI + $resourceNamePluralUriString = $ResourceName.ToLower() + "s" + + # TODO: Need to get this from input parameter? + $apiVersionUriParameter = "api-version=$ApiVersion" + + # TODO: Need to generate this from a function + $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" + if (![System.String]::IsNullOrWhiteSpace($ResourceId)) + { + $apiResourceUri = $apiResourceUri + "/$ResourceId" + } + $apiResourceUri = $apiResourceUri + '?' + $apiVersionUriParameter + + + + [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + + # TODO: Need to tidy up? + [System.Object[]]$apiObjects = @() + $apiResources += Invoke-RestMethod -Uri $apiResourceUri -Method 'Get' -Headers $apiHttpRequestHeader + + # If not a single, resource request, set from the resource(s) in the 'value' property within the response + if ([System.String]::IsNullOrWhiteSpace($ResourceId)) + { + [System.Object[]]$apiResources = $apiResources.value + } + + return $apiResources +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 new file mode 100644 index 000000000..a1eab1b8d --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 @@ -0,0 +1,22 @@ +<# + .SYNOPSIS + Returns an array of all the Azure DevOps API, 'Resource' names that can used/managed. + + .EXAMPLE + Get-AzDevOpsApiResourceName + + Returns all the names of the resources that can be used/managed in the Azure DevOps API. +#> +function Get-AzDevOpsApiResourceName +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param () + + [string[]]$resourceNames = @( + 'Operation', + 'Project' + ) + + return $resourceNames +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 new file mode 100644 index 000000000..056536726 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 @@ -0,0 +1,82 @@ +<# + .SYNOPSIS + Returns a full URI for the API resource given the parameter values provided. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + + .PARAMETER ResourceName + The name of the resource being obtained from the Azure DevOps API (e.g. 'Project' or 'Operation') + + .PARAMETER ResourceId + The 'id' of the resource type being obtained. For example, if the 'ResourceName' parameter value + was 'Project', the 'ResourceId' value would be assumed to be the 'id' of a 'Project'. + + .EXAMPLE + Get-AzDevOpsApiResourceUri -ApiUri 'YourApiUriHere' -ResourceName 'Project' + + Returns a URI to obtain all 'Project' resources from the Azure DevOps API related to the Organization/ApiUri + value provided. + + .EXAMPLE + Get-AzDevOpsApiResourceUri -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -ResourceId 'YourProjectId' + + Returns a URI to obtain the 'Project' resource from the Azure DevOps API related to the Organization/ApiUri + value provided (where the 'id' of the 'Project' is equal to 'YourProjectId'). +#> +function Get-AzDevOpsApiResourceUri +{ + [CmdletBinding()] + [OutputType([string])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter()] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] + [System.String] + $ResourceId + ) + + [string]$apiResourceUri = $ApiUri + + + + + # TODO: Need something to pluralise and lowercase this resource for the URI + $resourceNamePluralUriString = $ResourceName.ToLower() + "s" + + # TODO: Need to get this from input parameter? + $apiVersionUriParameter = "api-version=$ApiVersion" + + # TODO: Need to generate this from a function + $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" + if (![System.String]::IsNullOrWhiteSpace($ResourceId)) + { + $apiResourceUri = $apiResourceUri + "/$ResourceId" + } + $apiResourceUri = $apiResourceUri + '?' + $apiVersionUriParameter + + + + return $apiResourceUri +} diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 index 7c750c1f0..370c89943 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.ps1 @@ -6,7 +6,7 @@ .EXAMPLE Get-AzDevOpsApiVersion - Returns all the names of the objects that can be used/managed in the Azure DevOps API. + Returns all the names of the resources that can be used/managed in the Azure DevOps API. #> function Get-AzDevOpsApiVersion { diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiObject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 similarity index 52% rename from source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiObject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index d8310ca3d..2f923a574 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiObject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -1,9 +1,9 @@ <# .SYNOPSIS - Attempts to create an object within Azure DevOps. + Attempts to create an resource within Azure DevOps. - The type of object type created is provided in the 'ObjectName' parameter and it is - assumed that the 'Object' parameter value passed in meets the specification of the object. + The type of resource type created is provided in the 'ResourceName' parameter and it is + assumed that the 'Resource' parameter value passed in meets the specification of the resource. .PARAMETER ApiUri The URI of the Azure DevOps API to be connected to. For example: @@ -15,32 +15,32 @@ against the Azure DevOps API. This PAT must have the relevant permissions assigned for the subsequent operations being performed. - .PARAMETER ObjectName - The name of the object being created within Azure DevOps (e.g. 'Project') + .PARAMETER ResourceName + The name of the resource being created within Azure DevOps (e.g. 'Project') - .PARAMETER Object - The object being created (typically provided by another function (e.g. 'New-AzDevOpsApiProject')). + .PARAMETER Resource + The resource being created (typically provided by another function (e.g. 'New-AzDevOpsApiProject')). .EXAMPLE - New-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -Object $YourObject -Wait + New-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -Resource $YourResource -Wait - Creates the 'Project' object in Azure DevOps within to the Organization relating to the to the 'ApiUri' + Creates the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' provided. NOTE: In this example, the '-Wait' switch is provided so the function will wait for the corresponding API 'Operation' - to complete before the function completes. If the creation of the object has been successful, it will be return by the - function. If the creation of the object has failed, an exception will be thrown. + to complete before the function completes. If the creation of the resource has been successful, it will be return by the + function. If the creation of the resource has failed, an exception will be thrown. .EXAMPLE - New-AzDevOpsApiObject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ObjectName 'Project' -Object $YourObject + New-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -Resource $YourResource - Creates the 'Project' object in Azure DevOps within to the Organization relating to the to the 'ApiUri' + Creates the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' provided. NOTE: In this example, no '-Wait' switch is provided so the request is made to the API but the operation may not complete before the function completes (and may not complete successfully at all). #> -function New-AzDevOpsApiObject +function New-AzDevOpsApiResource { [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] [OutputType([System.Object])] @@ -61,11 +61,11 @@ function New-AzDevOpsApiObject [Parameter(Mandatory = $true)] [ValidateSet('Operation','Project')] [System.String] - $ObjectName, + $ResourceName, [Parameter(Mandatory = $true)] [System.Object] - $Object, + $Resource, [Parameter()] [System.Management.Automation.SwitchParameter] @@ -76,28 +76,28 @@ function New-AzDevOpsApiObject $Force ) - $objectId = $Object.id # TODO: Might have to remove the assumption that this works (see below also). Input object's 'id' value looks to be ignored when creating object. + $ResourceId = $Resource.id # TODO: Might have to remove the assumption that this works (see below also). Input resource's 'id' value looks to be ignored when creating resource. - # TODO: Need something to pluralise and lowercase this object for the URI - $objectNamePluralUriString = $ObjectName.ToLower() + "s" + # TODO: Need something to pluralise and lowercase this resource for the URI + $resourceNamePluralUriString = $ResourceName.ToLower() + "s" # TODO: Need something to convert to JSON - $objectJson = $Object | ConvertTo-Json -Depth 10 -Compress + $resourceJson = $Resource | ConvertTo-Json -Depth 10 -Compress # TODO: Need to get this from input parameter? $apiVersionUriParameter = 'api-version=5.1' # TODO: Need to generate this from a function - $apiObjectUri = $ApiUri + "/$objectNamePluralUriString" + '?' + $apiVersionUriParameter + $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" + '?' + $apiVersionUriParameter - if ($Force -or $PSCmdlet.ShouldProcess($apiObjectUri, $ObjectName)) + if ($Force -or $PSCmdlet.ShouldProcess($apiResourceUri, $ResourceName)) { [System.Object]$apiOperation = $null [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiObjectUri -Method 'Post' -Headers $apiHttpRequestHeader -Body $objectJson -ContentType 'application/json' + [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Post' -Headers $apiHttpRequestHeader -Body $resourceJson -ContentType 'application/json' if ($Wait) { @@ -106,10 +106,10 @@ function New-AzDevOpsApiObject -OperationId $apiOperation.id ` -IsSuccessful - # Obtains and returns the new object - New-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat ` - -ObjectName $ObjectName ` - -ObjectId $objectId # TODO: Might have to remove the assumption that this works (see above also). Input object's 'id' value looks to be ignored when creating object. + # Obtains and returns the new resource + New-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId # TODO: Might have to remove the assumption that this works (see above also). Input resource's 'id' value looks to be ignored when creating resource. } } } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 similarity index 65% rename from source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 index 2c2d2e3c8..772cee951 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 @@ -1,26 +1,26 @@ <# .SYNOPSIS - Peforms test on a provided 'ObjectName' to provide a boolean ($true or $false) + Peforms test on a provided 'ResourceId' to provide a boolean ($true or $false) return value. Returns $true if the test is successful. NOTE: Use of the '-IsValid' switch is required. - .PARAMETER ObjectName - The 'ObjectName' to be tested/validated. + .PARAMETER ResourceId + The 'ResourceId' to be tested/validated. .PARAMETER IsValid - Use of this switch will validate the format of the 'ObjectName' + Use of this switch will validate the format of the 'ResourceId' rather than the existence/presence of it. Failure to use this switch will throw an exception. .EXAMPLE - Test-AzDevOpsApiObjectName -ObjectName 'YourObjectNameHere' -IsValid + Test-AzDevOpsApiResourceId -ResourceId 'YourResourceIdHere' -IsValid - Returns $true if the 'ObjectName' provided is of a valid format. + Returns $true if the 'ResourceId' provided is of a valid format. Returns $false if it is not. #> -function Test-AzDevOpsApiObjectName +function Test-AzDevOpsApiResourceId { [CmdletBinding()] [OutputType([System.Boolean])] @@ -28,7 +28,7 @@ function Test-AzDevOpsApiObjectName ( [Parameter(Mandatory = $true)] [System.String] - $ObjectName, + $ResourceId, [Parameter(Mandatory = $true)] [System.Management.Automation.SwitchParameter] @@ -42,7 +42,7 @@ function Test-AzDevOpsApiObjectName } - if (!($(Get-AzDevOpsApiObjectName).Contains($ObjectName))) + if (![guid]::TryParse($ResourceId, $([ref][guid]::Empty))) { return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 similarity index 61% rename from source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 index 94c26bcea..6d8580607 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 @@ -1,26 +1,26 @@ <# .SYNOPSIS - Peforms test on a provided 'ObjectId' to provide a boolean ($true or $false) + Peforms test on a provided 'ResourceName' to provide a boolean ($true or $false) return value. Returns $true if the test is successful. NOTE: Use of the '-IsValid' switch is required. - .PARAMETER ObjectId - The 'ObjectId' to be tested/validated. + .PARAMETER ResourceName + The 'ResourceName' to be tested/validated. .PARAMETER IsValid - Use of this switch will validate the format of the 'ObjectId' + Use of this switch will validate the format of the 'ResourceName' rather than the existence/presence of it. Failure to use this switch will throw an exception. .EXAMPLE - Test-AzDevOpsApiObjectId -ObjectId 'YourObjectIdHere' -IsValid + Test-AzDevOpsApiResourceName -ResourceName 'YourResourceNameHere' -IsValid - Returns $true if the 'ObjectId' provided is of a valid format. + Returns $true if the 'ResourceName' provided is of a valid format. Returns $false if it is not. #> -function Test-AzDevOpsApiObjectId +function Test-AzDevOpsApiResourceName { [CmdletBinding()] [OutputType([System.Boolean])] @@ -28,7 +28,7 @@ function Test-AzDevOpsApiObjectId ( [Parameter(Mandatory = $true)] [System.String] - $ObjectId, + $ResourceName, [Parameter(Mandatory = $true)] [System.Management.Automation.SwitchParameter] @@ -42,7 +42,7 @@ function Test-AzDevOpsApiObjectId } - if (![guid]::TryParse($ObjectId, $([ref][guid]::Empty))) + if (!($(Get-AzDevOpsApiResourceName).Contains($ResourceName))) { return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index 977cdd61e..f2cdf2a04 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -17,9 +17,9 @@ $functionSubDirectoryPaths = @( "$PSScriptRoot\Connection\Functions\Public", "$PSScriptRoot\Connection\Functions\Private", - # Objects - "$PSScriptRoot\Objects\Functions\Public", - "$PSScriptRoot\Objects\Functions\Private", + # Resources + "$PSScriptRoot\Resources\Functions\Public", + "$PSScriptRoot\Resources\Functions\Private", # Server "$PSScriptRoot\Server\Functions\Public", diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 similarity index 93% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 index 4dfadd237..2a512cd24 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsOperationId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid:$IsValid)) + if (!(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid:$IsValid)) { return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 similarity index 94% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 index ef608f1ad..5ea136872 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsProjectId New-InvalidOperationException -Message $errorMessage } - if (!(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid:$IsValid)) + if (!(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid:$IsValid)) { return $false } diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Wait-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 similarity index 79% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 index 6ec321285..29da5e3ca 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -18,7 +18,7 @@ .EXAMPLE Get-AzDevOpsOperation -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -OperationId 'YourOperationIdHere' - Returns the 'Operation' object from Azure DevOps related to the 'OperationId' value provided. + Returns the 'Operation' resource from Azure DevOps related to the 'OperationId' value provided. #> function Get-AzDevOpsOperation { @@ -46,25 +46,25 @@ function Get-AzDevOpsOperation ) - $azDevOpsApiObjectParameters = @{ + $azDevOpsApiResourceParameters = @{ ApiUri = $ApiUri; Pat = $Pat; - ObjectName = 'Operation'} + ResourceName = 'Operation'} If(![string]::IsNullOrWhiteSpace($OperationId)){ - $azDevOpsApiObjectParameters.ObjectId = $OperationId + $azDevOpsApiResourceParameters.ResourceId = $OperationId } - [System.Object[]]$apiObjects = Get-AzDevOpsApiObject @azDevOpsApiObjectParameters + [System.Object[]]$apiResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters If(![string]::IsNullOrWhiteSpace($OperationId)){ - $apiObjects = $apiObjects | + $apiResources = $apiResources | Where-Object id -ilike $OperationId } - return [object[]]$apiObjects + return [object[]]$apiResources } diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 similarity index 71% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 index b41e4d25e..1b727ebd8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 @@ -21,27 +21,27 @@ .EXAMPLE Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' - Returns all the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps. + Returns all the 'Project' resources (assocated with the Organization/ApiUrl) from Azure DevOps. .EXAMPLE Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectName '*' - Returns all the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps. + Returns all the 'Project' resources (assocated with the Organization/ApiUrl) from Azure DevOps. .EXAMPLE Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectIdHere' - Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' value provided. + Returns the 'Project' resources (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' value provided. .EXAMPLE Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectName 'YourProjectNameHere' - Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectName' value provided. + Returns the 'Project' resources (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectName' value provided. .EXAMPLE Get-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectIdHere' -ProjectName 'YourProjectNameHere' - Returns the 'Project' objects (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' and 'ProjectName' value provided. + Returns the 'Project' resources (assocated with the Organization/ApiUrl) from Azure DevOps related to the 'ProjectId' and 'ProjectName' value provided. #> function Get-AzDevOpsProject { @@ -63,7 +63,7 @@ function Get-AzDevOpsProject [Parameter()] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] - [Alias('ObjectId','Id')] + [Alias('ResourceId','Id')] [System.String] $ProjectId, @@ -75,31 +75,31 @@ function Get-AzDevOpsProject ) - $azDevOpsApiObjectParameters = @{ + $azDevOpsApiResourceParameters = @{ ApiUri = $ApiUri; Pat = $Pat; - ObjectName = 'Project'} + ResourceName = 'Project'} If(![string]::IsNullOrWhiteSpace($ProjectId)){ - $azDevOpsApiObjectParameters.ObjectId = $ProjectId + $azDevOpsApiResourceParameters.ResourceId = $ProjectId } - [object[]]$apiObjects = Get-AzDevOpsApiObject @azDevOpsApiObjectParameters + [object[]]$apiResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters If(![string]::IsNullOrWhiteSpace($ProjectId)){ - $apiObjects = $apiObjects | + $apiResources = $apiResources | Where-Object id -ilike $ProjectId } If(![string]::IsNullOrWhiteSpace($ProjectName)){ - $apiObjects = $apiObjects | + $apiResources = $apiResources | Where-Object name -ilike $ProjectName } - return [object[]]$apiObjects + return [object[]]$apiResources } diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 similarity index 88% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/New-AzDevOpsProject.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index db8e3becd..3ef1fac75 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -82,7 +82,7 @@ function New-AzDevOpsProject $Force ) - [string]$objectJson = ' + [string]$resourceJson = ' { "id": "' + $ProjectId + '", "name": "' + $ProjectName + '", @@ -98,15 +98,15 @@ function New-AzDevOpsProject } ' - [System.Object]$object = $null + [System.Object]$resource = $null - if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $objectName)) + if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $resourceName)) { - [System.Object]$object = New-AzDevOpsApiObject -$ApiUri $ApiUri -Pat $Pat ` - -ObjectName 'Project' ` - -Object $($objectJson | ConvertFrom-Json) ` + [System.Object]$resource = New-AzDevOpsApiResource -$ApiUri $ApiUri -Pat $Pat ` + -ResourceName 'Project' ` + -Resource $($resourceJson | ConvertFrom-Json) ` -Force:$Force } - return $object + return $resource } diff --git a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 similarity index 98% rename from source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Test-AzDevOpsOperation.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 5a717bc5d..5fd8b405a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -92,7 +92,7 @@ function Test-AzDevOpsOperation } - [object[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + [resource[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $OperationId diff --git a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 index 89648b8ad..966bc79fb 100644 --- a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 @@ -59,7 +59,7 @@ try $getProjectName = "ProjectName_$projectId" $getProjectDescription = "ProjectDescription_$projectId" - $getAzDevOpsObject = @{ + $getAzDevOpsResource = @{ id = $getProjectId name = $getProjectName description = $getProjectDescription @@ -80,7 +80,7 @@ try BeforeAll { $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { return $null } -Force -PassThru @@ -102,11 +102,11 @@ try Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { BeforeAll { $differentProjectId = [GUID]::NewGuid().ToString() - $getAzDevOpsObject.ProjectId = $differentProjectId + $getAzDevOpsResource.ProjectId = $differentProjectId $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { - return $getAzDevOpsObject + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { + return $getAzDevOpsResource } -Force -PassThru } @@ -125,12 +125,12 @@ try Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { BeforeAll { - $differentProjectName = "z" + $getAzDevOpsObject.ProjectName - $getAzDevOpsObject.ProjectName = $differentProjectName + $differentProjectName = "z" + $getAzDevOpsResource.ProjectName + $getAzDevOpsResource.ProjectName = $differentProjectName $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { - return $getAzDevOpsObject + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { + return $getAzDevOpsResource } -Force -PassThru } @@ -148,12 +148,12 @@ try Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { BeforeAll { - $differentProjectDescription = "z" + $getAzDevOpsObject.ProjectDescription - $getAzDevOpsObject.ProjectDescription = $differentProjectDescription + $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription + $getAzDevOpsResource.ProjectDescription = $differentProjectDescription $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { - return $getAzDevOpsObject + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { + return $getAzDevOpsResource } -Force -PassThru } @@ -174,8 +174,8 @@ try BeforeAll { $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsObject' -Value { - return $getAzDevOpsObject + Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { + return $getAzDevOpsResource } -Force -PassThru } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 index 86587cdeb..794c2add6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 @@ -5,12 +5,12 @@ InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiObject' -Tag 'GetAzDevOpsApiObject' { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiResource' -Tag 'GetAzDevOpsApiResource' { Context 'When called with valid parameters' { BeforeAll { - [string]$nonPresentObjectId = '114bff8d-6169-45cf-b085-fe121267e7aa' + [string]$nonPresentResourceId = '114bff8d-6169-45cf-b085-fe121267e7aa' Mock Invoke-RestMethod -Verifiable { @@ -19,10 +19,10 @@ InModuleScope $script:subModuleName { "count": 2, "value": [ { - "id": "$ObjectId", + "id": "$ResourceId", "name": "Test Project 1", "description": "Test Project Description 1", - "url": "https://dev.azure.com/fabrikam/_apis/projects/$ObjectId", + "url": "https://dev.azure.com/fabrikam/_apis/projects/$ResourceId", "state": "wellFormed" }, { @@ -36,20 +36,20 @@ InModuleScope $script:subModuleName { } "@ | ConvertFrom-Json - if (![string]::IsNullOrWhiteSpace($ObjectId)) + if (![string]::IsNullOrWhiteSpace($ResourceId)) { $response = $response.value | - Where-Object { $_.id -eq $ObjectId} | - Where-Object { $_.id -ne $nonPresentObjectId} + Where-Object { $_.id -eq $ResourceId} | + Where-Object { $_.id -ne $nonPresentResourceId} } - #if ([string]::IsNullOrWhiteSpace($ObjectId)) + #if ([string]::IsNullOrWhiteSpace($ResourceId)) #{ # $response = $response.Value #} #else { # $response = $response.Value | - # Where-Object { $_.id -eq $ObjectId } + # Where-Object { $_.id -eq $ResourceId } #} return $response @@ -60,28 +60,28 @@ InModuleScope $script:subModuleName { $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - $testCasesValidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' - $testCasesValidApiUriPatObjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidObjectNames + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesValidApiUriPatResourceNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidResourceNames - $testCasesValidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Valid' - $testCasesValidApiUriPatObjectNameObjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatObjectNameCombined, $testCasesValidObjectIds + $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' + $testCasesValidApiUriPatResourceNameResourceIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatResourceNameCombined, $testCasesValidResourceIds - Context 'When called with no "ObjectId" parameter' { + Context 'When called with no "ResourceId" parameter' { - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName } | Should -Not -Throw + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName } | Should -Not -Throw } - It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName + $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName #Write-Warning "x" #Write-Warning "$ApiUri" #Write-Warning "$Pat" - #Write-Warning "$ObjectName" + #Write-Warning "$ResourceName" #Write-Warning "$result" #Write-Warning "yy" @@ -90,45 +90,45 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName | Out-Null + Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName | Out-Null Should -Invoke Invoke-RestMethod -Times 1 -Exactly -Scope It } } - Context 'When called with an "ObjectId" parameter' { + Context 'When called with an "ResourceId" parameter' { - It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId } | Should -Not -Throw + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId } | Should -Not -Throw } - It 'Should return "object[]" or "hashtable" - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + It 'Should return "object[]" or "hashtable" - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId + $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId $result.GetType() | Should -Be $(New-Object -TypeName PSCustomObject).GetType() } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameObjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName, [string]$ObjectId) + It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $ObjectId | Out-Null + Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId | Out-Null Should -Invoke Invoke-RestMethod -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } - Context 'When a "Object" with supplied "ObjectId" parameter value does not exist' { + Context 'When a "Resource" with supplied "ResourceId" parameter value does not exist' { - It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatObjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ObjectName) + It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - $result = Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $Pat -ObjectName $ObjectName -ObjectId $nonPresentObjectId # Non-present "ObjectId" + $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $nonPresentResourceId # Non-present "ResourceId" $result | Should -Be $null } } @@ -152,7 +152,7 @@ InModuleScope $script:subModuleName { It "Should throw - ''" -TestCases $testCasesInvalidPats { param ([string]$Pat) - { Get-AzDevOpsApiObject -Pat $Pat } | Should -Throw + { Get-AzDevOpsApiResource -Pat $Pat } | Should -Throw } } @@ -162,7 +162,7 @@ InModuleScope $script:subModuleName { param ([string]$Pat) $validApiUri = 'https://someuri.api/_apis/' - { Get-AzDevOpsApiObject -ApiUri $validApiUri -Pat $Pat } | Should -Throw + { Get-AzDevOpsApiResource -ApiUri $validApiUri -Pat $Pat } | Should -Throw } } @@ -172,7 +172,7 @@ InModuleScope $script:subModuleName { param ([string]$Pat) $invalidApiUri = 'someInvalidApiUrl' - { Get-AzDevOpsApiObject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + { Get-AzDevOpsApiResource -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw } } @@ -187,7 +187,7 @@ InModuleScope $script:subModuleName { It "Should throw - ''" -TestCases $testCasesInvalidApiUris { param ([string]$ApiUri) - { Get-AzDevOpsApiObject -ApiUri $ApiUri } | Should -Throw + { Get-AzDevOpsApiResource -ApiUri $ApiUri } | Should -Throw } } @@ -197,7 +197,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri) $validPat = '1234567890123456789012345678901234567890123456789012' - { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $validPat } | Should -Throw + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $validPat } | Should -Throw } } @@ -207,7 +207,7 @@ InModuleScope $script:subModuleName { param ([string]$ApiUri) $invalidPat = '123456789012' - { Get-AzDevOpsApiObject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 index 7b765a112..52da03533 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 @@ -5,34 +5,34 @@ InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiObjectName' -Tag 'GetAzDevOpsApiObjectName' { + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiResourceName' -Tag 'GetAzDevOpsApiResourceName' { Context 'When called with valid parameters' { BeforeAll { - $testCasesValidObjectName = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' + $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' } It 'Should not throw' { param () - { Get-AzDevOpsApiObjectName } | Should -Not -Throw + { Get-AzDevOpsApiResourceName } | Should -Not -Throw } It 'Should return "object[]"' { param () - $result = Get-AzDevOpsApiObjectName - $result.GetType() | Should -Be @('ObjectName1','ObjectName2').GetType() + $result = Get-AzDevOpsApiResourceName + $result.GetType() | Should -Be @('ResourceName1','ResourceName2').GetType() } - It 'Should return all objects that are present in $testCasesValidObjectName variable'{ + It 'Should return all resources that are present in $testCasesValidResourceName variable'{ param () - $result = Get-AzDevOpsApiObjectName - $result.Count | Should -Be $($testCasesValidObjectName.Count) + $result = Get-AzDevOpsApiResourceName + $result.Count | Should -Be $($testCasesValidResourceName.Count) } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 index 7cfd2faf3..ddf592f83 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -29,7 +29,7 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@('ApiVersion1','ApiVersion2').GetType(),'ApiVersion1'.GetType()) } - It 'Should return all objects that are present in $testCasesValidApiVersion variable'{ + It 'Should return all resources that are present in $testCasesValidApiVersion variable'{ param () [string[]]$result = Get-AzDevOpsApiVersion diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 index 852fd3eca..999f48d5a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 @@ -5,11 +5,11 @@ InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectId' -Tag 'TestAzDevOpsApiObjectId' { + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiResourceId' -Tag 'TestAzDevOpsApiResourceId' { - $testCasesValidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Valid' - $testCasesEmptyObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Empty' - $testCasesInvalidObjectIds = Get-TestCase -ScopeName 'ObjectId' -TestCaseName 'Invalid' + $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' + $testCasesEmptyResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Empty' + $testCasesInvalidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Invalid' Context 'When called with valid parameters' { BeforeAll { @@ -17,40 +17,40 @@ InModuleScope $script:subModuleName { Context 'When called using "-IsValid" switch' { - Context 'When called with valid "ObjectId" parameter' { + Context 'When called with valid "ResourceId" parameter' { - It 'Should not throw - ""' -TestCases $testCasesValidObjectIds { - param ([string]$ObjectId) + It 'Should not throw - ""' -TestCases $testCasesValidResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidObjectIds { - param ([string]$ObjectId) + It 'Should return $true - ""' -TestCases $testCasesValidResourceIds { + param ([string]$ResourceId) - $result = Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid + $result = Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid $result | Should -Be $true } } - Context 'When called with invalid "ObjectId" parameter' { + Context 'When called with invalid "ResourceId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { - param ([string]$ObjectId) + It 'Should throw - ""' -TestCases $testCasesEmptyResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Throw } - It 'Should not throw - ""' -TestCases $testCasesInvalidObjectIds { - param ([string]$ObjectId) + It 'Should not throw - ""' -TestCases $testCasesInvalidResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidObjectIds { - param ([string]$ObjectId) + It 'Should return $false - ""' -TestCases $testCasesInvalidResourceIds { + param ([string]$ResourceId) - $result = Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid + $result = Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid $result | Should -Be $false } } @@ -65,28 +65,28 @@ InModuleScope $script:subModuleName { Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ObjectId" parameter' { + Context 'When called with valid "ResourceId" parameter' { - It 'Should throw - ""' -TestCases $testCasesValidObjectIds { - param ([string]$ObjectId) + It 'Should throw - ""' -TestCases $testCasesValidResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw } } - Context 'When called with invalid "ObjectId" parameter' { + Context 'When called with invalid "ResourceId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyObjectIds { - param ([string]$ObjectId) + It 'Should throw - ""' -TestCases $testCasesEmptyResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw } - It 'Should throw - ""' -TestCases $testCasesInvalidObjectIds { - param ([string]$ObjectId) + It 'Should throw - ""' -TestCases $testCasesInvalidResourceIds { + param ([string]$ResourceId) - { Test-AzDevOpsApiObjectId -ObjectId $ObjectId -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 index f7e4ce97a..9141424e0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 @@ -5,19 +5,19 @@ InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiObjectName' -Tag 'TestAzDevOpsApiObjectName' { + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiResourceName' -Tag 'TestAzDevOpsApiResourceName' { - $testCasesValidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Valid' - $testCasesEmptyObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Empty' - $testCasesInvalidObjectNames = Get-TestCase -ScopeName 'ObjectName' -TestCaseName 'Invalid' + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesEmptyResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Empty' + $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' - Context 'When validating, valid "ObjectName" test cases' { + Context 'When validating, valid "ResourceName" test cases' { - It 'Should also be returned from "Get-AzDevOpsApiObjectName" function - ' -TestCases $testCasesValidObjectNames { - param ([string]$ObjectName) + It 'Should also be returned from "Get-AzDevOpsApiResourceName" function - ' -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - $($(Get-AzDevOpsApiObjectName | - Where-Object { $_ -ceq $ObjectName})) | Should -Be $ObjectName + $($(Get-AzDevOpsApiResourceName | + Where-Object { $_ -ceq $ResourceName})) | Should -Be $ResourceName } @@ -29,40 +29,40 @@ InModuleScope $script:subModuleName { Context 'When called using "-IsValid" switch' { - Context 'When called with valid "ObjectName" parameter' { + Context 'When called with valid "ResourceName" parameter' { - It 'Should not throw - ""' -TestCases $testCasesValidObjectNames { - param ([string]$ObjectName) + It 'Should not throw - ""' -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidObjectNames { - param ([string]$ObjectName) + It 'Should return $true - ""' -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - $result = Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid + $result = Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid $result | Should -Be $true } } - Context 'When called with invalid "ObjectName" parameter' { + Context 'When called with invalid "ResourceName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyObjectNames { - param ([string]$ObjectName) + It 'Should throw - ""' -TestCases $testCasesEmptyResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Throw } - It 'Should not throw - ""' -TestCases $testCasesInvalidObjectNames { - param ([string]$ObjectName) + It 'Should not throw - ""' -TestCases $testCasesInvalidResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid } | Should -Not -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidObjectNames { - param ([string]$ObjectName) + It 'Should return $false - ""' -TestCases $testCasesInvalidResourceNames { + param ([string]$ResourceName) - $result = Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid + $result = Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid $result | Should -Be $false } } @@ -77,28 +77,28 @@ InModuleScope $script:subModuleName { Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ObjectName" parameter' { + Context 'When called with valid "ResourceName" parameter' { - It 'Should throw - ""' -TestCases $testCasesValidObjectNames { - param ([string]$ObjectName) + It 'Should throw - ""' -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw } } - Context 'When called with invalid "ObjectName" parameter' { + Context 'When called with invalid "ResourceName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyObjectNames { - param ([string]$ObjectName) + It 'Should throw - ""' -TestCases $testCasesEmptyResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw } - It 'Should throw - ""' -TestCases $testCasesInvalidObjectNames { - param ([string]$ObjectName) + It 'Should throw - ""' -TestCases $testCasesInvalidResourceNames { + param ([string]$ResourceName) - { Test-AzDevOpsApiObjectName -ObjectName $ObjectName -IsValid:$false } | Should -Throw + { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 similarity index 89% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index 7d1332ef2..6cc8302db 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -32,11 +32,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $true } - It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesValidOperationIds { + It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidOperationIds { param ([string]$OperationId) $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid) } } @@ -61,11 +61,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $false } - It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesInvalidOperationIds { + It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesInvalidOperationIds { param ([string]$OperationId) $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $OperationId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid) } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsPat.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 similarity index 89% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index d6560882c..09b6142d8 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -32,11 +32,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $true } - It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesValidProjectIds { + It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidProjectIds { param ([string]$ProjectId) $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid) } } @@ -61,11 +61,11 @@ InModuleScope $script:subModuleName { $result | Should -Be $false } - It 'Should return same as "Test-AzDevOpsApiObjectId" - ""' -TestCases $testCasesInvalidProjectIds { + It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesInvalidProjectIds { param ([string]$ProjectId) $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsApiObjectId -ObjectId $ProjectId -IsValid) + $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid) } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 similarity index 92% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 index 5c1a180d1..7d247f79a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -9,7 +9,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { return $(Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid') | ForEach-Object { @{ @@ -43,11 +43,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { + It 'Should call "Get-AzDevOpsApiResource" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { param ([string]$ApiUri, [string]$Pat) Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -68,11 +68,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { param ([string]$ApiUri, [string]$Pat, [string]$OperationId) Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 similarity index 91% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index 7f5005d53..4a7bdb172 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -9,7 +9,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiObject { + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' @@ -51,11 +51,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { + It 'Should call "Get-AzDevOpsApiResource" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { param ([string]$ApiUri, [string]$Pat) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -78,11 +78,11 @@ InModuleScope $script:subModuleName { Context 'When a "Project" with supplied "ProjectName" parameter value exists' { - It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } } @@ -113,11 +113,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiObject" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null - Should -Invoke Get-AzDevOpsApiObject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It } Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Objects/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index bb85db3dc..9f6693aef 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -18,8 +18,8 @@ function Get-TestCaseValue ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiVersion','Pat',` - 'ObjectName','ProjectName','OrganizationName',` - 'ObjectId','OperationId','ProjectId')] + 'ResourceName','ProjectName','OrganizationName',` + 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -211,8 +211,8 @@ function Get-TestCaseValue } - # ObjectName - $testCaseValues.ObjectName = @{ + # ResourceName + $testCaseValues.ResourceName = @{ Valid = @( 'Operation', @@ -220,11 +220,11 @@ function Get-TestCaseValue ) Invalid = @( - 'NonObject', - 'SomeOtherInvalidObject', - 'Some Object', # Contains space - ' Some Object', # Leading space - 'Some Object ' # Trailing space + 'NonResource', + 'SomeOtherInvalidResource', + 'Some Resource', # Contains space + ' Some Resource', # Leading space + 'Some Resource ' # Trailing space ) Empty = $testCaseValues.String.Empty @@ -234,8 +234,8 @@ function Get-TestCaseValue } - # ObjectId - $testCaseValues.ObjectId = @{ + # ResourceId + $testCaseValues.ResourceId = @{ Valid = @( 'd59709e7-6fdf-40c6-88fa-ac5dc10bbfc3', @@ -256,12 +256,12 @@ function Get-TestCaseValue } - # OperationId (derived from ObjectId) - $testCaseValues.OperationId = $testCaseValues.ObjectId + # OperationId (derived from ResourceId) + $testCaseValues.OperationId = $testCaseValues.ResourceId - # ProjectId (derived from ObjectId) - $testCaseValues.ProjectId = $testCaseValues.ObjectId + # ProjectId (derived from ResourceId) + $testCaseValues.ProjectId = $testCaseValues.ResourceId return $testCaseValues[$ScopeName][$TestCaseName] @@ -288,8 +288,8 @@ function Get-TestCase ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiVersion','Pat',` - 'ObjectName','ProjectName','OrganizationName',` - 'ObjectId','OperationId','ProjectId')] + 'ResourceName','ProjectName','OrganizationName',` + 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, From ddecaf0e143537d8641b52658d0e02f470070cb6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 14:19:10 +0000 Subject: [PATCH 124/611] Added 'Get-AzDevOpsApiUriAreaName' function --- .../Private/Get-AzDevOpsApiUriAreaName.ps1 | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 new file mode 100644 index 000000000..fd04a3f64 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 @@ -0,0 +1,40 @@ +<# + .SYNOPSIS + Returns an array of all the Azure DevOps API, URI-specific, 'Area' names that can used/managed. + + .EXAMPLE + Get-AzDevOpsApiUriAreaName + + Returns all the names of the URI-specific, area names that can be used/managed in the Azure DevOps API. + + .EXAMPLE + Get-AzDevOpsApiUriAreaName -ResourceName 'YourResourceNameHere' + + Returns the URI-specific, resource name that can be used/managed in the Azure DevOps API for the given + 'ResourceName' (e.g. 'Project' or 'Operation') +#> +function Get-AzDevOpsApiUriAreaName +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName + ) + + [hashtable]$resourceNameToApiUriAreaName = @{ + + Operation = 'core' # Note: Not explicitly listed here in documentation + Project = 'core' + } + + if (![string]::IsNullOrWhiteSpace($ResourceName)) + { + return $resourceNameToApiUriAreaName[$ResourceName] + } + + return $resourceNameToApiUriAreaName.Values +} From 13bca64acbf9413cc0ac67267a60df807eb7a486 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 14:19:23 +0000 Subject: [PATCH 125/611] Added 'Get-AzDevOpsApiUriResourceName' function --- .../Get-AzDevOpsApiUriResourceName.ps1 | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 new file mode 100644 index 000000000..4c767c5a7 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 @@ -0,0 +1,39 @@ +<# + .SYNOPSIS + Returns an array of all the Azure DevOps API, URI-specific, 'Resource' names that can used/managed. + + .EXAMPLE + Get-AzDevOpsApiUriResourceName + + Returns all the names of the URI-specific, resource names that can be used/managed in the Azure DevOps API. + + .EXAMPLE + Get-AzDevOpsApiUriResourceName -ResourceName 'YourResourceNameHere' + + Returns the URI-specific, resource name that can be used/managed in the Azure DevOps API for the given + 'ResourceName' (e.g. 'Project' or 'Operation') +#> +function Get-AzDevOpsApiUriResourceName +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName + ) + + [hashtable]$resourceNameToApiUriResourceName = @{ + Operation = 'operations' + Project = 'projects' + } + + if (![string]::IsNullOrWhiteSpace($ResourceName)) + { + return $resourceNameToApiUriResourceName[$ResourceName] + } + + return $resourceNameToApiUriResourceName.Values +} From 560f87f767716ac3b27bfdf4c888728bce743a00 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 14:20:04 +0000 Subject: [PATCH 126/611] Updated 'Get-AzDevOpsApiResourceUri' function to make use of 'Get-AzDevOpsApiUriAreaName' and 'Get-AzDevOpsApiUriResourceName' functions. --- .../Private/Get-AzDevOpsApiResourceUri.ps1 | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 index 056536726..dd3cb81c8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 @@ -60,23 +60,41 @@ function Get-AzDevOpsApiResourceUri [string]$apiResourceUri = $ApiUri + # Obtain URI-specific names relating to $ResourceName + [string]$apiUriResourceAreaName = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName + [string]$apiUriResourceName = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName - # TODO: Need something to pluralise and lowercase this resource for the URI - $resourceNamePluralUriString = $ResourceName.ToLower() + "s" + # Append the URI-specific, 'AreaName' of the 'Resource' onto the URI (only if not in the 'core' area) + if ($apiResourceAreaName -ne 'core') + { + $apiResourceUri = $apiResourceUri + "$apiUriResourceAreaName/" + } + - # TODO: Need to get this from input parameter? - $apiVersionUriParameter = "api-version=$ApiVersion" + # Append the URI-specific, 'ResourceName' of the 'Resource' onto the URI + $apiResourceUri = $apiResourceUri + "$apiUriResourceName/" - # TODO: Need to generate this from a function - $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" + + # Append the identifier of the resource, if provided if (![System.String]::IsNullOrWhiteSpace($ResourceId)) { - $apiResourceUri = $apiResourceUri + "/$ResourceId" + $apiResourceUri = $apiResourceUri + "$ResourceId/" } - $apiResourceUri = $apiResourceUri + '?' + $apiVersionUriParameter + # Append any parameters to the URI + $apiResourceUriParameters = @{ + "api-version" = $ApiVersion # Taken from input parameter + } + + $apiResourceUri = $apiResourceUri + '?' + $apiResourceUriParameters.Keys | ForEach-Object { + + $apiResourceUri = $apiResourceUri + '&' + $_ + '=' + $apiResourceUriParameters[$_] + } + $apiResourceUri = $apiResourceUri.Replace('/?&','?') # Tidy up the end of base URI where initial parameter begins + return $apiResourceUri } From 4e0204c08481509a1a30f3d7d688170546ccbc95 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 14:21:02 +0000 Subject: [PATCH 127/611] Updated 'Get-AzDevOpsApiResource' function to make use of 'Get-AzDevOpsApiResourceUri' function --- .../Private/Get-AzDevOpsApiResource.ps1 | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 index 1aff94046..fec95c580 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 @@ -71,35 +71,22 @@ function Get-AzDevOpsApiResource $ResourceId ) - # Remove any $ResourceId if using a wildcard character - # TODO: Might want to make this more generic (i.e. if !(Test-AzDevOpsApiResourceId $ResourceId -IsValid') then set to $null) - if ($ResourceId -contains '*') - { - $ResourceId = $null - } - - # TODO: Need something to pluralise and lowercase this resource for the URI - $resourceNamePluralUriString = $ResourceName.ToLower() + "s" - - # TODO: Need to get this from input parameter? - $apiVersionUriParameter = "api-version=$ApiVersion" - # TODO: Need to generate this from a function - $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" - if (![System.String]::IsNullOrWhiteSpace($ResourceId)) - { - $apiResourceUri = $apiResourceUri + "/$ResourceId" + $apiResourceUriParameters = @{ + ApiUri = $ApiUri + ApiVersion = $ApiVersion + ResourceName = $ResourceName } - $apiResourceUri = $apiResourceUri + '?' + $apiVersionUriParameter - + [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - # TODO: Need to tidy up? - [System.Object[]]$apiObjects = @() + + [System.Object[]]$apiResources = @() $apiResources += Invoke-RestMethod -Uri $apiResourceUri -Method 'Get' -Headers $apiHttpRequestHeader + # If not a single, resource request, set from the resource(s) in the 'value' property within the response if ([System.String]::IsNullOrWhiteSpace($ResourceId)) { From 328f7e9b093b842a6b3590cf93622bf17741df43 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 15:02:15 +0000 Subject: [PATCH 128/611] Added tests for 'Get-AzDevOpsApiUriAreaName' and 'Get-AzDevOpsApiUriResourceName' --- .../Private/Get-AzDevOpsApiUriAreaName.ps1 | 4 +- .../Get-AzDevOpsApiUriResourceName.ps1 | 8 +- .../Get-AzDevOpsApiUriAreaName.Tests.ps1 | 83 +++++++++++++++++++ .../Get-AzDevOpsApiUriResourceName.Tests.ps1 | 83 +++++++++++++++++++ .../Modules/TestHelpers/CommonTestCases.psm1 | 43 +++++++++- 5 files changed, 213 insertions(+), 8 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 index fd04a3f64..d70fc4de7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 @@ -19,7 +19,7 @@ function Get-AzDevOpsApiUriAreaName [OutputType([System.Object[]])] param ( - [Parameter(Mandatory=$true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] [System.String] $ResourceName @@ -36,5 +36,5 @@ function Get-AzDevOpsApiUriAreaName return $resourceNameToApiUriAreaName[$ResourceName] } - return $resourceNameToApiUriAreaName.Values + return $resourceNameToApiUriAreaName.Values | Select-Object -Unique } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 index 4c767c5a7..123891c59 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 @@ -19,21 +19,21 @@ function Get-AzDevOpsApiUriResourceName [OutputType([System.Object[]])] param ( - [Parameter(Mandatory=$true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] [System.String] $ResourceName ) - [hashtable]$resourceNameToApiUriResourceName = @{ + [hashtable]$apiResourceNameToApiUriResourceName = @{ Operation = 'operations' Project = 'projects' } if (![string]::IsNullOrWhiteSpace($ResourceName)) { - return $resourceNameToApiUriResourceName[$ResourceName] + return $apiResourceNameToApiUriResourceName[$ResourceName] } - return $resourceNameToApiUriResourceName.Values + return $apiResourceNameToApiUriResourceName.Values } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 new file mode 100644 index 000000000..14065ea18 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 @@ -0,0 +1,83 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiUriAreaName' -Tag 'GetAzDevOpsApiUriAreaName' { + + Context 'When called with valid parameters' { + + Context 'When called without "-ResourceName" parameter' { + + BeforeAll { + + $testCasesValidApiUriAreaName = Get-TestCase -ScopeName 'ApiUriAreaName' -TestCaseName 'Valid' + } + + It 'Should not throw' { + param () + + { Get-AzDevOpsApiUriAreaName } | Should -Not -Throw + } + + It 'Should return "object[]" or "string"' { + param () + + $result = Get-AzDevOpsApiUriAreaName + $result.GetType() | Should -BeIn @(@('ApiUriAreaName1','ApiUriAreaName2').GetType(),'ApiUriAreaName1'.GetType()) + } + + It 'Should return all resources that are present in $testCasesValidApiUriAreaName variable'{ + param () + + [string[]]$result = Get-AzDevOpsApiUriAreaName + $result.Count | Should -Be $($testCasesValidApiUriAreaName.Count) + } + } + + Context 'When called with valid "-ResourceName" parameter' { + + $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + + BeforeAll { + } + + It 'Should not throw - ""' -TestCases $testCasesValidResourceName { + param ([string]$ResourceName) + Write-Verbose $ResourceName + + { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName} | Should -Not -Throw + } + + It 'Should return "string" - ""' -TestCases $testCasesValidResourceName { + param ([string]$ResourceName) + + [string]$result = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName + $result.GetType() | Should -Be @('ApiUriAreaName1'.GetType()) + } + + } + + Context 'When called with invalid "-ResourceName" parameter' { + + $testCasesInvalidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + + BeforeAll { + } + + It 'Should throw - ""' -TestCases $testCasesInvalidResourceName { + param ([string]$ResourceName) + Write-Verbose $ResourceName + + { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName} | Should -Throw + } + + } + + } + + } + +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 new file mode 100644 index 000000000..37b665d1e --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 @@ -0,0 +1,83 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiUriResourceName' -Tag 'GetAzDevOpsApiUriResourceName' { + + Context 'When called with valid parameters' { + + Context 'When called without "-ResourceName" parameter' { + + BeforeAll { + + $testCasesValidApiUriResourceName = Get-TestCase -ScopeName 'ApiUriResourceName' -TestCaseName 'Valid' + } + + It 'Should not throw' { + param () + + { Get-AzDevOpsApiUriResourceName } | Should -Not -Throw + } + + It 'Should return "object[]" or "string"' { + param () + + $result = Get-AzDevOpsApiUriResourceName + $result.GetType() | Should -BeIn @(@('ApiUriResourceName1','ApiUriResourceName2').GetType(),'ApiUriResourceName1'.GetType()) + } + + It 'Should return all resources that are present in $testCasesValidApiUriResourceName variable'{ + param () + + [string[]]$result = Get-AzDevOpsApiUriResourceName + $result.Count | Should -Be $($testCasesValidApiUriResourceName.Count) + } + } + + Context 'When called with valid "-ResourceName" parameter' { + + $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + + BeforeAll { + } + + It 'Should not throw - ""' -TestCases $testCasesValidResourceName { + param ([string]$ResourceName) + Write-Verbose $ResourceName + + { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName} | Should -Not -Throw + } + + It 'Should return "string" - ""' -TestCases $testCasesValidResourceName { + param ([string]$ResourceName) + + [string]$result = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName + $result.GetType() | Should -Be @('ApiUriResourceName1'.GetType()) + } + + } + + Context 'When called with invalid "-ResourceName" parameter' { + + $testCasesInvalidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + + BeforeAll { + } + + It 'Should throw - ""' -TestCases $testCasesInvalidResourceName { + param ([string]$ResourceName) + Write-Verbose $ResourceName + + { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName} | Should -Throw + } + + } + + } + + } + +} diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 9f6693aef..fa7b36c3e 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -17,7 +17,7 @@ function Get-TestCaseValue param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','ApiVersion','Pat',` + [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` 'ResourceName','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] @@ -103,6 +103,45 @@ function Get-TestCaseValue } + # ApiUriAreaName + $testCaseValues.ApiUriAreaName = @{ + + Valid = @( + 'core' + ) + + Invalid = @( + + 'invalidApiUriAreaName' + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # ApiUriResourceName + $testCaseValues.ApiUriResourceName = @{ + + Valid = @( + 'operations', + 'projects' + ) + + Invalid = @( + + 'invalidApiUriResourceName' + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # ApiVersion $testCaseValues.ApiVersion = @{ @@ -287,7 +326,7 @@ function Get-TestCase param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','ApiVersion','Pat',` + [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` 'ResourceName','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] From 0f577017be67230741336bc40ee1df2c56b22de5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:35:30 +0000 Subject: [PATCH 129/611] Added 'DSC_AzDevOpsProject' to 'DscResourcesToExport' property array in module manifest --- source/AzureDevOpsDsc.psd1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index 64ef90275..4f260e201 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -1,6 +1,8 @@ @{ + RootModule = 'AzureDevOpsDsc.psm1' + # Version number of this module. - moduleVersion = '0.0.1' + moduleVersion = '0.0.3' # ID used to uniquely identify this module GUID = '3f8bbada-0fa9-4d80-b3d8-f019c3c60230' @@ -35,7 +37,7 @@ # Aliases to export from this module AliasesToExport = @() - DscResourcesToExport = @() + DscResourcesToExport = @('DSC_AzDevOpsProject') RequiredAssemblies = @() From 037ca68cc8f74803c1b1604cf488da85475aff1b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:36:25 +0000 Subject: [PATCH 130/611] Added validation and use of $ResourceId within 'Get-AzDevOpsApiResource' --- .../Api/Functions/Private/Get-AzDevOpsApiResource.ps1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 index fec95c580..4c805739a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 @@ -71,12 +71,20 @@ function Get-AzDevOpsApiResource $ResourceId ) + if ($ResourceId -contains '*') + { + $ResourceId = $null + } $apiResourceUriParameters = @{ ApiUri = $ApiUri ApiVersion = $ApiVersion ResourceName = $ResourceName } + if (![string]::IsNullOrWhiteSpace($ResourceId)) + { + $apiResourceUriParameters.ResourceId = $ResourceId + } [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters From e93f857d00baca4eb8f5d5c49904eefdd46836f4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:36:49 +0000 Subject: [PATCH 131/611] Deleted 'README.md' file --- .../DSC_AzDevOpsProject/README.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 source/DSCClassResources/DSC_AzDevOpsProject/README.md diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/README.md b/source/DSCClassResources/DSC_AzDevOpsProject/README.md deleted file mode 100644 index 2d691e59f..000000000 --- a/source/DSCClassResources/DSC_AzDevOpsProject/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Description - -The `SqlAG` DSC resource is used to create, remove, and update an Always On -Availability Group. It will also manage the Availability Group replica on the -specified node. - -## Requirements - -* Target machine must be running Windows Server 2012 or later. -* Target machine must be running SQL Server Database Engine 2012 or later. -* 'NT SERVICE\ClusSvc' or 'NT AUTHORITY\SYSTEM' must have the 'Connect SQL', - 'Alter Any Availability Group', and 'View Server State' permissions. - -## Known issues - -All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/SqlServerDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+SqlAG). From c4dbaa4f3efc7d97b85c81be1ff4517eb0f240f9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:37:44 +0000 Subject: [PATCH 132/611] Updated 'New-AzDevOpsProject' to remove mandatory $ProjectId parameter and correct typo in call to 'New-AzDevOpsApiResource' --- .../Resources/Functions/Public/New-AzDevOpsProject.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index 3ef1fac75..71874ba43 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -54,7 +54,7 @@ function New-AzDevOpsProject [System.String] $Pat, - [Parameter(Mandatory = $true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] [Alias('Id')] [System.String] @@ -102,10 +102,10 @@ function New-AzDevOpsProject if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $resourceName)) { - [System.Object]$resource = New-AzDevOpsApiResource -$ApiUri $ApiUri -Pat $Pat ` - -ResourceName 'Project' ` - -Resource $($resourceJson | ConvertFrom-Json) ` - -Force:$Force + [System.Object]$resource = New-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName 'Project' ` + -Resource $($resourceJson | ConvertFrom-Json) ` + -Force:$Force -Wait } return $resource From 84e6e9bd83ef97c439469fea790b03883b90d3fd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:38:14 +0000 Subject: [PATCH 133/611] Corrected $apiResourceAreaName variable name in 'Get-AzDevOpsApiResourceUri' --- .../Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 index dd3cb81c8..92894d6e9 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 @@ -66,7 +66,7 @@ function Get-AzDevOpsApiResourceUri # Append the URI-specific, 'AreaName' of the 'Resource' onto the URI (only if not in the 'core' area) - if ($apiResourceAreaName -ne 'core') + if ($apiUriResourceAreaName -ne 'core') { $apiResourceUri = $apiResourceUri + "$apiUriResourceAreaName/" } From b19387a23ee914dca0b25b66939e282bbb2fe80b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:38:46 +0000 Subject: [PATCH 134/611] Corrected call to 'Get-AzDevOpsApiResource' in 'New-AzDevOpsApiResource' --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 2f923a574..3ccb61e49 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -107,9 +107,9 @@ function New-AzDevOpsApiResource -IsSuccessful # Obtains and returns the new resource - New-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` - -ResourceName $ResourceName ` - -ResourceId $ResourceId # TODO: Might have to remove the assumption that this works (see above also). Input resource's 'id' value looks to be ignored when creating resource. + Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId # TODO: Might have to remove the assumption that this works (see above also). Input resource's 'id' value looks to be ignored when creating resource. } } } From 0cf48e7a0576b98b4f9b77817357878fefa7ea04 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:45:07 +0000 Subject: [PATCH 135/611] Added 'Test-AzDevOpsProjectDescription' function and tests --- .../Test-AzDevOpsProjectDescription.ps1 | 51 +++++++++ .../Test-AzDevOpsProjectDescription.Tests.ps1 | 100 ++++++++++++++++++ .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++- 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 new file mode 100644 index 000000000..0511f80be --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -0,0 +1,51 @@ +<# + .SYNOPSIS + Peforms test on a provided 'ProjectDescription' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER ProjectDescription + The 'ProjectDescription' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'ProjectDescription' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsProjectDescription -ProjectDescription 'YourProjectDescriptionHere' -IsValid + + Returns $true if the 'ProjectDescription' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsProjectDescription +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ProjectDescription, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + if ([System.String]::IsNullOrWhiteSpace($ProjectDescription) -or + ($ProjectDescription.Contains('%') -or $ProjectDescription.Contains('*') -or $ProjectDescription.StartsWith(' ') -or $ProjectDescription.EndsWith(' '))) + { + return $false + } + + return $true +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 new file mode 100644 index 000000000..1323dd9cf --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -0,0 +1,100 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectDescription' -Tag 'TestAzDevOpsProjectDescription' { + + $testCasesValidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Valid' + $testCasesEmptyProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Empty' + $testCasesInvalidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Invalid' + + Context 'When called with valid parameters' { + BeforeAll { + } + + Context 'When called using "-IsValid" switch' { + + Context 'When called with valid "ProjectDescription" parameter' { + + It 'Should not throw - ""' -TestCases $testCasesValidProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidProjectDescriptions { + param ([string]$ProjectDescription) + + $result = Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid + $result | Should -Be $true + } + } + + Context 'When called with invalid "ProjectDescription" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Throw + } + + It 'Should not throw - ""' -TestCases $testCasesInvalidProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectDescriptions { + param ([string]$ProjectDescription) + + $result = Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid + $result | Should -Be $false + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + $testCasesValidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Valid' + + Context 'When called without using "-IsValid" switch' { + + Context 'When called with valid "ProjectDescription" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw + } + + } + + Context 'When called with invalid "ProjectDescription" parameter' { + + It 'Should throw - ""' -TestCases $testCasesEmptyProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw + } + + It 'Should throw - ""' -TestCases $testCasesInvalidProjectDescriptions { + param ([string]$ProjectDescription) + + { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw + } + + } + + } + } + + } +} diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index fa7b36c3e..bf9dd734a 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -18,7 +18,7 @@ function Get-TestCaseValue ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName','ProjectName','OrganizationName',` + 'ResourceName','ProjectDescription','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -223,6 +223,33 @@ function Get-TestCaseValue } + # ProjectDescription + $testCaseValues.ProjectDescription = @{ + + Valid = @( + 'ProjectDescription', + 'Project Description', + 'Project-Description', + 'Project_Description' + ) + + Invalid = @( + '%', # Just '%' character + '*', # Just '*' character + 'Project%Description', # Contains '%' + 'Project*Description' # Contains '*' + ' ProjectDescription', # Leading ' ' (whitespace) + 'ProjectDescription ', # Trailing ' ' (whitespace) + ' ProjectDescription ' # Leading and trailing ' ' (whitespace) + ) + $testCaseValues.String.Whitespace # Any that are just whitespace characters + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # ProjectName $testCaseValues.ProjectName = @{ @@ -327,7 +354,7 @@ function Get-TestCase ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName','ProjectName','OrganizationName',` + 'ResourceName','ProjectDescription','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, From 688cbc1f928e27769253e10bc5bd49bc58b77e6e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:46:49 +0000 Subject: [PATCH 136/611] Removed 'DSCClassResources' files (for now) --- .../DSC_AzDevOpsProject.psm1 | 100 ------------------ .../en-US/DSC_AzDevOpsProject.strings.psd1 | 2 - 2 files changed, 102 deletions(-) delete mode 100644 source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 delete mode 100644 source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 b/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 deleted file mode 100644 index 98e73d689..000000000 --- a/source/DSCClassResources/DSC_AzDevOpsProject/DSC_AzDevOpsProject.psm1 +++ /dev/null @@ -1,100 +0,0 @@ -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -$script:azureDevOpsDscServerModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Server' -$script:azureDevOpsDscServicesModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Services' -#$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' - -Import-Module -Name $script:azureDevOpsDscCommonModulePath -Import-Module -Name $script:azureDevOpsDscServerModulePath -Import-Module -Name $script:azureDevOpsDscServicesModulePath -#Import-Module -Name $script:dscResourceCommonModulePath - -$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - - -enum Ensure -{ - Present - Absent -} - - -[DscResource()] -class DSC_AzDevOpsProject -{ - - [DscProperty()] - [Ensure]$Ensure - - - [DscProperty()] - [Alias('Uri')] - [string]$ApiUri - - [DscProperty()] - [Alias('PersonalAccessToken')] - [string]$Pat - - - [DscProperty()] - [Alias('Id')] - [string]$ProjectId = '*' - - [DscProperty(Key, Mandatory)] - [Alias('Name')] - [string]$ProjectName - - [DscProperty()] - [Alias('Description')] - [string]$ProjectDescription - - [hashtable]GetAzDevOpsResource() - { - $getParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - ProjectId = $(if ([string]::IsNullOrWhiteSpace($this.ProjectId)) { [guid]::NewGuid().ToString() }else{$this.ProjectId}) - ProjectName = $this.ProjectName - } - - return Get-AzDevOpsProject @getParameters - } - - [DSC_AzDevOpsProject] Get() - { - $project = $this.GetAzDevOpsResource() - - if ($null -eq $project) - { - return $null - } - - return [DSC_AzDevOpsProject]@{ - - # Existing properties - Ensure = $this.Ensure - ApiUri = $this.ApiUri - Pat = $this.Pat - - # Updated properties (from 'Get') - ProjectId = $project.id - ProjectName = $project.name - ProjectDescription = $project.description - } - - } - - - [bool] Test() - { - #$current = $this.Get() - return $true - } - - - [void] Set() - { - #$current = $this.Get() - } - - -} diff --git a/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 b/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 deleted file mode 100644 index 3b35d6611..000000000 --- a/source/DSCClassResources/DSC_AzDevOpsProject/en-US/DSC_AzDevOpsProject.strings.psd1 +++ /dev/null @@ -1,2 +0,0 @@ -ConvertFrom-StringData @' -'@ From a994f2647c4fae5cdb49e8ef2f97f87d73e9ecd2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:47:41 +0000 Subject: [PATCH 137/611] Commented out 'DSC_AzDevOpsProject' unit tests (for now) --- .../DSC_AzDevOpsProject.Tests.ps1 | 380 +++++++++--------- 1 file changed, 190 insertions(+), 190 deletions(-) diff --git a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 index 966bc79fb..c1ff0ef6e 100644 --- a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 @@ -1,201 +1,201 @@ -<# - .SYNOPSIS - Automated unit test for DSC_AzDevOpsProject DSC resource. -#> - -$script:dscModuleName = 'AzureDevOpsDsc' -$script:dscResourceName = 'DSC_AzDevOpsProject' - -function Invoke-TestSetup -{ - try - { - Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' - } - catch [System.IO.FileNotFoundException] - { - throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' - } +# <# +# .SYNOPSIS +# Automated unit test for DSC_AzDevOpsProject DSC resource. +# #> + +# $script:dscModuleName = 'AzureDevOpsDsc' +# $script:dscResourceName = 'DSC_AzDevOpsProject' + +# function Invoke-TestSetup +# { +# try +# { +# Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' +# } +# catch [System.IO.FileNotFoundException] +# { +# throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' +# } - $script:testEnvironment = Initialize-TestEnvironment ` - -DSCModuleName $script:dscModuleName ` - -DSCResourceName $script:dscResourceName ` - -ResourceType 'Class' ` - -TestType 'Unit' -} +# $script:testEnvironment = Initialize-TestEnvironment ` +# -DSCModuleName $script:dscModuleName ` +# -DSCResourceName $script:dscResourceName ` +# -ResourceType 'Class' ` +# -TestType 'Unit' +# } -function Invoke-TestCleanup -{ - Restore-TestEnvironment -TestEnvironment $script:testEnvironment -} +# function Invoke-TestCleanup +# { +# Restore-TestEnvironment -TestEnvironment $script:testEnvironment +# } -# Begin Testing - -Invoke-TestSetup +# # Begin Testing + +# Invoke-TestSetup -try -{ - InModuleScope $script:dscResourceName { - Set-StrictMode -Version 1.0 +# try +# { +# InModuleScope $script:dscResourceName { +# Set-StrictMode -Version 1.0 - Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { - BeforeAll { - #$mockInstanceName = 'DSCTEST' - - #Mock -CommandName Import-SQLPSModule - } - } - - Describe 'AzDevOpsProject\Get' -Tag 'Get' { - - - - BeforeAll { - - $getApiUri = "https://www.someUri.api/_apis/" - $getPat = "1234567890123456789012345678901234567890123456789012" - - $getProjectId = [GUID]::NewGuid().ToString() - $getProjectName = "ProjectName_$projectId" - $getProjectDescription = "ProjectDescription_$projectId" - - $getAzDevOpsResource = @{ - id = $getProjectId - name = $getProjectName - description = $getProjectDescription - } - - $AzDevOpsProjectResource = [DSC_AzDevOpsProject]@{ - ApiUri = $getApiUri - Pat = $getPat - ProjectId = $getProjectId - ProjectName = $getProjectName - ProjectDescription = $getProjectDescription - } - } - - - Context 'When Azure DevOps is not in the desired state' { - Context 'When the Azure DevOps "Project" does not exist' { - BeforeAll { - - $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { - return $null - } -Force -PassThru - - } - - It 'Should return the correct values' { - $getResult = $AzDevOpsProjectResource.Get() - - $getResult | Should -Be $null - $getResult.ApiUri | Should -Be $null - $getResult.Pat | Should -Be $null - $getResult.ProjectId | Should -Be $null - $getResult.ProjectName | Should -Be $null - $getResult.ProjectDescription | Should -Be $null - } - } - - - Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { - BeforeAll { - $differentProjectId = [GUID]::NewGuid().ToString() - $getAzDevOpsResource.ProjectId = $differentProjectId - - $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { - return $getAzDevOpsResource - } -Force -PassThru - - } - - It 'Should return the correct values, with "ProjectId" values different' { - $getResult = $AzDevOpsProjectResource.Get() - - $getResult.ApiUri | Should -Be $getApiUri - $getResult.Pat | Should -Be $getPat - $getResult.ProjectId | Should -Not -Be $differentProjectId # Different - $getResult.ProjectName | Should -Be $getProjectName - $getResult.ProjectDescription | Should -Be $getProjectDescription - } - } +# Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { +# BeforeAll { +# #$mockInstanceName = 'DSCTEST' + +# #Mock -CommandName Import-SQLPSModule +# } +# } + +# Describe 'AzDevOpsProject\Get' -Tag 'Get' { + + + +# BeforeAll { + +# $getApiUri = "https://www.someUri.api/_apis/" +# $getPat = "1234567890123456789012345678901234567890123456789012" + +# $getProjectId = [GUID]::NewGuid().ToString() +# $getProjectName = "ProjectName_$projectId" +# $getProjectDescription = "ProjectDescription_$projectId" + +# $getAzDevOpsResource = @{ +# id = $getProjectId +# name = $getProjectName +# description = $getProjectDescription +# } + +# $AzDevOpsProjectResource = [DSC_AzDevOpsProject]@{ +# ApiUri = $getApiUri +# Pat = $getPat +# ProjectId = $getProjectId +# ProjectName = $getProjectName +# ProjectDescription = $getProjectDescription +# } +# } + + +# Context 'When Azure DevOps is not in the desired state' { +# Context 'When the Azure DevOps "Project" does not exist' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $null +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult | Should -Be $null +# $getResult.ApiUri | Should -Be $null +# $getResult.Pat | Should -Be $null +# $getResult.ProjectId | Should -Be $null +# $getResult.ProjectName | Should -Be $null +# $getResult.ProjectDescription | Should -Be $null +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { +# BeforeAll { +# $differentProjectId = [GUID]::NewGuid().ToString() +# $getAzDevOpsResource.ProjectId = $differentProjectId + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectId" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Not -Be $differentProjectId # Different +# $getResult.ProjectName | Should -Be $getProjectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } - Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { - BeforeAll { - $differentProjectName = "z" + $getAzDevOpsResource.ProjectName - $getAzDevOpsResource.ProjectName = $differentProjectName +# Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { +# BeforeAll { +# $differentProjectName = "z" + $getAzDevOpsResource.ProjectName +# $getAzDevOpsResource.ProjectName = $differentProjectName - $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { - return $getAzDevOpsResource - } -Force -PassThru +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru - } - - It 'Should return the correct values, with "ProjectName" values different' { - $getResult = $AzDevOpsProjectResource.Get() +# } + +# It 'Should return the correct values, with "ProjectName" values different' { +# $getResult = $AzDevOpsProjectResource.Get() - $getResult.ApiUri | Should -Be $getApiUri - $getResult.Pat | Should -Be $getPat - $getResult.ProjectId | Should -Be $getProjectId - $getResult.ProjectName | Should -Not -Be $differentProjectName # Different - $getResult.ProjectDescription | Should -Be $getProjectDescription - } - } +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Not -Be $differentProjectName # Different +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } - Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { - BeforeAll { - $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription - $getAzDevOpsResource.ProjectDescription = $differentProjectDescription - - $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { - return $getAzDevOpsResource - } -Force -PassThru - - } - - It 'Should return the correct values, with "ProjectDescription" values different' { - $getResult = $AzDevOpsProjectResource.Get() - - $getResult.ApiUri | Should -Be $getApiUri - $getResult.Pat | Should -Be $getPat - $getResult.ProjectId | Should -Be $getProjectId - $getResult.ProjectName | Should -Be $getprojectName - $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different - } - } - } - - Context 'When Azure DevOps is in the desired state' { - BeforeAll { - - $AzDevOpsProjectResource = $AzDevOpsProjectResource | - Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { - return $getAzDevOpsResource - } -Force -PassThru - - } - - It 'Should return the correct values' { - $getResult = $AzDevOpsProjectResource.Get() - - $getResult.ApiUri | Should -Be $getApiUri - $getResult.Pat | Should -Be $getPat - $getResult.ProjectId | Should -Be $getProjectId - $getResult.ProjectName | Should -Be $getprojectName - $getResult.ProjectDescription | Should -Be $getProjectDescription - } - - } - } - - } -} -finally -{ - Invoke-TestCleanup -} +# Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { +# BeforeAll { +# $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription +# $getAzDevOpsResource.ProjectDescription = $differentProjectDescription + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectDescription" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different +# } +# } +# } + +# Context 'When Azure DevOps is in the desired state' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } + +# } +# } + +# } +# } +# finally +# { +# Invoke-TestCleanup +# } From ad60bf7e207f2b0e2aa31c94bcb9ab08319022da Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:48:15 +0000 Subject: [PATCH 138/611] Added 'AzureDevOpsDsc.psm1' file with 'DSC_AzDevOpsProject' class resource --- source/AzureDevOpsDsc.psm1 | 142 +++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 source/AzureDevOpsDsc.psm1 diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 new file mode 100644 index 000000000..d3cabf638 --- /dev/null +++ b/source/AzureDevOpsDsc.psm1 @@ -0,0 +1,142 @@ +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' +$script:azureDevOpsDscServerModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Server' +$script:azureDevOpsDscServicesModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Services' +#$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' + +Import-Module -Name $script:azureDevOpsDscCommonModulePath +Import-Module -Name $script:azureDevOpsDscServerModulePath +Import-Module -Name $script:azureDevOpsDscServicesModulePath +#Import-Module -Name $script:dscResourceCommonModulePath +# +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +enum Ensure +{ + Present + Absent +} + + +[DscResource()] +class DSC_AzDevOpsProject +{ + + [DscProperty()] + [string]$Ensure + + + [DscProperty()] + [Alias('Uri')] + [string]$ApiUri + + [DscProperty()] + [Alias('PersonalAccessToken')] + [string]$Pat + + + [DscProperty()] + [Alias('Id')] + [string]$ProjectId + + [DscProperty(Key, Mandatory)] + [Alias('Name')] + [string]$ProjectName + + [DscProperty()] + [Alias('Description')] + [string]$ProjectDescription + + + [PSCustomObject]GetAzDevOpsResource() + { + $getParameters = @{ + ApiUri = $this.ApiUri + Pat = $this.Pat + + ProjectName = $this.ProjectName + } + + if (![string]::IsNullOrWhiteSpace($this.ProjectId)) + { + $getParameters.ProjectId = $this.ProjectId + } + + return Get-AzDevOpsProject @getParameters + } + + + [DSC_AzDevOpsProject] Get() + { + $existing = $this.GetAzDevOpsResource() + + if ($null -eq $existing) + { + return $null + } + + return [DSC_AzDevOpsProject]@{ + + # Existing properties + Ensure = $this.Ensure + ApiUri = $this.ApiUri + Pat = $this.Pat + + # Updated properties (from 'Get') + ProjectId = $existing.id + ProjectName = $existing.name + ProjectDescription = $existing.description + } + + } + + + [bool] Test() + { + $existing = $this.Get() + + if ($existing.ProjectDescription -ne $this.ProjectDescription -or + $existing.SourceControlType -ne $this.SourceControlType) + { + return $false + } + + return $true + } + + + [void] Set() + { + $existing = $this.Get() + + + $setParameters = @{ + ApiUri = $this.ApiUri + Pat = $this.Pat + + ProjectName = $this.ProjectName + ProjectDescription = $this.ProjectDescription + SourceControlType = 'Git' + } + + if (![string]::IsNullOrWhiteSpace($this.ProjectId)) + { + $setParameters.ProjectId = $this.ProjectId + } + + + if ($null -eq $existing) + { + New-AzDevOpsProject @setParameters -Force | Out-Null + } + else + { + throw 'Need to implement "Set-AzDevOpsProject" (using PATCH)' + Set-AzDevOpsProject @setParameters -Force | Out-Null + } + + + } + + +} From a2ac5e12767a5d8371ca32a95350d4ae4a3a0200 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 20:51:42 +0000 Subject: [PATCH 139/611] Setup initial, working. Integration tests for 'DSC_AzDevOpsProject', class-based, DSC resource. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 106 ++++++++++++++++++ .../DSC_AzDevOpsProject.config.ps1 | 62 ++++++++++ 2 files changed, 168 insertions(+) create mode 100644 tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 create mode 100644 tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 new file mode 100644 index 000000000..867834cd1 --- /dev/null +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -0,0 +1,106 @@ +#Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') + +if (-not (Test-BuildCategory -Type 'Integration')) +{ + return +} + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:dscResourceFriendlyName = 'DSC_AzDevOpsProject' +$script:dscResourceName = $script:dscResourceFriendlyName + +try +{ + Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' +} +catch [System.IO.FileNotFoundException] +{ + throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' +} + +$script:testEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:dscModuleName ` + -DSCResourceName $script:dscResourceName ` + -ResourceType 'Mof' ` + -TestType 'Integration' + + +try +{ + #$configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" + #. $configFile + + Describe "$($script:dscResourceName)_Integration" { + + BeforeAll { + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test" + $configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" + . $configFile + + $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + $TestDrive = 'C:\TestDSC' + } + + + Context ('When using configuration {0}' -f $configurationName) { + + It "Should exist - '$configFile'" { + Test-Path $configFile | Should -BeTrue + } + + It "Should not be null or empty - '$configurationName'" { + $configurationName | Should -Not -BeNullOrEmpty + } + + + It 'Should compile and apply the MOF without throwing' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + It 'Should be able to call Get-DscConfiguration without throwing' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + } + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + } +} +finally +{ + Restore-TestEnvironment -TestEnvironment $script:testEnvironment +} diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 new file mode 100644 index 000000000..77581701f --- /dev/null +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -0,0 +1,62 @@ +#region HEADER +# Integration Test Config Template Version: 1.2.0 +#endregion + +#$configFile = [System.IO.Path]::ChangeExtension($MyInvocation.MyCommand.Path, 'json') +#if (Test-Path -Path $configFile) +#{ +# <# +# Allows reading the configuration data from a JSON file, +# for real testing scenarios outside of the CI. +# #> +# $ConfigurationData = Get-Content -Path $configFile | ConvertFrom-Json +#} +#else +#{ + $ConfigurationData = @{ + AllNodes = @( + @{ + NodeName = 'localhost' + + ApiUri = 'InsertApiUriHere' + Pat = 'InsertPatHere' + + #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' + ProjectName = 'TestProjectName' + ProjectDescription = 'TestProjectDescription' + + #CertificateFile = $env:DscPublicCertificatePath + } + ) + } +#} + + +<# + .SYNOPSIS + Reverts the SQL Server Agent service account of the default instance to + the original account that was initially used during installation. + + .NOTES + This test is intentionally meant to run using the credentials in + $SqlInstallCredential. +#> +Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = $Node.ProjectName + ProjectDescription = $Node.ProjectDescription + + Ensure = $Node.Ensure + } + } +} From fa7b5b3387b9965a211886f63d2442831ad5a2e9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 21:01:14 +0000 Subject: [PATCH 140/611] Updated 'Wait-AzDevOpsOperation' and 'Test-AzDevOpsOperation' to correct 'IsComplete' and 'IsSuccessful' logic. --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 6 +++--- .../Resources/Functions/Public/Test-AzDevOpsOperation.ps1 | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 7ecc6d067..973eeb01a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -77,11 +77,11 @@ function Wait-AzDevOpsOperation [System.UInt32] $WaitTimeoutMilliseconds = 10000, - [Parameter(Mandatory = $true, ParameterSetName = 'IsComplete')] + [Parameter()] [System.Management.Automation.SwitchParameter] $IsComplete, - [Parameter(Mandatory = $true, ParameterSetName = 'IsSuccessful')] + [Parameter()] [System.Management.Automation.SwitchParameter] $IsSuccessful ) @@ -91,7 +91,7 @@ function Wait-AzDevOpsOperation $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand New-InvalidOperationException -Message $errorMessage } - elseif (!$IsComplete -and !$IsSuccessful) # Failsafe: Unlikely/Impossible to occur while both setup with different 'ParameterSetName' values + elseif ($IsComplete -and $IsSuccessful) { $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand New-InvalidOperationException -Message $errorMessage diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 5fd8b405a..657028484 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -71,11 +71,11 @@ function Test-AzDevOpsOperation [System.String] $OperationId, - [Parameter(Mandatory = $true, ParameterSetName = 'IsComplete')] + [Parameter()] [System.Management.Automation.SwitchParameter] $IsComplete, - [Parameter(Mandatory = $true, ParameterSetName = 'IsSuccessful')] + [Parameter()] [System.Management.Automation.SwitchParameter] $IsSuccessful ) @@ -85,7 +85,7 @@ function Test-AzDevOpsOperation $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand New-InvalidOperationException -Message $errorMessage } - elseif (!$IsComplete -and !$IsSuccessful) # Failsafe: Unlikely/Impossible to occur while both setup with different 'ParameterSetName' values + elseif ($IsComplete -and $IsSuccessful) { $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand New-InvalidOperationException -Message $errorMessage From 8b6cbaa74925f15156863bea47ae710817ea4ca8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 3 Nov 2020 21:05:40 +0000 Subject: [PATCH 141/611] Updated 'New-AzDevOpsApiResource' to validate $ResourceName parameter --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 3ccb61e49..41bef8c8a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -59,7 +59,7 @@ function New-AzDevOpsApiResource $Pat, [Parameter(Mandatory = $true)] - [ValidateSet('Operation','Project')] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] [System.String] $ResourceName, From 730bf0f526f9eb2f8ab8c896c7dc08190b1c38ae Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 09:18:29 +0000 Subject: [PATCH 142/611] Corrected type name in 'Test-AzDevOpsOperation' --- .../Resources/Functions/Public/Test-AzDevOpsOperation.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 657028484..347354ff5 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -92,8 +92,8 @@ function Test-AzDevOpsOperation } - [resource[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` - -OperationId $OperationId + [object[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $OperationId # Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus From a5816118d57c4d622c9a1bb6d19a5a724feddd99 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 09:45:05 +0000 Subject: [PATCH 143/611] Removed use of a resource 'id' and the call to 'Get-AzDevOpsApiResource' within 'New-AzDevOpsApiResource' --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 7 ------- 1 file changed, 7 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 41bef8c8a..4f1681d65 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -76,8 +76,6 @@ function New-AzDevOpsApiResource $Force ) - $ResourceId = $Resource.id # TODO: Might have to remove the assumption that this works (see below also). Input resource's 'id' value looks to be ignored when creating resource. - # TODO: Need something to pluralise and lowercase this resource for the URI $resourceNamePluralUriString = $ResourceName.ToLower() + "s" @@ -105,11 +103,6 @@ function New-AzDevOpsApiResource Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $apiOperation.id ` -IsSuccessful - - # Obtains and returns the new resource - Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` - -ResourceName $ResourceName ` - -ResourceId $ResourceId # TODO: Might have to remove the assumption that this works (see above also). Input resource's 'id' value looks to be ignored when creating resource. } } } From 5c24e39f0478c7e799fa775a50799d43b3f2d5ba Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 09:47:50 +0000 Subject: [PATCH 144/611] Removed $ProjectId parameter from 'New-AzDevOpsProject' and added call to 'Get-AzDevOpsProject' to return new object. --- .../Functions/Public/New-AzDevOpsProject.ps1 | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index 71874ba43..145101dd1 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -12,9 +12,6 @@ against the Azure DevOps API. This PAT must have the relevant permissions assigned for the subsequent operations being performed. - .PARAMETER ProjectId - The 'id' of the 'Project' being created. - .PARAMETER ProjectName The 'name' of the 'Project' being created. @@ -31,8 +28,8 @@ .EXAMPLE New-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` - -ProjectId 'YourProjectIdHere' -ProjectName 'YourProjectNameHere' ` - -ProjectName 'YourProjectDescriptionHere' -SourceControlType 'Git' + -ProjectName 'YourProjectNameHere' ` + -ProjectDescription 'YourProjectDescriptionHere' -SourceControlType 'Git' Creates a 'Project' (assocated with the Organization/ApiUrl) in Azure DevOps using project-related, parameter values provided. #> @@ -54,12 +51,6 @@ function New-AzDevOpsProject [System.String] $Pat, - [Parameter()] - [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] - [Alias('Id')] - [System.String] - $ProjectId, - [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] [Alias('Name')] @@ -84,7 +75,7 @@ function New-AzDevOpsProject [string]$resourceJson = ' { - "id": "' + $ProjectId + '", + "id": "00000000-0000-0000-0000-000000000000", "name": "' + $ProjectName + '", "description": "' + $ProjectDescription + '", "capabilities": { @@ -98,15 +89,20 @@ function New-AzDevOpsProject } ' - [System.Object]$resource = $null + [System.Object]$newResource = $null + $ResourceName = 'Project' - if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $resourceName)) + if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $ResourceName)) { - [System.Object]$resource = New-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` - -ResourceName 'Project' ` - -Resource $($resourceJson | ConvertFrom-Json) ` - -Force:$Force -Wait + New-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -Resource $($resourceJson | ConvertFrom-Json) ` + -Force:$Force -Wait | Out-Null + + [System.Object]$newResource = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ProjectName $ProjectName } - return $resource + return $newResource } From b758e4d011fb443c60a7ed4c428baf45aded8469 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 11:23:32 +0000 Subject: [PATCH 145/611] Removed incorrect use of 'ResourceName' in call to 'Get-AzDevOpsProject' within 'New-AzDevOpsProject' function. --- .../Resources/Functions/Public/New-AzDevOpsProject.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index 145101dd1..bb809e099 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -100,7 +100,6 @@ function New-AzDevOpsProject -Force:$Force -Wait | Out-Null [System.Object]$newResource = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat ` - -ResourceName $ResourceName ` -ProjectName $ProjectName } From 5ebba37faf712cf7cb0330fa12f95e7f1294b5d5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 11:24:44 +0000 Subject: [PATCH 146/611] Added 'Ensure' option to 'DSC_AzDevOpsProject' configuration data --- .../DSCClassResources/DSC_AzDevOpsProject.config.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 77581701f..72f09827f 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -25,6 +25,8 @@ ProjectName = 'TestProjectName' ProjectDescription = 'TestProjectDescription' + Ensure = 'Present' + #CertificateFile = $env:DscPublicCertificatePath } ) From 2bbae1c2c4b5248981b31bb8c661a863bc575cd3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 11:26:36 +0000 Subject: [PATCH 147/611] Fleshed out logic and added verbose output within 'DSC_AzDevOpsProject', DSCResource within 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 141 ++++++++++++++++++++++++++++++++----- 1 file changed, 125 insertions(+), 16 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index d3cabf638..960470f7d 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -17,13 +17,22 @@ enum Ensure Absent } +enum RequiredFunction +{ + None + New + Set + Remove +} + + [DscResource()] class DSC_AzDevOpsProject { [DscProperty()] - [string]$Ensure + [Ensure]$Ensure [DscProperty()] @@ -35,7 +44,7 @@ class DSC_AzDevOpsProject [string]$Pat - [DscProperty()] + [DscProperty()] # Note: Do want to be able to pass this back populated so not set as 'NotConfigurable' [Alias('Id')] [string]$ProjectId @@ -62,6 +71,12 @@ class DSC_AzDevOpsProject $getParameters.ProjectId = $this.ProjectId } + Write-Verbose "GetAzDevOpsResource()..." + Write-Verbose "this.Ensure : $($this.Ensure) " + Write-Verbose "this.ProjectId : $($this.ProjectId) " + Write-Verbose "this.ProjectName : $($this.ProjectName) " + Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + return Get-AzDevOpsProject @getParameters } @@ -75,6 +90,16 @@ class DSC_AzDevOpsProject return $null } + Write-Verbose "Get()..." + Write-Verbose "this.Ensure : $($this.Ensure) " + Write-Verbose "this.ProjectId : $($this.ProjectId) " + Write-Verbose "this.ProjectName : $($this.ProjectName) " + Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + Write-Verbose "existing.Ensure : $($existing.Ensure) " + Write-Verbose "existing.ProjectId : $($existing.ProjectId) " + Write-Verbose "existing.ProjectName : $($existing.ProjectName) " + Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + return [DSC_AzDevOpsProject]@{ # Existing properties @@ -95,22 +120,97 @@ class DSC_AzDevOpsProject { $existing = $this.Get() - if ($existing.ProjectDescription -ne $this.ProjectDescription -or - $existing.SourceControlType -ne $this.SourceControlType) + Write-Verbose "Test()..." + Write-Verbose "this.Ensure : $($this.Ensure) " + Write-Verbose "this.ProjectId : $($this.ProjectId) " + Write-Verbose "this.ProjectName : $($this.ProjectName) " + Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + Write-Verbose "existing.Ensure : $($existing.Ensure) " + Write-Verbose "existing.ProjectId : $($existing.ProjectId) " + Write-Verbose "existing.ProjectName : $($existing.ProjectName) " + Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + + switch ($this.Ensure) { - return $false + 'Present' { + # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) + if ($null -eq $existing) + { + return $false + } + # Following comparisons are DSCResource-specific + elseif ($existing.ProjectDescription -ne $this.ProjectDescription -or + $existing.SourceControlType -ne $this.SourceControlType) + { + return $false + } + break + } + 'Absent' { + # If currently/already present - return $false (i.e. state is incorrect) + if ($null -ne $existing) + { + return $false + } + break + } + default + { + throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($this.Ensure)'." + } } + # State is already as desired - return $true return $true + } [void] Set() { $existing = $this.Get() + $requiredFunction = [RequiredFunction]::None + + Write-Verbose "Set()..." + Write-Verbose "this.Ensure : $($this.Ensure) " + Write-Verbose "this.ProjectId : $($this.ProjectId) " + Write-Verbose "this.ProjectName : $($this.ProjectName) " + Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + Write-Verbose "existing.Ensure : $($existing.Ensure) " + Write-Verbose "existing.ProjectId : $($existing.ProjectId) " + Write-Verbose "existing.ProjectName : $($existing.ProjectName) " + Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + + switch ($this.Ensure) + { + 'Present' { + # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) + if ($null -eq $existing) + { + $requiredFunction = [RequiredFunction]::New + } + elseif ($existing.ProjectDescription -ne $this.ProjectDescription -or + $existing.SourceControlType -ne $this.SourceControlType) + { + $requiredFunction = [RequiredFunction]::Set + } + break + } + 'Absent' { + # If currently/already present - return $false (i.e. state is incorrect) + if ($null -ne $existing) + { + $requiredFunction = [RequiredFunction]::Remove + } + break + } + default { + throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($this.Ensure)'." + } + } - $setParameters = @{ + $newSetParameters = @{ ApiUri = $this.ApiUri Pat = $this.Pat @@ -121,22 +221,31 @@ class DSC_AzDevOpsProject if (![string]::IsNullOrWhiteSpace($this.ProjectId)) { - $setParameters.ProjectId = $this.ProjectId + $newSetParameters.ProjectId = $this.ProjectId } - if ($null -eq $existing) + switch ($requiredFunction) { - New-AzDevOpsProject @setParameters -Force | Out-Null + 'None' { + break + } + 'New' { + New-AzDevOpsProject @newSetParameters -Force | Out-Null + Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'New-AzDevOpsProject' command + break + } + 'Set' { + throw 'Need to implement "Set-AzDevOpsProject" (using PATCH)' + Set-AzDevOpsProject @newSetParameters -Force | Out-Null + Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command + break + } + default { + throw "Could not obtain a valid 'RequiredFunction' value within 'DSC_AzDevOpsProject' Set() function." + } } - else - { - throw 'Need to implement "Set-AzDevOpsProject" (using PATCH)' - Set-AzDevOpsProject @setParameters -Force | Out-Null - } - } - } From b52666cb1c127d9a1094c9d624984250c6a98e72 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 11:42:41 +0000 Subject: [PATCH 148/611] Updated 'New-AzDevOpsApiResource' to add $ApiVersion parameter and make use of additional functions for preparation of call to 'Invoke-RestMethod' --- .../Private/New-AzDevOpsApiResource.ps1 | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 4f1681d65..05937fa74 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -52,6 +52,11 @@ function New-AzDevOpsApiResource [System.String] $ApiUri, + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] @@ -76,26 +81,22 @@ function New-AzDevOpsApiResource $Force ) - # TODO: Need something to pluralise and lowercase this resource for the URI - $resourceNamePluralUriString = $ResourceName.ToLower() + "s" - - # TODO: Need something to convert to JSON - $resourceJson = $Resource | ConvertTo-Json -Depth 10 -Compress - - # TODO: Need to get this from input parameter? - $apiVersionUriParameter = 'api-version=5.1' - - # TODO: Need to generate this from a function - $apiResourceUri = $ApiUri + "/$resourceNamePluralUriString" + '?' + $apiVersionUriParameter - - - if ($Force -or $PSCmdlet.ShouldProcess($apiResourceUri, $ResourceName)) { - [System.Object]$apiOperation = $null + $apiResourceUriParameters = @{ + ApiUri = $ApiUri + ApiVersion = $ApiVersion + ResourceName = $ResourceName + } + + [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + [string]$apiHttpRequestBody = $Resource | ConvertTo-Json -Depth 10 -Compress - [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Post' -Headers $apiHttpRequestHeader -Body $resourceJson -ContentType 'application/json' + [System.Object]$apiOperation = $null + [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Post' ` + -Headers $apiHttpRequestHeader -Body $apiHttpRequestBody ` + -ContentType 'application/json' if ($Wait) { From 1e9ec591c3e1eb0817ffd90945fefb55635fddf3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 12:57:52 +0000 Subject: [PATCH 149/611] Added 'Set-AzDevOpsApiResource' --- .../Private/Set-AzDevOpsApiResource.ps1 | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 new file mode 100644 index 000000000..814aa2f51 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 @@ -0,0 +1,115 @@ +<# + .SYNOPSIS + Attempts to update a resource within Azure DevOps. + + The type of resource type updated is provided in the 'ResourceName' parameter and it is + assumed that the 'Resource' parameter value passed in meets the specification of the resource. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ResourceName + The name of the resource being updated within Azure DevOps (e.g. 'Project') + + .PARAMETER Resource + The resource being updated (typically provided by another function (e.g. 'Set-AzDevOpsApiProject')). + + .EXAMPLE + Set-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -Resource $YourResource -Wait + + Updates the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, the '-Wait' switch is provided so the function will wait for the corresponding API 'Operation' + to complete before the function completes. No return value is provided by this function and if the creation of the + resource has failed, an exception will be thrown. + + .EXAMPLE + Set-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -Resource $YourResource + + Updates the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, no '-Wait' switch is provided so the request is made to the API but the operation may + not complete before the function completes (and may not complete successfully at all). +#> +function Set-AzDevOpsApiResource +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] + [System.String] + $ResourceId, + + [Parameter(Mandatory = $true)] + [System.Object] + $Resource, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Wait, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + if ($Force -or $PSCmdlet.ShouldProcess($apiResourceUri, $ResourceName)) + { + $apiResourceUriParameters = @{ + ApiUri = $ApiUri + ApiVersion = $ApiVersion + ResourceName = $ResourceName + ResourceId = $ResourceId + } + + [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters + [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + [string]$apiHttpRequestBody = $Resource | ConvertTo-Json -Depth 10 -Compress + + [System.Object]$apiOperation = $null + [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Patch' ` + -Headers $apiHttpRequestHeader -Body $apiHttpRequestBody ` + -ContentType 'application/json' + + if ($Wait) + { + # Waits for operation to complete successfully. Throws exception if operation is not successful and/or timeout is reached. + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $apiOperation.id ` + -IsSuccessful + } + } +} From d88a6e562384550f0d2e013a486d35c38c25739d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 12:58:12 +0000 Subject: [PATCH 150/611] Updated notes in 'New-AzDevOpsApiResource' --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 05937fa74..667e8993a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -28,8 +28,8 @@ provided. NOTE: In this example, the '-Wait' switch is provided so the function will wait for the corresponding API 'Operation' - to complete before the function completes. If the creation of the resource has been successful, it will be return by the - function. If the creation of the resource has failed, an exception will be thrown. + to complete before the function completes. No return value is provided by this function and if the creation of the + resource has failed, an exception will be thrown. .EXAMPLE New-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -Resource $YourResource From 321da62625d4cdd9820d0d427a1e9df52369d1d9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 12:58:31 +0000 Subject: [PATCH 151/611] Added 'Set-AzDevOpsProject' function --- .../Functions/Public/Set-AzDevOpsProject.ps1 | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 new file mode 100644 index 000000000..73d9be003 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 @@ -0,0 +1,121 @@ +<# + .SYNOPSIS + Updates an Azure DevOps 'Project' with the specified properties set by the parameters. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ProjectName + The 'name' of the 'Project' being updated. + + .PARAMETER ProjectDescription + The 'description' of the 'Project' being updated. + + .PARAMETER SourceControlType + The 'sourceControlType' of the 'Project' being updated. + + Options are 'Tfvc' or 'Git'. Defaults to 'Git' if no value provided. + + .PARAMETER Force + When this switch is used, any confirmation will be overidden/ignored. + + .EXAMPLE + Set-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ProjectName 'YourProjectNameHere' ` + -ProjectDescription 'YourProjectDescriptionHere' -SourceControlType 'Git' + + Creates a 'Project' (assocated with the Organization/ApiUrl) in Azure DevOps using project-related, parameter values provided. +#> +function Set-AzDevOpsProject +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] + [Alias('Id')] + [System.String] + $ProjectId, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] + [Alias('Name')] + [System.String] + $ProjectName, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] + [Alias('Description')] + [System.String] + $ProjectDescription, + + + # $SourceControlType = 'Git', # Not supported + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + +# [string]$resourceJson = ' +# { +# "id": "'+ $ProjectId +'", +# "name": "' + $ProjectName + '", +# "description": "' + $ProjectDescription + '", +# "capabilities": { +# "versioncontrol": { +# "sourceControlType": "' + $SourceControlType + '" +# }, +# "processTemplate": { +# "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" +# } +# } +# } +# ' + + [string]$resourceJson = ' + { + "id": "'+ $ProjectId +'", + "name": "' + $ProjectName + '", + "description": "' + $ProjectDescription + '" + } + ' + + [System.Object]$newResource = $null + $ResourceName = 'Project' + + if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $ResourceName)) + { + Set-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ProjectId ` + -Resource $($resourceJson | ConvertFrom-Json) ` + -Force:$Force -Wait | Out-Null + + [System.Object]$newResource = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat ` + -ProjectId $ProjectId ` + -ProjectName $ProjectName + } + + return $newResource +} From d7e28de2b8da6e8c97d22d353a43792a6b5465bf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 12:58:58 +0000 Subject: [PATCH 152/611] Added 'Set-AzDevOpsProject' function to 'AzureDevOpsDsc.Common' module manifest. --- .../AzureDevOpsDsc.Common.psd1 | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 index 698558f4b..9a8ff8862 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -22,14 +22,15 @@ # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. FunctionsToExport = @( - 'Get-AzDevOpsServicesUri' - 'Get-AzDevOpsServicesApiUri' + 'Get-AzDevOpsServicesUri', + 'Get-AzDevOpsServicesApiUri', - 'Get-AzDevOpsOperation' - 'Test-AzDevOpsOperation' + 'Get-AzDevOpsOperation', + 'Test-AzDevOpsOperation', - 'Get-AzDevOpsProject' - 'New-AzDevOpsProject' + 'Get-AzDevOpsProject', + 'New-AzDevOpsProject', + 'Set-AzDevOpsProject' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. From 50b00ec706f5c46ec395eacc02a0deef81a35c0f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 13:00:54 +0000 Subject: [PATCH 153/611] Implemented call to 'Set-AzDevOpsProject' and catered for non-support of 'SourceControlType' property. --- source/AzureDevOpsDsc.psm1 | 51 ++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 960470f7d..30f65f7fa 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -56,6 +56,9 @@ class DSC_AzDevOpsProject [Alias('Description')] [string]$ProjectDescription + [DscProperty()] + [string]$SourceControlType + [PSCustomObject]GetAzDevOpsResource() { @@ -95,10 +98,12 @@ class DSC_AzDevOpsProject Write-Verbose "this.ProjectId : $($this.ProjectId) " Write-Verbose "this.ProjectName : $($this.ProjectName) " Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + Write-Verbose "this.SourceControlType : $($this.SourceControlType) " Write-Verbose "existing.Ensure : $($existing.Ensure) " Write-Verbose "existing.ProjectId : $($existing.ProjectId) " Write-Verbose "existing.ProjectName : $($existing.ProjectName) " Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + Write-Verbose "existing.SourceControlType : $($existing.SourceControlType) " return [DSC_AzDevOpsProject]@{ @@ -119,16 +124,26 @@ class DSC_AzDevOpsProject [bool] Test() { $existing = $this.Get() + # Note: $this is effectively 'desired' values Write-Verbose "Test()..." Write-Verbose "this.Ensure : $($this.Ensure) " Write-Verbose "this.ProjectId : $($this.ProjectId) " Write-Verbose "this.ProjectName : $($this.ProjectName) " Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " + Write-Verbose "this.SourceControlType : $($this.SourceControlType) " Write-Verbose "existing.Ensure : $($existing.Ensure) " Write-Verbose "existing.ProjectId : $($existing.ProjectId) " Write-Verbose "existing.ProjectName : $($existing.ProjectName) " Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + Write-Verbose "existing.SourceControlType : $($existing.SourceControlType) " + + # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($this.ProjectId) -and ![string]::IsNullOrWhiteSpace($existing.ProjectId)) + { + $this.ProjectId = $existing.ProjectId + Write-Verbose "this.ProjectId : $($this.ProjectId) (Since updated)" + } switch ($this.Ensure) { @@ -138,9 +153,14 @@ class DSC_AzDevOpsProject { return $false } - # Following comparisons are DSCResource-specific - elseif ($existing.ProjectDescription -ne $this.ProjectDescription -or - $existing.SourceControlType -ne $this.SourceControlType) + # Following comparisons are DSCResource-specific but UNSUPPORTED + elseif ($existing.SourceControlType -ne $this.SourceControlType) + { + throw "This DSCResource does not support changes to the following properties: SourceControlType" + } + # Following comparisons are DSCResource-specific and supported + elseif ($existing.ProjectName -ne $this.ProjectName -or + $existing.ProjectDescription -ne $this.ProjectDescription) { return $false } @@ -168,8 +188,8 @@ class DSC_AzDevOpsProject [void] Set() { - $existing = $this.Get() $requiredFunction = [RequiredFunction]::None + $existing = $this.Get() Write-Verbose "Set()..." Write-Verbose "this.Ensure : $($this.Ensure) " @@ -181,6 +201,14 @@ class DSC_AzDevOpsProject Write-Verbose "existing.ProjectName : $($existing.ProjectName) " Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " + # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($this.ProjectId) -and ![string]::IsNullOrWhiteSpace($existing.ProjectId)) + { + $this.ProjectId = $existing.ProjectId + Write-Verbose "this.ProjectId : $($this.ProjectId) (Since updated)" + } + + switch ($this.Ensure) { 'Present' { @@ -189,8 +217,14 @@ class DSC_AzDevOpsProject { $requiredFunction = [RequiredFunction]::New } - elseif ($existing.ProjectDescription -ne $this.ProjectDescription -or - $existing.SourceControlType -ne $this.SourceControlType) + # Following comparisons are DSCResource-specific but UNSUPPORTED + elseif ($existing.SourceControlType -ne $this.SourceControlType) + { + throw "This DSCResource does not support changes to the following properties: SourceControlType" + } + # Following comparisons are DSCResource-specific and supported + elseif ($existing.ProjectName -ne $this.ProjectName -or + $existing.ProjectDescription -ne $this.ProjectDescription) { $requiredFunction = [RequiredFunction]::Set } @@ -216,7 +250,9 @@ class DSC_AzDevOpsProject ProjectName = $this.ProjectName ProjectDescription = $this.ProjectDescription - SourceControlType = 'Git' + + # Not supported + # SourceControlType = $this.SourceControlType } if (![string]::IsNullOrWhiteSpace($this.ProjectId)) @@ -236,7 +272,6 @@ class DSC_AzDevOpsProject break } 'Set' { - throw 'Need to implement "Set-AzDevOpsProject" (using PATCH)' Set-AzDevOpsProject @newSetParameters -Force | Out-Null Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break From 7c0fc3f97ca160eac86612163ada8fa53bebd05c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 13:02:13 +0000 Subject: [PATCH 154/611] Added 'SourceControlType' into 'DSC_AzDevOpsProeject.config.ps1' configuration data. --- .../DSCClassResources/DSC_AzDevOpsProject.config.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 72f09827f..cdf01e98a 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -23,7 +23,9 @@ #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' ProjectName = 'TestProjectName' - ProjectDescription = 'TestProjectDescription' + ProjectDescription = 'TestProjectDescription2' + + SourceControlType = 'Git' Ensure = 'Present' From 02069d4aeb7c12a9acf8bbd0f321abd38963dbfa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 13:10:27 +0000 Subject: [PATCH 155/611] Added 'Remove' section into Set() methodd within 'DSC_AzDevOpsProject' DSCResource --- source/AzureDevOpsDsc.psm1 | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 30f65f7fa..46d246690 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -276,6 +276,19 @@ class DSC_AzDevOpsProject Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break } + 'Remove' { + $removeParameters = @{ + ApiUri = $newSetParameters.ApiUri + Pat = $newSetParameters.Pat + + ProjectId = $newSetParameters.ProjectId + } + + throw "Need to create 'Remove-AzDevOpsProject' function!!" + Remove-AzDevOpsProject @removeParameters -Force | Out-Null + Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command + break + } default { throw "Could not obtain a valid 'RequiredFunction' value within 'DSC_AzDevOpsProject' Set() function." } From 74483af10390edf7bbf89215a636404454d1bfdd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 13:27:34 +0000 Subject: [PATCH 156/611] Removed unwanted tests from 'DSC_AzDevOpsProject.Integration.Tests.ps1' --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 867834cd1..4e50113b4 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -44,15 +44,6 @@ try Context ('When using configuration {0}' -f $configurationName) { - It "Should exist - '$configFile'" { - Test-Path $configFile | Should -BeTrue - } - - It "Should not be null or empty - '$configurationName'" { - $configurationName | Should -Not -BeNullOrEmpty - } - - It 'Should compile and apply the MOF without throwing' { { $configurationParameters = @{ From 6c11115f4c290a05962af54643cd3d0278d2cc6e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 15:30:51 +0000 Subject: [PATCH 157/611] Added assignment of 'SourceControlType' into new 'DSC_AzDevOpsProject' object passed back from Get() method in 'DSC_AzDevOpsProject' DSCResource. --- source/AzureDevOpsDsc.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 46d246690..aaf10d439 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -116,6 +116,7 @@ class DSC_AzDevOpsProject ProjectId = $existing.id ProjectName = $existing.name ProjectDescription = $existing.description + SourceControlType = $existing.capabilities.versioncontrol.sourceControlType } } From f69fadb46a1abad36f322bd1baee90279896bae0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 15:32:12 +0000 Subject: [PATCH 158/611] Added 'includeCapabilities' into the URI output by 'Get-AzDevOpsApiResourceUri' so that projects will include all information on capabilities when obtained from the API. --- .../Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 index 92894d6e9..afd7515ed 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceUri.ps1 @@ -86,6 +86,9 @@ function Get-AzDevOpsApiResourceUri # Append any parameters to the URI $apiResourceUriParameters = @{ "api-version" = $ApiVersion # Taken from input parameter + + # Always add these into URI (NOTE: Crude at present) + "includeCapabilities" = 'true' # Projects - Specifically to return full project capabilties } $apiResourceUri = $apiResourceUri + '?' From a8f2d2c766f66364b09484d390dd353f210fd1ca Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 15:33:58 +0000 Subject: [PATCH 159/611] Updated 'Get-AzDevOpsProject' to obtain a list of resources and then go back and obtain them independently (with additional information that provides for the project resource). --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 index 1b727ebd8..9bb0e372c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 @@ -86,20 +86,36 @@ function Get-AzDevOpsProject } - [object[]]$apiResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters + [object[]]$apiListResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters If(![string]::IsNullOrWhiteSpace($ProjectId)){ - $apiResources = $apiResources | + $apiListResources = $apiListResources | Where-Object id -ilike $ProjectId } If(![string]::IsNullOrWhiteSpace($ProjectName)){ - $apiResources = $apiResources | + $apiListResources = $apiListResources | Where-Object name -ilike $ProjectName } - - return [object[]]$apiResources + [object[]]$projects = @() + Write-Verbose "$($apiListResources.Count) in apiListResources" + + if ($apiListResources.Count -gt 0) + { + $apiListResources | + ForEach-Object { + Write-Verbose "$($_ | ConvertTo-Json)" + + $azDevOpsProjectParameters = @{ + ApiUri = $ApiUri; + Pat = $Pat; + ResourceName = 'Project' + ResourceId = $_.id} + $projects += $(Get-AzDevOpsApiResource @azDevOpsProjectParameters) + } + } + return [object[]]$projects } From 443b907d1a3964d7985990cdca15887215acf9bf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 15:37:15 +0000 Subject: [PATCH 160/611] Updated 'DSC_AzDevOpsProject' integration tests --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 229 ++++++++++++++---- 1 file changed, 184 insertions(+), 45 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 4e50113b4..87c1a829a 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -1,9 +1,9 @@ #Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -if (-not (Test-BuildCategory -Type 'Integration')) -{ - return -} +#if (-not (Test-BuildCategory -Type 'Integration')) +#{ +# return +#} $script:dscModuleName = 'AzureDevOpsDsc' $script:dscResourceFriendlyName = 'DSC_AzDevOpsProject' @@ -27,69 +27,208 @@ $script:testEnvironment = Initialize-TestEnvironment ` try { - #$configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" - #. $configFile + $configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" + . $configFile + Describe "$($script:dscResourceName)_Integration" { BeforeAll { - $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test" $configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" . $configFile - - $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" - $TestDrive = 'C:\TestDSC' } - Context ('When using configuration {0}' -f $configurationName) { + # Assign these at the script level + $script:configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" - It 'Should compile and apply the MOF without throwing' { - { - $configurationParameters = @{ - OutputPath = $TestDrive - # The variable $ConfigurationData was dot-sourced above. - ConfigurationData = $ConfigurationData - } - . $configFile - & $configurationName @configurationParameters + Context ("When compiling, applying and testing the MOF - '$ConfigurationName'") { + # Assign this within this context (from the script level) + $configurationName = $script:configurationName + $resourceId = $script:resourceId - $startDscConfigurationParameters = @{ - Path = $TestDrive - ComputerName = 'localhost' - Wait = $true - Verbose = $true - Force = $true - ErrorAction = 'Stop' - } - Start-DscConfiguration @startDscConfigurationParameters - } | Should -Not -Throw - } + Context ("When compiling, applying and testing the MOF") { - It 'Should be able to call Get-DscConfiguration without throwing' { - { - $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - } | Should -Not -Throw - } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } - It 'Should have set the resource and all the parameters should match' { - $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - $_.ConfigurationName -eq $configurationName ` - -and $_.ResourceId -eq $resourceId + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw } - $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' - } - It 'Should return $true when Test-DscConfiguration is run' { - Test-DscConfiguration -Verbose | Should -Be 'True' + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } } } + } + + + + # Describe "$($script:dscResourceName)_Integration" { + + # BeforeAll { + # $configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" + # . $configFile + # } + + + + # $script:configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + # $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + + # Context ('When using configuration {0}' -f $script:configurationName) { + + # BeforeAll { + # $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + # $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + # } + + # It 'Should compile and apply the MOF without throwing' { + # { + # $configurationParameters = @{ + # OutputPath = $TestDrive + # # The variable $ConfigurationData was dot-sourced above. + # ConfigurationData = $ConfigurationData + # } + + # . $configFile + # & $($script:configurationName) @configurationParameters + + + # $startDscConfigurationParameters = @{ + # Path = $TestDrive + # ComputerName = 'localhost' + # Wait = $true + # Verbose = $true + # Force = $true + # ErrorAction = 'Stop' + # } + + # Start-DscConfiguration @startDscConfigurationParameters + # } | Should -Not -Throw + # } + + # It 'Should be able to call Get-DscConfiguration without throwing' { + # { + # $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + # } | Should -Not -Throw + # } + + # It 'Should have set the resource and all the parameters should match' { + # $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + # $_.ConfigurationName -eq $configurationName ` + # -and $_.ResourceId -eq $resourceId + # } + + # $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + # $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + # } + + # It 'Should return $true when Test-DscConfiguration is run' { + # Test-DscConfiguration -Verbose | Should -Be 'True' + # } + # } + + + + # $script:configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" + # $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" + + # Context ('When using configuration {0}' -f $script:configurationName) { + + # BeforeAll { + # $configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" + # $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" + # } + + # It 'Should compile and apply the MOF without throwing' { + # { + # $configurationParameters = @{ + # OutputPath = $TestDrive + # # The variable $ConfigurationData was dot-sourced above. + # ConfigurationData = $ConfigurationData + # } + + # . $configFile + # & $($script:configurationName) @configurationParameters + + + # $startDscConfigurationParameters = @{ + # Path = $TestDrive + # ComputerName = 'localhost' + # Wait = $true + # Verbose = $true + # Force = $true + # ErrorAction = 'Stop' + # } + + # Start-DscConfiguration @startDscConfigurationParameters + # } | Should -Not -Throw + # } + + # It 'Should be able to call Get-DscConfiguration without throwing' { + # { + # $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + # } | Should -Not -Throw + # } + + # It 'Should have set the resource and all the parameters should match' { + # $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + # $_.ConfigurationName -eq $configurationName ` + # -and $_.ResourceId -eq $resourceId + # } + + # $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + # $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' + # } + + # It 'Should return $true when Test-DscConfiguration is run' { + # Test-DscConfiguration -Verbose | Should -Be 'True' + # } + # } + # } } finally { From e0fc7d484ab22bf09d51fa7ccf85bb1905f73743 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 15:47:53 +0000 Subject: [PATCH 161/611] Removed verbose outputs from 'Get-AzDevOpsProject' --- .../Resources/Functions/Public/Get-AzDevOpsProject.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 index 9bb0e372c..1afc12e15 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 @@ -101,13 +101,11 @@ function Get-AzDevOpsProject } [object[]]$projects = @() - Write-Verbose "$($apiListResources.Count) in apiListResources" if ($apiListResources.Count -gt 0) { $apiListResources | ForEach-Object { - Write-Verbose "$($_ | ConvertTo-Json)" $azDevOpsProjectParameters = @{ ApiUri = $ApiUri; From c7b05fc296aad3524473d31ec2720f9f5347e32d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 16:18:20 +0000 Subject: [PATCH 162/611] Added 'SourceControlType' back into $newSetParameters within 'DSC_AzDevOpsProject' resource. --- source/AzureDevOpsDsc.psm1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index aaf10d439..5cf757f83 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -252,8 +252,7 @@ class DSC_AzDevOpsProject ProjectName = $this.ProjectName ProjectDescription = $this.ProjectDescription - # Not supported - # SourceControlType = $this.SourceControlType + SourceControlType = $this.SourceControlType } if (![string]::IsNullOrWhiteSpace($this.ProjectId)) @@ -273,6 +272,10 @@ class DSC_AzDevOpsProject break } 'Set' { + # Remove any not supported + $newSetParameters.Remove('SourceControlType') + + Set-AzDevOpsProject @newSetParameters -Force | Out-Null Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break From 01b4c6fd7b98cc561d20221a340c1101da6d7d91 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 16:19:46 +0000 Subject: [PATCH 163/611] Added additional 'DSC_AzDevOpsProject' integration tests for 'EnsureProjectPresent', 'EnsureGitProjectPresent'. 'EnsureTfvcProjectPresent' and 'EnsureProjectUpdated'. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 275 +++++++++++------- 1 file changed, 167 insertions(+), 108 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 87c1a829a..b30eda81d 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -39,20 +39,78 @@ try } - # Assign these at the script level - $script:configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" - $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectPresent_Config'") { - Context ("When compiling, applying and testing the MOF - '$ConfigurationName'") { + Context ("When compiling, applying and testing the MOF") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureGitProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureGitProjectPresent" + } + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.ProjectName | Should -Be 'TestGitProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestGitProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + } - # Assign this within this context (from the script level) - $configurationName = $script:configurationName - $resourceId = $script:resourceId + + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectPresent_Config'") { Context ("When compiling, applying and testing the MOF") { + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureTfvcProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureTfvcProjectPresent" + } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { { $configurationParameters = @{ @@ -91,8 +149,9 @@ try -and $_.ResourceId -eq $resourceId } - $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + $resourceCurrentState.ProjectName | Should -Be 'TestTfvcProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestTfvcProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Tfvc' } @@ -102,133 +161,133 @@ try } } - } + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectPresent_Config'") { + + + Context ("When compiling, applying and testing the MOF") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + } + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - # Describe "$($script:dscResourceName)_Integration" { - # BeforeAll { - # $configFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).config.ps1" - # . $configFile - # } + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } - # $script:configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" - # $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + # These are all defaults from values provided in configuration data + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' + } - # Context ('When using configuration {0}' -f $script:configurationName) { - # BeforeAll { - # $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" - # $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" - # } + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + } - # It 'Should compile and apply the MOF without throwing' { - # { - # $configurationParameters = @{ - # OutputPath = $TestDrive - # # The variable $ConfigurationData was dot-sourced above. - # ConfigurationData = $ConfigurationData - # } - # . $configFile - # & $($script:configurationName) @configurationParameters + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectUpdated_Config'") { - # $startDscConfigurationParameters = @{ - # Path = $TestDrive - # ComputerName = 'localhost' - # Wait = $true - # Verbose = $true - # Force = $true - # ErrorAction = 'Stop' - # } + Context ("When compiling, applying and testing the MOF") { - # Start-DscConfiguration @startDscConfigurationParameters - # } | Should -Not -Throw - # } + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" + } - # It 'Should be able to call Get-DscConfiguration without throwing' { - # { - # $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - # } | Should -Not -Throw - # } - # It 'Should have set the resource and all the parameters should match' { - # $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - # $_.ConfigurationName -eq $configurationName ` - # -and $_.ResourceId -eq $resourceId - # } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } - # $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - # $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' - # } + . $configFile + & $configurationName @configurationParameters - # It 'Should return $true when Test-DscConfiguration is run' { - # Test-DscConfiguration -Verbose | Should -Be 'True' - # } - # } + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - # $script:configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" - # $script:resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } - # Context ('When using configuration {0}' -f $script:configurationName) { - # BeforeAll { - # $configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" - # $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" - # } + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } - # It 'Should compile and apply the MOF without throwing' { - # { - # $configurationParameters = @{ - # OutputPath = $TestDrive - # # The variable $ConfigurationData was dot-sourced above. - # ConfigurationData = $ConfigurationData - # } + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' # Must be the same (change not supported with this) + } - # . $configFile - # & $($script:configurationName) @configurationParameters + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + } - # $startDscConfigurationParameters = @{ - # Path = $TestDrive - # ComputerName = 'localhost' - # Wait = $true - # Verbose = $true - # Force = $true - # ErrorAction = 'Stop' - # } + } - # Start-DscConfiguration @startDscConfigurationParameters - # } | Should -Not -Throw - # } - - # It 'Should be able to call Get-DscConfiguration without throwing' { - # { - # $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - # } | Should -Not -Throw - # } - - # It 'Should have set the resource and all the parameters should match' { - # $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - # $_.ConfigurationName -eq $configurationName ` - # -and $_.ResourceId -eq $resourceId - # } - - # $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - # $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' - # } - - # It 'Should return $true when Test-DscConfiguration is run' { - # Test-DscConfiguration -Verbose | Should -Be 'True' - # } - # } - # } } finally { From 9380720ac786d31af86c2f89b033c14242596019 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 16:24:11 +0000 Subject: [PATCH 164/611] Removed non-required, suib-'Context' scopes from 'DSC_AzDevOpsProject' integration tests. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 343 +++++++++--------- 1 file changed, 166 insertions(+), 177 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index b30eda81d..1134e7efe 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -41,61 +41,58 @@ try Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectPresent_Config'") { + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureGitProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureGitProjectPresent" + } - Context ("When compiling, applying and testing the MOF") { - BeforeAll { - $configurationName = "$($script:dscResourceName)_EnsureGitProjectPresent_Config" - $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureGitProjectPresent" - } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } - It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { - { - $configurationParameters = @{ - OutputPath = $TestDrive - # The variable $ConfigurationData was dot-sourced above. - ConfigurationData = $ConfigurationData - } - - . $configFile - & $configurationName @configurationParameters - - $startDscConfigurationParameters = @{ - Path = $TestDrive - ComputerName = 'localhost' - Wait = $true - Verbose = $true - Force = $true - ErrorAction = 'Stop' - } - - Start-DscConfiguration @startDscConfigurationParameters - } | Should -Not -Throw - } + . $configFile + & $configurationName @configurationParameters + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } - It 'Should not throw when calling "Get-DscConfiguration"' { - { - $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - } | Should -Not -Throw - } + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - It 'Should have set the resource and all the parameters should match' { - $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - $_.ConfigurationName -eq $configurationName ` - -and $_.ResourceId -eq $resourceId - } + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } - $resourceCurrentState.ProjectName | Should -Be 'TestGitProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'TestGitProjectDescription' - $resourceCurrentState.SourceControlType | Should -Be 'Git' + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.ProjectName | Should -Be 'TestGitProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestGitProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' + } - It 'Should return $true when Test-DscConfiguration is run' { - Test-DscConfiguration -Verbose | Should -Be 'True' - } + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' } } @@ -103,61 +100,58 @@ try Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectPresent_Config'") { + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureTfvcProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureTfvcProjectPresent" + } - Context ("When compiling, applying and testing the MOF") { - BeforeAll { - $configurationName = "$($script:dscResourceName)_EnsureTfvcProjectPresent_Config" - $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureTfvcProjectPresent" - } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } - It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { - { - $configurationParameters = @{ - OutputPath = $TestDrive - # The variable $ConfigurationData was dot-sourced above. - ConfigurationData = $ConfigurationData - } - - . $configFile - & $configurationName @configurationParameters - - $startDscConfigurationParameters = @{ - Path = $TestDrive - ComputerName = 'localhost' - Wait = $true - Verbose = $true - Force = $true - ErrorAction = 'Stop' - } - - Start-DscConfiguration @startDscConfigurationParameters - } | Should -Not -Throw - } + . $configFile + & $configurationName @configurationParameters + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } - It 'Should not throw when calling "Get-DscConfiguration"' { - { - $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - } | Should -Not -Throw - } + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - It 'Should have set the resource and all the parameters should match' { - $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - $_.ConfigurationName -eq $configurationName ` - -and $_.ResourceId -eq $resourceId - } + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + - $resourceCurrentState.ProjectName | Should -Be 'TestTfvcProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'TestTfvcProjectDescription' - $resourceCurrentState.SourceControlType | Should -Be 'Tfvc' + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.ProjectName | Should -Be 'TestTfvcProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestTfvcProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Tfvc' + } + - It 'Should return $true when Test-DscConfiguration is run' { - Test-DscConfiguration -Verbose | Should -Be 'True' - } + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' } } @@ -165,124 +159,119 @@ try Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectPresent_Config'") { + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" + } - Context ("When compiling, applying and testing the MOF") { - BeforeAll { - $configurationName = "$($script:dscResourceName)_EnsureProjectPresent_Config" - $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectPresent" - } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } - It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { - { - $configurationParameters = @{ - OutputPath = $TestDrive - # The variable $ConfigurationData was dot-sourced above. - ConfigurationData = $ConfigurationData - } - - . $configFile - & $configurationName @configurationParameters - - $startDscConfigurationParameters = @{ - Path = $TestDrive - ComputerName = 'localhost' - Wait = $true - Verbose = $true - Force = $true - ErrorAction = 'Stop' - } - - Start-DscConfiguration @startDscConfigurationParameters - } | Should -Not -Throw - } + . $configFile + & $configurationName @configurationParameters + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } - It 'Should not throw when calling "Get-DscConfiguration"' { - { - $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - } | Should -Not -Throw - } + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - It 'Should have set the resource and all the parameters should match' { - $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - $_.ConfigurationName -eq $configurationName ` - -and $_.ResourceId -eq $resourceId - } + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + - # These are all defaults from values provided in configuration data - $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' - $resourceCurrentState.SourceControlType | Should -Be 'Git' + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId } + # These are all defaults from values provided in configuration data + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' + } + - It 'Should return $true when Test-DscConfiguration is run' { - Test-DscConfiguration -Verbose | Should -Be 'True' - } + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' } + } Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectUpdated_Config'") { - Context ("When compiling, applying and testing the MOF") { + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" + } - BeforeAll { - $configurationName = "$($script:dscResourceName)_EnsureProjectUpdated_Config" - $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectUpdated" - } + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } - It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { - { - $configurationParameters = @{ - OutputPath = $TestDrive - # The variable $ConfigurationData was dot-sourced above. - ConfigurationData = $ConfigurationData - } - - . $configFile - & $configurationName @configurationParameters - - $startDscConfigurationParameters = @{ - Path = $TestDrive - ComputerName = 'localhost' - Wait = $true - Verbose = $true - Force = $true - ErrorAction = 'Stop' - } - - Start-DscConfiguration @startDscConfigurationParameters - } | Should -Not -Throw - } + . $configFile + & $configurationName @configurationParameters + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } - It 'Should not throw when calling "Get-DscConfiguration"' { - { - $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop - } | Should -Not -Throw - } + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } - It 'Should have set the resource and all the parameters should match' { - $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { - $_.ConfigurationName -eq $configurationName ` - -and $_.ResourceId -eq $resourceId - } + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + - $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' - $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' - $resourceCurrentState.SourceControlType | Should -Be 'Git' # Must be the same (change not supported with this) + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' # Must be the same (change not supported with this) + } - It 'Should return $true when Test-DscConfiguration is run' { - Test-DscConfiguration -Verbose | Should -Be 'True' - } + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' } } From 9e2d81b1552a272692fb083f01670f63991360e7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:14:36 +0000 Subject: [PATCH 165/611] Added 'Remove-AzDevOpsApiResource' function. --- .../Private/Remove-AzDevOpsApiResource.ps1 | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 new file mode 100644 index 000000000..8ef9c8fed --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 @@ -0,0 +1,109 @@ +<# + .SYNOPSIS + Attempts to remove a resource within Azure DevOps. + + The type of resource type removed is provided in the 'ResourceName' parameter and it is + assumed that the 'ResourceId' parameter value passed in is present (in order to be deleted). + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ResourceName + The name of the resource being deleted within Azure DevOps (e.g. 'Project') + + .PARAMETER ResourceId + The 'ResourceId' of the resource being created (typically provided by another function (e.g. 'Remove-AzDevOpsApiProject')). + + .EXAMPLE + Remove-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -ResourceId $YourResourceId -Wait + + Removes/Deletes the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, the '-Wait' switch is provided so the function will wait for the corresponding API 'Operation' + to complete before the function completes. No return value is provided by this function and if the creation of the + resource has failed, an exception will be thrown. + + .EXAMPLE + New-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -ResourceId $YourResourceId + + Remmoves/Deletes the 'Project' resource in Azure DevOps within to the Organization relating to the to the 'ApiUri' + provided. + + NOTE: In this example, no '-Wait' switch is provided so the request is made to the API but the operation may + not complete before the function completes (and may not complete successfully at all). +#> +function Remove-AzDevOpsApiResource +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [System.Object] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] + $ResourceId, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Wait, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + if ($Force -or $PSCmdlet.ShouldProcess($apiResourceUri, $ResourceName)) + { + $apiResourceUriParameters = @{ + ApiUri = $ApiUri + ApiVersion = $ApiVersion + ResourceName = $ResourceName + ResourceId = $ResourceId + } + + [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters + [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + + [System.Object]$apiOperation = $null + [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Delete' ` + -Headers $apiHttpRequestHeader + + if ($Wait) + { + # Waits for operation to complete successfully. Throws exception if operation is not successful and/or timeout is reached. + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $apiOperation.id ` + -IsSuccessful + } + } +} From 0051dd39abf3447d74f4bbd35632ee5b17977311 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:14:50 +0000 Subject: [PATCH 166/611] Added 'Remove-AzDevOpsProject' function. --- .../Public/Remove-AzDevOpsProject.ps1 | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 new file mode 100644 index 000000000..80bff781c --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 @@ -0,0 +1,65 @@ +<# + .SYNOPSIS + Removes/deletes a Azure DevOps 'Project' with the provided 'ProjectId'. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ProjectId + The 'id' of the 'Project' being deleted. + + .PARAMETER Force + When this switch is used, any confirmation will be overidden/ignored. + + .EXAMPLE + New-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ProjectName 'YourProjectNameHere' ` + -ProjectDescription 'YourProjectDescriptionHere' -SourceControlType 'Git' + + Creates a 'Project' (assocated with the Organization/ApiUrl) in Azure DevOps using project-related, parameter values provided. +#> +function Remove-AzDevOpsProject +{ + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + [OutputType([System.Object])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] + [Alias('Id')] + [System.String] + $ProjectId, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + if ($Force -or $PSCmdlet.ShouldProcess($ApiUri, $ResourceName)) + { + Remove-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName 'Project' ` + -ResourceId $ProjectId ` + -Force:$Force -Wait | Out-Null + + } +} From bce98068a36abb9b89802633ddddf411dc00c4cc Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:14:59 +0000 Subject: [PATCH 167/611] Added 'Remove-AzDevOpsProject' function to module manifest. --- .../Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 index 9a8ff8862..dae2251ee 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -30,7 +30,8 @@ 'Get-AzDevOpsProject', 'New-AzDevOpsProject', - 'Set-AzDevOpsProject' + 'Set-AzDevOpsProject', + 'Remove-AzDevOpsProject' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. From f349683c1d20d3226cfa0cff730685da8b156a47 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:16:48 +0000 Subject: [PATCH 168/611] Updated 'DSC_AzDevOpsProject' DSCResouce to handle 'Ensure' values more consistently and return a 'DSC_AzDevOpsProject' object from get if existing resource does not exist. --- source/AzureDevOpsDsc.psm1 | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 5cf757f83..af9d79f62 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -90,7 +90,16 @@ class DSC_AzDevOpsProject if ($null -eq $existing) { - return $null + return [DSC_AzDevOpsProject]@{ + + # Existing properties + ApiUri = $this.ApiUri + Pat = $this.Pat + ProjectName = $this.ProjectName + + # Updated properties (from 'Get') + Ensure = 'Absent' + } } Write-Verbose "Get()..." @@ -108,11 +117,12 @@ class DSC_AzDevOpsProject return [DSC_AzDevOpsProject]@{ # Existing properties - Ensure = $this.Ensure ApiUri = $this.ApiUri Pat = $this.Pat + # Updated properties (from 'Get') + Ensure = 'Present' ProjectId = $existing.id ProjectName = $existing.name ProjectDescription = $existing.description @@ -150,7 +160,7 @@ class DSC_AzDevOpsProject { 'Present' { # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) - if ($null -eq $existing) + if ($null -eq $existing -or $existing.Ensure -eq 'Absent') { return $false } @@ -169,7 +179,7 @@ class DSC_AzDevOpsProject } 'Absent' { # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $existing) + if ($null -ne $existing -and $existing.Ensure -ne 'Absent') { return $false } @@ -214,7 +224,7 @@ class DSC_AzDevOpsProject { 'Present' { # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) - if ($null -eq $existing) + if ($null -eq $existing -or $existing.Ensure -ne 'Present') { $requiredFunction = [RequiredFunction]::New } @@ -233,7 +243,7 @@ class DSC_AzDevOpsProject } 'Absent' { # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $existing) + if ($null -ne $existing -and $existing.Ensure -ne 'Absent') { $requiredFunction = [RequiredFunction]::Remove } @@ -288,7 +298,6 @@ class DSC_AzDevOpsProject ProjectId = $newSetParameters.ProjectId } - throw "Need to create 'Remove-AzDevOpsProject' function!!" Remove-AzDevOpsProject @removeParameters -Force | Out-Null Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break From d8c2511ea3c15265970c57cfc87b5ee8a1d779b2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:17:59 +0000 Subject: [PATCH 169/611] Added 'EnsureProjectRemoved' integration test for 'DSC_AzDevOpsProject' DSCResource and amended other tests to include validation of 'Ensure' property. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 1134e7efe..391f69be9 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -85,6 +85,7 @@ try -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.Ensure | Should -Be 'Present' $resourceCurrentState.ProjectName | Should -Be 'TestGitProjectName' $resourceCurrentState.ProjectDescription | Should -Be 'TestGitProjectDescription' $resourceCurrentState.SourceControlType | Should -Be 'Git' @@ -144,6 +145,7 @@ try -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.Ensure | Should -Be 'Present' $resourceCurrentState.ProjectName | Should -Be 'TestTfvcProjectName' $resourceCurrentState.ProjectDescription | Should -Be 'TestTfvcProjectDescription' $resourceCurrentState.SourceControlType | Should -Be 'Tfvc' @@ -204,6 +206,7 @@ try } # These are all defaults from values provided in configuration data + $resourceCurrentState.Ensure | Should -Be 'Present' $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' $resourceCurrentState.SourceControlType | Should -Be 'Git' @@ -264,6 +267,7 @@ try -and $_.ResourceId -eq $resourceId } + $resourceCurrentState.Ensure | Should -Be 'Present' $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' $resourceCurrentState.ProjectDescription | Should -Be 'AnAmendedProjectDescription' $resourceCurrentState.SourceControlType | Should -Be 'Git' # Must be the same (change not supported with this) @@ -275,6 +279,63 @@ try } } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectRemoved_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectRemoved_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectRemoved" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Absent' + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + } } From f2e441d44dc76ee9aca20af23603b4eabfbaf086 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 4 Nov 2020 18:20:55 +0000 Subject: [PATCH 170/611] Updated 'ProjectDescription' in config. --- .../DSC_AzDevOpsProject.config.ps1 | 133 +++++++++++++++++- 1 file changed, 127 insertions(+), 6 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index cdf01e98a..b6008c7e9 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -23,7 +23,7 @@ #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' ProjectName = 'TestProjectName' - ProjectDescription = 'TestProjectDescription2' + ProjectDescription = 'TestProjectDescription' SourceControlType = 'Git' @@ -38,12 +38,70 @@ <# .SYNOPSIS - Reverts the SQL Server Agent service account of the default instance to - the original account that was initially used during installation. + Attempts to ensure an Azure DevOps 'Project' (that uses 'Git' for source control) is present. .NOTES - This test is intentionally meant to run using the credentials in - $SqlInstallCredential. + +#> +Configuration DSC_AzDevOpsProject_EnsureGitProjectPresent_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureGitProjectPresent + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestGitProjectName' + ProjectDescription = 'TestGitProjectDescription' + + SourceControlType = 'Git' + + Ensure = $Node.Ensure + } + } +} + + +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is present. + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectPresent + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestTfvcProjectName' + ProjectDescription = 'TestTfvcProjectDescription' + + SourceControlType = 'Tfvc' + + Ensure = $Node.Ensure + } + } +} + + +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' is updated. + + .NOTES + #> Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config { @@ -51,7 +109,7 @@ Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test + DSC_AzDevOpsProject Integration_Test_EnsureProjectPresent { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -60,7 +118,70 @@ Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config ProjectName = $Node.ProjectName ProjectDescription = $Node.ProjectDescription + SourceControlType = $Node.SourceControlType + Ensure = $Node.Ensure } } } + + +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' is updated. + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureProjectUpdated_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureProjectUpdated + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = $Node.ProjectName + ProjectDescription = 'AnAmendedProjectDescription' + + SourceControlType = $Node.SourceControlType + + Ensure = $Node.Ensure + } + } +} + + +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' is updated. + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureProjectRemoved_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureProjectRemoved + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = $Node.ProjectName + #ProjectDescription = $Node.ProjectDescription + + #SourceControlType = $Node.SourceControlType + + Ensure = 'Absent' + } + } +} + From be13cef11fa38a740a11d6358bcb11b6d1e6eb71 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:20:58 +0000 Subject: [PATCH 171/611] Updated/added error strings to 'AzureDevOpsDsc.Common.strings.psd1' --- .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 index a5aa003ff..31287c77e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -5,7 +5,12 @@ ConvertFrom-StringData @' MandatoryIsValidSwitchNotUsed = The '-IsValid' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0501) MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed = Either the '-IsComplete' switch or the '-IsSuccessful' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0502) MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed = Only one of the '-IsComplete' switch and the '-IsSuccessful' switch can be used when calling '{0}'. (AZDEVOPSCOMMON0503) + MandatoryIsPresentAndIsAbsentSwitchesNotUsed = Either the '-IsPresent' switch or the '-IsAbsent' switch must be used when calling '{0}'. (AZDEVOPSCOMMON0504) + MandatoryIsPresentAndIsAbsentSwitchesBothUsed = Only one of the '-IsPresent' switch and the '-IsAbsent' switch can be used when calling '{0}'. (AZDEVOPSCOMMON0505) - AzDevOpsOperationTimeoutExceeded = The '{0}' function (using OperationId of '$OperationId') exceeded specified, maximum timeout ({2} milliseconds). (AZDEVOPSCOMMON0701) + AzDevOpsApiResourceAccessDenied = The Azure DevOps API returned an "ACCESS DENIED" error when performing an operation/request (using ResourceName of '{0}' and ResourceId of '{1}'). (AZDEVOPSCOMMON0601) + AzDevOpsApiResourceWaitTimeoutExceeded = The '{0}' function (using ResourceName of '{1}' and ResourceId of '{2}') exceeded specified, maximum timeout ({3} milliseconds). (AZDEVOPSCOMMON0602) + + AzDevOpsOperationWaitTimeoutExceeded = The '{0}' function (using OperationId of '{1}') exceeded specified, maximum timeout ({2} milliseconds). (AZDEVOPSCOMMON0702) '@ From 8cf9585751e983b7c50302602c1ed3fd6e3d1e30 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:21:56 +0000 Subject: [PATCH 172/611] Updated error message string used within 'Wait-AzDevOpsOperation' --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 973eeb01a..c38386496 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -108,7 +108,7 @@ function Wait-AzDevOpsOperation if ($(New-TimeSpan -Start $waitStartDateTime -End $([System.DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) { - $errorMessage = $script:localizedData.AzDevOpsOperationTimeoutExceeded -f $MyInvocation.MyCommand, $OperationId, $WaitTimeoutMilliseconds + $errorMessage = $script:localizedData.AzDevOpsOperationWaitTimeoutExceeded -f $MyInvocation.MyCommand, $OperationId, $WaitTimeoutMilliseconds New-InvalidOperationException -Message $errorMessage } } From c4e32aeede8037efd2db299fa76eb750f07b49e6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:22:21 +0000 Subject: [PATCH 173/611] Added 'Test-AzDevOpsApiResource' function --- .../Private/Test-AzDevOpsApiResource.ps1 | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 new file mode 100644 index 000000000..7078a7361 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 @@ -0,0 +1,65 @@ +<# + .SYNOPSIS + Tests for the presence of an Azure DevOps API Resource. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/Resources + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent Resources being performed. + + .PARAMETER ResourceName + The name of the resource being updated within Azure DevOps (e.g. 'Project') + + .PARAMETER ResourceId + The 'id' of the Azure DevOps API Resource. This is typically obtained from a response + provided by the API when a request is made to it. + + .EXAMPLE + Test-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ResourceName 'YourResourceName' -ResourceId 'YourResourceId' + + Tests that the Azure DevOps 'Resource' (identified by the 'ResourceId' for the resource of type + provided by the 'ResourceName' field) exists. Returns $true if it exists and returns $false + if it does not. +#> +function Test-AzDevOpsApiResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsResourceId -ResourceId $_ -IsValid })] + [Alias('Id')] + [System.String] + $ResourceId + ) + + [object[]]$apiResource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId + + return ($apiResource.Count -gt 0) +} From ed27b34636d019d5a7afae447a08cd736e6290ee Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:22:39 +0000 Subject: [PATCH 174/611] Added 'Wait-AzDevOpsApiResource' function --- .../Private/Wait-AzDevOpsApiResource.ps1 | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 new file mode 100644 index 000000000..31c2dedda --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -0,0 +1,137 @@ +<# + .SYNOPSIS + Waits for an Azure DevOps API resource to be present or absent. + + NOTE: Use of one of the '-IsPresent' or '-IsAbsent' switch is required. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ResourceName + The name of the resource being updated within Azure DevOps (e.g. 'Project') + + .PARAMETER ResourceId + The 'id' of the Azure DevOps API Resource. This is typically obtained from a response + provided by the API when a request is made to it. + + .PARAMETER IsPresent + Use of this switch will ensure the function waits for the Azure DevOps API resource + to be present. + + Failure to use this switch or the '-IsAbsent' one as an alternative will throw an + exception. An exception will also be thrown if the wait exceeds the timeout. + + .PARAMETER IsAbsent + Use of this switch will ensure the function waits for the Azure DevOps API resource + to be absent. + + Failure to use this switch or the '-IsPresent' one as an alternative will throw an + exception. An exception will also be thrown if the wait exceeds the timeout. + + .EXAMPLE + Wait-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ResourceName 'YourResourceName' -ResourceId 'YourResourceId' ` + -IsPresent + + Waits for the Azure DevOps 'Resource' (identified by the 'ResourceId' for the specific 'ResourceName') + to indicate that the API resource being waited for is present (i.e. it has been added and does exist). + + .EXAMPLE + Wait-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ResourceName 'YourResourceName' -ResourceId 'YourResourceId' ` + -IsAbsent + + Waits for the Azure DevOps 'Resource' (identified by the 'ResourceId' for the specific 'ResourceName') + to indicate that the API resource being waited for is absent (i.e. it has been removed and does not exist). +#> +function Wait-AzDevOpsApiResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsApiResourceName -ResourceName $_ -IsValid })] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsResourceId -ResourceId $_ -IsValid })] + [Alias('Id')] + [System.String] + $ResourceId, + + [Parameter()] + [Alias('Interval','IntervalMilliseconds')] + [System.UInt32] + $WaitIntervalMilliseconds = 100, + + [Parameter()] + [Alias('Timeout','TimeoutMilliseconds')] + [System.UInt32] + $WaitTimeoutMilliseconds = 10000, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IsPresent, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IsAbsent + ) + + if (!$IsPresent -and !$IsAbsent) + { + $errorMessage = $script:localizedData.MandatoryIsPresentAndIsAbsentSwitchesNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + elseif ($IsPresent -and $IsAbsent) + { + $errorMessage = $script:localizedData.MandatoryIsPresentAndIsAbsentSwitchesBothUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + + [System.DateTime]$waitStartDateTime = [System.DateTime]::UtcNow + + [bool]$testAzDevOpsApiResource = Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId + + # Wait/Sleep while... + # 1) Resource is currently absent but waiting for presence or; + # 2) Resource is currently present but waiting for absence + while (($IsPresent -and -not $testAzDevOpsApiResource) -or + ($IsAbsent -and $testAzDevOpsApiResource)) + { + Start-Sleep -Milliseconds $WaitIntervalMilliseconds + + if ($(New-TimeSpan -Start $waitStartDateTime -End $([System.DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) + { + $errorMessage = $script:localizedData.AzDevOpsApiResourceWaitTimeoutExceeded -f $MyInvocation.MyCommand, $ResourceName, $ResourceId, $WaitTimeoutMilliseconds + New-InvalidOperationException -Message $errorMessage + } + + [bool]$testAzDevOpsApiResource = Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId + } +} From 75c0079418a253b5ae808cbd695943cb998a9a9b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:32:27 +0000 Subject: [PATCH 175/611] Added post-operation delays/buffers into 'New-AzDevOpsApiResource', 'Set-AzDevOpsApiResource' and 'Remove-AzDevOpsApiResource' --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 3 +++ .../Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 | 3 +++ .../Api/Functions/Private/Set-AzDevOpsApiResource.ps1 | 3 +++ 3 files changed, 9 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 667e8993a..77268e41a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -104,6 +104,9 @@ function New-AzDevOpsApiResource Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $apiOperation.id ` -IsSuccessful + + # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API + Start-Sleep -Milliseconds 250 } } } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 index 8ef9c8fed..984f2af40 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 @@ -104,6 +104,9 @@ function Remove-AzDevOpsApiResource Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $apiOperation.id ` -IsSuccessful + + # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API + Start-Sleep -Milliseconds 250 } } } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 index 814aa2f51..b003b2c6e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 @@ -110,6 +110,9 @@ function Set-AzDevOpsApiResource Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $apiOperation.id ` -IsSuccessful + + # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API + Start-Sleep -Milliseconds 250 } } } From d396e34c57c6186d30b0076bc578cc21b458de0c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:45:39 +0000 Subject: [PATCH 176/611] Added 'Get-AzDevOpsApiWaitIntervalMs' function --- .../Private/Get-AzDevOpsApiWaitIntervalMs.ps1 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 new file mode 100644 index 000000000..8c1866b7f --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 @@ -0,0 +1,19 @@ +<# + .SYNOPSIS + Returns the number of Milliseconds that will be waited for between calls + to the Azure DevOps API. + + .EXAMPLE + Get-AzDevOpsApiWaitIntervalMs + + Returns the number of Milliseconds that will be waited for between calls + to the Azure DevOps API. +#> +function Get-AzDevOpsApiWaitIntervalMs +{ + [CmdletBinding()] + [OutputType([int])] + param () + + return 250 +} From b1304f9485e772e73ee6730ae9d7dcf6c2a2a522 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:45:48 +0000 Subject: [PATCH 177/611] Added 'Get-AzDevOpsApiWaitTimeoutMs' --- .../Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 new file mode 100644 index 000000000..13c296b55 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 @@ -0,0 +1,19 @@ +<# + .SYNOPSIS + Returns the number of Milliseconds that will be waited for calls to + the Azure DevOps API to timeout (during a 'Wait' operation). + + .EXAMPLE + Get-AzDevOpsApiWaitTimeoutMs + + Returns the number of Milliseconds that will be waited for calls to + the Azure DevOps API to timeout (during a 'Wait' operation). +#> +function Get-AzDevOpsApiWaitTimeoutMs +{ + [CmdletBinding()] + [OutputType([int])] + param () + + return 10000 +} From 06a00678a6cfc264a558c4d587884e4d7d8a58e8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:46:39 +0000 Subject: [PATCH 178/611] Updated 'Wait-AzDevOpsApiResource' to make use of 'Get-AzDevOpsApiWaitIntervalMs' and 'Get-AzDevOpsApiWaitTimeoutMs' functions as parameter default values. --- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index 31c2dedda..56d5a8a04 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -82,12 +82,12 @@ function Wait-AzDevOpsApiResource [Parameter()] [Alias('Interval','IntervalMilliseconds')] [System.UInt32] - $WaitIntervalMilliseconds = 100, + $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] [Alias('Timeout','TimeoutMilliseconds')] [System.UInt32] - $WaitTimeoutMilliseconds = 10000, + $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter()] [System.Management.Automation.SwitchParameter] From d501d4354482b6cc4cb69b9e1b2886cc250990ba Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:51:28 +0000 Subject: [PATCH 179/611] Updated 'Wait-AzDevOpsOperation' to make use of 'Get-AzDevOpsApiWaitIntervalMs' and 'Get-AzDevOpsApiWaitTimeoutMs' functions as parameter default values. --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index c38386496..ad41d8c36 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -70,12 +70,12 @@ function Wait-AzDevOpsOperation [Parameter()] [Alias('Interval','IntervalMilliseconds')] [System.UInt32] - $WaitIntervalMilliseconds = 100, + $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] [Alias('Timeout','TimeoutMilliseconds')] [System.UInt32] - $WaitTimeoutMilliseconds = 10000, + $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter()] [System.Management.Automation.SwitchParameter] From 1e064e73ce67d91675f7c23e6ce368b9f8046213 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:54:59 +0000 Subject: [PATCH 180/611] Updated 'Get-AzDevOpsApiWaitIntervalMs' return value to 500 milliseconds --- .../Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 index 8c1866b7f..30ae0467f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 @@ -15,5 +15,5 @@ function Get-AzDevOpsApiWaitIntervalMs [OutputType([int])] param () - return 250 + return 500 } From ce165cc9579518e778caaab2b9fdc729bbadc489 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 09:57:15 +0000 Subject: [PATCH 181/611] Removed 'Start-Sleep' statements from 'DSC_AzDevOpsProject' Set() method. --- source/AzureDevOpsDsc.psm1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index af9d79f62..03aad4eb1 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -278,7 +278,6 @@ class DSC_AzDevOpsProject } 'New' { New-AzDevOpsProject @newSetParameters -Force | Out-Null - Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'New-AzDevOpsProject' command break } 'Set' { @@ -287,7 +286,6 @@ class DSC_AzDevOpsProject Set-AzDevOpsProject @newSetParameters -Force | Out-Null - Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break } 'Remove' { @@ -299,7 +297,6 @@ class DSC_AzDevOpsProject } Remove-AzDevOpsProject @removeParameters -Force | Out-Null - Start-Sleep -Seconds 5 # Need/Want to remove .... and replace with wait in the 'Set-AzDevOpsProject' command break } default { From d94bc94a6219b23e5a75b49e23f9f50533d449ea Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 10:03:19 +0000 Subject: [PATCH 182/611] Updated 'New-AzDevOpsApiResource' to make use of 'Get-AzDevOpsApiWaitIntervalMs' function for post-operation delay. --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 77268e41a..4ec2e1982 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -106,7 +106,7 @@ function New-AzDevOpsApiResource -IsSuccessful # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API - Start-Sleep -Milliseconds 250 + Start-Sleep -Milliseconds $(Get-AzDevOpsApiWaitIntervalMs) } } } From b90fccf96bebc40b790c49186069ba81d8951571 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 10:03:26 +0000 Subject: [PATCH 183/611] Updated 'Remove-AzDevOpsApiResource' to make use of 'Get-AzDevOpsApiWaitIntervalMs' function for post-operation delay. --- .../Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 index 984f2af40..92324bc72 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 @@ -106,7 +106,7 @@ function Remove-AzDevOpsApiResource -IsSuccessful # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API - Start-Sleep -Milliseconds 250 + Start-Sleep -Milliseconds $(Get-AzDevOpsApiWaitIntervalMs) } } } From b9f4b921c6ef0f8227c2936eadb32eef2a9fb2c2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 10:03:39 +0000 Subject: [PATCH 184/611] Updated 'Set-AzDevOpsApiResource' to make use of 'Get-AzDevOpsApiWaitIntervalMs' function for post-operation delay. --- .../Api/Functions/Private/Set-AzDevOpsApiResource.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 index b003b2c6e..212a56f1f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 @@ -112,7 +112,7 @@ function Set-AzDevOpsApiResource -IsSuccessful # Adds an additional, post-operation delay/buffer to mitigate subsequent calls trying to obtain new/updated items too quickly from the API - Start-Sleep -Milliseconds 250 + Start-Sleep -Milliseconds $(Get-AzDevOpsApiWaitIntervalMs) } } } From 278278b53a72b7d985901ce8d2c1684d3577b43d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 10:36:30 +0000 Subject: [PATCH 185/611] Updated/fixed 'Get-AzDevOpsProject' tests off the back of changed expectations. --- .../Public/Get-AzDevOpsProject.Tests.ps1 | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index 4a7bdb172..152a906cb 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -9,11 +9,11 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { BeforeAll { - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { + $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames - $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { return $mockProjects | ForEach-Object { @{ @@ -51,11 +51,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiResource" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { + It 'Should call "Get-AzDevOpsApiResource" function once per project present/available + 1 initial call - "", ""' -TestCases $testCasesValidApiUriPatCombined { param ([string]$ApiUri, [string]$Pat) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times $($mockProjects.Count + 1) -Exactly -Scope It } } @@ -78,11 +78,11 @@ InModuleScope $script:subModuleName { Context 'When a "Project" with supplied "ProjectName" parameter value exists' { - It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It } } @@ -113,11 +113,11 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) } - It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It } Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { From de0aeba46c293d70960d36744656375e65d8d9bb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 11:36:54 +0000 Subject: [PATCH 186/611] Added 'DSC_AzDevOpsResource' class and moved 'Ensure', 'ApiUri' and 'Pat' properties out of 'DSC_AzDevOpsProject' class (which now inherits from it) --- source/AzureDevOpsDsc.psm1 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 03aad4eb1..7bc9699be 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -26,11 +26,8 @@ enum RequiredFunction } - -[DscResource()] -class DSC_AzDevOpsProject +class DSC_AzDevOpsResource { - [DscProperty()] [Ensure]$Ensure @@ -42,8 +39,13 @@ class DSC_AzDevOpsProject [DscProperty()] [Alias('PersonalAccessToken')] [string]$Pat +} +[DscResource()] +class DSC_AzDevOpsProject : DSC_AzDevOpsResource +{ + [DscProperty()] # Note: Do want to be able to pass this back populated so not set as 'NotConfigurable' [Alias('Id')] [string]$ProjectId From 333311585c16dc9dda4281d56692b53ba540765c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 14:31:44 +0000 Subject: [PATCH 187/611] Added a number of hidden properties and functions into 'DSC_AzDevOpsResource' class. --- source/AzureDevOpsDsc.psm1 | 234 ++++++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 7bc9699be..d0e14cae6 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -26,12 +26,9 @@ enum RequiredFunction } + class DSC_AzDevOpsResource { - [DscProperty()] - [Ensure]$Ensure - - [DscProperty()] [Alias('Uri')] [string]$ApiUri @@ -39,6 +36,235 @@ class DSC_AzDevOpsResource [DscProperty()] [Alias('PersonalAccessToken')] [string]$Pat + + [DscProperty()] + [Ensure]$Ensure + + + # Non-DSC properties for use in operations/comparisons + + + # Hidden properties + hidden [string]$ResourceKey + hidden [string]$ResourceKeyPropertyName + hidden [string]$ResourceName = $this.GetResourceName() + hidden [hashtable]$ResourceProperties = $this.GetResourceProperties() + + + # Constructor(s) + DSC_AzDevOpsResource(){} + + + # DSC-specific methods + + hidden [string[]]GetDscResourceDscPropertyNames() + { + [string[]]$thisDscPropertyNames = @() + + [Type]$thisType = $this.GetType() + + $thisProperties = $thisType.GetProperties() + $thisProperties | ForEach-Object { + + $PropertyName = $_.Name + + $_.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute') + { + $thisDscPropertyNames += $PropertyName + } + } + } + + return $thisDscPropertyNames + } + + hidden [string]GetDscResourceDscKeyPropertyName() + { + [string[]]$thisDscKeyPropertyNames = @() + + $thisProperties = $this.GetDscResourceDscPropertyNames() + $thisProperties | ForEach-Object { + + $PropertyName = $_.Name + + $_.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and + $_.Key -eq $true) + { + $thisDscKeyPropertyNames += $PropertyName + } + } + } + + if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) + { + throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + } + elseif ($thisDscKeyPropertyNames.Count -gt 1) + { + throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + } + + return $thisDscKeyPropertyNames[0] + } + + + + + # Non DSC-specific methods + + hidden [string]GetResourceName() + { + # Assumes a naming convention is followed between the DSC + # resource name and the name of the resource within the API + return $this.GetType().ToString().Replace('DSC_AzDevOps','') + } + + + hidden [string]GetResourceKeyPropertyName() + { + # Uses the same value as the 'DscResourceDscKeyPropertyName' + return $this.GetDscResourceDscKeyPropertyName() + } + + + hidden [string]GetResourceKey() + { + [string]$keyPropertyName = $this.GetResourceKeyPropertyName() + + if ([string]::IsNullOrWhiteSpace($keyPropertyName)) + { + return $null + } + + return $this."$keyPropertyName" + } + + + # This method must be overidden by inheriting classes + hidden [string]GetResourceAlternateKeyPropertyName() + { + $thisType = $this.GetType() + if ($thisType -eq [DSC_AzDevOpsResource]) + { + throw "Method 'GetResourceAlternateKeyPropertyName()' in '$($thisType.Name)' must be overidden by an inheriting class." + return $null + } + return $null + } + + + hidden [string]GetResourceAlternateKey() + { + [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + + if ([string]::IsNullOrWhiteSpace($alternateKeyPropertyName)) + { + return $null + } + + return $this."$alternateKeyPropertyName" + } + + + hidden [Hashtable]GetResourceProperties() + { + [PSObject]$thisObject = $this + [Hashtable]$thisProperties = @{} + + $thisObject.PSObject.Properties | ForEach-Object { + $thisProperties[$_.Name] = $_.Value + } + + return $thisProperties + } + + + hidden [string]GetResourceGetMethodName() + { + $thisResourceName = $this.GetResourceName() + return "Get-AzDevOps$thisResourceName" + } + hidden [string]GetResourceSetMethodName() + { + $thisResourceName = $this.GetResourceName() + return "Set-AzDevOps$thisResourceName" + } + hidden [string]GetResourceRemoveMethodName() + { + $thisResourceName = $this.GetResourceName() + return "Remove-AzDevOps$thisResourceName" + } + hidden [string]GetResourceTestMethodName() + { + $thisResourceName = $this.GetResourceName() + return "Test-AzDevOps$thisResourceName" + } + + + hidden [object]GetCurrentStateResourceObject() + { + [string]$thisResourceKey = $this.GetResourceKey() + [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() + [string]$thisResourceGetMethodName = $this.GetResourceGetMethodName() + + $getParameters = @{ + ApiUri = $this.ApiUri + Pat = $this.Pat + "$thisResourceKey" = $this."$thisResourceKey" + } + + if (![string]::IsNullOrWhiteSpace($this."$thisResourceAlternateKey")) + { + $getParameters."$thisResourceAlternateKey" = $this."$thisResourceAlternateKey" + } + + return & $thisResourceGetMethodName @getParameters + } + + + [Hashtable]GetCurrentStateProperties() + { + # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class + return $this.GetCurrentStateProperties($this.GetCurrentStateResourceObject()) + } + + # This method must be overidden by inheriting classes + [Hashtable]GetCurrentStateProperties([object]$ResourceObject) + { + $thisType = $this.GetType() + if ($thisType -eq [DSC_AzDevOpsResource]) + { + throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden by an inheriting class." + return $null + } + return $null + } + + [Hashtable]GetDesiredStateProperties() + { + return $this.GetResourceProperties() + } + + + [bool]IsInDesiredState( + [hashtable]$Desired, + [hashtable]$Current) + { + $thisType = $this.GetType() + if ($thisType -eq [DSC_AzDevOpsResource]) + { + throw "Method 'IsInDesiredState()' in '$($thisType.Name)' must be overidden by an inheriting class." + return $null + } + return $null + } + } From 9198a9dde4532b6eaa52757d14ac6d1ed444f578 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 16:10:38 +0000 Subject: [PATCH 188/611] Added/Corrected a number of functions within 'DSC_AzDevOpsResource' class to enable successful call to 'GetCurrentStateProperties()' method. --- source/AzureDevOpsDsc.psm1 | 101 +++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 28 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index d0e14cae6..b0758c42f 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -62,13 +62,13 @@ class DSC_AzDevOpsResource [string[]]$thisDscPropertyNames = @() [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - $thisProperties = $thisType.GetProperties() $thisProperties | ForEach-Object { - + [System.Reflection.PropertyInfo]$propertyInfo = $_ $PropertyName = $_.Name - $_.GetCustomAttributes($true) | + $propertyInfo.GetCustomAttributes($true) | ForEach-Object { if ($_.TypeId.Name -eq 'DscPropertyAttribute') @@ -85,12 +85,15 @@ class DSC_AzDevOpsResource { [string[]]$thisDscKeyPropertyNames = @() - $thisProperties = $this.GetDscResourceDscPropertyNames() - $thisProperties | ForEach-Object { + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + $thisProperties | ForEach-Object { + Write-Verbose $_.Name + [System.Reflection.PropertyInfo]$propertyInfo = $_ $PropertyName = $_.Name - $_.GetCustomAttributes($true) | + $propertyInfo.GetCustomAttributes($true) | ForEach-Object { if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and @@ -149,26 +152,13 @@ class DSC_AzDevOpsResource # This method must be overidden by inheriting classes hidden [string]GetResourceAlternateKeyPropertyName() { - $thisType = $this.GetType() - if ($thisType -eq [DSC_AzDevOpsResource]) - { - throw "Method 'GetResourceAlternateKeyPropertyName()' in '$($thisType.Name)' must be overidden by an inheriting class." - return $null - } - return $null + return "$($this.GetResourceName())Id" } hidden [string]GetResourceAlternateKey() { - [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() - - if ([string]::IsNullOrWhiteSpace($alternateKeyPropertyName)) - { - return $null - } - - return $this."$alternateKeyPropertyName" + return $this."$($this.GetResourceAlternateKeyPropertyName())" } @@ -210,21 +200,34 @@ class DSC_AzDevOpsResource hidden [object]GetCurrentStateResourceObject() { [string]$thisResourceKey = $this.GetResourceKey() + [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() + [string]$thisResourceAlternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() [string]$thisResourceGetMethodName = $this.GetResourceGetMethodName() $getParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - "$thisResourceKey" = $this."$thisResourceKey" + ApiUri = $this.ApiUri + Pat = $this.Pat + "$thisResourceKeyPropertyName" = $thisResourceKey } - if (![string]::IsNullOrWhiteSpace($this."$thisResourceAlternateKey")) + if (![string]::IsNullOrWhiteSpace($thisResourceAlternateKey)) { - $getParameters."$thisResourceAlternateKey" = $this."$thisResourceAlternateKey" + $getParameters."$thisResourceAlternateKeyPropertyName" = $thisResourceAlternateKey + } + + Write-Verbose "Calling '$thisResourceGetMethodName'..." + + $currentStateResourceObject = $(& $thisResourceGetMethodName @getParameters) + + if ($null -eq $currentStateResourceObject) + { + return New-Object -TypeName 'PSObject' -Property @{ + Ensure = [Ensure]::Absent + } } - return & $thisResourceGetMethodName @getParameters + return $currentStateResourceObject } @@ -235,7 +238,7 @@ class DSC_AzDevOpsResource } # This method must be overidden by inheriting classes - [Hashtable]GetCurrentStateProperties([object]$ResourceObject) + [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) { $thisType = $this.GetType() if ($thisType -eq [DSC_AzDevOpsResource]) @@ -246,6 +249,18 @@ class DSC_AzDevOpsResource return $null } + + [Ensure]GetEnsure([object]$ResourceObject) + { + [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() + + if ([string]::IsNullOrWhiteSpace($ResourceObject."$thisResourceKeyPropertyName")) + { + return [Ensure]::Absent + } + return [Ensure]::Present + } + [Hashtable]GetDesiredStateProperties() { return $this.GetResourceProperties() @@ -272,6 +287,27 @@ class DSC_AzDevOpsResource class DSC_AzDevOpsProject : DSC_AzDevOpsResource { + [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) + { + $properties = @{ + Pat = $this.Pat + ApiUri = $this.ApiUri + + Ensure = $($this.GetEnsure($CurrentResourceObject)) + } + + if ($null -ne $CurrentResourceObject) + { + $properties.ProductId = $CurrentResourceObject['id'] + $properties.ProductName = $CurrentResourceObject['name'] + $properties.Description = $CurrentResourceObject['description'] + } + + return $properties + } + + + [DscProperty()] # Note: Do want to be able to pass this back populated so not set as 'NotConfigurable' [Alias('Id')] [string]$ProjectId @@ -362,6 +398,15 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [bool] Test() { + Write-Verbose "Test(): Calling 'GetCurrentStateProperties'..." + $current = $this.GetCurrentStateProperties() + Write-Verbose "Test(): Successfully called 'GetCurrentStateProperties'." + + Write-Verbose "Test(): CurrentStateProperties are..." + Write-Verbose $($current | ConvertTo-Json) + Write-Verbose "Test(): " + + $existing = $this.Get() # Note: $this is effectively 'desired' values From 6399eeb6228f7a822d539a1daa38eca21b16bcb8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 17:03:34 +0000 Subject: [PATCH 189/611] Added 'GetRequiredAction()' method in 'DSC_AzDevOpsResource' DSC resource --- source/AzureDevOpsDsc.psm1 | 136 ++++++++++++++++++++++++++++++++----- 1 file changed, 118 insertions(+), 18 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index b0758c42f..3adb4720c 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -17,12 +17,13 @@ enum Ensure Absent } -enum RequiredFunction +enum RequiredAction { None New Set Remove + Error } @@ -231,14 +232,14 @@ class DSC_AzDevOpsResource } - [Hashtable]GetCurrentStateProperties() + hidden [Hashtable]GetCurrentStateProperties() { # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class return $this.GetCurrentStateProperties($this.GetCurrentStateResourceObject()) } # This method must be overidden by inheriting classes - [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) + hidden [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) { $thisType = $this.GetType() if ($thisType -eq [DSC_AzDevOpsResource]) @@ -250,7 +251,7 @@ class DSC_AzDevOpsResource } - [Ensure]GetEnsure([object]$ResourceObject) + hidden [Ensure]GetEnsure([object]$ResourceObject) { [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() @@ -261,23 +262,112 @@ class DSC_AzDevOpsResource return [Ensure]::Present } - [Hashtable]GetDesiredStateProperties() + hidden [Hashtable]GetDesiredStateProperties() { return $this.GetResourceProperties() } - [bool]IsInDesiredState( - [hashtable]$Desired, - [hashtable]$Current) + hidden [RequiredAction]GetRequiredAction() { - $thisType = $this.GetType() - if ($thisType -eq [DSC_AzDevOpsResource]) + [hashtable]$currentProperties = $this.GetCurrentStateProperties() + [hashtable]$desiredProperties = $this.GetDesiredStateProperties() + + [string[]]$propertyNamesUnsupportedForSet = @() + [string[]]$propertyNamesToCompare = $this.GetDscResourceDscPropertyNames() + + + # Update 'AlternateKey' property: + # Set $desiredProperties."$alternateKeyPropertyName" to $currentProperties."$alternateKeyPropertyName" if it's desired + # value is blank/null but it's current/existing value is known (and can be recovered from $currentProperties). + # + # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences + [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + if ([string]::IsNullOrWhiteSpace($desiredProperties."$alternateKeyPropertyName") -and + ![string]::IsNullOrWhiteSpace($currentProperties."$alternateKeyPropertyName")) { - throw "Method 'IsInDesiredState()' in '$($thisType.Name)' must be overidden by an inheriting class." - return $null + $desiredProperties."$alternateKeyPropertyName" = $currentProperties."$alternateKeyPropertyName" } - return $null + + + # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already 'Present' but property values differ) + switch ($desiredProperties.Ensure) + { + 'Present' { + + # If not already present, or different to expected/desired - return 'New' (i.e. Resource needs creating) + if ($null -eq $currentProperties -or $currentProperties.Ensure -ne 'Present') + { + return [RequiredAction]::New + break + } + + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) + if ($propertyNamesUnsupportedForSet.Count -gt 0) + { + $propertyNamesUnsupportedForSet | ForEach-Object { + if ($currentProperties."$_" -ne $desiredProperties."$_") + { + throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." + return [RequiredAction]::Error + break + } + } + } + + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) + if ($propertyNamesToCompare.Count -gt 0) + { + $propertyNamesToCompare | ForEach-Object { + if ($currentProperties."$_" -ne $desiredProperties."$_") + { + return [RequiredAction]::Set + break + } + } + } + + # Otherwise, no changes to make (i.e. The desired state is already achieved) + return [RequiredAction]::None + break + } + 'Absent' { + # If currently/already present - return $false (i.e. state is incorrect) + if ($null -ne $currentProperties -and $currentProperties.Ensure -ne 'Absent') + { + return [RequiredAction]::Remove + break + } + + # Otherwise, no changes to make (i.e. The desired state is already achieved) + return [RequiredAction]::None + break + } + default { + throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." + return [RequiredAction]::Error + } + } + + return [RequiredAction]::Error + + } + + + hidden [bool]IsInDesiredState() + { + if ($this.GetRequiredAction() -eq [RequiredAction]::None) + { + return $true + } + + return $false + } + + + [bool] TestNew() + { + return $this.IsInDesiredState() } } @@ -396,6 +486,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } + [bool] Test() { Write-Verbose "Test(): Calling 'GetCurrentStateProperties'..." @@ -407,6 +498,15 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "Test(): " + Write-Verbose "Test(): Calling 'GetDesiredStateProperties'..." + $desired = $this.GetDesiredStateProperties() + Write-Verbose "Test(): Successfully called 'GetDesiredStateProperties'." + + Write-Verbose "Test(): DesiredStateProperties are..." + Write-Verbose $($desired | ConvertTo-Json) + Write-Verbose "Test(): " + + $existing = $this.Get() # Note: $this is effectively 'desired' values @@ -472,7 +572,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [void] Set() { - $requiredFunction = [RequiredFunction]::None + $requiredFunction = [RequiredAction]::None $existing = $this.Get() Write-Verbose "Set()..." @@ -499,7 +599,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) if ($null -eq $existing -or $existing.Ensure -ne 'Present') { - $requiredFunction = [RequiredFunction]::New + $requiredFunction = [RequiredAction]::New } # Following comparisons are DSCResource-specific but UNSUPPORTED elseif ($existing.SourceControlType -ne $this.SourceControlType) @@ -510,7 +610,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource elseif ($existing.ProjectName -ne $this.ProjectName -or $existing.ProjectDescription -ne $this.ProjectDescription) { - $requiredFunction = [RequiredFunction]::Set + $requiredFunction = [RequiredAction]::Set } break } @@ -518,7 +618,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource # If currently/already present - return $false (i.e. state is incorrect) if ($null -ne $existing -and $existing.Ensure -ne 'Absent') { - $requiredFunction = [RequiredFunction]::Remove + $requiredFunction = [RequiredAction]::Remove } break } @@ -573,7 +673,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource break } default { - throw "Could not obtain a valid 'RequiredFunction' value within 'DSC_AzDevOpsProject' Set() function." + throw "Could not obtain a valid 'RequiredAction' value within 'DSC_AzDevOpsProject' Set() function." } } From d44532e278ab6f353ebe311f146d0d8962743d07 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 5 Nov 2020 21:46:57 +0000 Subject: [PATCH 190/611] Updated 'DSC_AzDevOpsResource' and 'DSC_AzDevOpsProject' classes to revised version (still needs tidy up). --- source/AzureDevOpsDsc.psm1 | 328 +++++++++++++++++-------------------- 1 file changed, 147 insertions(+), 181 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 3adb4720c..1f5206bcb 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -39,7 +39,7 @@ class DSC_AzDevOpsResource [string]$Pat [DscProperty()] - [Ensure]$Ensure + [string]$Ensure # Non-DSC properties for use in operations/comparisons @@ -49,7 +49,7 @@ class DSC_AzDevOpsResource hidden [string]$ResourceKey hidden [string]$ResourceKeyPropertyName hidden [string]$ResourceName = $this.GetResourceName() - hidden [hashtable]$ResourceProperties = $this.GetResourceProperties() + #hidden [hashtable]$ResourceProperties = $this.GetResourceProperties() # Constructor(s) @@ -90,7 +90,7 @@ class DSC_AzDevOpsResource [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() $thisProperties | ForEach-Object { - Write-Verbose $_.Name + [System.Reflection.PropertyInfo]$propertyInfo = $_ $PropertyName = $_.Name @@ -165,12 +165,15 @@ class DSC_AzDevOpsResource hidden [Hashtable]GetResourceProperties() { - [PSObject]$thisObject = $this + #[PSObject]$thisObject = $this [Hashtable]$thisProperties = @{} - $thisObject.PSObject.Properties | ForEach-Object { - $thisProperties[$_.Name] = $_.Value + $this.GetDscResourceDscPropertyNames() | ForEach-Object { + $thisProperties."$_" = $this."$_" } + #$thisObject.PSObject.Properties | ForEach-Object { + # $thisProperties[$_.Name] = $_.Value + #} return $thisProperties } @@ -200,6 +203,7 @@ class DSC_AzDevOpsResource hidden [object]GetCurrentStateResourceObject() { + Write-Verbose "GetCurrentStateResourceObject()..." [string]$thisResourceKey = $this.GetResourceKey() [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() @@ -214,20 +218,25 @@ class DSC_AzDevOpsResource if (![string]::IsNullOrWhiteSpace($thisResourceAlternateKey)) { + Write-Verbose "thisResourceAlternateKey was not null or whitespace." $getParameters."$thisResourceAlternateKeyPropertyName" = $thisResourceAlternateKey } - Write-Verbose "Calling '$thisResourceGetMethodName'..." - + #Write-Verbose "Calling '$thisResourceGetMethodName'..." + #Write-Verbose $($getParameters | ConvertTo-Json) $currentStateResourceObject = $(& $thisResourceGetMethodName @getParameters) + #Write-Verbose "'$thisResourceGetMethodName' end..." + #Write-Verbose $($currentStateResourceObject | ConvertTo-Json) if ($null -eq $currentStateResourceObject) { + #Write-Verbose "currentStateResourceObject was null." return New-Object -TypeName 'PSObject' -Property @{ - Ensure = [Ensure]::Absent + Ensure = 'Absent' } } + #Write-Verbose "GetCurrentStateResourceObject() end." return $currentStateResourceObject } @@ -239,7 +248,7 @@ class DSC_AzDevOpsResource } # This method must be overidden by inheriting classes - hidden [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) + hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { $thisType = $this.GetType() if ($thisType -eq [DSC_AzDevOpsResource]) @@ -251,24 +260,13 @@ class DSC_AzDevOpsResource } - hidden [Ensure]GetEnsure([object]$ResourceObject) - { - [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - - if ([string]::IsNullOrWhiteSpace($ResourceObject."$thisResourceKeyPropertyName")) - { - return [Ensure]::Absent - } - return [Ensure]::Present - } - hidden [Hashtable]GetDesiredStateProperties() { return $this.GetResourceProperties() } - hidden [RequiredAction]GetRequiredAction() + hidden [string]GetRequiredAction() { [hashtable]$currentProperties = $this.GetCurrentStateProperties() [hashtable]$desiredProperties = $this.GetDesiredStateProperties() @@ -283,80 +281,137 @@ class DSC_AzDevOpsResource # # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() - if ([string]::IsNullOrWhiteSpace($desiredProperties."$alternateKeyPropertyName") -and - ![string]::IsNullOrWhiteSpace($currentProperties."$alternateKeyPropertyName")) + Write-Verbose "got ... alternateKeyPropertyName : $alternateKeyPropertyName" + if ([string]::IsNullOrWhiteSpace($desiredProperties[$alternateKeyPropertyName]) -and + ![string]::IsNullOrWhiteSpace($currentProperties[$alternateKeyPropertyName])) { + Write-Verbose "Set ... alternateKeyPropertyName" $desiredProperties."$alternateKeyPropertyName" = $currentProperties."$alternateKeyPropertyName" } + Write-Verbose '============================================================' + Write-Verbose 'Current:' + Write-Verbose $($currentProperties | ConvertTo-Json) + Write-Verbose '============================================================' + Write-Verbose 'Desired:' + Write-Verbose $($desiredProperties | ConvertTo-Json) + Write-Verbose '============================================================' + + # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already 'Present' but property values differ) - switch ($desiredProperties.Ensure) + $requiredAction = 'None' + + switch ($($desiredProperties.Ensure.ToString())) { 'Present' { # If not already present, or different to expected/desired - return 'New' (i.e. Resource needs creating) - if ($null -eq $currentProperties -or $currentProperties.Ensure -ne 'Present') + if ($null -eq $currentProperties -or $($currentProperties.Ensure.ToString()) -ne 'Present') { - return [RequiredAction]::New - break + $requiredAction = 'New' + } + + # Return if not 'None' + if ($requiredAction -ne 'None') + { + return $requiredAction } + Write-Verbose "-----------------------------------------------------" + Write-Verbose "GetRequiredAction RequiredAction : Passed 'New'" + Write-Verbose "-----------------------------------------------------" + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) if ($propertyNamesUnsupportedForSet.Count -gt 0) { $propertyNamesUnsupportedForSet | ForEach-Object { - if ($currentProperties."$_" -ne $desiredProperties."$_") + + Write-Verbose "Comparing UNSUPPORTED: $_" + Write-Verbose $("Current: "+ $($currentProperties."$_")) + Write-Verbose $("Desired: "+ $($desiredProperties."$_")) + + if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." - return [RequiredAction]::Error - break + $requiredAction = 'Error' } } } + # Return if not 'None' + if ($requiredAction -ne 'None') + { + return $requiredAction + break + } + + Write-Verbose "-----------------------------------------------------" + Write-Verbose "GetRequiredAction RequiredAction : Passed 'Error'" + Write-Verbose "-----------------------------------------------------" + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) if ($propertyNamesToCompare.Count -gt 0) { $propertyNamesToCompare | ForEach-Object { - if ($currentProperties."$_" -ne $desiredProperties."$_") + + Write-Verbose "Comparing OK: $_" + Write-Verbose $("Current: "+ $($currentProperties."$_")) + Write-Verbose $("Desired: "+ $($desiredProperties."$_")) + + if ($($currentProperties."$_") -ne $($desiredProperties."$_")) { - return [RequiredAction]::Set - break + $requiredAction = 'Set' } } } + # Return if not 'None' + if ($requiredAction -ne 'None') + { + return $requiredAction + break + } + + Write-Verbose "-----------------------------------------------------" + Write-Verbose "GetRequiredAction RequiredAction : Passed 'Set'" + Write-Verbose "-----------------------------------------------------" + # Otherwise, no changes to make (i.e. The desired state is already achieved) - return [RequiredAction]::None + return $requiredAction break } 'Absent' { + # If currently/already present - return $false (i.e. state is incorrect) if ($null -ne $currentProperties -and $currentProperties.Ensure -ne 'Absent') { - return [RequiredAction]::Remove - break + $requiredAction = 'Remove' + } + + # Return if not 'None' + if ($requiredAction -ne 'None') + { + return $requiredAction } # Otherwise, no changes to make (i.e. The desired state is already achieved) - return [RequiredAction]::None + return $requiredAction break } default { throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." - return [RequiredAction]::Error + return 'Error' } } - return [RequiredAction]::Error - + return $requiredAction } hidden [bool]IsInDesiredState() { - if ($this.GetRequiredAction() -eq [RequiredAction]::None) + if ($this.GetRequiredAction() -eq 'None') { return $true } @@ -377,22 +432,31 @@ class DSC_AzDevOpsResource class DSC_AzDevOpsProject : DSC_AzDevOpsResource { - [Hashtable]GetCurrentStateProperties([object]$CurrentResourceObject) + [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { + Write-Verbose "GetCurrentStateProperties()..." $properties = @{ Pat = $this.Pat ApiUri = $this.ApiUri - - Ensure = $($this.GetEnsure($CurrentResourceObject)) + Ensure = 'Absent' } if ($null -ne $CurrentResourceObject) { - $properties.ProductId = $CurrentResourceObject['id'] - $properties.ProductName = $CurrentResourceObject['name'] - $properties.Description = $CurrentResourceObject['description'] + if (![string]::IsNullOrWhiteSpace($CurrentResourceObject.id)) + { + $properties.Ensure = 'Present' + } + #Write-Verbose "(CurrentResourceObject was not null)..." + #Write-Verbose $($CurrentResourceObject | ConvertTo-Json) + $properties.ProjectId = $CurrentResourceObject.id + $properties.ProjectName = $CurrentResourceObject.name + $properties.ProjectDescription = $CurrentResourceObject.description + $properties.SourceControlType = $CurrentResourceObject.capabilities.versioncontrol.sourceControlType } - + #Write-Verbose 'properties' + #Write-Verbose $($properties | ConvertTo-Json) + #Write-Verbose "GetCurrentStateProperties() end." return $properties } @@ -489,158 +553,57 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [bool] Test() { - Write-Verbose "Test(): Calling 'GetCurrentStateProperties'..." - $current = $this.GetCurrentStateProperties() - Write-Verbose "Test(): Successfully called 'GetCurrentStateProperties'." - - Write-Verbose "Test(): CurrentStateProperties are..." - Write-Verbose $($current | ConvertTo-Json) - Write-Verbose "Test(): " - - - Write-Verbose "Test(): Calling 'GetDesiredStateProperties'..." - $desired = $this.GetDesiredStateProperties() - Write-Verbose "Test(): Successfully called 'GetDesiredStateProperties'." - - Write-Verbose "Test(): DesiredStateProperties are..." - Write-Verbose $($desired | ConvertTo-Json) - Write-Verbose "Test(): " - + return $this.IsInDesiredState() + } - $existing = $this.Get() - # Note: $this is effectively 'desired' values - Write-Verbose "Test()..." - Write-Verbose "this.Ensure : $($this.Ensure) " - Write-Verbose "this.ProjectId : $($this.ProjectId) " - Write-Verbose "this.ProjectName : $($this.ProjectName) " - Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " - Write-Verbose "this.SourceControlType : $($this.SourceControlType) " - Write-Verbose "existing.Ensure : $($existing.Ensure) " - Write-Verbose "existing.ProjectId : $($existing.ProjectId) " - Write-Verbose "existing.ProjectName : $($existing.ProjectName) " - Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " - Write-Verbose "existing.SourceControlType : $($existing.SourceControlType) " - - # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($this.ProjectId) -and ![string]::IsNullOrWhiteSpace($existing.ProjectId)) - { - $this.ProjectId = $existing.ProjectId - Write-Verbose "this.ProjectId : $($this.ProjectId) (Since updated)" - } + [void] Set() + { + Write-Verbose "Set()..." - switch ($this.Ensure) - { - 'Present' { - # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) - if ($null -eq $existing -or $existing.Ensure -eq 'Absent') - { - return $false - } - # Following comparisons are DSCResource-specific but UNSUPPORTED - elseif ($existing.SourceControlType -ne $this.SourceControlType) - { - throw "This DSCResource does not support changes to the following properties: SourceControlType" - } - # Following comparisons are DSCResource-specific and supported - elseif ($existing.ProjectName -ne $this.ProjectName -or - $existing.ProjectDescription -ne $this.ProjectDescription) - { - return $false - } - break - } - 'Absent' { - # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $existing -and $existing.Ensure -ne 'Absent') - { - return $false - } - break - } - default - { - throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($this.Ensure)'." - } - } - # State is already as desired - return $true - return $true + $requiredFunction = $this.GetRequiredAction() + Write-Verbose "-----------------------------------------------------" + Write-Verbose "RequiredFunction : $requiredFunction" + Write-Verbose "-----------------------------------------------------" - } + $current = $this.GetCurrentStateProperties() + $desired = $this.GetDesiredStateProperties() - [void] Set() - { - $requiredFunction = [RequiredAction]::None - $existing = $this.Get() + Write-Verbose "current.Ensure : $($current.Ensure) " + Write-Verbose "current.ProjectId : $($current.ProjectId) " + Write-Verbose "current.ProjectName : $($current.ProjectName) " + Write-Verbose "current.ProjectDescription : $($current.ProjectDescription) " + Write-Verbose "current.SourceControlType : $($current.SourceControlType) " + Write-Verbose "desired.Ensure : $($desired.Ensure) " + Write-Verbose "desired.ProjectId : $($desired.ProjectId) " + Write-Verbose "desired.ProjectName : $($desired.ProjectName) " + Write-Verbose "desired.ProjectDescription : $($desired.ProjectDescription) " + Write-Verbose "desired.SourceControlType : $($desired.SourceControlType) " - Write-Verbose "Set()..." - Write-Verbose "this.Ensure : $($this.Ensure) " - Write-Verbose "this.ProjectId : $($this.ProjectId) " - Write-Verbose "this.ProjectName : $($this.ProjectName) " - Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " - Write-Verbose "existing.Ensure : $($existing.Ensure) " - Write-Verbose "existing.ProjectId : $($existing.ProjectId) " - Write-Verbose "existing.ProjectName : $($existing.ProjectName) " - Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($this.ProjectId) -and ![string]::IsNullOrWhiteSpace($existing.ProjectId)) + if ([string]::IsNullOrWhiteSpace($desired.ProjectId) -and ![string]::IsNullOrWhiteSpace($current.ProjectId)) { - $this.ProjectId = $existing.ProjectId - Write-Verbose "this.ProjectId : $($this.ProjectId) (Since updated)" - } - - - switch ($this.Ensure) - { - 'Present' { - # If not already present, or different to expected/desired - return $false (i.e. state is incorrect) - if ($null -eq $existing -or $existing.Ensure -ne 'Present') - { - $requiredFunction = [RequiredAction]::New - } - # Following comparisons are DSCResource-specific but UNSUPPORTED - elseif ($existing.SourceControlType -ne $this.SourceControlType) - { - throw "This DSCResource does not support changes to the following properties: SourceControlType" - } - # Following comparisons are DSCResource-specific and supported - elseif ($existing.ProjectName -ne $this.ProjectName -or - $existing.ProjectDescription -ne $this.ProjectDescription) - { - $requiredFunction = [RequiredAction]::Set - } - break - } - 'Absent' { - # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $existing -and $existing.Ensure -ne 'Absent') - { - $requiredFunction = [RequiredAction]::Remove - } - break - } - default { - throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($this.Ensure)'." - } + $desired.ProjectId = $current.ProjectId + Write-Verbose "desired.ProjectId : $($desired.ProjectId) (Since updated)" } $newSetParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat + ApiUri = $current.ApiUri + Pat = $current.Pat - ProjectName = $this.ProjectName - ProjectDescription = $this.ProjectDescription + ProjectName = $desired.ProjectName + ProjectDescription = $desired.ProjectDescription - SourceControlType = $this.SourceControlType + SourceControlType = $desired.SourceControlType } - if (![string]::IsNullOrWhiteSpace($this.ProjectId)) + if (![string]::IsNullOrWhiteSpace($desired.ProjectId)) { - $newSetParameters.ProjectId = $this.ProjectId + $newSetParameters.ProjectId = $desired.ProjectId } @@ -651,6 +614,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } 'New' { New-AzDevOpsProject @newSetParameters -Force | Out-Null + Start-Sleep -Seconds 5 break } 'Set' { @@ -659,6 +623,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Set-AzDevOpsProject @newSetParameters -Force | Out-Null + Start-Sleep -Seconds 5 break } 'Remove' { @@ -670,6 +635,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } Remove-AzDevOpsProject @removeParameters -Force | Out-Null + Start-Sleep -Seconds 5 break } default { From 495bc0e553ffce190bb3e65333e0e5bca14c4158 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 06:40:47 +0000 Subject: [PATCH 191/611] Updated 'Ensure' property and comparisions to use an 'enum' --- source/AzureDevOpsDsc.psm1 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 1f5206bcb..b765a8823 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -39,7 +39,7 @@ class DSC_AzDevOpsResource [string]$Pat [DscProperty()] - [string]$Ensure + [Ensure]$Ensure # Non-DSC properties for use in operations/comparisons @@ -232,7 +232,7 @@ class DSC_AzDevOpsResource { #Write-Verbose "currentStateResourceObject was null." return New-Object -TypeName 'PSObject' -Property @{ - Ensure = 'Absent' + Ensure = [Ensure]::Absent } } @@ -299,15 +299,15 @@ class DSC_AzDevOpsResource Write-Verbose '============================================================' - # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already 'Present' but property values differ) + # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) $requiredAction = 'None' - switch ($($desiredProperties.Ensure.ToString())) + switch ($desiredProperties.Ensure) { - 'Present' { + ([Ensure]::Present) { # If not already present, or different to expected/desired - return 'New' (i.e. Resource needs creating) - if ($null -eq $currentProperties -or $($currentProperties.Ensure.ToString()) -ne 'Present') + if ($null -eq $currentProperties -or $($currentProperties.Ensure.ToString()) -ne [Ensure]::Present) { $requiredAction = 'New' } @@ -381,10 +381,10 @@ class DSC_AzDevOpsResource return $requiredAction break } - 'Absent' { + ([Ensure]::Absent) { # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $currentProperties -and $currentProperties.Ensure -ne 'Absent') + if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) { $requiredAction = 'Remove' } @@ -438,14 +438,14 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $properties = @{ Pat = $this.Pat ApiUri = $this.ApiUri - Ensure = 'Absent' + Ensure = [Ensure]::Absent } if ($null -ne $CurrentResourceObject) { if (![string]::IsNullOrWhiteSpace($CurrentResourceObject.id)) { - $properties.Ensure = 'Present' + $properties.Ensure = [Ensure]::Present } #Write-Verbose "(CurrentResourceObject was not null)..." #Write-Verbose $($CurrentResourceObject | ConvertTo-Json) @@ -516,7 +516,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource ProjectName = $this.ProjectName # Updated properties (from 'Get') - Ensure = 'Absent' + Ensure = [Ensure]::Absent } } @@ -540,7 +540,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource # Updated properties (from 'Get') - Ensure = 'Present' + Ensure = [Ensure]::Present ProjectId = $existing.id ProjectName = $existing.name ProjectDescription = $existing.description From 3d17c8393fff016af675c177b240ed9802af1e6d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 06:48:11 +0000 Subject: [PATCH 192/611] Updated 'RequiredAction' to make use of 'enum' --- source/AzureDevOpsDsc.psm1 | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index b765a8823..211bfbc83 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -266,7 +266,7 @@ class DSC_AzDevOpsResource } - hidden [string]GetRequiredAction() + hidden [RequiredAction]GetRequiredAction() { [hashtable]$currentProperties = $this.GetCurrentStateProperties() [hashtable]$desiredProperties = $this.GetDesiredStateProperties() @@ -300,29 +300,29 @@ class DSC_AzDevOpsResource # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) - $requiredAction = 'None' + $requiredAction = [RequiredAction]::None switch ($desiredProperties.Ensure) { ([Ensure]::Present) { - # If not already present, or different to expected/desired - return 'New' (i.e. Resource needs creating) - if ($null -eq $currentProperties -or $($currentProperties.Ensure.ToString()) -ne [Ensure]::Present) + # If not already present, or different to expected/desired - return [RequiredAction]::New (i.e. Resource needs creating) + if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) { - $requiredAction = 'New' + $requiredAction = [RequiredAction]::New } - # Return if not 'None' - if ($requiredAction -ne 'None') + # Return if not [RequiredAction]::None + if ($requiredAction -ne [RequiredAction]::None) { return $requiredAction } Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed 'New'" + Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::New" Write-Verbose "-----------------------------------------------------" - # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) if ($propertyNamesUnsupportedForSet.Count -gt 0) { $propertyNamesUnsupportedForSet | ForEach-Object { @@ -334,23 +334,23 @@ class DSC_AzDevOpsResource if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." - $requiredAction = 'Error' + $requiredAction = [RequiredAction]::Error } } } - # Return if not 'None' - if ($requiredAction -ne 'None') + # Return if not [RequiredAction]::None + if ($requiredAction -ne [RequiredAction]::None) { return $requiredAction break } Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed 'Error'" + Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::Error" Write-Verbose "-----------------------------------------------------" - # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a 'New' resource) + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) if ($propertyNamesToCompare.Count -gt 0) { $propertyNamesToCompare | ForEach-Object { @@ -361,20 +361,20 @@ class DSC_AzDevOpsResource if ($($currentProperties."$_") -ne $($desiredProperties."$_")) { - $requiredAction = 'Set' + $requiredAction = [RequiredAction]::Set } } } - # Return if not 'None' - if ($requiredAction -ne 'None') + # Return if not [RequiredAction]::None + if ($requiredAction -ne [RequiredAction]::None) { return $requiredAction break } Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed 'Set'" + Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::Set" Write-Verbose "-----------------------------------------------------" # Otherwise, no changes to make (i.e. The desired state is already achieved) @@ -386,11 +386,11 @@ class DSC_AzDevOpsResource # If currently/already present - return $false (i.e. state is incorrect) if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) { - $requiredAction = 'Remove' + $requiredAction = [RequiredAction]::Remove } - # Return if not 'None' - if ($requiredAction -ne 'None') + # Return if not [RequiredAction]::None + if ($requiredAction -ne [RequiredAction]::None) { return $requiredAction } @@ -401,7 +401,7 @@ class DSC_AzDevOpsResource } default { throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." - return 'Error' + return [RequiredAction]::Error } } @@ -411,7 +411,7 @@ class DSC_AzDevOpsResource hidden [bool]IsInDesiredState() { - if ($this.GetRequiredAction() -eq 'None') + if ($this.GetRequiredAction() -eq [RequiredAction]::None) { return $true } @@ -562,7 +562,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "Set()..." - $requiredFunction = $this.GetRequiredAction() + [RequiredAction]$requiredFunction = $this.GetRequiredAction() Write-Verbose "-----------------------------------------------------" Write-Verbose "RequiredFunction : $requiredFunction" Write-Verbose "-----------------------------------------------------" @@ -609,15 +609,15 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource switch ($requiredFunction) { - 'None' { + ([RequiredAction]::'None') { break } - 'New' { + ([RequiredAction]::'New') { New-AzDevOpsProject @newSetParameters -Force | Out-Null Start-Sleep -Seconds 5 break } - 'Set' { + ([RequiredAction]::'Set') { # Remove any not supported $newSetParameters.Remove('SourceControlType') @@ -626,7 +626,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Start-Sleep -Seconds 5 break } - 'Remove' { + ([RequiredAction]::'Remove') { $removeParameters = @{ ApiUri = $newSetParameters.ApiUri Pat = $newSetParameters.Pat From 8199f670ef42f0d690a3985b18484e79153f9199 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 06:50:35 +0000 Subject: [PATCH 193/611] Updated $requiredAction to $requiredFunction in 'DSC_AzDevOpsProject' resource --- source/AzureDevOpsDsc.psm1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 211bfbc83..b042a4ff0 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -562,9 +562,9 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "Set()..." - [RequiredAction]$requiredFunction = $this.GetRequiredAction() + [RequiredAction]$requiredAction = $this.GetRequiredAction() Write-Verbose "-----------------------------------------------------" - Write-Verbose "RequiredFunction : $requiredFunction" + Write-Verbose "RequiredAction : $requiredAction" Write-Verbose "-----------------------------------------------------" @@ -607,7 +607,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } - switch ($requiredFunction) + switch ($requiredAction) { ([RequiredAction]::'None') { break From 9ed1f7902773a8fcfd6e16552f31db61e0a8dfa5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 06:55:46 +0000 Subject: [PATCH 194/611] Removed 'TestNew()' method from 'DSC_AzDevOpsResource' --- source/AzureDevOpsDsc.psm1 | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index b042a4ff0..0da55dac8 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -419,18 +419,16 @@ class DSC_AzDevOpsResource return $false } - - [bool] TestNew() - { - return $this.IsInDesiredState() - } - } [DscResource()] class DSC_AzDevOpsProject : DSC_AzDevOpsResource { + [bool] Test() + { + return $this.IsInDesiredState() + } [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { @@ -549,14 +547,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } - - - [bool] Test() - { - return $this.IsInDesiredState() - } - - [void] Set() { Write-Verbose "Set()..." From 11586c03cc60a84627de87609b4c67502dc8d5c5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 07:04:33 +0000 Subject: [PATCH 195/611] Amended comments/formatting in 'DSC_AzDevOpsResource' class --- source/AzureDevOpsDsc.psm1 | 48 +++++++------------------------------- 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 0da55dac8..4332fd382 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -7,7 +7,7 @@ Import-Module -Name $script:azureDevOpsDscCommonModulePath Import-Module -Name $script:azureDevOpsDscServerModulePath Import-Module -Name $script:azureDevOpsDscServicesModulePath #Import-Module -Name $script:dscResourceCommonModulePath -# + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' @@ -30,6 +30,7 @@ enum RequiredAction class DSC_AzDevOpsResource { + # DSC-specific properties for use in operations/comparisons [DscProperty()] [Alias('Uri')] [string]$ApiUri @@ -42,14 +43,10 @@ class DSC_AzDevOpsResource [Ensure]$Ensure - # Non-DSC properties for use in operations/comparisons - - - # Hidden properties + # Hidden, non-DSC properties for use in operations/comparisons hidden [string]$ResourceKey hidden [string]$ResourceKeyPropertyName hidden [string]$ResourceName = $this.GetResourceName() - #hidden [hashtable]$ResourceProperties = $this.GetResourceProperties() # Constructor(s) @@ -57,7 +54,6 @@ class DSC_AzDevOpsResource # DSC-specific methods - hidden [string[]]GetDscResourceDscPropertyNames() { [string[]]$thisDscPropertyNames = @() @@ -132,7 +128,7 @@ class DSC_AzDevOpsResource hidden [string]GetResourceKeyPropertyName() { - # Uses the same value as the 'DscResourceDscKeyPropertyName' + # Uses the same value as the 'DscResourceDscKeyPropertyName()' return $this.GetDscResourceDscKeyPropertyName() } @@ -150,7 +146,6 @@ class DSC_AzDevOpsResource } - # This method must be overidden by inheriting classes hidden [string]GetResourceAlternateKeyPropertyName() { return "$($this.GetResourceName())Id" @@ -165,15 +160,11 @@ class DSC_AzDevOpsResource hidden [Hashtable]GetResourceProperties() { - #[PSObject]$thisObject = $this [Hashtable]$thisProperties = @{} $this.GetDscResourceDscPropertyNames() | ForEach-Object { $thisProperties."$_" = $this."$_" } - #$thisObject.PSObject.Properties | ForEach-Object { - # $thisProperties[$_.Name] = $_.Value - #} return $thisProperties } @@ -203,7 +194,6 @@ class DSC_AzDevOpsResource hidden [object]GetCurrentStateResourceObject() { - Write-Verbose "GetCurrentStateResourceObject()..." [string]$thisResourceKey = $this.GetResourceKey() [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() @@ -222,21 +212,15 @@ class DSC_AzDevOpsResource $getParameters."$thisResourceAlternateKeyPropertyName" = $thisResourceAlternateKey } - #Write-Verbose "Calling '$thisResourceGetMethodName'..." - #Write-Verbose $($getParameters | ConvertTo-Json) $currentStateResourceObject = $(& $thisResourceGetMethodName @getParameters) - #Write-Verbose "'$thisResourceGetMethodName' end..." - #Write-Verbose $($currentStateResourceObject | ConvertTo-Json) if ($null -eq $currentStateResourceObject) { - #Write-Verbose "currentStateResourceObject was null." return New-Object -TypeName 'PSObject' -Property @{ Ensure = [Ensure]::Absent } } - #Write-Verbose "GetCurrentStateResourceObject() end." return $currentStateResourceObject } @@ -247,7 +231,7 @@ class DSC_AzDevOpsResource return $this.GetCurrentStateProperties($this.GetCurrentStateResourceObject()) } - # This method must be overidden by inheriting classes + # This method must be overidden by inheriting class(es) hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { $thisType = $this.GetType() @@ -281,11 +265,10 @@ class DSC_AzDevOpsResource # # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() - Write-Verbose "got ... alternateKeyPropertyName : $alternateKeyPropertyName" + if ([string]::IsNullOrWhiteSpace($desiredProperties[$alternateKeyPropertyName]) -and ![string]::IsNullOrWhiteSpace($currentProperties[$alternateKeyPropertyName])) { - Write-Verbose "Set ... alternateKeyPropertyName" $desiredProperties."$alternateKeyPropertyName" = $currentProperties."$alternateKeyPropertyName" } @@ -318,10 +301,6 @@ class DSC_AzDevOpsResource return $requiredAction } - Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::New" - Write-Verbose "-----------------------------------------------------" - # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) if ($propertyNamesUnsupportedForSet.Count -gt 0) { @@ -432,7 +411,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { - Write-Verbose "GetCurrentStateProperties()..." $properties = @{ Pat = $this.Pat ApiUri = $this.ApiUri @@ -445,22 +423,18 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource { $properties.Ensure = [Ensure]::Present } - #Write-Verbose "(CurrentResourceObject was not null)..." - #Write-Verbose $($CurrentResourceObject | ConvertTo-Json) $properties.ProjectId = $CurrentResourceObject.id $properties.ProjectName = $CurrentResourceObject.name $properties.ProjectDescription = $CurrentResourceObject.description $properties.SourceControlType = $CurrentResourceObject.capabilities.versioncontrol.sourceControlType } - #Write-Verbose 'properties' - #Write-Verbose $($properties | ConvertTo-Json) - #Write-Verbose "GetCurrentStateProperties() end." + return $properties } - [DscProperty()] # Note: Do want to be able to pass this back populated so not set as 'NotConfigurable' + [DscProperty()] [Alias('Id')] [string]$ProjectId @@ -490,12 +464,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $getParameters.ProjectId = $this.ProjectId } - Write-Verbose "GetAzDevOpsResource()..." - Write-Verbose "this.Ensure : $($this.Ensure) " - Write-Verbose "this.ProjectId : $($this.ProjectId) " - Write-Verbose "this.ProjectName : $($this.ProjectName) " - Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " - return Get-AzDevOpsProject @getParameters } From 3858558e7c3b95413300c89c75faaf4bd0248a8c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 07:17:43 +0000 Subject: [PATCH 196/611] Replaced Get() method in 'DSC_AzDevOpsProject' resource (and corrected test based on new, expected functionality) --- source/AzureDevOpsDsc.psm1 | 50 ++----------------- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 2 +- 2 files changed, 6 insertions(+), 46 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 4332fd382..f21f989ca 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -404,6 +404,11 @@ class DSC_AzDevOpsResource [DscResource()] class DSC_AzDevOpsProject : DSC_AzDevOpsResource { + [DSC_AzDevOpsProject] Get() + { + return [DSC_AzDevOpsProject]$($this.GetCurrentStateProperties()) + } + [bool] Test() { return $this.IsInDesiredState() @@ -468,52 +473,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } - [DSC_AzDevOpsProject] Get() - { - $existing = $this.GetAzDevOpsResource() - - if ($null -eq $existing) - { - return [DSC_AzDevOpsProject]@{ - - # Existing properties - ApiUri = $this.ApiUri - Pat = $this.Pat - ProjectName = $this.ProjectName - - # Updated properties (from 'Get') - Ensure = [Ensure]::Absent - } - } - - Write-Verbose "Get()..." - Write-Verbose "this.Ensure : $($this.Ensure) " - Write-Verbose "this.ProjectId : $($this.ProjectId) " - Write-Verbose "this.ProjectName : $($this.ProjectName) " - Write-Verbose "this.ProjectDescription : $($this.ProjectDescription) " - Write-Verbose "this.SourceControlType : $($this.SourceControlType) " - Write-Verbose "existing.Ensure : $($existing.Ensure) " - Write-Verbose "existing.ProjectId : $($existing.ProjectId) " - Write-Verbose "existing.ProjectName : $($existing.ProjectName) " - Write-Verbose "existing.ProjectDescription : $($existing.ProjectDescription) " - Write-Verbose "existing.SourceControlType : $($existing.SourceControlType) " - - return [DSC_AzDevOpsProject]@{ - - # Existing properties - ApiUri = $this.ApiUri - Pat = $this.Pat - - # Updated properties (from 'Get') - Ensure = [Ensure]::Present - ProjectId = $existing.id - ProjectName = $existing.name - ProjectDescription = $existing.description - SourceControlType = $existing.capabilities.versioncontrol.sourceControlType - } - - } [void] Set() { diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 391f69be9..c70946627 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -327,7 +327,7 @@ try } $resourceCurrentState.Ensure | Should -Be 'Absent' - $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectName | Should -BeNullOrEmpty } From a4c81a4628676ec5bee346f6cd720a31fdfbfac0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 07:19:34 +0000 Subject: [PATCH 197/611] Removed 'GetAzureDevOpsResource()' function from 'DSC_AzDevOpsProject' resource/class --- source/AzureDevOpsDsc.psm1 | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index f21f989ca..50ddd13a0 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -455,24 +455,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [string]$SourceControlType - [PSCustomObject]GetAzDevOpsResource() - { - $getParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - - ProjectName = $this.ProjectName - } - - if (![string]::IsNullOrWhiteSpace($this.ProjectId)) - { - $getParameters.ProjectId = $this.ProjectId - } - - return Get-AzDevOpsProject @getParameters - } - - [void] Set() From a6ef4ba38905a695d1bdfa6df5950990a2747218 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 07:38:31 +0000 Subject: [PATCH 198/611] Updated 'DSC_AzDevOpsProject' to replace 'Set()' method and correct generated function names --- source/AzureDevOpsDsc.psm1 | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 50ddd13a0..ba9a20755 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -170,22 +170,27 @@ class DSC_AzDevOpsResource } - hidden [string]GetResourceGetMethodName() + hidden [string]GetResourceGetFunctionName() { $thisResourceName = $this.GetResourceName() return "Get-AzDevOps$thisResourceName" } - hidden [string]GetResourceSetMethodName() + hidden [string]GetResourceNewFunctionName() + { + $thisResourceName = $this.GetResourceName() + return "New-AzDevOps$thisResourceName" + } + hidden [string]GetResourceSetFunctionName() { $thisResourceName = $this.GetResourceName() return "Set-AzDevOps$thisResourceName" } - hidden [string]GetResourceRemoveMethodName() + hidden [string]GetResourceRemoveFunctionName() { $thisResourceName = $this.GetResourceName() return "Remove-AzDevOps$thisResourceName" } - hidden [string]GetResourceTestMethodName() + hidden [string]GetResourceTestFunctionName() { $thisResourceName = $this.GetResourceName() return "Test-AzDevOps$thisResourceName" @@ -198,7 +203,7 @@ class DSC_AzDevOpsResource [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() [string]$thisResourceAlternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() - [string]$thisResourceGetMethodName = $this.GetResourceGetMethodName() + [string]$thisResourceGetFunctionName = $this.GetResourceGetFunctionName() $getParameters = @{ ApiUri = $this.ApiUri @@ -212,7 +217,7 @@ class DSC_AzDevOpsResource $getParameters."$thisResourceAlternateKeyPropertyName" = $thisResourceAlternateKey } - $currentStateResourceObject = $(& $thisResourceGetMethodName @getParameters) + $currentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) if ($null -eq $currentStateResourceObject) { @@ -456,17 +461,11 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource - [void] Set() { Write-Verbose "Set()..." - [RequiredAction]$requiredAction = $this.GetRequiredAction() - Write-Verbose "-----------------------------------------------------" - Write-Verbose "RequiredAction : $requiredAction" - Write-Verbose "-----------------------------------------------------" - $current = $this.GetCurrentStateProperties() $desired = $this.GetDesiredStateProperties() @@ -513,7 +512,9 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource break } ([RequiredAction]::'New') { - New-AzDevOpsProject @newSetParameters -Force | Out-Null + $thisResourceNewFunctionName = $this.GetResourceNewFunctionName() + Write-Verbose "Calling '$thisResourceNewFunctionName'..." + & $thisResourceNewFunctionName @newSetParameters -Force | Out-Null Start-Sleep -Seconds 5 break } @@ -522,7 +523,9 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $newSetParameters.Remove('SourceControlType') - Set-AzDevOpsProject @newSetParameters -Force | Out-Null + $thisResourceSetFunctionName = $this.GetResourceSetFunctionName() + Write-Verbose "Calling '$thisResourceSetFunctionName'..." + & $thisResourceSetFunctionName @newSetParameters -Force | Out-Null Start-Sleep -Seconds 5 break } @@ -534,7 +537,9 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource ProjectId = $newSetParameters.ProjectId } - Remove-AzDevOpsProject @removeParameters -Force | Out-Null + $thisResourceRemoveFunctionName = $this.GetResourceRemoveFunctionName() + Write-Verbose "Calling '$thisResourceRemoveFunctionName'..." + & $thisResourceRemoveFunctionName @removeParameters -Force | Out-Null Start-Sleep -Seconds 5 break } From 4bd4b4173d776baa358fec35ea181d436d9686ee Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 07:47:02 +0000 Subject: [PATCH 199/611] Replaced 'Project'-specific items in 'DSC_AzDevOpsProject' Set() method. --- source/AzureDevOpsDsc.psm1 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index ba9a20755..0d7490a89 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -470,6 +470,8 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $current = $this.GetCurrentStateProperties() $desired = $this.GetDesiredStateProperties() + $alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + Write-Verbose "current.Ensure : $($current.Ensure) " Write-Verbose "current.ProjectId : $($current.ProjectId) " Write-Verbose "current.ProjectName : $($current.ProjectName) " @@ -483,10 +485,11 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desired.ProjectId) -and ![string]::IsNullOrWhiteSpace($current.ProjectId)) + if ([string]::IsNullOrWhiteSpace($desired."$alternateKeyPropertyName") -and + ![string]::IsNullOrWhiteSpace($current."$alternateKeyPropertyName")) { - $desired.ProjectId = $current.ProjectId - Write-Verbose "desired.ProjectId : $($desired.ProjectId) (Since updated)" + $desired."$alternateKeyPropertyName" = $current."$alternateKeyPropertyName" + Write-Verbose $("desired.$alternateKeyPropertyName : "+$($desired."$alternateKeyPropertyName")+" (Since updated)") } From b5aa36b4033722a88f108a9ca9c2443ff2589c0d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 08:03:56 +0000 Subject: [PATCH 200/611] Removed use of $newSetParameters in 'DSC_AzDevOpsProject' class Set() method and replaced with use of $desired variable --- source/AzureDevOpsDsc.psm1 | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 0d7490a89..7a8223af3 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -484,31 +484,23 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "desired.SourceControlType : $($desired.SourceControlType) " - # Set $this.ProjectId to $existing.ProjectId if it's known and can be recovered from existing resource + # Set $desired."$alternateKeyPropertyName" to $current."$alternateKeyPropertyName" if it's known and can be recovered from existing resource if ([string]::IsNullOrWhiteSpace($desired."$alternateKeyPropertyName") -and ![string]::IsNullOrWhiteSpace($current."$alternateKeyPropertyName")) { $desired."$alternateKeyPropertyName" = $current."$alternateKeyPropertyName" Write-Verbose $("desired.$alternateKeyPropertyName : "+$($desired."$alternateKeyPropertyName")+" (Since updated)") } - - - $newSetParameters = @{ - ApiUri = $current.ApiUri - Pat = $current.Pat - - ProjectName = $desired.ProjectName - ProjectDescription = $desired.ProjectDescription - - SourceControlType = $desired.SourceControlType - } - - if (![string]::IsNullOrWhiteSpace($desired.ProjectId)) + # Alternatively, if $desired."$alternateKeyPropertyName" is null/empty, remove it (as we don't want to pass an empty/null parameter) + elseif ([string]::IsNullOrWhiteSpace($desired."$alternateKeyPropertyName")) { - $newSetParameters.ProjectId = $desired.ProjectId + $desired.Remove($alternateKeyPropertyName) } + $desired.Remove('Ensure') + + switch ($requiredAction) { ([RequiredAction]::'None') { @@ -516,28 +508,31 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource } ([RequiredAction]::'New') { $thisResourceNewFunctionName = $this.GetResourceNewFunctionName() + Write-Verbose "Calling '$thisResourceNewFunctionName'..." - & $thisResourceNewFunctionName @newSetParameters -Force | Out-Null + Write-Verbose $($desired | ConvertTo-Json) + & $thisResourceNewFunctionName @desired -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Set') { # Remove any not supported - $newSetParameters.Remove('SourceControlType') + $desired.Remove('SourceControlType') $thisResourceSetFunctionName = $this.GetResourceSetFunctionName() Write-Verbose "Calling '$thisResourceSetFunctionName'..." - & $thisResourceSetFunctionName @newSetParameters -Force | Out-Null + Write-Verbose $($desired | ConvertTo-Json) + & $thisResourceSetFunctionName @desired -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Remove') { $removeParameters = @{ - ApiUri = $newSetParameters.ApiUri - Pat = $newSetParameters.Pat + ApiUri = $desired.ApiUri + Pat = $desired.Pat - ProjectId = $newSetParameters.ProjectId + "$alternateKeyPropertyName" = $desired."$alternateKeyPropertyName" } $thisResourceRemoveFunctionName = $this.GetResourceRemoveFunctionName() From 18718cb853cf94db39c08887286230bd877f80c5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 08:10:41 +0000 Subject: [PATCH 201/611] Added $desiredParameters variable within 'DSC_AzDevOpsProject' class, Set() method to maintain $desired variable as obtained --- source/AzureDevOpsDsc.psm1 | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 7a8223af3..17cead4ca 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -469,6 +469,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $current = $this.GetCurrentStateProperties() $desired = $this.GetDesiredStateProperties() + $desiredParameters = $desired $alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() @@ -484,21 +485,21 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "desired.SourceControlType : $($desired.SourceControlType) " - # Set $desired."$alternateKeyPropertyName" to $current."$alternateKeyPropertyName" if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desired."$alternateKeyPropertyName") -and + # Set $desiredParameters."$alternateKeyPropertyName" to $current."$alternateKeyPropertyName" if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($desiredParameters."$alternateKeyPropertyName") -and ![string]::IsNullOrWhiteSpace($current."$alternateKeyPropertyName")) { - $desired."$alternateKeyPropertyName" = $current."$alternateKeyPropertyName" + $desiredParameters."$alternateKeyPropertyName" = $current."$alternateKeyPropertyName" Write-Verbose $("desired.$alternateKeyPropertyName : "+$($desired."$alternateKeyPropertyName")+" (Since updated)") } - # Alternatively, if $desired."$alternateKeyPropertyName" is null/empty, remove it (as we don't want to pass an empty/null parameter) - elseif ([string]::IsNullOrWhiteSpace($desired."$alternateKeyPropertyName")) + # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove it (as we don't want to pass an empty/null parameter) + elseif ([string]::IsNullOrWhiteSpace($desiredParameters."$alternateKeyPropertyName")) { - $desired.Remove($alternateKeyPropertyName) + $desiredParameters.Remove($alternateKeyPropertyName) } - $desired.Remove('Ensure') + $desiredParameters.Remove('Ensure') switch ($requiredAction) @@ -510,29 +511,29 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $thisResourceNewFunctionName = $this.GetResourceNewFunctionName() Write-Verbose "Calling '$thisResourceNewFunctionName'..." - Write-Verbose $($desired | ConvertTo-Json) - & $thisResourceNewFunctionName @desired -Force | Out-Null + Write-Verbose $($desiredParameters | ConvertTo-Json) + & $thisResourceNewFunctionName @desiredParameters -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Set') { # Remove any not supported - $desired.Remove('SourceControlType') + $desiredParameters.Remove('SourceControlType') $thisResourceSetFunctionName = $this.GetResourceSetFunctionName() Write-Verbose "Calling '$thisResourceSetFunctionName'..." - Write-Verbose $($desired | ConvertTo-Json) - & $thisResourceSetFunctionName @desired -Force | Out-Null + Write-Verbose $($desiredParameters | ConvertTo-Json) + & $thisResourceSetFunctionName @desiredParameters -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Remove') { $removeParameters = @{ - ApiUri = $desired.ApiUri - Pat = $desired.Pat + ApiUri = $desiredParameters.ApiUri + Pat = $desiredParameters.Pat - "$alternateKeyPropertyName" = $desired."$alternateKeyPropertyName" + "$alternateKeyPropertyName" = $desiredParameters."$alternateKeyPropertyName" } $thisResourceRemoveFunctionName = $this.GetResourceRemoveFunctionName() From 91a04d8e07f25b9c4e28231c319be48eb6ace785 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 08:22:34 +0000 Subject: [PATCH 202/611] Added 'GetResourceFunctionName()' method and removed and made use of this (via $requiredActionFunctionName) variable within 'DSC_AzDevOpsProject' class Set() method. --- source/AzureDevOpsDsc.psm1 | 57 +++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 17cead4ca..ff8542af4 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -196,6 +196,46 @@ class DSC_AzDevOpsResource return "Test-AzDevOps$thisResourceName" } + hidden [string]GetResourceFunctionName([RequiredAction]$RequiredAction) + { + switch ($RequiredAction) + { + ([RequiredAction]::Get) { + return $this.GetResourceGetFunctionName() + break + } + + ([RequiredAction]::New) { + return $this.GetResourceNewFunctionName() + break + } + + ([RequiredAction]::Set) { + return $this.GetResourceSetFunctionName() + break + } + + ([RequiredAction]::Remove) { + return $this.GetResourceRemoveFunctionName() + break + } + + ([RequiredAction]::Test) { + return $this.GetResourceTestFunctionName() + break + } + + default { + throw "Cannot obtain a function name within 'GetResourceFunctionName()' for RequiredAction of '$($RequiredAction)'." + } + + } + + + $thisResourceName = $this.GetResourceName() + return "Get-AzDevOps$thisResourceName" + } + hidden [object]GetCurrentStateResourceObject() { @@ -466,6 +506,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "Set()..." [RequiredAction]$requiredAction = $this.GetRequiredAction() + $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) $current = $this.GetCurrentStateProperties() $desired = $this.GetDesiredStateProperties() @@ -508,11 +549,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource break } ([RequiredAction]::'New') { - $thisResourceNewFunctionName = $this.GetResourceNewFunctionName() - - Write-Verbose "Calling '$thisResourceNewFunctionName'..." - Write-Verbose $($desiredParameters | ConvertTo-Json) - & $thisResourceNewFunctionName @desiredParameters -Force | Out-Null + & $requiredActionFunctionName @desiredParameters -Force | Out-Null Start-Sleep -Seconds 5 break } @@ -520,11 +557,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource # Remove any not supported $desiredParameters.Remove('SourceControlType') - - $thisResourceSetFunctionName = $this.GetResourceSetFunctionName() - Write-Verbose "Calling '$thisResourceSetFunctionName'..." - Write-Verbose $($desiredParameters | ConvertTo-Json) - & $thisResourceSetFunctionName @desiredParameters -Force | Out-Null + & $requiredActionFunctionName @desiredParameters -Force | Out-Null Start-Sleep -Seconds 5 break } @@ -536,9 +569,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource "$alternateKeyPropertyName" = $desiredParameters."$alternateKeyPropertyName" } - $thisResourceRemoveFunctionName = $this.GetResourceRemoveFunctionName() - Write-Verbose "Calling '$thisResourceRemoveFunctionName'..." - & $thisResourceRemoveFunctionName @removeParameters -Force | Out-Null + & $requiredActionFunctionName @removeParameters -Force | Out-Null Start-Sleep -Seconds 5 break } From 274b356ad2915f93571ee706ef60f96d7faeb92d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 08:56:39 +0000 Subject: [PATCH 203/611] Added 'GetDesiredStateParameters()' within 'DSC_AzDevOpsResource' class and implemented use of it in 'DSC_AzDevOpsProject' class Set() method. --- source/AzureDevOpsDsc.psm1 | 81 ++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index ff8542af4..37f119893 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -443,6 +443,52 @@ class DSC_AzDevOpsResource return $false } + + + hidden [hashtable]GetDesiredStateParameters([hashtable]$CurrentStateProperties, [hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) + { + [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + + + # If the desired state/action is to remove the resource, generate/return a minimal set of parameters + if ($RequiredAction -eq [RequiredAction]::Remove) + { + return @{ + ApiUri = $DesiredStateProperties.ApiUri + Pat = $DesiredStateProperties.Pat + + # Set this from the 'Current' state as we would expect this to have an existing ID to use + "$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + } + } + + + # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable + [hashtable]$desiredStateParameters = $DesiredStateProperties + + + # Set $desiredParameters."$alternateKeyPropertyName" to $CurrentStateProperties."$alternateKeyPropertyName" if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName") -and + ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$alternateKeyPropertyName")) + { + $desiredStateParameters."$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + } + # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) + elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName")) + { + $desiredStateParameters.Remove($alternateKeyPropertyName) + } + + + # Do not need/want this passing as a parameter (the action taken will determine the desired state) + $desiredStateParameters.Remove('Ensure') + + + return $desiredStateParameters + } + + + } @@ -510,9 +556,9 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource $current = $this.GetCurrentStateProperties() $desired = $this.GetDesiredStateProperties() - $desiredParameters = $desired + $desiredStateParameters = $this.GetDesiredStateParameters($current, $desired, $requiredAction) + - $alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() Write-Verbose "current.Ensure : $($current.Ensure) " Write-Verbose "current.ProjectId : $($current.ProjectId) " @@ -526,22 +572,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource Write-Verbose "desired.SourceControlType : $($desired.SourceControlType) " - # Set $desiredParameters."$alternateKeyPropertyName" to $current."$alternateKeyPropertyName" if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desiredParameters."$alternateKeyPropertyName") -and - ![string]::IsNullOrWhiteSpace($current."$alternateKeyPropertyName")) - { - $desiredParameters."$alternateKeyPropertyName" = $current."$alternateKeyPropertyName" - Write-Verbose $("desired.$alternateKeyPropertyName : "+$($desired."$alternateKeyPropertyName")+" (Since updated)") - } - # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove it (as we don't want to pass an empty/null parameter) - elseif ([string]::IsNullOrWhiteSpace($desiredParameters."$alternateKeyPropertyName")) - { - $desiredParameters.Remove($alternateKeyPropertyName) - } - - - $desiredParameters.Remove('Ensure') - switch ($requiredAction) { @@ -549,27 +579,20 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource break } ([RequiredAction]::'New') { - & $requiredActionFunctionName @desiredParameters -Force | Out-Null + & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Set') { # Remove any not supported - $desiredParameters.Remove('SourceControlType') + $desiredStateParameters.Remove('SourceControlType') - & $requiredActionFunctionName @desiredParameters -Force | Out-Null + & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null Start-Sleep -Seconds 5 break } ([RequiredAction]::'Remove') { - $removeParameters = @{ - ApiUri = $desiredParameters.ApiUri - Pat = $desiredParameters.Pat - - "$alternateKeyPropertyName" = $desiredParameters."$alternateKeyPropertyName" - } - - & $requiredActionFunctionName @removeParameters -Force | Out-Null + & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null Start-Sleep -Seconds 5 break } From c6f66380525344f6fcaaa71bf9ed7f1bc2a6d683 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 09:18:28 +0000 Subject: [PATCH 204/611] Added and made use of GetDscResourceDscUnsupportedForSetPropertyNames() function in 'DSC_AzDevOpsResource' and 'DSC_AzDevOpsProject' classes. --- source/AzureDevOpsDsc.psm1 | 74 ++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 37f119893..eb153cb3a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -78,6 +78,11 @@ class DSC_AzDevOpsResource return $thisDscPropertyNames } + hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() + { + return @() + } + hidden [string]GetDscResourceDscKeyPropertyName() { [string[]]$thisDscKeyPropertyNames = @() @@ -300,7 +305,7 @@ class DSC_AzDevOpsResource [hashtable]$currentProperties = $this.GetCurrentStateProperties() [hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [string[]]$propertyNamesUnsupportedForSet = @() + [string[]]$propertyNamesUnsupportedForSet = $this.GetDscResourceDscUnsupportedForSetPropertyNames() [string[]]$propertyNamesToCompare = $this.GetDscResourceDscPropertyNames() @@ -447,43 +452,64 @@ class DSC_AzDevOpsResource hidden [hashtable]GetDesiredStateParameters([hashtable]$CurrentStateProperties, [hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) { + [hashtable]$desiredStateParameters = $DesiredStateProperties [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() - # If the desired state/action is to remove the resource, generate/return a minimal set of parameters - if ($RequiredAction -eq [RequiredAction]::Remove) + # If actions required are 'None' or 'Error', return a $null value + if ($RequiredAction -in @([RequiredAction]::None, [RequiredAction]::Error)) + { + return $null + } + # If the desired state/action is to remove the resource, generate/return a minimal set of parameters required to remove the resource + elseif ($RequiredAction -eq [RequiredAction]::Remove) { return @{ ApiUri = $DesiredStateProperties.ApiUri Pat = $DesiredStateProperties.Pat - # Set this from the 'Current' state as we would expect this to have an existing ID to use + # Set this from the 'Current' state as we would expect this to have an existing key/ID value to use "$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" } } + # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable, and amend + elseif ($RequiredAction -in @([RequiredAction]::New, [RequiredAction]::Set)) + { + # Set $desiredParameters."$alternateKeyPropertyName" to $CurrentStateProperties."$alternateKeyPropertyName" if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName") -and + ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$alternateKeyPropertyName")) + { + $desiredStateParameters."$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + } + # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) + elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName")) + { + $desiredStateParameters.Remove($alternateKeyPropertyName) + } - # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable - [hashtable]$desiredStateParameters = $DesiredStateProperties + # Do not need/want this passing as a parameter (the action taken will determine the desired state) + $desiredStateParameters.Remove('Ensure') - # Set $desiredParameters."$alternateKeyPropertyName" to $CurrentStateProperties."$alternateKeyPropertyName" if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName") -and - ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$alternateKeyPropertyName")) - { - $desiredStateParameters."$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) + [string[]]$unsupportedForSetPropertyNames = $this.GetDscResourceDscUnsupportedForSetPropertyNames() + + if ($RequiredAction -eq [RequiredAction]::Set -and + $unsupportedForSetPropertyNames.Count -gt 0) + { + $unsupportedForSetPropertyNames | ForEach-Object { + $desiredStateParameters.Remove($_) + } + } + } - # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) - elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName")) + else { - $desiredStateParameters.Remove($alternateKeyPropertyName) + throw "A required action of '$RequiredAction' has not been catered for in GetDesiredStateParameters() method." } - # Do not need/want this passing as a parameter (the action taken will determine the desired state) - $desiredStateParameters.Remove('Ensure') - - return $desiredStateParameters } @@ -505,7 +531,14 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource return $this.IsInDesiredState() } - [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) + hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() + { + return @( + 'SourceControlType' + ) + } + + hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { $properties = @{ Pat = $this.Pat @@ -584,9 +617,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource break } ([RequiredAction]::'Set') { - # Remove any not supported - $desiredStateParameters.Remove('SourceControlType') - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null Start-Sleep -Seconds 5 break From 253d63bf6b691a9d7d2d01738c6da0cb77120d33 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 09:31:49 +0000 Subject: [PATCH 205/611] Simplified Set() method in 'DSC_AzDevOpsProject' class and reordered properties and methods in it. --- source/AzureDevOpsDsc.psm1 | 112 ++++++++++++------------------------- 1 file changed, 37 insertions(+), 75 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index eb153cb3a..c199b833c 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -521,6 +521,23 @@ class DSC_AzDevOpsResource [DscResource()] class DSC_AzDevOpsProject : DSC_AzDevOpsResource { + [DscProperty()] + [Alias('Id')] + [string]$ProjectId + + [DscProperty(Key, Mandatory)] + [Alias('Name')] + [string]$ProjectName + + [DscProperty()] + [Alias('Description')] + [string]$ProjectDescription + + [DscProperty()] + [string]$SourceControlType + + + [DSC_AzDevOpsProject] Get() { return [DSC_AzDevOpsProject]$($this.GetCurrentStateProperties()) @@ -531,11 +548,28 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource return $this.IsInDesiredState() } + [void] Set() + { + [RequiredAction]$requiredAction = $this.GetRequiredAction() + + if ($requiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) + { + $currentStateProperties = $this.GetCurrentStateProperties() + $desiredStateProperties = $this.GetDesiredStateProperties() + + $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) + $desiredStateParameters = $this.GetDesiredStateParameters($currentStateProperties, $desiredStateProperties, $requiredAction) + + & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null + Start-Sleep -Seconds 5 + } + } + + + hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() { - return @( - 'SourceControlType' - ) + return @('SourceControlType') } hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) @@ -561,76 +595,4 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource return $properties } - - - [DscProperty()] - [Alias('Id')] - [string]$ProjectId - - [DscProperty(Key, Mandatory)] - [Alias('Name')] - [string]$ProjectName - - [DscProperty()] - [Alias('Description')] - [string]$ProjectDescription - - [DscProperty()] - [string]$SourceControlType - - - - [void] Set() - { - Write-Verbose "Set()..." - - [RequiredAction]$requiredAction = $this.GetRequiredAction() - $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) - - $current = $this.GetCurrentStateProperties() - $desired = $this.GetDesiredStateProperties() - $desiredStateParameters = $this.GetDesiredStateParameters($current, $desired, $requiredAction) - - - - Write-Verbose "current.Ensure : $($current.Ensure) " - Write-Verbose "current.ProjectId : $($current.ProjectId) " - Write-Verbose "current.ProjectName : $($current.ProjectName) " - Write-Verbose "current.ProjectDescription : $($current.ProjectDescription) " - Write-Verbose "current.SourceControlType : $($current.SourceControlType) " - Write-Verbose "desired.Ensure : $($desired.Ensure) " - Write-Verbose "desired.ProjectId : $($desired.ProjectId) " - Write-Verbose "desired.ProjectName : $($desired.ProjectName) " - Write-Verbose "desired.ProjectDescription : $($desired.ProjectDescription) " - Write-Verbose "desired.SourceControlType : $($desired.SourceControlType) " - - - - switch ($requiredAction) - { - ([RequiredAction]::'None') { - break - } - ([RequiredAction]::'New') { - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 - break - } - ([RequiredAction]::'Set') { - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 - break - } - ([RequiredAction]::'Remove') { - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 - break - } - default { - throw "Could not obtain a valid 'RequiredAction' value within 'DSC_AzDevOpsProject' Set() function." - } - } - - } - } From 72a6a40ca61a39c97b8b4ce9fef23a0efe8a1766 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 09:57:36 +0000 Subject: [PATCH 206/611] Added SetToDesiredState() method in 'DSC_AzDevOpsResource' class and updated 'DSC_AzDevOpsProject' class to make use of it in Set() method. --- source/AzureDevOpsDsc.psm1 | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index c199b833c..cac9ca6e9 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -514,6 +514,23 @@ class DSC_AzDevOpsResource } + [void] SetToDesiredState() + { + [RequiredAction]$requiredAction = $this.GetRequiredAction() + + if ($requiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) + { + $currentStateProperties = $this.GetCurrentStateProperties() + $desiredStateProperties = $this.GetDesiredStateProperties() + + $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) + $desiredStateParameters = $this.GetDesiredStateParameters($currentStateProperties, $desiredStateProperties, $requiredAction) + + & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null + Start-Sleep -Seconds 5 + } + } + } @@ -537,7 +554,6 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [string]$SourceControlType - [DSC_AzDevOpsProject] Get() { return [DSC_AzDevOpsProject]$($this.GetCurrentStateProperties()) @@ -550,23 +566,10 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsResource [void] Set() { - [RequiredAction]$requiredAction = $this.GetRequiredAction() - - if ($requiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) - { - $currentStateProperties = $this.GetCurrentStateProperties() - $desiredStateProperties = $this.GetDesiredStateProperties() - - $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) - $desiredStateParameters = $this.GetDesiredStateParameters($currentStateProperties, $desiredStateProperties, $requiredAction) - - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 - } + $this.SetToDesiredState() } - hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() { return @('SourceControlType') From 47357962afdf3f27655e00f9852bb8574a9e3a3a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 13:45:46 +0000 Subject: [PATCH 207/611] Created 'AzDevOpsApiResource' class and extracted some functions from inheriting 'DSC_AzDevOpsResource' class. --- source/AzureDevOpsDsc.psm1 | 202 +++++++++++++++++++------------------ 1 file changed, 106 insertions(+), 96 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index cac9ca6e9..f97aa254d 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -28,115 +28,25 @@ enum RequiredAction -class DSC_AzDevOpsResource -{ - # DSC-specific properties for use in operations/comparisons - [DscProperty()] - [Alias('Uri')] - [string]$ApiUri - - [DscProperty()] - [Alias('PersonalAccessToken')] - [string]$Pat - - [DscProperty()] - [Ensure]$Ensure +class AzDevOpsApiResource +{ # Hidden, non-DSC properties for use in operations/comparisons - hidden [string]$ResourceKey - hidden [string]$ResourceKeyPropertyName + hidden [string]$ResourceKey = $this.GetResourceKey() + hidden [string]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() hidden [string]$ResourceName = $this.GetResourceName() - # Constructor(s) - DSC_AzDevOpsResource(){} - - - # DSC-specific methods - hidden [string[]]GetDscResourceDscPropertyNames() - { - [string[]]$thisDscPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - [System.Reflection.PropertyInfo]$propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute') - { - $thisDscPropertyNames += $PropertyName - } - } - } - - return $thisDscPropertyNames - } - - hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() - { - return @() - } - - hidden [string]GetDscResourceDscKeyPropertyName() - { - [string[]]$thisDscKeyPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - - [System.Reflection.PropertyInfo]$propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and - $_.Key -eq $true) - { - $thisDscKeyPropertyNames += $PropertyName - } - } - } - - if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) - { - throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." - } - elseif ($thisDscKeyPropertyNames.Count -gt 1) - { - throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." - } - - return $thisDscKeyPropertyNames[0] - } - - - - - # Non DSC-specific methods hidden [string]GetResourceName() { # Assumes a naming convention is followed between the DSC # resource name and the name of the resource within the API - return $this.GetType().ToString().Replace('DSC_AzDevOps','') + return $this.GetType().ToString().Replace('DSC_AzDevOps','').Replace('AzDevOps','') } - hidden [string]GetResourceKeyPropertyName() - { - # Uses the same value as the 'DscResourceDscKeyPropertyName()' - return $this.GetDscResourceDscKeyPropertyName() - } - hidden [string]GetResourceKey() { @@ -150,19 +60,26 @@ class DSC_AzDevOpsResource return $this."$keyPropertyName" } + hidden [string]GetResourceKeyPropertyName() + { + # Uses the same value as the 'DscResourceDscKeyPropertyName()' + return $this.GetDscResourceDscKeyPropertyName() + } + + hidden [string]GetResourceAlternateKeyPropertyName() { return "$($this.GetResourceName())Id" } - hidden [string]GetResourceAlternateKey() { return $this."$($this.GetResourceAlternateKeyPropertyName())" } + hidden [Hashtable]GetResourceProperties() { [Hashtable]$thisProperties = @{} @@ -175,6 +92,7 @@ class DSC_AzDevOpsResource } + hidden [string]GetResourceGetFunctionName() { $thisResourceName = $this.GetResourceName() @@ -241,6 +159,98 @@ class DSC_AzDevOpsResource return "Get-AzDevOps$thisResourceName" } +} + + + +class DSC_AzDevOpsResource : AzDevOpsApiResource +{ + # DSC-specific properties for use in operations/comparisons + [DscProperty()] + [Alias('Uri')] + [string]$ApiUri + + [DscProperty()] + [Alias('PersonalAccessToken')] + [string]$Pat + + [DscProperty()] + [Ensure]$Ensure + + + # Constructor(s) + DSC_AzDevOpsResource(){} + + + # DSC-specific methods + hidden [string[]]GetDscResourceDscPropertyNames() + { + [string[]]$thisDscPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + [System.Reflection.PropertyInfo]$propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute') + { + $thisDscPropertyNames += $PropertyName + } + } + } + + return $thisDscPropertyNames + } + + hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() + { + return @() + } + + hidden [string]GetDscResourceDscKeyPropertyName() + { + [string[]]$thisDscKeyPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + + [System.Reflection.PropertyInfo]$propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and + $_.Key -eq $true) + { + $thisDscKeyPropertyNames += $PropertyName + } + } + } + + if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) + { + throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + } + elseif ($thisDscKeyPropertyNames.Count -gt 1) + { + throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + } + + return $thisDscKeyPropertyNames[0] + } + + + + + hidden [object]GetCurrentStateResourceObject() { From 8f4696eb72a5e8fe51952576d13c56c5bc25f412 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 13:48:14 +0000 Subject: [PATCH 208/611] Renamed 'DSC_AzDevOpsResource' class to 'DSC_AzDevOpsApiResource' --- source/AzureDevOpsDsc.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index f97aa254d..c60fa80c5 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -163,7 +163,7 @@ class AzDevOpsApiResource -class DSC_AzDevOpsResource : AzDevOpsApiResource +class DSC_AzDevOpsApiResource : AzDevOpsApiResource { # DSC-specific properties for use in operations/comparisons [DscProperty()] @@ -179,7 +179,7 @@ class DSC_AzDevOpsResource : AzDevOpsApiResource # Constructor(s) - DSC_AzDevOpsResource(){} + DSC_AzDevOpsApiResource(){} # DSC-specific methods @@ -295,7 +295,7 @@ class DSC_AzDevOpsResource : AzDevOpsApiResource hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { $thisType = $this.GetType() - if ($thisType -eq [DSC_AzDevOpsResource]) + if ($thisType -eq [DSC_AzDevOpsApiResource]) { throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden by an inheriting class." return $null @@ -546,7 +546,7 @@ class DSC_AzDevOpsResource : AzDevOpsApiResource [DscResource()] -class DSC_AzDevOpsProject : DSC_AzDevOpsResource +class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource { [DscProperty()] [Alias('Id')] From 445af9980750d88f95a78da2c0e9ab4be092bf0a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 13:54:06 +0000 Subject: [PATCH 209/611] Renamed GetDscResourceDscPropertyNames() to GetDscPropertyNames() in 'DSC_AzDevOpsApiResource' class. --- source/AzureDevOpsDsc.psm1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index c60fa80c5..941618a63 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -84,7 +84,7 @@ class AzDevOpsApiResource { [Hashtable]$thisProperties = @{} - $this.GetDscResourceDscPropertyNames() | ForEach-Object { + $this.GetDscPropertyNames() | ForEach-Object { $thisProperties."$_" = $this."$_" } @@ -183,15 +183,15 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # DSC-specific methods - hidden [string[]]GetDscResourceDscPropertyNames() + hidden [System.String[]]GetDscPropertyNames() { - [string[]]$thisDscPropertyNames = @() + [System.String[]]$thisDscPropertyNames = @() [Type]$thisType = $this.GetType() [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() $thisProperties | ForEach-Object { - [System.Reflection.PropertyInfo]$propertyInfo = $_ + $propertyInfo = $_ $PropertyName = $_.Name $propertyInfo.GetCustomAttributes($true) | @@ -316,7 +316,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource [hashtable]$desiredProperties = $this.GetDesiredStateProperties() [string[]]$propertyNamesUnsupportedForSet = $this.GetDscResourceDscUnsupportedForSetPropertyNames() - [string[]]$propertyNamesToCompare = $this.GetDscResourceDscPropertyNames() + [string[]]$propertyNamesToCompare = $this.GetDscPropertyNames() # Update 'AlternateKey' property: From 051edae7b4ee96db665590906b53ad7de26b7791 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 13:58:29 +0000 Subject: [PATCH 210/611] Renamed GetDscResourceDscUnsupportedForSetPropertyNames() to GetDscNoSetSupportPropertyNames() in 'DSC_AzDevOpsApiResource' class. --- source/AzureDevOpsDsc.psm1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 941618a63..441e0cb54 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -207,7 +207,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource return $thisDscPropertyNames } - hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() + hidden [string[]]GetDscNoSetSupportPropertyNames() { return @() } @@ -315,7 +315,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource [hashtable]$currentProperties = $this.GetCurrentStateProperties() [hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [string[]]$propertyNamesUnsupportedForSet = $this.GetDscResourceDscUnsupportedForSetPropertyNames() + [string[]]$propertyNamesWithNoSetSupport = $this.GetDscNoSetSupportPropertyNames() [string[]]$propertyNamesToCompare = $this.GetDscPropertyNames() @@ -362,9 +362,9 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource } # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) - if ($propertyNamesUnsupportedForSet.Count -gt 0) + if ($propertyNamesWithNoSetSupport.Count -gt 0) { - $propertyNamesUnsupportedForSet | ForEach-Object { + $propertyNamesWithNoSetSupport | ForEach-Object { Write-Verbose "Comparing UNSUPPORTED: $_" Write-Verbose $("Current: "+ $($currentProperties."$_")) @@ -503,7 +503,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [string[]]$unsupportedForSetPropertyNames = $this.GetDscResourceDscUnsupportedForSetPropertyNames() + [string[]]$unsupportedForSetPropertyNames = $this.GetDscNoSetSupportPropertyNames() if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) @@ -580,7 +580,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource } - hidden [string[]]GetDscResourceDscUnsupportedForSetPropertyNames() + hidden [string[]]GetDscNoSetSupportPropertyNames() { return @('SourceControlType') } From 1a88d0d4154ed0f8ffdfbe4ae9493527548f5c24 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 14:23:15 +0000 Subject: [PATCH 211/611] Amended/Renamed a number of (Dsc)ResourceId/Key fields within 'AzDevOpsApiResource' and 'DSC_AzDevOpsApiResource' classes --- source/AzureDevOpsDsc.psm1 | 185 ++++++++++++++++++++++++------------- 1 file changed, 122 insertions(+), 63 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 441e0cb54..037fbaa17 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -32,12 +32,11 @@ enum RequiredAction class AzDevOpsApiResource { - # Hidden, non-DSC properties for use in operations/comparisons - hidden [string]$ResourceKey = $this.GetResourceKey() - hidden [string]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - hidden [string]$ResourceName = $this.GetResourceName() - - + <# + .SYNOPSIS + Returns the 'Name' of the resource (e.g. 'Project') + #> + [string]$ResourceName = $this.GetResourceName() hidden [string]GetResourceName() { @@ -48,6 +47,47 @@ class AzDevOpsApiResource + <# + .SYNOPSIS + Returns the 'Id' of the resource (e.g. 'ProjectId') + + .NOTES + When creating an object via the Azure DevOps API, the ID (if provided) is ignored + and Azure DevOps creates/generates the Id (a GUID) which can then be used for the + object. + + As a result, only existing resources from the API will have a ResourceId and new + resources to be created via the API do not need one providing. + #> + [string]$ResourceId = $this.GetResourceId() + [string]$ResourceIdPropertyName = $this.GetResourceIdPropertyName() + + hidden [string]GetResourceId() + { + return $this."$($this.GetResourceIdPropertyName())" + } + + hidden [string]GetResourceIdPropertyName() + { + return "$($this.GetResourceName())Id" + } + + + + <# + .SYNOPSIS + Returns the 'Key' of the resource (e.g. 'ProjectName') + + .NOTES + When creating an object via the Azure DevOps API, the 'Key' of the object will be + another, alternate, unique key/identifier to the 'ResourceId' but this will be + specific to the resource. + + This 'Key' can be used to determine an 'Id' of a new resource that has been added. + #> + [string]$ResourceKey = $this.GetResourceKey() + [string]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() + hidden [string]GetResourceKey() { [string]$keyPropertyName = $this.GetResourceKeyPropertyName() @@ -60,22 +100,10 @@ class AzDevOpsApiResource return $this."$keyPropertyName" } - hidden [string]GetResourceKeyPropertyName() + hidden [string]GetResourceKeyPropertyName() # TODO: Need to remove this from here... { # Uses the same value as the 'DscResourceDscKeyPropertyName()' - return $this.GetDscResourceDscKeyPropertyName() - } - - - - hidden [string]GetResourceAlternateKeyPropertyName() - { - return "$($this.GetResourceName())Id" - } - - hidden [string]GetResourceAlternateKey() - { - return $this."$($this.GetResourceAlternateKeyPropertyName())" + return $this.GetDscResourceKeyPropertyName() } @@ -182,37 +210,31 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource DSC_AzDevOpsApiResource(){} - # DSC-specific methods - hidden [System.String[]]GetDscPropertyNames() - { - [System.String[]]$thisDscPropertyNames = @() - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + <# + .NOTES + When creating an object via the Azure DevOps API, the 'Key' of the object will be + another, alternate, unique key/identifier to the 'ResourceId' but this will be + specific to the resource. - $thisProperties | ForEach-Object { - $propertyInfo = $_ - $PropertyName = $_.Name + This 'Key' can be used to determine an 'Id' of a new resource that has been added. + #> + [string]$DscResourceKey = $this.GetDscResourceKey() + [string]$DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { + hidden [string]GetDscResourceKey() + { + [string]$keyPropertyName = $this.GetDscResourceKeyPropertyName() - if ($_.TypeId.Name -eq 'DscPropertyAttribute') - { - $thisDscPropertyNames += $PropertyName - } - } + if ([string]::IsNullOrWhiteSpace($keyPropertyName)) + { + return $null } - return $thisDscPropertyNames - } - - hidden [string[]]GetDscNoSetSupportPropertyNames() - { - return @() + return $this."$keyPropertyName" } - hidden [string]GetDscResourceDscKeyPropertyName() + hidden [string]GetDscResourceKeyPropertyName() { [string[]]$thisDscKeyPropertyNames = @() @@ -252,12 +274,49 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource + + + # DSC-specific methods + hidden [System.String[]]GetDscPropertyNames() + { + [System.String[]]$thisDscPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + $propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute') + { + $thisDscPropertyNames += $PropertyName + } + } + } + + return $thisDscPropertyNames + } + + hidden [string[]]GetDscNoSetSupportPropertyNames() + { + return @() + } + + + + + + hidden [object]GetCurrentStateResourceObject() { [string]$thisResourceKey = $this.GetResourceKey() [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - [string]$thisResourceAlternateKey = $this.GetResourceAlternateKey() - [string]$thisResourceAlternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + [string]$thisResourceId = $this.GetResourceId() + [string]$thisResourceIdPropertyName = $this.GetResourceIdPropertyName() [string]$thisResourceGetFunctionName = $this.GetResourceGetFunctionName() $getParameters = @{ @@ -266,10 +325,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource "$thisResourceKeyPropertyName" = $thisResourceKey } - if (![string]::IsNullOrWhiteSpace($thisResourceAlternateKey)) + if (![string]::IsNullOrWhiteSpace($thisResourceId)) { - Write-Verbose "thisResourceAlternateKey was not null or whitespace." - $getParameters."$thisResourceAlternateKeyPropertyName" = $thisResourceAlternateKey + Write-Verbose "thisResourceId was not null or whitespace." + $getParameters."$thisResourceIdPropertyName" = $thisResourceId } $currentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) @@ -319,17 +378,17 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource [string[]]$propertyNamesToCompare = $this.GetDscPropertyNames() - # Update 'AlternateKey' property: - # Set $desiredProperties."$alternateKeyPropertyName" to $currentProperties."$alternateKeyPropertyName" if it's desired + # Update 'Id' property: + # Set $desiredProperties."$IdPropertyName" to $currentProperties."$IdPropertyName" if it's desired # value is blank/null but it's current/existing value is known (and can be recovered from $currentProperties). # # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences - [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + [string]$IdPropertyName = $this.GetResourceIdPropertyName() - if ([string]::IsNullOrWhiteSpace($desiredProperties[$alternateKeyPropertyName]) -and - ![string]::IsNullOrWhiteSpace($currentProperties[$alternateKeyPropertyName])) + if ([string]::IsNullOrWhiteSpace($desiredProperties[$IdPropertyName]) -and + ![string]::IsNullOrWhiteSpace($currentProperties[$IdPropertyName])) { - $desiredProperties."$alternateKeyPropertyName" = $currentProperties."$alternateKeyPropertyName" + $desiredProperties."$IdPropertyName" = $currentProperties."$IdPropertyName" } @@ -463,7 +522,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource hidden [hashtable]GetDesiredStateParameters([hashtable]$CurrentStateProperties, [hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) { [hashtable]$desiredStateParameters = $DesiredStateProperties - [string]$alternateKeyPropertyName = $this.GetResourceAlternateKeyPropertyName() + [string]$IdPropertyName = $this.GetResourceIdPropertyName() # If actions required are 'None' or 'Error', return a $null value @@ -479,22 +538,22 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource Pat = $DesiredStateProperties.Pat # Set this from the 'Current' state as we would expect this to have an existing key/ID value to use - "$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + "$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" } } # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable, and amend elseif ($RequiredAction -in @([RequiredAction]::New, [RequiredAction]::Set)) { - # Set $desiredParameters."$alternateKeyPropertyName" to $CurrentStateProperties."$alternateKeyPropertyName" if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName") -and - ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$alternateKeyPropertyName")) + # Set $desiredParameters."$IdPropertyName" to $CurrentStateProperties."$IdPropertyName" if it's known and can be recovered from existing resource + if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName") -and + ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$IdPropertyName")) { - $desiredStateParameters."$alternateKeyPropertyName" = $CurrentStateProperties."$alternateKeyPropertyName" + $desiredStateParameters."$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" } - # Alternatively, if $desiredParameters."$alternateKeyPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) - elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$alternateKeyPropertyName")) + # Alternatively, if $desiredParameters."$IdPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) + elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName")) { - $desiredStateParameters.Remove($alternateKeyPropertyName) + $desiredStateParameters.Remove($IdPropertyName) } From 4aaf210d6d7aa6c3bbcdf943fd3c14345cc80919 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 14:29:36 +0000 Subject: [PATCH 212/611] Refactored GetResourceFunctionName() method in 'AzDevOpsApiResource' class --- source/AzureDevOpsDsc.psm1 | 54 +++++++------------------------------- 1 file changed, 10 insertions(+), 44 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 037fbaa17..f4d0c0447 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -32,10 +32,6 @@ enum RequiredAction class AzDevOpsApiResource { - <# - .SYNOPSIS - Returns the 'Name' of the resource (e.g. 'Project') - #> [string]$ResourceName = $this.GetResourceName() hidden [string]GetResourceName() @@ -48,9 +44,6 @@ class AzDevOpsApiResource <# - .SYNOPSIS - Returns the 'Id' of the resource (e.g. 'ProjectId') - .NOTES When creating an object via the Azure DevOps API, the ID (if provided) is ignored and Azure DevOps creates/generates the Id (a GUID) which can then be used for the @@ -75,9 +68,6 @@ class AzDevOpsApiResource <# - .SYNOPSIS - Returns the 'Key' of the resource (e.g. 'ProjectName') - .NOTES When creating an object via the Azure DevOps API, the 'Key' of the object will be another, alternate, unique key/identifier to the 'ResourceId' but this will be @@ -100,7 +90,7 @@ class AzDevOpsApiResource return $this."$keyPropertyName" } - hidden [string]GetResourceKeyPropertyName() # TODO: Need to remove this from here... + hidden [string]GetResourceKeyPropertyName() # TODO: Need to remove this from here (it's DSC specific)... { # Uses the same value as the 'DscResourceDscKeyPropertyName()' return $this.GetDscResourceKeyPropertyName() @@ -149,42 +139,18 @@ class AzDevOpsApiResource hidden [string]GetResourceFunctionName([RequiredAction]$RequiredAction) { - switch ($RequiredAction) + if ($RequiredAction -in @( + [RequiredAction]::Get, + [RequiredAction]::New, + [RequiredAction]::Set, + [RequiredAction]::Remove, + [RequiredAction]::Test)) { - ([RequiredAction]::Get) { - return $this.GetResourceGetFunctionName() - break - } - - ([RequiredAction]::New) { - return $this.GetResourceNewFunctionName() - break - } - - ([RequiredAction]::Set) { - return $this.GetResourceSetFunctionName() - break - } - - ([RequiredAction]::Remove) { - return $this.GetResourceRemoveFunctionName() - break - } - - ([RequiredAction]::Test) { - return $this.GetResourceTestFunctionName() - break - } - - default { - throw "Cannot obtain a function name within 'GetResourceFunctionName()' for RequiredAction of '$($RequiredAction)'." - } - + $thisResourceName = $this.GetResourceName() + return "$($RequiredAction)-AzDevOps$thisResourceName" } - - $thisResourceName = $this.GetResourceName() - return "Get-AzDevOps$thisResourceName" + return $null } } From 8030244ffbffc0b9505885f0e9be7fe2310be88e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 14:35:18 +0000 Subject: [PATCH 213/611] Removed 'GetResource...FunctionName()' functions and replaced with use of 'GetResourceFunctionName()' --- source/AzureDevOpsDsc.psm1 | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index f4d0c0447..2ef26e38e 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -20,9 +20,11 @@ enum Ensure enum RequiredAction { None + Get New Set Remove + Test Error } @@ -111,32 +113,6 @@ class AzDevOpsApiResource - hidden [string]GetResourceGetFunctionName() - { - $thisResourceName = $this.GetResourceName() - return "Get-AzDevOps$thisResourceName" - } - hidden [string]GetResourceNewFunctionName() - { - $thisResourceName = $this.GetResourceName() - return "New-AzDevOps$thisResourceName" - } - hidden [string]GetResourceSetFunctionName() - { - $thisResourceName = $this.GetResourceName() - return "Set-AzDevOps$thisResourceName" - } - hidden [string]GetResourceRemoveFunctionName() - { - $thisResourceName = $this.GetResourceName() - return "Remove-AzDevOps$thisResourceName" - } - hidden [string]GetResourceTestFunctionName() - { - $thisResourceName = $this.GetResourceName() - return "Test-AzDevOps$thisResourceName" - } - hidden [string]GetResourceFunctionName([RequiredAction]$RequiredAction) { if ($RequiredAction -in @( @@ -283,7 +259,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() [string]$thisResourceId = $this.GetResourceId() [string]$thisResourceIdPropertyName = $this.GetResourceIdPropertyName() - [string]$thisResourceGetFunctionName = $this.GetResourceGetFunctionName() + [string]$thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) $getParameters = @{ ApiUri = $this.ApiUri From 4711ee753ae05c9e7153098bf0ce22fd6efa478f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 14:40:00 +0000 Subject: [PATCH 214/611] Renamed GetDscNoSetSupportPropertyNames() to GetDscPropertyNamesWithNoSetSupport() in 'DSC_AzDevOpsApiResource' class. --- source/AzureDevOpsDsc.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 2ef26e38e..2b1238fc8 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -243,7 +243,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource return $thisDscPropertyNames } - hidden [string[]]GetDscNoSetSupportPropertyNames() + hidden [string[]]GetDscPropertyNamesWithNoSetSupport() { return @() } @@ -316,7 +316,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource [hashtable]$currentProperties = $this.GetCurrentStateProperties() [hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [string[]]$propertyNamesWithNoSetSupport = $this.GetDscNoSetSupportPropertyNames() + [string[]]$propertyNamesWithNoSetSupport = $this.GetDscPropertyNamesWithNoSetSupport() [string[]]$propertyNamesToCompare = $this.GetDscPropertyNames() @@ -504,7 +504,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [string[]]$unsupportedForSetPropertyNames = $this.GetDscNoSetSupportPropertyNames() + [string[]]$unsupportedForSetPropertyNames = $this.GetDscPropertyNamesWithNoSetSupport() if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) @@ -581,7 +581,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource } - hidden [string[]]GetDscNoSetSupportPropertyNames() + hidden [string[]]GetDscPropertyNamesWithNoSetSupport() { return @('SourceControlType') } From d8ef1b9c6ef989856a8e7b51019489e4e5d2d968 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 14:44:34 +0000 Subject: [PATCH 215/611] Updated naming style of types within 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 104 ++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 2b1238fc8..5d940e72c 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -34,9 +34,9 @@ enum RequiredAction class AzDevOpsApiResource { - [string]$ResourceName = $this.GetResourceName() + [System.String]$ResourceName = $this.GetResourceName() - hidden [string]GetResourceName() + hidden [System.String]GetResourceName() { # Assumes a naming convention is followed between the DSC # resource name and the name of the resource within the API @@ -54,15 +54,15 @@ class AzDevOpsApiResource As a result, only existing resources from the API will have a ResourceId and new resources to be created via the API do not need one providing. #> - [string]$ResourceId = $this.GetResourceId() - [string]$ResourceIdPropertyName = $this.GetResourceIdPropertyName() + [System.String]$ResourceId = $this.GetResourceId() + [System.String]$ResourceIdPropertyName = $this.GetResourceIdPropertyName() - hidden [string]GetResourceId() + hidden [System.String]GetResourceId() { return $this."$($this.GetResourceIdPropertyName())" } - hidden [string]GetResourceIdPropertyName() + hidden [System.String]GetResourceIdPropertyName() { return "$($this.GetResourceName())Id" } @@ -77,14 +77,14 @@ class AzDevOpsApiResource This 'Key' can be used to determine an 'Id' of a new resource that has been added. #> - [string]$ResourceKey = $this.GetResourceKey() - [string]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() + [System.String]$ResourceKey = $this.GetResourceKey() + [System.String]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - hidden [string]GetResourceKey() + hidden [System.String]GetResourceKey() { - [string]$keyPropertyName = $this.GetResourceKeyPropertyName() + [System.String]$keyPropertyName = $this.GetResourceKeyPropertyName() - if ([string]::IsNullOrWhiteSpace($keyPropertyName)) + if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) { return $null } @@ -92,7 +92,7 @@ class AzDevOpsApiResource return $this."$keyPropertyName" } - hidden [string]GetResourceKeyPropertyName() # TODO: Need to remove this from here (it's DSC specific)... + hidden [System.String]GetResourceKeyPropertyName() # TODO: Need to remove this from here (it's DSC specific)... { # Uses the same value as the 'DscResourceDscKeyPropertyName()' return $this.GetDscResourceKeyPropertyName() @@ -113,7 +113,7 @@ class AzDevOpsApiResource - hidden [string]GetResourceFunctionName([RequiredAction]$RequiredAction) + hidden [System.String]GetResourceFunctionName([RequiredAction]$RequiredAction) { if ($RequiredAction -in @( [RequiredAction]::Get, @@ -138,11 +138,11 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # DSC-specific properties for use in operations/comparisons [DscProperty()] [Alias('Uri')] - [string]$ApiUri + [System.String]$ApiUri [DscProperty()] [Alias('PersonalAccessToken')] - [string]$Pat + [System.String]$Pat [DscProperty()] [Ensure]$Ensure @@ -161,14 +161,14 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource This 'Key' can be used to determine an 'Id' of a new resource that has been added. #> - [string]$DscResourceKey = $this.GetDscResourceKey() - [string]$DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() + [System.String]$DscResourceKey = $this.GetDscResourceKey() + [System.String]$DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - hidden [string]GetDscResourceKey() + hidden [System.String]GetDscResourceKey() { - [string]$keyPropertyName = $this.GetDscResourceKeyPropertyName() + [System.String]$keyPropertyName = $this.GetDscResourceKeyPropertyName() - if ([string]::IsNullOrWhiteSpace($keyPropertyName)) + if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) { return $null } @@ -176,9 +176,9 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource return $this."$keyPropertyName" } - hidden [string]GetDscResourceKeyPropertyName() + hidden [System.String]GetDscResourceKeyPropertyName() { - [string[]]$thisDscKeyPropertyNames = @() + [System.String[]]$thisDscKeyPropertyNames = @() [Type]$thisType = $this.GetType() [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() @@ -243,7 +243,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource return $thisDscPropertyNames } - hidden [string[]]GetDscPropertyNamesWithNoSetSupport() + hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() { return @() } @@ -253,13 +253,13 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource - hidden [object]GetCurrentStateResourceObject() + hidden [System.Object]GetCurrentStateResourceObject() { - [string]$thisResourceKey = $this.GetResourceKey() - [string]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - [string]$thisResourceId = $this.GetResourceId() - [string]$thisResourceIdPropertyName = $this.GetResourceIdPropertyName() - [string]$thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) + [System.String]$thisResourceKey = $this.GetResourceKey() + [System.String]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() + [System.String]$thisResourceId = $this.GetResourceId() + [System.String]$thisResourceIdPropertyName = $this.GetResourceIdPropertyName() + [System.String]$thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) $getParameters = @{ ApiUri = $this.ApiUri @@ -267,7 +267,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource "$thisResourceKeyPropertyName" = $thisResourceKey } - if (![string]::IsNullOrWhiteSpace($thisResourceId)) + if (![System.String]::IsNullOrWhiteSpace($thisResourceId)) { Write-Verbose "thisResourceId was not null or whitespace." $getParameters."$thisResourceIdPropertyName" = $thisResourceId @@ -313,11 +313,11 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource hidden [RequiredAction]GetRequiredAction() { - [hashtable]$currentProperties = $this.GetCurrentStateProperties() - [hashtable]$desiredProperties = $this.GetDesiredStateProperties() + [Hashtable]$currentProperties = $this.GetCurrentStateProperties() + [Hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [string[]]$propertyNamesWithNoSetSupport = $this.GetDscPropertyNamesWithNoSetSupport() - [string[]]$propertyNamesToCompare = $this.GetDscPropertyNames() + [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscPropertyNamesWithNoSetSupport() + [System.String[]]$propertyNamesToCompare = $this.GetDscPropertyNames() # Update 'Id' property: @@ -325,10 +325,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # value is blank/null but it's current/existing value is known (and can be recovered from $currentProperties). # # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences - [string]$IdPropertyName = $this.GetResourceIdPropertyName() + [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() - if ([string]::IsNullOrWhiteSpace($desiredProperties[$IdPropertyName]) -and - ![string]::IsNullOrWhiteSpace($currentProperties[$IdPropertyName])) + if ([System.String]::IsNullOrWhiteSpace($desiredProperties[$IdPropertyName]) -and + ![System.String]::IsNullOrWhiteSpace($currentProperties[$IdPropertyName])) { $desiredProperties."$IdPropertyName" = $currentProperties."$IdPropertyName" } @@ -449,7 +449,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource } - hidden [bool]IsInDesiredState() + hidden [System.Boolean]IsInDesiredState() { if ($this.GetRequiredAction() -eq [RequiredAction]::None) { @@ -461,10 +461,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource - hidden [hashtable]GetDesiredStateParameters([hashtable]$CurrentStateProperties, [hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) + hidden [Hashtable]GetDesiredStateParameters([Hashtable]$CurrentStateProperties, [Hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) { - [hashtable]$desiredStateParameters = $DesiredStateProperties - [string]$IdPropertyName = $this.GetResourceIdPropertyName() + [Hashtable]$desiredStateParameters = $DesiredStateProperties + [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() # If actions required are 'None' or 'Error', return a $null value @@ -487,13 +487,13 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource elseif ($RequiredAction -in @([RequiredAction]::New, [RequiredAction]::Set)) { # Set $desiredParameters."$IdPropertyName" to $CurrentStateProperties."$IdPropertyName" if it's known and can be recovered from existing resource - if ([string]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName") -and - ![string]::IsNullOrWhiteSpace($CurrentStateProperties."$IdPropertyName")) + if ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName") -and + ![System.String]::IsNullOrWhiteSpace($CurrentStateProperties."$IdPropertyName")) { $desiredStateParameters."$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" } # Alternatively, if $desiredParameters."$IdPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) - elseif ([string]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName")) + elseif ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName")) { $desiredStateParameters.Remove($IdPropertyName) } @@ -504,7 +504,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [string[]]$unsupportedForSetPropertyNames = $this.GetDscPropertyNamesWithNoSetSupport() + [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscPropertyNamesWithNoSetSupport() if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) @@ -551,18 +551,18 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource { [DscProperty()] [Alias('Id')] - [string]$ProjectId + [System.String]$ProjectId [DscProperty(Key, Mandatory)] [Alias('Name')] - [string]$ProjectName + [System.String]$ProjectName [DscProperty()] [Alias('Description')] - [string]$ProjectDescription + [System.String]$ProjectDescription [DscProperty()] - [string]$SourceControlType + [System.String]$SourceControlType [DSC_AzDevOpsProject] Get() @@ -570,7 +570,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource return [DSC_AzDevOpsProject]$($this.GetCurrentStateProperties()) } - [bool] Test() + [System.Boolean] Test() { return $this.IsInDesiredState() } @@ -581,7 +581,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource } - hidden [string[]]GetDscPropertyNamesWithNoSetSupport() + hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() { return @('SourceControlType') } @@ -596,7 +596,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource if ($null -ne $CurrentResourceObject) { - if (![string]::IsNullOrWhiteSpace($CurrentResourceObject.id)) + if (![System.String]::IsNullOrWhiteSpace($CurrentResourceObject.id)) { $properties.Ensure = [Ensure]::Present } From b9bea87aaca6e37781fe28294a5b8255724ac43a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 15:14:37 +0000 Subject: [PATCH 216/611] Added 'AzDevOpsDscResource' and making use of public properties in private/hidden functions (rather than other functions) --- source/AzureDevOpsDsc.psm1 | 201 ++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 104 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 5d940e72c..77364b8ec 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -30,9 +30,98 @@ enum RequiredAction +class AzDevOpsDscResource +{ + [System.String] + $DscResourceKey = $this.GetDscResourceKey() + + [System.String] + $DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() + + [System.String[]] + $DscResourcePropertyNames = $this.GetDscPropertyNames() + + + hidden [System.String]GetDscResourceKey() + { + [System.String]$thisDscKeyPropertyName = $this.GetDscResourceKeyPropertyName() + + if ([System.String]::IsNullOrWhiteSpace($thisDscKeyPropertyName)) + { + return $null + } + return $this."$thisDscKeyPropertyName" + } + + hidden [System.String]GetDscResourceKeyPropertyName() + { + [System.String[]]$thisDscKeyPropertyNames = @() -class AzDevOpsApiResource + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + + [System.Reflection.PropertyInfo]$propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and + $_.Key -eq $true) + { + $thisDscKeyPropertyNames += $PropertyName + } + } + } + + if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) + { + throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + } + elseif ($thisDscKeyPropertyNames.Count -gt 1) + { + throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + } + + return $thisDscKeyPropertyNames[0] + } + + + hidden [System.String[]]GetDscPropertyNames() + { + [System.String[]]$thisDscPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + $propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute') + { + $thisDscPropertyNames += $PropertyName + } + } + } + + return $thisDscPropertyNames + } + + hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() + { + return @() + } + +} + +class AzDevOpsApiDscResource : AzDevOpsDscResource { [System.String]$ResourceName = $this.GetResourceName() @@ -40,7 +129,7 @@ class AzDevOpsApiResource { # Assumes a naming convention is followed between the DSC # resource name and the name of the resource within the API - return $this.GetType().ToString().Replace('DSC_AzDevOps','').Replace('AzDevOps','') + return $this.GetType().ToString().Replace('DSC_AzDevOps','') } @@ -59,12 +148,12 @@ class AzDevOpsApiResource hidden [System.String]GetResourceId() { - return $this."$($this.GetResourceIdPropertyName())" + return $this."$($this.ResourceIdPropertyName)" } hidden [System.String]GetResourceIdPropertyName() { - return "$($this.GetResourceName())Id" + return "$($this.ResourceName)Id" } @@ -82,7 +171,7 @@ class AzDevOpsApiResource hidden [System.String]GetResourceKey() { - [System.String]$keyPropertyName = $this.GetResourceKeyPropertyName() + [System.String]$keyPropertyName = $this.ResourceKeyPropertyName if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) { @@ -104,7 +193,7 @@ class AzDevOpsApiResource { [Hashtable]$thisProperties = @{} - $this.GetDscPropertyNames() | ForEach-Object { + $this.DscResourcePropertyNames | ForEach-Object { $thisProperties."$_" = $this."$_" } @@ -122,8 +211,7 @@ class AzDevOpsApiResource [RequiredAction]::Remove, [RequiredAction]::Test)) { - $thisResourceName = $this.GetResourceName() - return "$($RequiredAction)-AzDevOps$thisResourceName" + return "$($RequiredAction)-AzDevOps$($this.ResourceName)" } return $null @@ -133,7 +221,7 @@ class AzDevOpsApiResource -class DSC_AzDevOpsApiResource : AzDevOpsApiResource +class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource { # DSC-specific properties for use in operations/comparisons [DscProperty()] @@ -153,101 +241,6 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiResource - <# - .NOTES - When creating an object via the Azure DevOps API, the 'Key' of the object will be - another, alternate, unique key/identifier to the 'ResourceId' but this will be - specific to the resource. - - This 'Key' can be used to determine an 'Id' of a new resource that has been added. - #> - [System.String]$DscResourceKey = $this.GetDscResourceKey() - [System.String]$DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - - hidden [System.String]GetDscResourceKey() - { - [System.String]$keyPropertyName = $this.GetDscResourceKeyPropertyName() - - if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) - { - return $null - } - - return $this."$keyPropertyName" - } - - hidden [System.String]GetDscResourceKeyPropertyName() - { - [System.String[]]$thisDscKeyPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - - [System.Reflection.PropertyInfo]$propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and - $_.Key -eq $true) - { - $thisDscKeyPropertyNames += $PropertyName - } - } - } - - if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) - { - throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." - } - elseif ($thisDscKeyPropertyNames.Count -gt 1) - { - throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." - } - - return $thisDscKeyPropertyNames[0] - } - - - - - - - - - # DSC-specific methods - hidden [System.String[]]GetDscPropertyNames() - { - [System.String[]]$thisDscPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - $propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute') - { - $thisDscPropertyNames += $PropertyName - } - } - } - - return $thisDscPropertyNames - } - - hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() - { - return @() - } - From 5318482e56096b352614a3102a1924496b5cd275 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 15:32:12 +0000 Subject: [PATCH 217/611] Renamed 'GetDscPropertyNames' to 'GetDscResourcePropertyNames' --- source/AzureDevOpsDsc.psm1 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 77364b8ec..8685e0464 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -39,7 +39,7 @@ class AzDevOpsDscResource $DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() [System.String[]] - $DscResourcePropertyNames = $this.GetDscPropertyNames() + $DscResourcePropertyNames = $this.GetDscResourcePropertyNames() hidden [System.String]GetDscResourceKey() @@ -90,7 +90,7 @@ class AzDevOpsDscResource } - hidden [System.String[]]GetDscPropertyNames() + hidden [System.String[]]GetDscResourcePropertyNames() { [System.String[]]$thisDscPropertyNames = @() @@ -114,7 +114,7 @@ class AzDevOpsDscResource return $thisDscPropertyNames } - hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() + hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() { return @() } @@ -309,8 +309,8 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [Hashtable]$currentProperties = $this.GetCurrentStateProperties() [Hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscPropertyNamesWithNoSetSupport() - [System.String[]]$propertyNamesToCompare = $this.GetDscPropertyNames() + [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() + [System.String[]]$propertyNamesToCompare = $this.GetDscResourcePropertyNames() # Update 'Id' property: @@ -497,7 +497,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscPropertyNamesWithNoSetSupport() + [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) @@ -574,7 +574,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource } - hidden [System.String[]]GetDscPropertyNamesWithNoSetSupport() + hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() { return @('SourceControlType') } From c35bce72fa60e95d2ff36ba35f783acee464b452 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 15:34:14 +0000 Subject: [PATCH 218/611] Added $DscResourcePropertyNamesWithNoSetSupport property to 'AzDevOpsDscResource' and replaced calls to GetDscResourcePropertyNamesWithNoSetSupport() where not an overide of a method. --- source/AzureDevOpsDsc.psm1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 8685e0464..9296bcc1a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -41,6 +41,9 @@ class AzDevOpsDscResource [System.String[]] $DscResourcePropertyNames = $this.GetDscResourcePropertyNames() + [System.String[]] + $DscResourcePropertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() + hidden [System.String]GetDscResourceKey() { @@ -309,7 +312,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [Hashtable]$currentProperties = $this.GetCurrentStateProperties() [Hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() + [System.String[]]$propertyNamesWithNoSetSupport = $this.DscResourcePropertyNamesWithNoSetSupport [System.String[]]$propertyNamesToCompare = $this.GetDscResourcePropertyNames() @@ -497,7 +500,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() + [System.String[]]$unsupportedForSetPropertyNames = $this.DscResourcePropertyNamesWithNoSetSupport if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) From f86d7bb9a607ad3446bf03b89a0b7bc1700867ad Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 15:43:48 +0000 Subject: [PATCH 219/611] Updated GetDscResourceKey() methodin 'AzDevOpsDscResource' to use $this.DscResourceKeyPropertyName --- source/AzureDevOpsDsc.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 9296bcc1a..a97b49d0a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -47,7 +47,7 @@ class AzDevOpsDscResource hidden [System.String]GetDscResourceKey() { - [System.String]$thisDscKeyPropertyName = $this.GetDscResourceKeyPropertyName() + [System.String]$thisDscKeyPropertyName = $this.DscResourceKeyPropertyName if ([System.String]::IsNullOrWhiteSpace($thisDscKeyPropertyName)) { From 2412f3c123fbd4b4037bb84724212b2e412ceaac Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 15:48:51 +0000 Subject: [PATCH 220/611] Removed invalid/non-required comments/constructor in 'AzDevOpsApiDscResource' class --- source/AzureDevOpsDsc.psm1 | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index a97b49d0a..d5cdb1fa1 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -184,9 +184,9 @@ class AzDevOpsApiDscResource : AzDevOpsDscResource return $this."$keyPropertyName" } - hidden [System.String]GetResourceKeyPropertyName() # TODO: Need to remove this from here (it's DSC specific)... + hidden [System.String]GetResourceKeyPropertyName() { - # Uses the same value as the 'DscResourceDscKeyPropertyName()' + # Use same property as the DSC Resource 'Key' return $this.GetDscResourceKeyPropertyName() } @@ -226,7 +226,6 @@ class AzDevOpsApiDscResource : AzDevOpsDscResource class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource { - # DSC-specific properties for use in operations/comparisons [DscProperty()] [Alias('Uri')] [System.String]$ApiUri @@ -239,15 +238,6 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [Ensure]$Ensure - # Constructor(s) - DSC_AzDevOpsApiResource(){} - - - - - - - hidden [System.Object]GetCurrentStateResourceObject() { From c6eab79ac1dc01959c9eab3e90270be2e379d9e6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 16:00:41 +0000 Subject: [PATCH 221/611] Removed all properties from 'AzDevOpsDscResource' class. --- source/AzureDevOpsDsc.psm1 | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index d5cdb1fa1..81b80ba08 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -32,22 +32,9 @@ enum RequiredAction class AzDevOpsDscResource { - [System.String] - $DscResourceKey = $this.GetDscResourceKey() - - [System.String] - $DscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - - [System.String[]] - $DscResourcePropertyNames = $this.GetDscResourcePropertyNames() - - [System.String[]] - $DscResourcePropertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() - - hidden [System.String]GetDscResourceKey() { - [System.String]$thisDscKeyPropertyName = $this.DscResourceKeyPropertyName + [System.String]$thisDscKeyPropertyName = $this.GetDscResourceKeyPropertyName() if ([System.String]::IsNullOrWhiteSpace($thisDscKeyPropertyName)) { @@ -196,7 +183,7 @@ class AzDevOpsApiDscResource : AzDevOpsDscResource { [Hashtable]$thisProperties = @{} - $this.DscResourcePropertyNames | ForEach-Object { + $this.GetDscResourcePropertyNames() | ForEach-Object { $thisProperties."$_" = $this."$_" } @@ -302,7 +289,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [Hashtable]$currentProperties = $this.GetCurrentStateProperties() [Hashtable]$desiredProperties = $this.GetDesiredStateProperties() - [System.String[]]$propertyNamesWithNoSetSupport = $this.DscResourcePropertyNamesWithNoSetSupport + [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() [System.String[]]$propertyNamesToCompare = $this.GetDscResourcePropertyNames() @@ -490,7 +477,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [System.String[]]$unsupportedForSetPropertyNames = $this.DscResourcePropertyNamesWithNoSetSupport + [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() if ($RequiredAction -eq [RequiredAction]::Set -and $unsupportedForSetPropertyNames.Count -gt 0) From e0553a87559a4643f582b8ae7efaa5d6e993a89b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 16:04:03 +0000 Subject: [PATCH 222/611] Updated variable names in 'AzDevOpsDscResource' class, GetDscResourceKey() and GetDscResourceKeyPropertyName() methods. --- source/AzureDevOpsDsc.psm1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 81b80ba08..35f94df31 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -34,19 +34,19 @@ class AzDevOpsDscResource { hidden [System.String]GetDscResourceKey() { - [System.String]$thisDscKeyPropertyName = $this.GetDscResourceKeyPropertyName() + [System.String]$dscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - if ([System.String]::IsNullOrWhiteSpace($thisDscKeyPropertyName)) + if ([System.String]::IsNullOrWhiteSpace($dscResourceKeyPropertyName)) { return $null } - return $this."$thisDscKeyPropertyName" + return $this."$dscResourceKeyPropertyName" } hidden [System.String]GetDscResourceKeyPropertyName() { - [System.String[]]$thisDscKeyPropertyNames = @() + [System.String[]]$dscResourceKeyPropertyNames = @() [Type]$thisType = $this.GetType() [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() @@ -62,21 +62,21 @@ class AzDevOpsDscResource if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and $_.Key -eq $true) { - $thisDscKeyPropertyNames += $PropertyName + $dscResourceKeyPropertyNames += $PropertyName } } } - if ($null -eq $thisDscKeyPropertyNames -or $thisDscKeyPropertyNames.Count -eq 0) + if ($null -eq $dscResourceKeyPropertyNames -or $dscResourceKeyPropertyNames.Count -eq 0) { throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." } - elseif ($thisDscKeyPropertyNames.Count -gt 1) + elseif ($dscResourceKeyPropertyNames.Count -gt 1) { throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." } - return $thisDscKeyPropertyNames[0] + return $dscResourceKeyPropertyNames[0] } From 539dd08eb988d2f42c478dfebd79c0d81ef9069b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 16:46:03 +0000 Subject: [PATCH 223/611] Amended property formatting in 'DSC_AzDevOpsApiResource' class. --- source/AzureDevOpsDsc.psm1 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 35f94df31..acafb955d 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -215,14 +215,17 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource { [DscProperty()] [Alias('Uri')] - [System.String]$ApiUri + [System.String] + $ApiUri [DscProperty()] [Alias('PersonalAccessToken')] - [System.String]$Pat + [System.String] + $Pat [DscProperty()] - [Ensure]$Ensure + [Ensure] + $Ensure From f82815556562aa89a0e93d90bd5ec95653c5a4c2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 16:48:34 +0000 Subject: [PATCH 224/611] Removed initial variable assignments from 'DSC_AzDevOpsApiResource' class GetCurrentStateResourceObject() method --- source/AzureDevOpsDsc.psm1 | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index acafb955d..2c5f87b6c 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -231,22 +231,17 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource hidden [System.Object]GetCurrentStateResourceObject() { - [System.String]$thisResourceKey = $this.GetResourceKey() - [System.String]$thisResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - [System.String]$thisResourceId = $this.GetResourceId() - [System.String]$thisResourceIdPropertyName = $this.GetResourceIdPropertyName() [System.String]$thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) $getParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - "$thisResourceKeyPropertyName" = $thisResourceKey + ApiUri = $this.ApiUri + Pat = $this.Pat + "$($this.GetResourceKeyPropertyName())" = $this.GetResourceKey() } - if (![System.String]::IsNullOrWhiteSpace($thisResourceId)) + if (![System.String]::IsNullOrWhiteSpace($this.GetResourceId())) { - Write-Verbose "thisResourceId was not null or whitespace." - $getParameters."$thisResourceIdPropertyName" = $thisResourceId + $getParameters."$($this.GetResourceIdPropertyName())" = $this.GetResourceId() } $currentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) From c5cdd0e185a239042fa103583458104eb0762fdb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:03:25 +0000 Subject: [PATCH 225/611] Removed '' class GetResourceProperties() function, added some comments and made minor reformatting changes. --- source/AzureDevOpsDsc.psm1 | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 2c5f87b6c..5a72f49cd 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -179,19 +179,6 @@ class AzDevOpsApiDscResource : AzDevOpsDscResource - hidden [Hashtable]GetResourceProperties() - { - [Hashtable]$thisProperties = @{} - - $this.GetDscResourcePropertyNames() | ForEach-Object { - $thisProperties."$_" = $this."$_" - } - - return $thisProperties - } - - - hidden [System.String]GetResourceFunctionName([RequiredAction]$RequiredAction) { if ($RequiredAction -in @( @@ -229,26 +216,29 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource - hidden [System.Object]GetCurrentStateResourceObject() + hidden [System.Management.Automation.PSObject]GetCurrentStateResourceObject() { - [System.String]$thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) - + # Setup a default set of parameters to pass into the object's 'Get' method $getParameters = @{ ApiUri = $this.ApiUri Pat = $this.Pat "$($this.GetResourceKeyPropertyName())" = $this.GetResourceKey() } + # If there is an available 'ResourceId' value, add it to the parameters/hashtable if (![System.String]::IsNullOrWhiteSpace($this.GetResourceId())) { $getParameters."$($this.GetResourceIdPropertyName())" = $this.GetResourceId() } + # Obtain the 'Get' function name for the object, then invoke it + $thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) $currentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) + # If no object was returned (i.e it does not exist), create a default/empty object if ($null -eq $currentStateResourceObject) { - return New-Object -TypeName 'PSObject' -Property @{ + return New-Object -TypeName 'System.Management.Automation.PSObject' -Property @{ Ensure = [Ensure]::Absent } } @@ -266,11 +256,11 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # This method must be overidden by inheriting class(es) hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { + # Obtain the type of $this object. Throw an exception if this is being called from the base class method. $thisType = $this.GetType() if ($thisType -eq [DSC_AzDevOpsApiResource]) { - throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden by an inheriting class." - return $null + throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden and called by an inheriting class." } return $null } @@ -278,7 +268,14 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource hidden [Hashtable]GetDesiredStateProperties() { - return $this.GetResourceProperties() + [Hashtable]$desiredStateProperties = @{} + + # Obtain all DSC-related properties, and add to the hashtable output + $this.GetDscResourcePropertyNames() | ForEach-Object { + $desiredStateProperties."$_" = $this."$_" + } + + return $desiredStateProperties } From f92d9e2b229f2a07c5a639e4e8d3cd150c9fe602 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:10:37 +0000 Subject: [PATCH 226/611] Performed some renames and added 'Dsc'/'Resource' prefixes to some functions and variables in 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 72 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 5a72f49cd..e6561cd20 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -216,7 +216,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource - hidden [System.Management.Automation.PSObject]GetCurrentStateResourceObject() + hidden [System.Management.Automation.PSObject]GetDscResourceCurrentStateObject() { # Setup a default set of parameters to pass into the object's 'Get' method $getParameters = @{ @@ -247,14 +247,14 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - hidden [Hashtable]GetCurrentStateProperties() + hidden [Hashtable]GetDscCurrentStateProperties() { # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class - return $this.GetCurrentStateProperties($this.GetCurrentStateResourceObject()) + return $this.GetDscCurrentStateProperties($this.GetDscResourceCurrentStateObject()) } # This method must be overidden by inheriting class(es) - hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) + hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { # Obtain the type of $this object. Throw an exception if this is being called from the base class method. $thisType = $this.GetType() @@ -266,7 +266,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - hidden [Hashtable]GetDesiredStateProperties() + hidden [Hashtable]GetDscDesiredStateProperties() { [Hashtable]$desiredStateProperties = @{} @@ -279,10 +279,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - hidden [RequiredAction]GetRequiredAction() + hidden [RequiredAction]GetDscRequiredAction() { - [Hashtable]$currentProperties = $this.GetCurrentStateProperties() - [Hashtable]$desiredProperties = $this.GetDesiredStateProperties() + [Hashtable]$currentProperties = $this.GetDscCurrentStateProperties() + [Hashtable]$desiredProperties = $this.GetDscDesiredStateProperties() [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() [System.String[]]$propertyNamesToCompare = $this.GetDscResourcePropertyNames() @@ -312,7 +312,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) - $requiredAction = [RequiredAction]::None + $dscRequiredAction = [RequiredAction]::None switch ($desiredProperties.Ensure) { @@ -321,13 +321,13 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # If not already present, or different to expected/desired - return [RequiredAction]::New (i.e. Resource needs creating) if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) { - $requiredAction = [RequiredAction]::New + $dscRequiredAction = [RequiredAction]::New } # Return if not [RequiredAction]::None - if ($requiredAction -ne [RequiredAction]::None) + if ($dscRequiredAction -ne [RequiredAction]::None) { - return $requiredAction + return $dscRequiredAction } # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) @@ -342,20 +342,20 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." - $requiredAction = [RequiredAction]::Error + $dscRequiredAction = [RequiredAction]::Error } } } # Return if not [RequiredAction]::None - if ($requiredAction -ne [RequiredAction]::None) + if ($dscRequiredAction -ne [RequiredAction]::None) { - return $requiredAction + return $dscRequiredAction break } Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::Error" + Write-Verbose "GetDscRequiredAction RequiredAction : Passed [RequiredAction]::Error" Write-Verbose "-----------------------------------------------------" # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) @@ -369,24 +369,24 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($($currentProperties."$_") -ne $($desiredProperties."$_")) { - $requiredAction = [RequiredAction]::Set + $dscRequiredAction = [RequiredAction]::Set } } } # Return if not [RequiredAction]::None - if ($requiredAction -ne [RequiredAction]::None) + if ($dscRequiredAction -ne [RequiredAction]::None) { - return $requiredAction + return $dscRequiredAction break } Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetRequiredAction RequiredAction : Passed [RequiredAction]::Set" + Write-Verbose "GetDscRequiredAction RequiredAction : Passed [RequiredAction]::Set" Write-Verbose "-----------------------------------------------------" # Otherwise, no changes to make (i.e. The desired state is already achieved) - return $requiredAction + return $dscRequiredAction break } ([Ensure]::Absent) { @@ -394,17 +394,17 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # If currently/already present - return $false (i.e. state is incorrect) if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) { - $requiredAction = [RequiredAction]::Remove + $dscRequiredAction = [RequiredAction]::Remove } # Return if not [RequiredAction]::None - if ($requiredAction -ne [RequiredAction]::None) + if ($dscRequiredAction -ne [RequiredAction]::None) { - return $requiredAction + return $dscRequiredAction } # Otherwise, no changes to make (i.e. The desired state is already achieved) - return $requiredAction + return $dscRequiredAction break } default { @@ -413,13 +413,13 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } } - return $requiredAction + return $dscRequiredAction } hidden [System.Boolean]IsInDesiredState() { - if ($this.GetRequiredAction() -eq [RequiredAction]::None) + if ($this.GetDscRequiredAction() -eq [RequiredAction]::None) { return $true } @@ -495,17 +495,17 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [void] SetToDesiredState() { - [RequiredAction]$requiredAction = $this.GetRequiredAction() + [RequiredAction]$dscRequiredAction = $this.GetDscRequiredAction() - if ($requiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) + if ($dscRequiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) { - $currentStateProperties = $this.GetCurrentStateProperties() - $desiredStateProperties = $this.GetDesiredStateProperties() + $dscCurrentStateProperties = $this.GetDscCurrentStateProperties() + $dscDesiredStateProperties = $this.GetDscDesiredStateProperties() - $requiredActionFunctionName = $this.GetResourceFunctionName($requiredAction) - $desiredStateParameters = $this.GetDesiredStateParameters($currentStateProperties, $desiredStateProperties, $requiredAction) + $dscRequiredActionFunctionName = $this.GetResourceFunctionName($dscRequiredAction) + $dscDesiredStateParameters = $this.GetDesiredStateParameters($dscCurrentStateProperties, $dscDesiredStateProperties, $dscRequiredAction) - & $requiredActionFunctionName @desiredStateParameters -Force | Out-Null + & $dscRequiredActionFunctionName @dscDesiredStateParameters -Force | Out-Null Start-Sleep -Seconds 5 } } @@ -535,7 +535,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource [DSC_AzDevOpsProject] Get() { - return [DSC_AzDevOpsProject]$($this.GetCurrentStateProperties()) + return [DSC_AzDevOpsProject]$($this.GetDscCurrentStateProperties()) } [System.Boolean] Test() @@ -554,7 +554,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource return @('SourceControlType') } - hidden [Hashtable]GetCurrentStateProperties([PSCustomObject]$CurrentResourceObject) + hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) { $properties = @{ Pat = $this.Pat From 7da3cb7ca438ad32f7c5dba67d7eef0802784141 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:15:01 +0000 Subject: [PATCH 227/611] More minor function and variable renames in 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index e6561cd20..e501b5e27 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -216,7 +216,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource - hidden [System.Management.Automation.PSObject]GetDscResourceCurrentStateObject() + hidden [System.Management.Automation.PSObject]GetDscCurrentStateObject() { # Setup a default set of parameters to pass into the object's 'Get' method $getParameters = @{ @@ -233,24 +233,24 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource # Obtain the 'Get' function name for the object, then invoke it $thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) - $currentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) + $dscCurrentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) # If no object was returned (i.e it does not exist), create a default/empty object - if ($null -eq $currentStateResourceObject) + if ($null -eq $dscCurrentStateResourceObject) { return New-Object -TypeName 'System.Management.Automation.PSObject' -Property @{ Ensure = [Ensure]::Absent } } - return $currentStateResourceObject + return $dscCurrentStateResourceObject } hidden [Hashtable]GetDscCurrentStateProperties() { # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class - return $this.GetDscCurrentStateProperties($this.GetDscResourceCurrentStateObject()) + return $this.GetDscCurrentStateProperties($this.GetDscCurrentStateObject()) } # This method must be overidden by inheriting class(es) @@ -268,14 +268,14 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource hidden [Hashtable]GetDscDesiredStateProperties() { - [Hashtable]$desiredStateProperties = @{} + [Hashtable]$dscDesiredStateProperties = @{} - # Obtain all DSC-related properties, and add to the hashtable output + # Obtain all DSC-related properties, and add them and their values to the hashtable output $this.GetDscResourcePropertyNames() | ForEach-Object { - $desiredStateProperties."$_" = $this."$_" + $dscDesiredStateProperties."$_" = $this."$_" } - return $desiredStateProperties + return $dscDesiredStateProperties } From e82e87d24b02e9de322bf2e0ee701e36df78dd48 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:22:58 +0000 Subject: [PATCH 228/611] Made minor renames and adjustments in 'DSC_AzDevOpsApiResource' class 'GetDscRequiredAction()' function --- source/AzureDevOpsDsc.psm1 | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index e501b5e27..9e85a5883 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -284,8 +284,8 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource [Hashtable]$currentProperties = $this.GetDscCurrentStateProperties() [Hashtable]$desiredProperties = $this.GetDscDesiredStateProperties() - [System.String[]]$propertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() - [System.String[]]$propertyNamesToCompare = $this.GetDscResourcePropertyNames() + [System.String[]]$dscPropertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() + [System.String[]]$dscPropertyNamesToCompare = $this.GetDscResourcePropertyNames() # Update 'Id' property: @@ -322,27 +322,24 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) { $dscRequiredAction = [RequiredAction]::New + break } # Return if not [RequiredAction]::None if ($dscRequiredAction -ne [RequiredAction]::None) { return $dscRequiredAction + break } # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) - if ($propertyNamesWithNoSetSupport.Count -gt 0) + if ($dscPropertyNamesWithNoSetSupport.Count -gt 0) { - $propertyNamesWithNoSetSupport | ForEach-Object { - - Write-Verbose "Comparing UNSUPPORTED: $_" - Write-Verbose $("Current: "+ $($currentProperties."$_")) - Write-Verbose $("Desired: "+ $($desiredProperties."$_")) + $dscPropertyNamesWithNoSetSupport | ForEach-Object { if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." - $dscRequiredAction = [RequiredAction]::Error } } } @@ -354,18 +351,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource break } - Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetDscRequiredAction RequiredAction : Passed [RequiredAction]::Error" - Write-Verbose "-----------------------------------------------------" - - # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) - if ($propertyNamesToCompare.Count -gt 0) + # Compare all properties ('Current' vs 'Desired') + if ($dscPropertyNamesToCompare.Count -gt 0) { - $propertyNamesToCompare | ForEach-Object { - - Write-Verbose "Comparing OK: $_" - Write-Verbose $("Current: "+ $($currentProperties."$_")) - Write-Verbose $("Desired: "+ $($desiredProperties."$_")) + $dscPropertyNamesToCompare | ForEach-Object { if ($($currentProperties."$_") -ne $($desiredProperties."$_")) { @@ -381,10 +370,6 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource break } - Write-Verbose "-----------------------------------------------------" - Write-Verbose "GetDscRequiredAction RequiredAction : Passed [RequiredAction]::Set" - Write-Verbose "-----------------------------------------------------" - # Otherwise, no changes to make (i.e. The desired state is already achieved) return $dscRequiredAction break From b7ef3bf3f9c04c4df37ed7c0acb2c7e1737b6fc6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:23:57 +0000 Subject: [PATCH 229/611] Simplified IsInDesiredState() function in 'DSC_AzDevOpsApiResource' class --- source/AzureDevOpsDsc.psm1 | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 9e85a5883..731ac9717 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -404,16 +404,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource hidden [System.Boolean]IsInDesiredState() { - if ($this.GetDscRequiredAction() -eq [RequiredAction]::None) - { - return $true - } - - return $false + return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) } - hidden [Hashtable]GetDesiredStateParameters([Hashtable]$CurrentStateProperties, [Hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) { [Hashtable]$desiredStateParameters = $DesiredStateProperties From af774e6a8bf2ba65a1860910b4cf7f9302f44534 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:34:12 +0000 Subject: [PATCH 230/611] Made minor tidy up in GetDscRequiredAction() method. --- source/AzureDevOpsDsc.psm1 | 46 +++++++++----------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 731ac9717..0b82ded55 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -302,15 +302,6 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - Write-Verbose '============================================================' - Write-Verbose 'Current:' - Write-Verbose $($currentProperties | ConvertTo-Json) - Write-Verbose '============================================================' - Write-Verbose 'Desired:' - Write-Verbose $($desiredProperties | ConvertTo-Json) - Write-Verbose '============================================================' - - # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) $dscRequiredAction = [RequiredAction]::None @@ -322,13 +313,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) { $dscRequiredAction = [RequiredAction]::New - break - } - - # Return if not [RequiredAction]::None - if ($dscRequiredAction -ne [RequiredAction]::None) - { - return $dscRequiredAction + Write-Verbose "DscActionRequired='$dscRequiredAction'" break } @@ -340,17 +325,11 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." + break } } } - # Return if not [RequiredAction]::None - if ($dscRequiredAction -ne [RequiredAction]::None) - { - return $dscRequiredAction - break - } - # Compare all properties ('Current' vs 'Desired') if ($dscPropertyNamesToCompare.Count -gt 0) { @@ -358,16 +337,16 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($($currentProperties."$_") -ne $($desiredProperties."$_")) { + Write-Verbose "DscPropertyValueMismatch='$_'" $dscRequiredAction = [RequiredAction]::Set } } - } - # Return if not [RequiredAction]::None - if ($dscRequiredAction -ne [RequiredAction]::None) - { - return $dscRequiredAction - break + if ($dscRequiredAction -eq [RequiredAction]::Set) + { + Write-Verbose "DscActionRequired='$dscRequiredAction'" + break + } } # Otherwise, no changes to make (i.e. The desired state is already achieved) @@ -380,15 +359,12 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) { $dscRequiredAction = [RequiredAction]::Remove - } - - # Return if not [RequiredAction]::None - if ($dscRequiredAction -ne [RequiredAction]::None) - { - return $dscRequiredAction + Write-Verbose "DscActionRequired='$dscRequiredAction'" + break } # Otherwise, no changes to make (i.e. The desired state is already achieved) + Write-Verbose "DscActionRequired='$dscRequiredAction'" return $dscRequiredAction break } From 6d25c9d8121bade335882e2a267d9a878b4863e4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:41:45 +0000 Subject: [PATCH 231/611] Moved IsInDesiredState() function in file. --- source/AzureDevOpsDsc.psm1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 0b82ded55..a2f245481 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -378,12 +378,6 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - hidden [System.Boolean]IsInDesiredState() - { - return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) - } - - hidden [Hashtable]GetDesiredStateParameters([Hashtable]$CurrentStateProperties, [Hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) { [Hashtable]$desiredStateParameters = $DesiredStateProperties @@ -448,6 +442,12 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } + hidden [System.Boolean]IsInDesiredState() + { + return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) + } + + [void] SetToDesiredState() { [RequiredAction]$dscRequiredAction = $this.GetDscRequiredAction() From 2639b3a7f4bbb16bb8c82777753a1e81fe5a400d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:44:47 +0000 Subject: [PATCH 232/611] Renamed 'IsInDesiredState()' function to 'TestDesiredState()' --- source/AzureDevOpsDsc.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index a2f245481..ffa5c81bc 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -442,7 +442,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } - hidden [System.Boolean]IsInDesiredState() + hidden [System.Boolean]TestDesiredState() { return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) } @@ -495,7 +495,7 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource [System.Boolean] Test() { - return $this.IsInDesiredState() + return $this.TestDesiredState() } [void] Set() From 6ef18626d881be1d452c7ac2c4f786d6829a3726 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 17:50:02 +0000 Subject: [PATCH 233/611] Added Test() and Set() methods in 'DSC_AzDevOpsApiResource' class --- source/AzureDevOpsDsc.psm1 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index ffa5c81bc..e44b29731 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -447,6 +447,11 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) } + [System.Boolean] Test() + { + return $this.TestDesiredState() + } + [void] SetToDesiredState() { @@ -465,6 +470,10 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource } } + [void] Set() + { + $this.SetToDesiredState() + } } @@ -493,12 +502,12 @@ class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource return [DSC_AzDevOpsProject]$($this.GetDscCurrentStateProperties()) } - [System.Boolean] Test() + [System.Boolean] Test() # Note: Overides identical method in base class but removes linting errors { return $this.TestDesiredState() } - [void] Set() + [void] Set() # Note: Overides identical method in base class but removes linting errors { $this.SetToDesiredState() } From 73b686394e79dd9b83c85c12f4f52e11a8ec4629 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:19:18 +0000 Subject: [PATCH 234/611] Added test/switch for integration test category back into integration script. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index c70946627..3cda33917 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -1,9 +1,9 @@ #Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -#if (-not (Test-BuildCategory -Type 'Integration')) -#{ -# return -#} +if (-not (Test-BuildCategory -Type 'Integration')) +{ + return +} $script:dscModuleName = 'AzureDevOpsDsc' $script:dscResourceFriendlyName = 'DSC_AzDevOpsProject' From eba90ed59002dca0db4169f7627a9cb675783e6a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:20:16 +0000 Subject: [PATCH 235/611] Added 'AzureDevOpsDsc.DscClassResources.Tests.ps1'' --- ...AzureDevOpsDsc.DscClassResources.Tests.ps1 | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 new file mode 100644 index 000000000..9b4d48b64 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 @@ -0,0 +1,30 @@ + +# Initialize tests +. $PSScriptRoot\AzureDevOpsDsc.TestInitialization.ps1 + + +InModuleScope 'AzureDevOpsDsc' { + + Describe 'DSCClassResources\AzDevOpsApiDscResource' -Tag 'AzDevOpsApiDscResource' { + + $dscModuleName = 'AzureDevOpsDsc' + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} + + Context "When evaluating '$dscModuleName' module" { + BeforeAll { + $dscModuleName = 'AzureDevOpsDsc' + $dscResourcePrefix = 'DSC_AzDevOps' + [string[]]$exportedDscResources = (Get-Module $dscModuleName).ExportedDscResources + } + + It "Should contain an exported, DSCResource specific to the 'ResourceName' - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "$dscResourcePrefix$ResourceName" | Should -BeIn $exportedDscResources + } + + } + + } +} From a0077c81f76e2066fc8b37c0e1b70bd5a774e115 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:21:13 +0000 Subject: [PATCH 236/611] Added 'AzureDevOpsDsc.TestInitialization.ps1'' --- .../AzureDevOpsDsc.TestInitialization.ps1 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 new file mode 100644 index 000000000..89c2c4f1d --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 @@ -0,0 +1,14 @@ +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -Force +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') -Force + + +if (-not (Test-BuildCategory -Type 'Unit')) +{ + return +} + + +$script:dscModuleName = 'AzureDevOpsDsc' +Remove-Module -Name $script:dscModuleName -Force -ErrorAction 'SilentlyContinue' +$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +Import-Module -Name $script:dscModuleName -Force -ErrorAction 'Stop' From 67538634a14806a60b56e84c670da87288078163 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:21:37 +0000 Subject: [PATCH 237/611] Added Get-CommandParameter to 'CommonTestHelper.psm1' --- .../Modules/TestHelpers/CommonTestHelper.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 index 83d0f70c2..fdb9c93eb 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -95,3 +95,34 @@ function Test-ContinuousIntegrationTaskCategory return $result } + +<# + .SYNOPSIS + Returns the parameters relating to a command. + + .PARAMETER CommandName + The name of the command to retrieve the parameters. + + .PARAMETER ModuleName + The name of the module the command belongs to. + +#> +function Get-CommandParameter +{ + [CmdletBinding()] + param + ( + [Parameter( Mandatory = $true)] + [System.String] + $CommandName, + + [Parameter()] + [System.String] + $ModuleName = '*' + + ) + + Get-Command -Module $ModuleName -Name $CommandName | + ForEach-Object { if ($_.Parameters) {$_.Parameters.Values }} + +} From 7a30f4f8e0e086e8e9ca34b6cd677e5f3b7baa11 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:22:15 +0000 Subject: [PATCH 238/611] Added a number of tests into 'AzureDevOpsDsc..Common.Resources.Functions.Public.Tests.ps1' --- ...ommon.Resources.Functions.Public.Tests.ps1 | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 new file mode 100644 index 000000000..d6aec06ec --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 @@ -0,0 +1,183 @@ + +# Initialize tests +. $PSScriptRoot\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + Describe 'DSCClassResources\AzDevOpsApiDscResource' -Tag 'AzDevOpsApiDscResource' { + + $moduleName = 'AzureDevOpsDsc.Common' + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} + + Context "When evaluating '$moduleName' module 'ExportedFunctions'" { + BeforeAll { + $moduleName = 'AzureDevOpsDsc.Common' + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + } + + It "Should contain an exported, 'Get-AzDevOps' (GET) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + "Get-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames + } + + It "Should contain an exported, 'New-AzDevOps' (NEW) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "New-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames + } + + It "Should contain an exported, 'Set-AzDevOps' (SET) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "Set-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames + } + + It "Should contain an exported, 'Remove-AzDevOps' (REMOVE) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "Remove-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames + } + + It "Should contain an exported, 'Test-AzDevOps' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + "Test-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames + } + + } + + + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + + Context "When evaluating '$moduleName' module, function '.ps1' scripts directory ('$resourcesFunctionsPublicDirectoryPath')" { + BeforeAll { + $moduleName = 'AzureDevOpsDsc.Common' + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + } + + It "Should contain a 'Get-AzDevOps.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.ps1") | Should -BeTrue + } + + It "Should contain a 'New-AzDevOps.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "New-AzDevOps$ResourceName.ps1") | Should -BeTrue + } + + It "Should contain a 'Set-AzDevOps.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.ps1") | Should -BeTrue + } + + It "Should contain a 'Remove-AzDevOps.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.ps1") | Should -BeTrue + } + + It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.ps1") | Should -BeTrue + } + + } + + $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + + Context "When evaluating '$moduleName' module, public, function, tests directory ('$resourcesFunctionsPublicTestsDirectoryPath')" { + BeforeAll { + $moduleName = 'AzureDevOpsDsc.Common' + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + } + + It "Should contain a 'Get-AzDevOps.Tests.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + It "Should contain a 'New-AzDevOps.Tests.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "New-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + It "Should contain a 'Set-AzDevOps.Tests.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + It "Should contain a 'Remove-AzDevOps.Tests.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + } + + Context "When evaluating '$moduleName' module, 'Get-AzDevOps...' (GET) functions" { + + Context "When evaluating function parameters" { + + It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } + + It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } + + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } + + } + + Context "When evaluating function parameter aliases" { + + It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + + It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + } + } + + } +} From af080725698df4aa09a403d9d5db1243348d0cdb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:52:20 +0000 Subject: [PATCH 239/611] Added 'ResourceId' alias to 'OperationId' parameter in 'Get-AzDevOpsOperation' --- .../Resources/Functions/Public/Get-AzDevOpsOperation.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 index 29da5e3ca..cf24bc608 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -40,7 +40,7 @@ function Get-AzDevOpsOperation [Parameter()] [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] - [Alias('Id')] + [Alias('ResourceId','Id')] [System.String] $OperationId ) From 3392089561bc716ef9aefdb6d99bfce11e5a9a98 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:52:36 +0000 Subject: [PATCH 240/611] Added 'ResourceId' alias to 'OperationId' parameter in 'Remove-AzDevOpsProject' --- .../Resources/Functions/Public/Remove-AzDevOpsProject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 index 80bff781c..266333e6d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.ps1 @@ -45,7 +45,7 @@ function Remove-AzDevOpsProject [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] - [Alias('Id')] + [Alias('ResourceId','Id')] [System.String] $ProjectId, From 021354c748f679f5706b7357f842dbabf500db37 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:52:58 +0000 Subject: [PATCH 241/611] Added 'ResourceId' alias to 'ProjectId' parameter in 'Get-AzDevOpsProject' --- .../Resources/Functions/Public/Set-AzDevOpsProject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 index 73d9be003..6a86569c2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 @@ -53,7 +53,7 @@ function Set-AzDevOpsProject [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] - [Alias('Id')] + [Alias('ResourceId','Id')] [System.String] $ProjectId, From b6acd8b77917355e4f8a6c66460727ca49bdb80d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:53:12 +0000 Subject: [PATCH 242/611] Added 'ResourceId' alias to 'OperationId' parameter in 'Test-AzDevOpsOperation' --- .../Resources/Functions/Public/Test-AzDevOpsOperation.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 347354ff5..5841f6bf5 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -67,7 +67,7 @@ function Test-AzDevOpsOperation [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] - [Alias('Id')] + [Alias('ResourceId','Id')] [System.String] $OperationId, From ce2dcd1beed523a380f7a52067e3e46f0ba728b2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 6 Nov 2020 22:54:19 +0000 Subject: [PATCH 243/611] Added more function tests function parameters and their aliases within 'AzureDevOpsDsc.Common' module (tests failing at present) --- ...ommon.Resources.Functions.Public.Tests.ps1 | 235 +++++++++++++++++- 1 file changed, 231 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 index d6aec06ec..6c65021f0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 @@ -50,13 +50,13 @@ InModuleScope 'AzureDevOpsDsc.Common' { } - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" Context "When evaluating '$moduleName' module, function '.ps1' scripts directory ('$resourcesFunctionsPublicDirectoryPath')" { BeforeAll { $moduleName = 'AzureDevOpsDsc.Common' [string[]]$exportedFunctionNames = Get-Command -Module $moduleName - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" } It "Should contain a 'Get-AzDevOps.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { @@ -167,13 +167,240 @@ InModuleScope 'AzureDevOpsDsc.Common' { It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { param ([string]$ResourceName) - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name | Where-Object { $_.Name -eq 'Pat' }).Aliases + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases } It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { param ([string]$ResourceName) - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + } + } + + + + Context "When evaluating '$moduleName' module, 'New-AzDevOps...' (NEW) functions" { + + Context "When evaluating function parameters" { + + It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } + + It "Should have a 'New-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } + + It "Should have a 'New-AzDevOps' function with no 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -Not -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } + + } + + Context "When evaluating function parameter aliases" { + + It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + + It "Should have a 'New-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'New-AzDevOps' function with no parameter with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ResourceId' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases + } + + It "Should have a 'New-AzDevOps' function with no parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Id' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases + } + + } + } + + + + + Context "When evaluating '$moduleName' module, 'Set-AzDevOps...' (SET) functions" { + + Context "When evaluating function parameters" { + + It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } + + It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } + + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } + + } + + Context "When evaluating function parameter aliases" { + + It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + + It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + } + } + + + + + Context "When evaluating '$moduleName' module, 'Remove-AzDevOps...' (REMOVE) functions" { + + Context "When evaluating function parameters" { + + It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } + + It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } + + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } + + } + + Context "When evaluating function parameter aliases" { + + It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + + It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + } + } + + + Context "When evaluating '$moduleName' module, 'Test-AzDevOps...' (TEST) functions" { + + Context "When evaluating function parameters" { + + It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } + + It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } + + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } + + } + + Context "When evaluating function parameter aliases" { + + It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + + It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases } } From 94c86cd8ef6eeae28e66db2ad63564a393a2a160 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 08:14:28 +0000 Subject: [PATCH 244/611] Added 'ResourcePublicFunctionName', 'ResourcePublicGetFunctionName', 'ResourcePublicNewFunctionName', 'ResourcePublicSetFunctionName', 'ResourcePublicRemoveFunctionName' and 'ResourcePublicTestFunctionName' test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index bf9dd734a..47c796d55 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -18,7 +18,10 @@ function Get-TestCaseValue ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName','ProjectDescription','ProjectName','OrganizationName',` + 'ResourceName',` + 'ResourcePublicFunctionName','ResourcePublicGetFunctionName','ResourcePublicNewFunctionName',` + 'ResourcePublicSetFunctionName','ResourcePublicRemoveFunctionName','ResourcePublicTestFunctionName',` + 'ProjectDescription','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -322,6 +325,63 @@ function Get-TestCaseValue } + # ResourcePublicGetFunctionName + $testCaseValues.ResourcePublicGetFunctionName = @{ + + Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { + "Get-AzDevOps$_" + } + + } + + # ResourcePublicNewFunctionName + $testCaseValues.ResourcePublicNewFunctionName = @{ + + Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { + "New-AzDevOps$_" + } + + } + + # ResourcePublicSetFunctionName + $testCaseValues.ResourcePublicSetFunctionName = @{ + + Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { + "Set-AzDevOps$_" + } + + } + + # ResourcePublicRemoveFunctionName + $testCaseValues.ResourcePublicRemoveFunctionName = @{ + + Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { + "Remove-AzDevOps$_" + } + + } + + # ResourcePublicTestFunctionName + $testCaseValues.ResourcePublicTestFunctionName = @{ + + Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { + "Test-AzDevOps$_" + } + + } + + # ResourcePublicFunctionName + $testCaseValues.ResourcePublicFunctionName = @{ + + Valid = $testCaseValues.ResourcePublicGetFunctionName.Valid + + $testCaseValues.ResourcePublicNewFunctionName.Valid + + $testCaseValues.ResourcePublicSetFunctionName.Valid + + $testCaseValues.ResourcePublicRemoveFunctionName.Valid + + $testCaseValues.ResourcePublicTestFunctionName.Valid + + } + + # OperationId (derived from ResourceId) $testCaseValues.OperationId = $testCaseValues.ResourceId @@ -354,7 +414,10 @@ function Get-TestCase ( [Parameter(Mandatory = $true)] [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName','ProjectDescription','ProjectName','OrganizationName',` + 'ResourceName',` + 'ResourcePublicFunctionName','ResourcePublicGetFunctionName','ResourcePublicNewFunctionName',` + 'ResourcePublicSetFunctionName','ResourcePublicRemoveFunctionName','ResourcePublicTestFunctionName',` + 'ProjectDescription','ProjectName','OrganizationName',` 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, From 1f756e65b649ed3d185b44a0c5750ca5560663a8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 08:33:00 +0000 Subject: [PATCH 245/611] Added additional test cases to 'CommonTestCases.ps1' and removed 'ValidateSet' parameter attribute. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 99 ++++++++++++++++--- 1 file changed, 87 insertions(+), 12 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 47c796d55..11f808c9e 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -17,12 +17,6 @@ function Get-TestCaseValue param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName',` - 'ResourcePublicFunctionName','ResourcePublicGetFunctionName','ResourcePublicNewFunctionName',` - 'ResourcePublicSetFunctionName','ResourcePublicRemoveFunctionName','ResourcePublicTestFunctionName',` - 'ProjectDescription','ProjectName','OrganizationName',` - 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, @@ -371,6 +365,7 @@ function Get-TestCaseValue } # ResourcePublicFunctionName + # Combination of all the 'Get', 'New', 'Set', 'Remove' and 'Test' functions for the 'Resource' $testCaseValues.ResourcePublicFunctionName = @{ Valid = $testCaseValues.ResourcePublicGetFunctionName.Valid + @@ -382,6 +377,92 @@ function Get-TestCaseValue } + + # NonDscResourceName + # The 'ResourceName' values that are to be excluded from being used as part of a DSC resource (typically treated differently to 'DscResourceName' values) + $testCaseValues.NonDscResourceName = @{ + + Valid = @( + 'Operation' + ) + + Invalid = $testCaseValues + + } + $testCaseValues.NonDscResourceName.Invalid = $testCaseValues.ResourceName.Valid | Where-Object { + $_ -notin $testCaseValues.NonDscResourceName.Valid + } + + + + # DscResourceName + # Use 'ResourceName' values, but remove valid 'NonDscResourceName' from 'Valid' array, and add them to the 'Invalid' array + $testCaseValues.DscResourceName = $testCaseValues.ResourceName + $testCaseValues.DscResourceName.Valid = $testCaseValues.DscResourceName | Where-Object { $_ -notin $testCaseValues.NonDscResourceName.Valid } + $testCaseValues.DscResourceName.Invalid = $testCaseValues.NonDscResourceName.Valid + + + + # DscResourcePublicGetFunctionName + $testCaseValues.DscResourcePublicGetFunctionName = @{ + + Valid = $testCaseValues.DscResourceName.Valid | ForEach-Object { + "Get-AzDevOps$_" + } + + } + + # DscResourcePublicNewFunctionName + $testCaseValues.DscResourcePublicNewFunctionName = @{ + + Valid = $testCaseValues.DscResourceName.Valid | ForEach-Object { + "New-AzDevOps$_" + } + + } + + # DscResourcePublicSetFunctionName + $testCaseValues.DscResourcePublicSetFunctionName = @{ + + Valid = $testCaseValues.DscResourceName.Valid | ForEach-Object { + "Set-AzDevOps$_" + } + + } + + # DscResourcePublicRemoveFunctionName + $testCaseValues.DscResourcePublicRemoveFunctionName = @{ + + Valid = $testCaseValues.DscResourceName.Valid | ForEach-Object { + "Remove-AzDevOps$_" + } + + } + + # DscResourcePublicTestFunctionName + $testCaseValues.DscResourcePublicTestFunctionName = @{ + + Valid = $testCaseValues.DscResourceName.Valid | ForEach-Object { + "Test-AzDevOps$_" + } + + } + + # DscResourcePublicFunctionName + # Combination of all the 'Get', 'New', 'Set', 'Remove' and 'Test' functions for the 'DscResource + $testCaseValues.DscResourcePublicFunctionName = @{ + + Valid = $testCaseValues.DscResourcePublicGetFunctionName.Valid + + $testCaseValues.DscResourcePublicNewFunctionName.Valid + + $testCaseValues.DscResourcePublicSetFunctionName.Valid + + $testCaseValues.DscResourcePublicRemoveFunctionName.Valid + + $testCaseValues.DscResourcePublicTestFunctionName.Valid + + } + + + + # OperationId (derived from ResourceId) $testCaseValues.OperationId = $testCaseValues.ResourceId @@ -413,12 +494,6 @@ function Get-TestCase param ( [Parameter(Mandatory = $true)] - [ValidateSet('String','ApiUri','ApiUriAreaName','ApiUriResourceName','ApiVersion','Pat',` - 'ResourceName',` - 'ResourcePublicFunctionName','ResourcePublicGetFunctionName','ResourcePublicNewFunctionName',` - 'ResourcePublicSetFunctionName','ResourcePublicRemoveFunctionName','ResourcePublicTestFunctionName',` - 'ProjectDescription','ProjectName','OrganizationName',` - 'ResourceId','OperationId','ProjectId')] [System.String] $ScopeName, From a2a230abf85e855d677d0cba768834f47bd468f9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 08:43:47 +0000 Subject: [PATCH 246/611] Added 'Test-AzDevOpsProject' function to 'AzureDevOpsDsc.Common', nested module --- .../AzureDevOpsDsc.Common.psd1 | 3 +- .../Functions/Public/Test-AzDevOpsProject.ps1 | 76 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 index dae2251ee..f7893cf19 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -31,7 +31,8 @@ 'Get-AzDevOpsProject', 'New-AzDevOpsProject', 'Set-AzDevOpsProject', - 'Remove-AzDevOpsProject' + 'Remove-AzDevOpsProject', + 'Test-AzDevOpsProject' ) # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 new file mode 100644 index 000000000..008db67e8 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 @@ -0,0 +1,76 @@ +<# + .SYNOPSIS + Tests the presence of an Azure DevOps API project. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER Pat + The 'Personal Access Token' (PAT) to be used by any subsequent requests/projects + against the Azure DevOps API. This PAT must have the relevant permissions assigned + for the subsequent operations being performed. + + .PARAMETER ProjectId + The 'id' of the Azure DevOps API project. + + .PARAMETER ProjectName + The 'name' of the Azure DevOps API project. + + .EXAMPLE + Test-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectId' + + Tests that the Azure DevOps 'Project' (identified by the 'ProjectId') exists. + + .EXAMPLE + Test-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ProjectId 'YourProjectName' + + Tests that the Azure DevOps 'Project' (identified by the 'ProjectName') exists. + + .EXAMPLE + Test-AzDevOpsProject -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' ` + -ProjectId 'YourProjectId' -ProjectId 'YourProjectName' + + Tests that the Azure DevOps 'Project' (identified by the 'ProjectId' and 'ProjectName') exists. +#> +function Test-AzDevOpsProject +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] + [Alias('PersonalAccessToken')] + [System.String] + $Pat, + + [Parameter(Mandatory = $true, ParameterSetName='ProjectId')] + [Parameter(Mandatory = $true, ParameterSetName='ProjectIdAndProjectName')] + [ValidateScript({ Test-AzDevOpsProjectId -ProjectId $_ -IsValid })] + [Alias('ResourceId','Id')] + [System.String] + $ProjectId, + + [Parameter(Mandatory = $true, ParameterSetName='ProjectName')] + [Parameter(Mandatory = $true, ParameterSetName='ProjectIdAndProjectName')] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectId $_ -IsValid })] + [Alias('Name')] + [System.String] + $ProjectName + ) + + [object[]]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat ` + -ProjectId $ProjectId ` + -ProjectName $ProjectName + + + return $($null -ne $project.id) +} From 59f631c06b1aff29dd33039c6da1f34856144f37 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 09:12:28 +0000 Subject: [PATCH 247/611] Amended/Corrected 'ResourcePublicFunctionName'-related and 'DscResourcePublicFunctionName'-related test case values. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 11f808c9e..0f1674a34 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -279,7 +279,8 @@ function Get-TestCaseValue Valid = @( 'Operation', - 'Project' + 'Project'#, + #'Team' ) Invalid = @( @@ -328,33 +329,6 @@ function Get-TestCaseValue } - # ResourcePublicNewFunctionName - $testCaseValues.ResourcePublicNewFunctionName = @{ - - Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { - "New-AzDevOps$_" - } - - } - - # ResourcePublicSetFunctionName - $testCaseValues.ResourcePublicSetFunctionName = @{ - - Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { - "Set-AzDevOps$_" - } - - } - - # ResourcePublicRemoveFunctionName - $testCaseValues.ResourcePublicRemoveFunctionName = @{ - - Valid = $testCaseValues.ResourceName.Valid | ForEach-Object { - "Remove-AzDevOps$_" - } - - } - # ResourcePublicTestFunctionName $testCaseValues.ResourcePublicTestFunctionName = @{ @@ -368,11 +342,11 @@ function Get-TestCaseValue # Combination of all the 'Get', 'New', 'Set', 'Remove' and 'Test' functions for the 'Resource' $testCaseValues.ResourcePublicFunctionName = @{ - Valid = $testCaseValues.ResourcePublicGetFunctionName.Valid + - $testCaseValues.ResourcePublicNewFunctionName.Valid + - $testCaseValues.ResourcePublicSetFunctionName.Valid + - $testCaseValues.ResourcePublicRemoveFunctionName.Valid + - $testCaseValues.ResourcePublicTestFunctionName.Valid + Valid = [string[]]$testCaseValues.ResourcePublicGetFunctionName.Valid + + #$testCaseValues.ResourcePublicNewFunctionName.Valid + # Not needed/wanted for 'NonDscResource' functions (use 'NonDscResource' for this ) + #$testCaseValues.ResourcePublicSetFunctionName.Valid + # Not needed/wanted for 'NonDscResource' functions (use 'NonDscResource' for this ) + #$testCaseValues.ResourcePublicRemoveFunctionName.Valid + # Not needed/wanted for 'NonDscResource' functions (use 'NonDscResource' for this ) + [string[]]$testCaseValues.ResourcePublicTestFunctionName.Valid } @@ -398,7 +372,7 @@ function Get-TestCaseValue # DscResourceName # Use 'ResourceName' values, but remove valid 'NonDscResourceName' from 'Valid' array, and add them to the 'Invalid' array $testCaseValues.DscResourceName = $testCaseValues.ResourceName - $testCaseValues.DscResourceName.Valid = $testCaseValues.DscResourceName | Where-Object { $_ -notin $testCaseValues.NonDscResourceName.Valid } + $testCaseValues.DscResourceName.Valid = $testCaseValues.DscResourceName.Valid | Where-Object { $_ -notin $testCaseValues.NonDscResourceName.Valid } $testCaseValues.DscResourceName.Invalid = $testCaseValues.NonDscResourceName.Valid @@ -452,11 +426,11 @@ function Get-TestCaseValue # Combination of all the 'Get', 'New', 'Set', 'Remove' and 'Test' functions for the 'DscResource $testCaseValues.DscResourcePublicFunctionName = @{ - Valid = $testCaseValues.DscResourcePublicGetFunctionName.Valid + - $testCaseValues.DscResourcePublicNewFunctionName.Valid + - $testCaseValues.DscResourcePublicSetFunctionName.Valid + - $testCaseValues.DscResourcePublicRemoveFunctionName.Valid + - $testCaseValues.DscResourcePublicTestFunctionName.Valid + Valid = [string[]]$testCaseValues.DscResourcePublicGetFunctionName.Valid + + [string[]]$testCaseValues.DscResourcePublicNewFunctionName.Valid + + [string[]]$testCaseValues.DscResourcePublicSetFunctionName.Valid + + [string[]]$testCaseValues.DscResourcePublicRemoveFunctionName.Valid + + [string[]]$testCaseValues.DscResourcePublicTestFunctionName.Valid } From ff455af7239d8e8a522677b7f111bbf27ba60278 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 09:14:36 +0000 Subject: [PATCH 248/611] Refactored tests for public functions exported from 'AzureDevOpsDsc.Common' module --- ...ommon.Resources.Functions.Public.Tests.ps1 | 480 +++++++++--------- 1 file changed, 249 insertions(+), 231 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 index 6c65021f0..50a7a672a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 @@ -5,404 +5,422 @@ InModuleScope 'AzureDevOpsDsc.Common' { - Describe 'DSCClassResources\AzDevOpsApiDscResource' -Tag 'AzDevOpsApiDscResource' { + Describe 'Resources\Functions' { $moduleName = 'AzureDevOpsDsc.Common' $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} - Context "When evaluating '$moduleName' module 'ExportedFunctions'" { + Context "When evaluating 'AzureDevOpsDsc.Common' module functions" { BeforeAll { $moduleName = 'AzureDevOpsDsc.Common' - [string[]]$exportedFunctionNames = Get-Command -Module $moduleName } - It "Should contain an exported, 'Get-AzDevOps' (GET) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Context "When evaluating public, 'ExportedFunctions'" { - "Get-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames - } - - It "Should contain an exported, 'New-AzDevOps' (NEW) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + BeforeAll { + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + } - "New-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames - } + $testCasesValidResourcePublicFunctionNames = Get-TestCase -ScopeName 'ResourcePublicFunctionName' -TestCaseName 'Valid' + $testCasesValidDscResourcePublicFunctionNames = Get-TestCase -ScopeName 'DscResourcePublicFunctionName' -TestCaseName 'Valid' - It "Should contain an exported, 'Set-AzDevOps' (SET) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - "Set-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames - } + Context "When evaluating functions required for DSC resources" { - It "Should contain an exported, 'Remove-AzDevOps' (REMOVE) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) - "Remove-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames - } + $DscResourcePublicFunctionName | Should -BeIn $exportedFunctionNames + } - It "Should contain an exported, 'Test-AzDevOps' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + It "Should return a '' function/command (specific to the 'ResourceName') from 'Get-Command' - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) - "Test-AzDevOps$ResourceName" | Should -BeIn $exportedFunctionNames - } + Get-Command -Module $moduleName -Name $DscResourcePublicFunctionName | Should -Not -BeNullOrEmpty + } - } + } + Context "When evaluating functions required for non-DSC resources" { - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" + It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourcePublicFunctionNames { + param ([string]$ResourcePublicFunctionName) - Context "When evaluating '$moduleName' module, function '.ps1' scripts directory ('$resourcesFunctionsPublicDirectoryPath')" { - BeforeAll { - $moduleName = 'AzureDevOpsDsc.Common' - [string[]]$exportedFunctionNames = Get-Command -Module $moduleName - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" - } + $ResourcePublicFunctionName | Should -BeIn $exportedFunctionNames + } - It "Should contain a 'Get-AzDevOps.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + It "Should return a '' function/command (specific to the 'ResourceName') from 'Get-Command' - ''" -TestCases $testCasesValidResourcePublicFunctionNames { + param ([string]$ResourcePublicFunctionName) - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.ps1") | Should -BeTrue - } + Get-Command -Module $moduleName -Name $ResourcePublicFunctionName | Should -Not -BeNullOrEmpty + } - It "Should contain a 'New-AzDevOps.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + } - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "New-AzDevOps$ResourceName.ps1") | Should -BeTrue } - It "Should contain a 'Set-AzDevOps.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.ps1") | Should -BeTrue - } + Context "When evaluating private, module functions" { - It "Should contain a 'Remove-AzDevOps.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + # TODO: + # Should be a 'Test-Id' function - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.ps1") | Should -BeTrue } - It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.ps1") | Should -BeTrue - } + Context "When evaluating '$moduleName' module, function '.ps1' scripts directory ('$resourcesFunctionsPublicDirectoryPath')" { + BeforeAll { + $moduleName = 'AzureDevOpsDsc.Common' + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" + } - } + It "Should contain a 'Get-AzDevOps.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.ps1") | Should -BeTrue + } - Context "When evaluating '$moduleName' module, public, function, tests directory ('$resourcesFunctionsPublicTestsDirectoryPath')" { - BeforeAll { - $moduleName = 'AzureDevOpsDsc.Common' - [string[]]$exportedFunctionNames = Get-Command -Module $moduleName - $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" - } + It "Should contain a 'New-AzDevOps.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should contain a 'Get-AzDevOps.Tests.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "New-AzDevOps$ResourceName.ps1") | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } + It "Should contain a 'Set-AzDevOps.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should contain a 'New-AzDevOps.Tests.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.ps1") | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "New-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } + It "Should contain a 'Remove-AzDevOps.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should contain a 'Set-AzDevOps.Tests.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.ps1") | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } + It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should contain a 'Remove-AzDevOps.Tests.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.ps1") | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue } - It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } + Context "When evaluating '$moduleName' module, public, function, tests directory ('$resourcesFunctionsPublicTestsDirectoryPath')" { + BeforeAll { + $moduleName = 'AzureDevOpsDsc.Common' + [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" + } - } + It "Should contain a 'Get-AzDevOps.Tests.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - Context "When evaluating '$moduleName' module, 'Get-AzDevOps...' (GET) functions" { + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } + + It "Should contain a 'New-AzDevOps.Tests.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - Context "When evaluating function parameters" { + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "New-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue + } - It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { + It "Should contain a 'Set-AzDevOps.Tests.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { param ([string]$ResourceName) - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue } - It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { + It "Should contain a 'Remove-AzDevOps.Tests.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { param ([string]$ResourceName) - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue } - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { + It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { param ([string]$ResourceName) - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue } } - Context "When evaluating function parameter aliases" { + Context "When evaluating '$moduleName' module, 'Get-AzDevOps...' (GET) functions" { - It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Context "When evaluating function parameters" { - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } + It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } + It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name + } - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases } - } - } + Context "When evaluating function parameter aliases" { + It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } - Context "When evaluating '$moduleName' module, 'New-AzDevOps...' (NEW) functions" { + It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - Context "When evaluating function parameters" { + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } - It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name - } + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - It "Should have a 'New-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name } + } - It "Should have a 'New-AzDevOps' function with no 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - "$($ResourceName)Id" | Should -Not -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name - } - } + Context "When evaluating '$moduleName' module, 'New-AzDevOps...' (NEW) functions" { - Context "When evaluating function parameter aliases" { + Context "When evaluating function parameters" { - It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } - It "Should have a 'New-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should have a 'New-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } - It "Should have a 'New-AzDevOps' function with no parameter with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + It "Should have a 'New-AzDevOps' function with no 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + + "$($ResourceName)Id" | Should -Not -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name + } - 'ResourceId' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases } - It "Should have a 'New-AzDevOps' function with no parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Context "When evaluating function parameter aliases" { - 'Id' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases - } + It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - } - } + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + It "Should have a 'New-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + It "Should have a 'New-AzDevOps' function with no parameter with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - Context "When evaluating '$moduleName' module, 'Set-AzDevOps...' (SET) functions" { + 'ResourceId' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases + } - Context "When evaluating function parameters" { + It "Should have a 'New-AzDevOps' function with no parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'Id' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases + } - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name } + } - It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name - } - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name - } + Context "When evaluating '$moduleName' module, 'Set-AzDevOps...' (SET) functions" { - } + Context "When evaluating function parameters" { - Context "When evaluating function parameter aliases" { + It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } + It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name + } - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases } - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Context "When evaluating function parameter aliases" { - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } + It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - } - } + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - Context "When evaluating '$moduleName' module, 'Remove-AzDevOps...' (REMOVE) functions" { + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - Context "When evaluating function parameters" { + It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name } + } - It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name - } - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name - } + Context "When evaluating '$moduleName' module, 'Remove-AzDevOps...' (REMOVE) functions" { - } + Context "When evaluating function parameters" { - Context "When evaluating function parameter aliases" { + It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } + It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name + } - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases } - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + Context "When evaluating function parameter aliases" { - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } + It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - } - } + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - Context "When evaluating '$moduleName' module, 'Test-AzDevOps...' (TEST) functions" { + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } - Context "When evaluating function parameters" { + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name - } + It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { + param ([string]$ResourceName) - It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name } + } - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name - } + Context "When evaluating '$moduleName' module, 'Test-AzDevOps...' (TEST) functions" { - } + Context "When evaluating function parameters" { - Context "When evaluating function parameter aliases" { + It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } + It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name + } - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases } - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Context "When evaluating function parameter aliases" { - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } + It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases + } + It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases + } + + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { + param ([string]$ResourceName) + + 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases + } + + } } } From 83dfb86b4accc00e8b93d18b5d57fe29bba7dceb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 09:15:10 +0000 Subject: [PATCH 249/611] Renamed file to remove '.Public' subsection. --- ...ts.ps1 => AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 => AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Public.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 From 7702971ce620fa1b8720e2c2c6a0596cd36437a9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 09:56:54 +0000 Subject: [PATCH 250/611] Updated/Refactored 'Function' tests for public function scripts and test scripts. --- ...psDsc.Common.Resources.Functions.Tests.ps1 | 115 +++++------------- 1 file changed, 32 insertions(+), 83 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 index 50a7a672a..9cb169b46 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 @@ -12,20 +12,23 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} Context "When evaluating 'AzureDevOpsDsc.Common' module functions" { - BeforeAll { + BeforeEach { $moduleName = 'AzureDevOpsDsc.Common' } Context "When evaluating public, 'ExportedFunctions'" { - BeforeAll { + BeforeEach { [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" + $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" } $testCasesValidResourcePublicFunctionNames = Get-TestCase -ScopeName 'ResourcePublicFunctionName' -TestCaseName 'Valid' $testCasesValidDscResourcePublicFunctionNames = Get-TestCase -ScopeName 'DscResourcePublicFunctionName' -TestCaseName 'Valid' + Context "When evaluating functions required for DSC resources" { It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { @@ -40,6 +43,20 @@ InModuleScope 'AzureDevOpsDsc.Common' { Get-Command -Module $moduleName -Name $DscResourcePublicFunctionName | Should -Not -BeNullOrEmpty } + It "Should have a '' script ('.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) + + $functionScriptPath = Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".ps1") + Test-Path $functionScriptPath | Should -BeTrue + } + + It "Should have a '' test fixture/script ('.Tests.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) + + $functionTestsScriptPath = Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".Tests.ps1") + Test-Path $functionTestsScriptPath | Should -BeTrue + } + } Context "When evaluating functions required for non-DSC resources" { @@ -56,96 +73,28 @@ InModuleScope 'AzureDevOpsDsc.Common' { Get-Command -Module $moduleName -Name $ResourcePublicFunctionName | Should -Not -BeNullOrEmpty } - } - - } - - Context "When evaluating private, module functions" { - - # TODO: - # Should be a 'Test-Id' function - - } - - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" - - Context "When evaluating '$moduleName' module, function '.ps1' scripts directory ('$resourcesFunctionsPublicDirectoryPath')" { - BeforeAll { - $moduleName = 'AzureDevOpsDsc.Common' - [string[]]$exportedFunctionNames = Get-Command -Module $moduleName - $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" - } - - It "Should contain a 'Get-AzDevOps.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.ps1") | Should -BeTrue - } - - It "Should contain a 'New-AzDevOps.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "New-AzDevOps$ResourceName.ps1") | Should -BeTrue - } - - It "Should contain a 'Set-AzDevOps.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.ps1") | Should -BeTrue - } + It "Should have a '' script ('.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourcePublicFunctionNames { + param ([string]$ResourcePublicFunctionName) - It "Should contain a 'Remove-AzDevOps.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + $functionScriptPath = Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath $($ResourcePublicFunctionName + ".ps1") + Test-Path $functionScriptPath | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.ps1") | Should -BeTrue - } + It "Should have a '' test fixture/script ('.Tests.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourcePublicFunctionNames { + param ([string]$ResourcePublicFunctionName) - It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + $functionTestsScriptPath = Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath $($ResourcePublicFunctionName + ".Tests.ps1") + Test-Path $functionTestsScriptPath | Should -BeTrue + } - Test-Path $(Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.ps1") | Should -BeTrue } } - $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" - - Context "When evaluating '$moduleName' module, public, function, tests directory ('$resourcesFunctionsPublicTestsDirectoryPath')" { - BeforeAll { - $moduleName = 'AzureDevOpsDsc.Common' - [string[]]$exportedFunctionNames = Get-Command -Module $moduleName - $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" - } - - It "Should contain a 'Get-AzDevOps.Tests.ps1' (GET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Get-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } - - It "Should contain a 'New-AzDevOps.Tests.ps1' (NEW) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "New-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } - - It "Should contain a 'Set-AzDevOps.Tests.ps1' (SET) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Set-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } - - It "Should contain a 'Remove-AzDevOps.Tests.ps1' (REMOVE) function script (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Remove-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } - - It "Should contain a 'Test-AzDevOps.ps1' (TEST) function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Context "When evaluating private, module functions" { - Test-Path $(Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath "Test-AzDevOps$ResourceName.Tests.ps1") | Should -BeTrue - } + # TODO: + # Should be a 'Test-Id' function } From 0ac8daecc07e9aeb487e1338228da160b3f68265 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 10:49:47 +0000 Subject: [PATCH 251/611] Added 'Get-CommandParameterAlias', tests, helper function --- .../Modules/TestHelpers/CommonTestHelper.psm1 | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 index fdb9c93eb..e8ebdd87e 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -105,7 +105,6 @@ function Test-ContinuousIntegrationTaskCategory .PARAMETER ModuleName The name of the module the command belongs to. - #> function Get-CommandParameter { @@ -119,10 +118,46 @@ function Get-CommandParameter [Parameter()] [System.String] $ModuleName = '*' - ) Get-Command -Module $ModuleName -Name $CommandName | ForEach-Object { if ($_.Parameters) {$_.Parameters.Values }} } + +<# + .SYNOPSIS + Returns the aliases relating to a command and it's parameters. + + .PARAMETER CommandName + The name of the command to retrieve the parameter aliases. + + .PARAMETER ParameterName + The name of the parameter to retrieve the aliases of. + + .PARAMETER ModuleName + The name of the module the command belongs to. +#> +function Get-CommandParameterAlias +{ + [CmdletBinding()] + param + ( + [Parameter( Mandatory = $true)] + [System.String] + $CommandName, + + [Parameter()] + [System.String] + $ParameterName = '*', + + [Parameter()] + [System.String] + $ModuleName = '*' + ) + + Get-CommandParameter -CommandName $CommandName -ModuleName $ModuleName | + ForEach-Object { if ($_.Name -ilike $ParameterName -and $_.Aliases) {$_.Aliases }} + +} + From 481c2613973a3fd70c0c45acdff3cb1a3ca910f4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 11:02:36 +0000 Subject: [PATCH 252/611] Added 'ParameterAliasName', 'ApiResourcePublicFunctionRequiredParameterName' and 'DscResourcePublicFunctionRequiredParameterName' test cases --- .../Modules/TestHelpers/CommonTestCases.psm1 | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 0f1674a34..e88b242cb 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -436,6 +436,41 @@ function Get-TestCaseValue + # ApiResourcePublicFunctionRequiredParameterName + # Parameter names that must be present on a public, function for an Azure DevOps, API resource + $testCaseValues.ApiResourcePublicFunctionRequiredParameterName = @{ + + Valid = @( + 'ApiUri', + 'Pat' + ) + } + + + # DscResourcePublicFunctionRequiredParameterName + # Parameter names that must be present on a public, function for a DSC resource (same as for an API resource) + $testCaseValues.DscResourcePublicFunctionRequiredParameterName = $testCaseValues.ApiResourcePublicFunctionRequiredParameterName + + + + + # ParameterAliasName + # Parameter names that must be present on a public, function for an Azure DevOps, API resource + $testCaseValues.ParameterAliasName = @{ + + Valid = @( + @{ + ParameterName='ApiUri' + AliasName=@('Uri') + }, + @{ + ParameterName='Pat' + AliasName=@('PersonalAccessToken') + } + ) + } + + # OperationId (derived from ResourceId) $testCaseValues.OperationId = $testCaseValues.ResourceId From 798de03df797920f608d5fcd126c14b4a59bcaa9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 11:26:49 +0000 Subject: [PATCH 253/611] Refactored tests for testingrequired, public, function parameters. --- ...psDsc.Common.Resources.Functions.Tests.ps1 | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 index 9cb169b46..272799e07 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 @@ -27,6 +27,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidResourcePublicFunctionNames = Get-TestCase -ScopeName 'ResourcePublicFunctionName' -TestCaseName 'Valid' $testCasesValidDscResourcePublicFunctionNames = Get-TestCase -ScopeName 'DscResourcePublicFunctionName' -TestCaseName 'Valid' + $testCasesValidApiResourcePublicFunctionRequiredParameterNames = Get-TestCase -ScopeName 'ApiResourcePublicFunctionRequiredParameterName' -TestCaseName 'Valid' + + $testCasesValidDscResourcePublicFunctionRequiredParameterNames = Join-TestCaseArray -Expand -TestCaseArray @( + $testCasesValidDscResourcePublicFunctionNames, + $testCasesValidApiResourcePublicFunctionRequiredParameterNames + ) + + $testCasesValidParameterAliasNames = Get-TestCase -ScopeName 'ParameterAliasName' -TestCaseName 'Valid' Context "When evaluating functions required for DSC resources" { @@ -35,28 +43,42 @@ InModuleScope 'AzureDevOpsDsc.Common' { param ([string]$DscResourcePublicFunctionName) $DscResourcePublicFunctionName | Should -BeIn $exportedFunctionNames - } + } + + It "Should return a '' function/command (specific to the 'ResourceName') from 'Get-Command' - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) + + Get-Command -Module $moduleName -Name $DscResourcePublicFunctionName | Should -Not -BeNullOrEmpty + } + + It "Should have a '' script ('.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) - It "Should return a '' function/command (specific to the 'ResourceName') from 'Get-Command' - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { - param ([string]$DscResourcePublicFunctionName) + $functionScriptPath = Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".ps1") + Test-Path $functionScriptPath | Should -BeTrue + } - Get-Command -Module $moduleName -Name $DscResourcePublicFunctionName | Should -Not -BeNullOrEmpty - } + It "Should have a '' test fixture/script ('.Tests.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { + param ([string]$DscResourcePublicFunctionName) - It "Should have a '' script ('.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { - param ([string]$DscResourcePublicFunctionName) + $functionTestsScriptPath = Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".Tests.ps1") + Test-Path $functionTestsScriptPath | Should -BeTrue + } - $functionScriptPath = Join-Path $resourcesFunctionsPublicDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".ps1") - Test-Path $functionScriptPath | Should -BeTrue - } + Context "When evaluating function parameters required for DSC resource functions" { - It "Should have a '' test fixture/script ('.Tests.ps1') file (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { - param ([string]$DscResourcePublicFunctionName) + It "Should have a '' function with required, '' parameter - '', ''" -TestCases $testCasesValidDscResourcePublicFunctionRequiredParameterNames { + param ([string]$DscResourcePublicFunctionName, + [string]$ApiResourcePublicFunctionRequiredParameterName) - $functionTestsScriptPath = Join-Path $resourcesFunctionsPublicTestsDirectoryPath -ChildPath $($DscResourcePublicFunctionName + ".Tests.ps1") - Test-Path $functionTestsScriptPath | Should -BeTrue - } + $ApiResourcePublicFunctionRequiredParameterName | + Should -BeIn $((Get-CommandParameter -CommandName $DscResourcePublicFunctionName -ModuleName $moduleName).Name) + } + Context "When evaluating function parameter, aliases required for DSC resource functions" { + # TODO + } + } } Context "When evaluating functions required for non-DSC resources" { @@ -100,28 +122,6 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context "When evaluating '$moduleName' module, 'Get-AzDevOps...' (GET) functions" { - Context "When evaluating function parameters" { - - It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name - } - - It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name - } - - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName").Name - } - - } - Context "When evaluating function parameter aliases" { It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { From a90a94ede1a805c8990a0f8d3de7b6d1ad23743a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 11:52:56 +0000 Subject: [PATCH 254/611] Added 'Get-CommandParameterSet' and 'Get-CommandParameterSetParameter' helper functions --- .../Modules/TestHelpers/CommonTestHelper.psm1 | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 index e8ebdd87e..7f0d9a12f 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -161,3 +161,74 @@ function Get-CommandParameterAlias } + + +<# + .SYNOPSIS + Returns the parameter sets relating to a command. + + .PARAMETER CommandName + The name of the command to retrieve the parameter sets. + + .PARAMETER ModuleName + The name of the module the command belongs to. + +#> +function Get-CommandParameterSet +{ + [CmdletBinding()] + param + ( + [Parameter( Mandatory = $true)] + [Alias('TestAlias')] + [System.String] + $CommandName, + + [Parameter()] + [System.String] + $ModuleName = '*' + + ) + + $(Get-Command -Module $ModuleName -Name $CommandName).ParameterSets + +} + +<# + .SYNOPSIS + Returns the parameter sets relating to a parameter set of a command. + + .PARAMETER CommandName + The name of the command to retrieve the parameter sets. + + .PARAMETER ParameterSetName + The name of the parameter set of the command to retrieve the parameters for. + + .PARAMETER ModuleName + The name of the module the command belongs to. + +#> +function Get-CommandParameterSetParameter +{ + [CmdletBinding()] + param + ( + [Parameter( Mandatory = $true)] + [Alias('TestAlias')] + [System.String] + $CommandName, + + [Parameter()] + [System.String] + $ParameterSetName = '*', + + [Parameter()] + [System.String] + $ModuleName = '*' + + ) + + $($(Get-CommandParameterSet -CommandName $CommandName -ModuleName $ModuleName) | + Where-Object { $_.Name -like $ParameterSetName}).Parameters + +} From 3bf065920811709e85e265e532469f3b7e7e56a6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 12:21:50 +0000 Subject: [PATCH 255/611] Added 'ApiResourcePublicFunctionMandatoryParameterName' and 'DscResourcePublicFunctionMandatoryParameterName' test cases --- .../Unit/Modules/TestHelpers/CommonTestCases.psm1 | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index e88b242cb..6ccd522ed 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -437,7 +437,7 @@ function Get-TestCaseValue # ApiResourcePublicFunctionRequiredParameterName - # Parameter names that must be present on a public, function for an Azure DevOps, API resource + # Parameter names that must be present on a public, function for an Azure DevOps, API resource - Note: different to 'ApiResourcePublicFunctionMandatoryParameterName' $testCaseValues.ApiResourcePublicFunctionRequiredParameterName = @{ Valid = @( @@ -446,13 +446,22 @@ function Get-TestCaseValue ) } - # DscResourcePublicFunctionRequiredParameterName - # Parameter names that must be present on a public, function for a DSC resource (same as for an API resource) + # Parameter names that must be present on a public, function for a DSC resource (same as for an API resource) - Note: different to 'DscResourcePublicFunctionMandatoryParameterName' $testCaseValues.DscResourcePublicFunctionRequiredParameterName = $testCaseValues.ApiResourcePublicFunctionRequiredParameterName + # ApiResourcePublicFunctionMandatoryParameterName + # Parameter names that must be present AND set as 'Mandatory' on a public, function for an Azure DevOps, API resource + $testCaseValues.ApiResourcePublicFunctionMandatoryParameterName = $testCaseValues.ApiResourcePublicFunctionRequiredParameterName + + # DscResourcePublicFunctionMandatoryParameterName + # Parameter names that must be present AND set as 'Mandatory' on a public, function for a DSC resource (same as for an API resource) + $testCaseValues.DscResourcePublicFunctionMandatoryParameterName = $testCaseValues.ApiResourcePublicFunctionMandatoryParameterName + + + # ParameterAliasName # Parameter names that must be present on a public, function for an Azure DevOps, API resource From 8907097e3bfad458a9e5b9bf214d640fedd6a65f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 7 Nov 2020 12:22:30 +0000 Subject: [PATCH 256/611] Removed a number of refactored tests on 'AzureDevOps.Common', resource-related functions. --- ...psDsc.Common.Resources.Functions.Tests.ps1 | 298 +++--------------- 1 file changed, 41 insertions(+), 257 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 index 272799e07..3fce83328 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 @@ -20,10 +20,12 @@ InModuleScope 'AzureDevOpsDsc.Common' { BeforeEach { [string[]]$exportedFunctionNames = Get-Command -Module $moduleName + $resourcesFunctionsPublicDirectoryPath = "$PSScriptRoot\..\..\..\..\source\Modules\$moduleName\Resources\Functions\Public" $resourcesFunctionsPublicTestsDirectoryPath = "$PSScriptRoot\Resources\Functions\Public" } + $testCasesValidResourcePublicFunctionNames = Get-TestCase -ScopeName 'ResourcePublicFunctionName' -TestCaseName 'Valid' $testCasesValidDscResourcePublicFunctionNames = Get-TestCase -ScopeName 'DscResourcePublicFunctionName' -TestCaseName 'Valid' @@ -34,10 +36,37 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidApiResourcePublicFunctionRequiredParameterNames ) + $testCasesValidApiResourcePublicFunctionMandatoryParameterNames = Get-TestCase -ScopeName 'ApiResourcePublicFunctionMandatoryParameterName' -TestCaseName 'Valid' + + $testCasesValidDscResourcePublicFunctionMandatoryParameterNames = Join-TestCaseArray -Expand -TestCaseArray @( + $testCasesValidDscResourcePublicFunctionNames, + $testCasesValidApiResourcePublicFunctionMandatoryParameterNames + ) + $testCasesValidParameterAliasNames = Get-TestCase -ScopeName 'ParameterAliasName' -TestCaseName 'Valid' - Context "When evaluating functions required for DSC resources" { + + Context "When evaluating all public, functions" { + + + # Note: $testCasesExportedFunctionNames contains all exported functions in the module + + #It "Does not return a null value when 'Get-Command' is called - ''" -TestCases $testCasesExportedFunctionNames { + # param ([string]$ExportedFunctionName) + # + # Get-Command "$ExportedFunctionName" | Should -Not -BeNullOrEmpty + #} + + It "When evaluating function parameter, aliases required for DSC resource functions" { + # TODO + } + + } + + + + Context "When evaluating all public, functions required for DSC resources" { It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { param ([string]$DscResourcePublicFunctionName) @@ -75,13 +104,20 @@ InModuleScope 'AzureDevOpsDsc.Common' { Should -BeIn $((Get-CommandParameter -CommandName $DscResourcePublicFunctionName -ModuleName $moduleName).Name) } - Context "When evaluating function parameter, aliases required for DSC resource functions" { - # TODO + Context "When evaluating function parameters required for DSC resource functions that must be 'Mandatory'" { + + It "Should have a '' function with required (and 'Mandatory'), '' parameter - '', ''" -TestCases $testCasesValidDscResourcePublicFunctionMandatoryParameterNames { + param ([string]$DscResourcePublicFunctionName, + [string]$ApiResourcePublicFunctionMandatoryParameterName) + + $ApiResourcePublicFunctionMandatoryParameterName | + Should -BeIn $(((Get-CommandParameterSetParameter -CommandName $DscResourcePublicFunctionName -ModuleName $moduleName) | Where-Object { $_.IsMandatory -eq 1 }).Name) + } } } } - Context "When evaluating functions required for non-DSC resources" { + Context "When evaluating all public, functions required for non-DSC resources" { It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourcePublicFunctionNames { param ([string]$ResourcePublicFunctionName) @@ -116,260 +152,8 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context "When evaluating private, module functions" { # TODO: - # Should be a 'Test-Id' function - - } - - Context "When evaluating '$moduleName' module, 'Get-AzDevOps...' (GET) functions" { - - Context "When evaluating function parameter aliases" { - - It "Should have a 'Get-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } - - It "Should have a 'Get-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } - - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - It "Should have a 'Get-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Get-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - } - } - - - - Context "When evaluating '$moduleName' module, 'New-AzDevOps...' (NEW) functions" { - - Context "When evaluating function parameters" { - - It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name - } - - It "Should have a 'New-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name - } - - It "Should have a 'New-AzDevOps' function with no 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - "$($ResourceName)Id" | Should -Not -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName").Name - } - - } - - Context "When evaluating function parameter aliases" { - - It "Should have a 'New-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } - - It "Should have a 'New-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } - - It "Should have a 'New-AzDevOps' function with no parameter with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ResourceId' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases - } - - It "Should have a 'New-AzDevOps' function with no parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Id' | Should -Not -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "New-AzDevOps$ResourceName")).Aliases - } - - } - } - - - - - Context "When evaluating '$moduleName' module, 'Set-AzDevOps...' (SET) functions" { - - Context "When evaluating function parameters" { - - It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name - } - - It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name - } - - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) + # Should be a 'Test-Id' function present - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName").Name - } - - } - - Context "When evaluating function parameter aliases" { - - It "Should have a 'Set-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } - - It "Should have a 'Set-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } - - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - It "Should have a 'Set-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Set-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - } - } - - - - - Context "When evaluating '$moduleName' module, 'Remove-AzDevOps...' (REMOVE) functions" { - - Context "When evaluating function parameters" { - - It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name - } - - It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name - } - - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName").Name - } - - } - - Context "When evaluating function parameter aliases" { - - It "Should have a 'Remove-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } - - It "Should have a 'Remove-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } - - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - It "Should have a 'Remove-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) - - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Remove-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - } - } - - - Context "When evaluating '$moduleName' module, 'Test-AzDevOps...' (TEST) functions" { - - Context "When evaluating function parameters" { - - It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'ApiUri' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name - } - - It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Pat' | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name - } - - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - "$($ResourceName)Id" | Should -BeIn $(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName").Name - } - - } - - Context "When evaluating function parameter aliases" { - - It "Should have a 'Test-AzDevOps' function with an 'ApiUri' parameter, with a 'Uri' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Uri' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'ApiUri' }).Aliases - } - - It "Should have a 'Test-AzDevOps' function with an 'Pat' parameter, with a 'PersonalAccessToken' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'PersonalAccessToken' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq 'Pat' }).Aliases - } - - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'ResourceId' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'ResourceId' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - It "Should have a 'Test-AzDevOps' function with a/an 'Id' parameter, with a 'Id' alias" -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) - - 'Id' | Should -BeIn $($(Get-CommandParameter -ModuleName $moduleName -CommandName "Test-AzDevOps$ResourceName") | Where-Object { $_.Name -eq "$($ResourceName)Id" }).Aliases - } - - } } } From 44b284bc7d58a32c6d89b32998b7e2f1e2829b13 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 09:58:26 +0000 Subject: [PATCH 257/611] Added 'SourceControlType' test cases --- .../Modules/TestHelpers/CommonTestCases.psm1 | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 6ccd522ed..b629ab610 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -352,6 +352,35 @@ function Get-TestCaseValue + + # SourceControlType + $testCaseValues.SourceControlType = @{ + + Valid = @( + 'Git', + 'Tfvc' + ) + + Invalid = @( + '%', # Just '%' character + '*', # Just '*' character + ' Git', # Leading ' ' (whitespace) + ' Tfvc', # Leading ' ' (whitespace) + 'Git ', # Trailing ' ' (whitespace) + 'Tfvc ', # Trailing ' ' (whitespace) + ' Git ' # Leading and trailing ' ' (whitespace) + ' Tfvc ' # Leading and trailing ' ' (whitespace) + ) + $testCaseValues.String.Whitespace # Any that are just whitespace characters + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + + # NonDscResourceName # The 'ResourceName' values that are to be excluded from being used as part of a DSC resource (typically treated differently to 'DscResourceName' values) $testCaseValues.NonDscResourceName = @{ From 8dd6ec926e02ccdbc677c023b6ca4908ce7cbc8a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 10:02:33 +0000 Subject: [PATCH 258/611] Updated 'New-AzDevOpsProject' and 'Test-AzDevOpsProjectDescription' to allow a 'ProjectDescription' of only whitespace and assume a '' default value. --- .../Functions/Private/Test-AzDevOpsProjectDescription.ps1 | 2 +- .../Resources/Functions/Public/New-AzDevOpsProject.ps1 | 4 ++-- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 index 0511f80be..d223d358e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -41,7 +41,7 @@ function Test-AzDevOpsProjectDescription New-InvalidOperationException -Message $errorMessage } - if ([System.String]::IsNullOrWhiteSpace($ProjectDescription) -or + if ($ProjectDescription -eq $null -or ($ProjectDescription.Contains('%') -or $ProjectDescription.Contains('*') -or $ProjectDescription.StartsWith(' ') -or $ProjectDescription.EndsWith(' '))) { return $false diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index bb809e099..1bbe4878c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -57,11 +57,11 @@ function New-AzDevOpsProject [System.String] $ProjectName, - [Parameter(Mandatory = $true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] [Alias('Description')] [System.String] - $ProjectDescription, + $ProjectDescription = '', [Parameter()] [ValidateSet('Git','Tfvc')] diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index b629ab610..d9fb5bf0c 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -227,7 +227,8 @@ function Get-TestCaseValue 'ProjectDescription', 'Project Description', 'Project-Description', - 'Project_Description' + 'Project_Description', + '' ) Invalid = @( @@ -238,7 +239,7 @@ function Get-TestCaseValue ' ProjectDescription', # Leading ' ' (whitespace) 'ProjectDescription ', # Trailing ' ' (whitespace) ' ProjectDescription ' # Leading and trailing ' ' (whitespace) - ) + $testCaseValues.String.Whitespace # Any that are just whitespace characters + ) Empty = $testCaseValues.String.Empty Null = $testCaseValues.String.Null From 85ff268be57658c3b4fb8aa8ef80907325ac3175 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 10:02:59 +0000 Subject: [PATCH 259/611] Added first set of 'New-AzDevOpsProject' tests. --- .../Public/New-AzDevOpsProject.Tests.ps1 | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..eecb67169 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 @@ -0,0 +1,223 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\New-AzDevOpsProject' -Tag 'NewAzDevOpsProject' { + + Context 'When called with valid parameters' { + BeforeAll { + $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames + + Mock -ModuleName $script:subModuleName New-AzDevOpsApiResource -Verifiable { + } + + Mock -ModuleName $script:subModuleName Get-AzDevOpsProject -Verifiable { + return $mockProjects | ForEach-Object { + @{ + id = $_.ProjectId + name = $_.ProjectName + } + } + } + } + + + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats + + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectNames + + $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesValidApiUriPatInvalidProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidProjectNames + + + Context 'When called with a "ProjectName" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + $result = New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName + $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) + } + + It 'Should call "New-AzDevOpsApiResource" function exactly once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null + Should -Invoke New-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + } + + Context 'When a "Project" with supplied "ProjectName" parameter value already exists' { + + BeforeEach { + Mock -ModuleName $script:subModuleName New-AzDevOpsApiResource -Verifiable { + throw "Already exists" + } + } + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Throw + } + } + + Context 'When a "Project" with supplied "ProjectName" parameter value does not exist' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should call "Get-AzDevOpsProject" function exactly once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null + Should -Invoke Get-AzDevOpsProject -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It + } + } + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats + + $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesValidApiUriPatInvalidProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidProjectNames + + $testCasesInvalidProjectDescriptions = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesValidApiUriPatInvalidProjectDescriptionCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidProjectDescriptions + + $testCasesInvalidSourceControlTypes = Get-TestCase -ScopeName 'SourceControlType' -TestCaseName 'Invalid' + $testCasesValidApiUriPatInvalidSourceControlTypeCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidSourceControlTypes + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { New-AzDevOpsProject -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { New-AzDevOpsProject -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { New-AzDevOpsProject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { New-AzDevOpsProject -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + + + Context 'When called with invalid "ProjectName" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidApiUriPatInvalidProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Throw + } + + } + + + Context 'When called with invalid "ProjectDescription" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidApiUriPatInvalidProjectDescriptionCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName, [string]$ProjectDescription) + + $ValidProjectName = 'SomeProjectName' + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ValidProjectName -ProjectDescription $ProjectDescription } | Should -Throw + } + + } + + + Context 'When called with invalid "SourceControlType" parameter' { + + It 'Should throw - ""' -TestCases $testCasesValidApiUriPatInvalidProjectDescriptionCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName, [string]$ProjectDescription, [string]$SourceControlType) + + $ValidProjectName = 'SomeProjectName' + $ValidProjectDescription = 'SomeProjectDescription' + { New-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ValidProjectName -ProjectDescription $ValidProjectDescription -SourceControlType $SourceControlType} | Should -Throw + } + + } + } + + } + +} From f123b394b0068bff402a8942c7fb62904b17652c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:17:40 +0000 Subject: [PATCH 260/611] Updated 'Test-AzDevOpsProjectDescription' to allow whitespace 'ProjectDescription' parameter. --- .../Functions/Private/Test-AzDevOpsProjectDescription.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 index d223d358e..46003d8b3 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -27,6 +27,7 @@ function Test-AzDevOpsProjectDescription param ( [Parameter(Mandatory = $true)] + [AllowEmptyString()] [System.String] $ProjectDescription, From 29ab50dbd366b8dcf8eb1994f41ef405ff85a11d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:17:52 +0000 Subject: [PATCH 261/611] Updated 'New-AzDevOpsProjectDescription' to allow whitespace 'ProjectDescription' parameter. --- .../Resources/Functions/Public/New-AzDevOpsProject.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 index 1bbe4878c..a40c71fbc 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.ps1 @@ -59,6 +59,7 @@ function New-AzDevOpsProject [Parameter()] [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] + [AllowEmptyString()] [Alias('Description')] [System.String] $ProjectDescription = '', From 343923d49eb27a785c984ea6d3980784a114747b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:18:03 +0000 Subject: [PATCH 262/611] Updated 'Set-AzDevOpsProjectDescription' to allow whitespace 'ProjectDescription' parameter. --- .../Resources/Functions/Public/Set-AzDevOpsProject.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 index 6a86569c2..c97272c80 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 @@ -65,6 +65,7 @@ function Set-AzDevOpsProject [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] + [AllowEmptyString()] [Alias('Description')] [System.String] $ProjectDescription, From 80dd8485c4f854d5dd976a72db5fc2e0e23ee148 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:20:23 +0000 Subject: [PATCH 263/611] Updated tests around 'Get-AzDevOpsApiResourceName' to amend how $testCasesValidResourceNames variable is obtained/used --- .../Private/Get-AzDevOpsApiObjectName.Tests.ps1 | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 index 52da03533..1a5a3ae2e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 @@ -9,11 +9,7 @@ InModuleScope $script:subModuleName { Context 'When called with valid parameters' { - - BeforeAll { - - $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' - } + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' It 'Should not throw' { param () @@ -28,11 +24,10 @@ InModuleScope $script:subModuleName { $result.GetType() | Should -Be @('ResourceName1','ResourceName2').GetType() } - It 'Should return all resources that are present in $testCasesValidResourceName variable'{ - param () + It "Should return all resources that are present in $testCasesValidResourceName variable - ''" -TestCases $testCasesValidResourceNames { + param ($ResourceName) - $result = Get-AzDevOpsApiResourceName - $result.Count | Should -Be $($testCasesValidResourceName.Count) + $ResourceName | Should -BeIn $(Get-AzDevOpsApiResourceName) } } From f13eb5e50224343fe7581bc67c8b50bc1430cbbd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:21:06 +0000 Subject: [PATCH 264/611] Updated 'Test-AzDevOpsProjectDescription' tests to remove treating whitespace as invalid. --- .../Private/Test-AzDevOpsProjectDescription.Tests.ps1 | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 index 1323dd9cf..33894e905 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -35,12 +35,6 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "ProjectDescription" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectDescriptions { - param ([string]$ProjectDescription) - - { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Throw - } - It 'Should not throw - ""' -TestCases $testCasesInvalidProjectDescriptions { param ([string]$ProjectDescription) From daa2e1b4d1eff576f5274da2cc9e126012245ea1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:21:58 +0000 Subject: [PATCH 265/611] Updated assignment of $testCaseValues.DscResourceName property within test cases so it wasn't using the same object instance as $testCaseValues.ResourceName --- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index d9fb5bf0c..c6012ff34 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -280,8 +280,7 @@ function Get-TestCaseValue Valid = @( 'Operation', - 'Project'#, - #'Team' + 'Project' ) Invalid = @( @@ -401,9 +400,12 @@ function Get-TestCaseValue # DscResourceName # Use 'ResourceName' values, but remove valid 'NonDscResourceName' from 'Valid' array, and add them to the 'Invalid' array - $testCaseValues.DscResourceName = $testCaseValues.ResourceName - $testCaseValues.DscResourceName.Valid = $testCaseValues.DscResourceName.Valid | Where-Object { $_ -notin $testCaseValues.NonDscResourceName.Valid } - $testCaseValues.DscResourceName.Invalid = $testCaseValues.NonDscResourceName.Valid + $testCaseValues.DscResourceName = @{ + + Valid = $testCaseValues.ResourceName.Valid | Where-Object { $_ -notin $testCaseValues.NonDscResourceName.Valid } | ForEach-Object { $_ } + + Invalid = $testCaseValues.NonDscResourceName.Valid | ForEach-Object { $_ } + } From 379e7b79c4fb9cb11c848a285e65c1e75522dbef Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:23:44 +0000 Subject: [PATCH 266/611] Renamed 'Object' to 'Resource' in some test-script, file names --- ...evOpsApiObject.Tests.ps1 => Get-AzDevOpsApiResource.Tests.ps1} | 0 ...ObjectName.Tests.ps1 => Get-AzDevOpsApiResourceName.Tests.ps1} | 0 ...ApiObjectId.Tests.ps1 => Test-AzDevOpsApiResourceId.Tests.ps1} | 0 ...bjectName.Tests.ps1 => Test-AzDevOpsApiResourceName.Tests.ps1} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Get-AzDevOpsApiObject.Tests.ps1 => Get-AzDevOpsApiResource.Tests.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Get-AzDevOpsApiObjectName.Tests.ps1 => Get-AzDevOpsApiResourceName.Tests.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Test-AzDevOpsApiObjectId.Tests.ps1 => Test-AzDevOpsApiResourceId.Tests.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Test-AzDevOpsApiObjectName.Tests.ps1 => Test-AzDevOpsApiResourceName.Tests.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiObjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectId.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiObjectName.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 From bf7b39b858bd86ec88014962b3cff0ae05901b6e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 12:37:49 +0000 Subject: [PATCH 267/611] Updated 'New-AzDevOpsProject' tests to correct, invalid 'ProjectDescription' parameter tests. --- .../Functions/Public/New-AzDevOpsProject.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 index eecb67169..865700a5a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 @@ -105,7 +105,7 @@ InModuleScope $script:subModuleName { $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' $testCasesValidApiUriPatInvalidProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidProjectNames - $testCasesInvalidProjectDescriptions = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesInvalidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Invalid' $testCasesValidApiUriPatInvalidProjectDescriptionCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesInvalidProjectDescriptions $testCasesInvalidSourceControlTypes = Get-TestCase -ScopeName 'SourceControlType' -TestCaseName 'Invalid' @@ -195,7 +195,7 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "ProjectDescription" parameter' { - It 'Should throw - ""' -TestCases $testCasesValidApiUriPatInvalidProjectDescriptionCombined { + It "Should throw - ''" -TestCases $testCasesValidApiUriPatInvalidProjectDescriptionCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName, [string]$ProjectDescription) $ValidProjectName = 'SomeProjectName' @@ -207,7 +207,7 @@ InModuleScope $script:subModuleName { Context 'When called with invalid "SourceControlType" parameter' { - It 'Should throw - ""' -TestCases $testCasesValidApiUriPatInvalidProjectDescriptionCombined { + It "Should throw - ''" -TestCases $testCasesValidApiUriPatInvalidSourceControlTypeCombined { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName, [string]$ProjectDescription, [string]$SourceControlType) $ValidProjectName = 'SomeProjectName' From 9e6d73657415eab528cab3d5bb3e0eca18a5e6ba Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 13:18:30 +0000 Subject: [PATCH 268/611] Added tests (and made corrections to) 'Test-AzDevOpsProject' --- .../Functions/Public/Test-AzDevOpsProject.ps1 | 19 +- .../Public/Test-AzDevOpsProject.Tests.ps1 | 212 ++++++++++++++++++ 2 files changed, 227 insertions(+), 4 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 index 008db67e8..ba5e6ace7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.ps1 @@ -61,15 +61,26 @@ function Test-AzDevOpsProject [Parameter(Mandatory = $true, ParameterSetName='ProjectName')] [Parameter(Mandatory = $true, ParameterSetName='ProjectIdAndProjectName')] - [ValidateScript({ Test-AzDevOpsProjectName -ProjectId $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] [Alias('Name')] [System.String] $ProjectName ) - [object[]]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat ` - -ProjectId $ProjectId ` - -ProjectName $ProjectName + $azDevOpsProjectParameters = @{ + ApiUri = $ApiUri; + Pat = $Pat + } + + If(![string]::IsNullOrWhiteSpace($ProjectId)){ + $azDevOpsProjectParameters.ProjectId = $ProjectId + } + + If(![string]::IsNullOrWhiteSpace($ProjectName)){ + $azDevOpsProjectParameters.ProjectName = $ProjectName + } + + [object[]]$project = Get-AzDevOpsProject @azDevOpsProjectParameters return $($null -ne $project.id) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..3363691db --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 @@ -0,0 +1,212 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProject' -Tag 'GetAzDevOpsProject' { + + Context 'When called with valid parameters' { + BeforeAll { + $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames + + Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { + + return $mockProjects | ForEach-Object { + @{ + id = $_.ProjectId + name = $_.ProjectName + } + } + } + } + + + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats + + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectNames + + $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectIds + + + Context 'When called with no "ProjectId" parameter and no "ProjectName" parameter' { + + It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Throw + } + + } + + + Context 'When called with no "ProjectId" parameter but with a "ProjectName" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName + $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() + } + + Context 'When a "Project" with supplied "ProjectName" parameter value exists' { + + It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It + } + } + + Context 'When a "Project" with supplied "ProjectName" parameter value does not exist' { + + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName 'NonPresentProjectName' + $result | Should -BeFalse + } + } + } + + + Context 'When called with no "ProjectName" parameter but with a "ProjectId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw + } + + It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId + $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() + } + + It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null + Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It + } + + Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { + + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ProjectId" + $result | Should -BeFalse + } + } + + Context 'When a "Project" with supplied "ProjectId" parameter value does exist' { + + It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $($mockProjectIds[0].ProjectId) + $result | Should -BeTrue + } + } + + } + + + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsProject -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { Test-AzDevOpsProject -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { Test-AzDevOpsProject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsProject -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + } + + } + +} From 97a6c57765b89f0837f843aae7d973fe53c5cd9f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 14:51:30 +0000 Subject: [PATCH 269/611] Added 'Test-AzDevOpsOperation' tests --- .../Public/Test-AzDevOpsOperation.ps1 | 6 +- .../Public/Test-AzDevOpsOperation.Tests.ps1 | 376 ++++++++++++++++++ 2 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 5841f6bf5..5d1071c3a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -93,12 +93,12 @@ function Test-AzDevOpsOperation [object[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` - -OperationId $OperationId + -OperationId $OperationId # Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus - if (($IsSuccessful -and $operation.status -eq 'succeeded') -or - ($IsComplete -and $operation.status -in 'succeeded', 'cancelled', 'failed')) + if (($IsSuccessful -and ($operation.status -eq 'succeeded')) -or + ($IsComplete -and ($operation.status -in @('succeeded', 'cancelled', 'failed')))) { return $true } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..f99adfff0 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1,376 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 + + +InModuleScope $script:subModuleName { + + Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOperation' -Tag 'GetAzDevOpsOperation' { + + Context 'When called with valid parameters' { + BeforeEach { + $mockOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $mockSucceededOperationId = $mockOperationIds[0].OperationId + $mockCancelledOperationId = $mockOperationIds[1].OperationId + $mockFailedOperationId = $mockOperationIds[2].OperationId + $mockOperations = $mockOperationIds + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return $mockOperations | ForEach-Object { + @{ + id = $_.OperationId + status = & { + switch ($_.OperationId) + { + $mockSucceededOperationId { + return 'succeeded' + break + } + $mockCancelledOperationId { + break + return 'cancelled' + } + $mockFailedOperationId { + break + return 'failed' + } + default { + return 'inProgress' + break + } + } + } + } + } + } + } + + + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats + + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesValidApiUriPatOperationIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidOperationIds + + + Context 'When called with an "OperationId" parameter but with no "IsComplete" switch and no "IsSuccessful" switch' { + + It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Throw + } + + } + + + Context 'When called with an "OperationId" parameter but with both an "IsComplete" switch and an "IsSuccessful" switch' { + + It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -IsSuccessful } | Should -Throw + } + + } + + + Context 'When called with an "OperationId" parameter and just the "IsSuccessful" switch' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Not -Throw + } + + It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() + } + + It 'Should call "Get-AzDevOpsOperation" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful | Out-Null + Should -Invoke Get-AzDevOpsOperation -ModuleName $script:subModuleName -Times 1 -Scope It + } + + Context 'When an "Operation" with supplied "OperationId" parameter value does not exist' { + + BeforeEach { + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @(@{}) + } + } + + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121117e7aa' -IsSuccessful # Non-present "OperationId" + $result | Should -BeFalse + } + } + + Context 'When a "Operation" with supplied "OperationId" parameter value does exist' { + + Context 'When the "Operation" present has a "status" of "succeeded"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockSucceededOperationId + status = 'succeeded' + } + } + } + + It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockSucceededOperationId -IsSuccessful + $result | Should -BeTrue + } + } + + Context 'When the "Operation" present has a "status" of "cancelled"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockCancelledOperationId + status = 'cancelled' + } + } + } + + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockCancelledOperationId -IsSuccessful + $result | Should -BeFalse + } + } + + Context 'When the "Operation" present has a "status" of "failed"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockFailedOperationId + status = 'failed' + } + } + } + + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockFailedOperationId -IsSuccessful + $result | Should -BeFalse + } + } + } + + } + + + + + Context 'When called with an "OperationId" parameter and just the "IsComplete" switch' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Not -Throw + } + + It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() + } + + It 'Should call "Get-AzDevOpsOperation" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Out-Null + Should -Invoke Get-AzDevOpsOperation -ModuleName $script:subModuleName -Times 1 -Scope It + } + + Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @(@{}) + } + } + It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121267e7aa' -IsComplete # Non-present "OperationId" + $result | Should -BeFalse + } + } + + Context 'When a "Operation" with supplied "OperationId" parameter value does exist' { + + Context 'When the "Operation" present has a "status" of "succeeded"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockSucceededOperationId + status = 'succeeded' + } + } + } + + It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockSucceededOperationId -IsComplete + $result | Should -BeTrue + } + } + + Context 'When the "Operation" present has a "status" of "cancelled"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockCancelledOperationId + status = 'cancelled' + } + } + } + + It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockCancelledOperationId -IsComplete + $result | Should -BeTrue + } + } + + Context 'When the "Operation" present has a "status" of "failed"' { + + BeforeEach { + + Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { + + return @{ + id = $mockFailedOperationId + status = 'failed' + } + } + } + + It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { + param ([string]$ApiUri, [string]$Pat) + + $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockFailedOperationId -IsComplete + $result | Should -BeTrue + } + } + } + + } + + } + + Context 'When called with invalid parameters' { + BeforeAll { + } + + Context 'When called with invalid "Pat" parameter' { + + $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + + Context 'When called without "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + { Test-AzDevOpsOperation -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with valid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $validApiUri = 'https://someuri.api/_apis/' + { Test-AzDevOpsOperation -ApiUri $validApiUri -Pat $Pat } | Should -Throw + + } + } + + Context 'When called with invalid "ApiUri" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidPats { + param ([string]$Pat) + + $invalidApiUri = 'someInvalidApiUrl' + { Test-AzDevOpsOperation -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw + + } + } + } + + Context 'When called with invalid "ApiUri" parameter' { + + $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + + Context 'When called without "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + { Test-AzDevOpsOperation -ApiUri $ApiUri } | Should -Throw + + } + } + + Context 'When called with valid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $validPat = '1234567890123456789012345678901234567890123456789012' + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $validPat } | Should -Throw + + } + } + + Context 'When called with invalid "Pat" parameter' { + It "Should throw - ''" -TestCases $testCasesInvalidApiUris { + param ([string]$ApiUri) + + $invalidPat = '123456789012' + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw + + } + } + } + } + + } + +} From 91f50189513a6bb991fcf8832d84cad1aac886fd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 15:13:29 +0000 Subject: [PATCH 270/611] Renamed/Added test scripts for 'Set-AzDevOpsProject' and 'Remove-AzDevOpsProject' --- ...psProject.Tests copy.ps1 => Remove-AzDevOpsProject.Tests.ps1} | 0 ...AzDevOpsOperation.Tests.ps1 => Set-AzDevOpsProject.Tests.ps1} | 0 .../Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 | 1 + .../Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 | 1 + 4 files changed, 2 insertions(+) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{_TODO_New-AzDevOpsProject.Tests copy.ps1 => Remove-AzDevOpsProject.Tests.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{_TODO_Test-AzDevOpsOperation.Tests.ps1 => Set-AzDevOpsProject.Tests.ps1} (100%) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_New-AzDevOpsProject.Tests copy.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Test-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 @@ -0,0 +1 @@ + diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 @@ -0,0 +1 @@ + From 2b5e2d247c9df0902a9df72378e4004b7810e72e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 8 Nov 2020 15:49:51 +0000 Subject: [PATCH 271/611] Minor update to 'Set-AzDevOpsProject' $ProjectDescription parameter, default/mandatory value --- .../Resources/Functions/Public/Set-AzDevOpsProject.ps1 | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 index c97272c80..5dbc00229 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.ps1 @@ -63,15 +63,14 @@ function Set-AzDevOpsProject [System.String] $ProjectName, - [Parameter(Mandatory = $true)] + [Parameter()] [ValidateScript({ Test-AzDevOpsProjectDescription -ProjectDescription $_ -IsValid })] [AllowEmptyString()] [Alias('Description')] [System.String] - $ProjectDescription, - + $ProjectDescription = '', - # $SourceControlType = 'Git', # Not supported + # $SourceControlType - Not supported for updates/set [Parameter()] [System.Management.Automation.SwitchParameter] From 9b92752cb1b3bda75adaed8cf31159ad47726b1a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 09:18:48 +0000 Subject: [PATCH 272/611] Added 'AzDevOpsApiRestMethodException' error string to 'AzureDevOpsDsc.Common.strings.psd1' --- .../en-US/AzureDevOpsDsc.Common.strings.psd1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 index 31287c77e..d23a69423 100644 --- a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.Common.strings.psd1 @@ -13,4 +13,6 @@ ConvertFrom-StringData @' AzDevOpsOperationWaitTimeoutExceeded = The '{0}' function (using OperationId of '{1}') exceeded specified, maximum timeout ({2} milliseconds). (AZDEVOPSCOMMON0702) + AzDevOpsApiRestMethodException = The '{0}' function returned an error when trying to send a HTTP request to the Azure DevOps API (after {1} unsuccessful, retry attempts): "{2}". (AZDEVOPSCOMMON0802) + '@ From b604bcbb50ea1057cf032dcaee21d121bce9d527 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 09:19:05 +0000 Subject: [PATCH 273/611] Added 'Invoke-AzDevOpsApiRestMethod' method. --- .../Private/Invoke-AzDevOpsApiRestMethod.ps1 | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 new file mode 100644 index 000000000..6475b50c6 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -0,0 +1,108 @@ +<# + .SYNOPSIS + This is a light, generic, wrapper proceedure around 'Invoke-RestMethod' to handle + multiple retries and error/exception handling. + + This function makes no assumptions around the versions of the API used, the resource + being operated/actioned upon, the operation/method being performed, nor the content + of the HTTP headers and body. + + .PARAMETER ApiUri + The URI of the Azure DevOps API to be connected to. For example: + + https://dev.azure.com/someOrganizationName/_apis/ + + .PARAMETER HttpMethod + The HTTP method being used in the HTTP/REST request sent to the Azure DevOps API. + + .PARAMETER HttpHeaders + The headers for the HTTP/REST request sent to the Azure DevOps API. + + .PARAMETER HttpBody + The body for the HTTP/REST request sent to the Azure DevOps API. If performing a 'Post', + 'Put' or 'Patch' method/request, this will typically contain the JSON document of the resource. + + .PARAMETER RetryAttempts + The number of times the method/request will attempt to be resent/retried if unsuccessful on the + initial attempt. + + If any attempt is successful, the remaining attempts are ignored. + + .PARAMETER RetryIntervalMs + The interval (in Milliseconds) between retry attempts. + + .EXAMPLE + Invoke-AzDevOpsApiRestMethod -ApiUri 'YourApiUriHere' -HttpMethod 'Get' -HttpHeaders $YouHttpHeadersHashtableHere + + Submits a 'Get' request to the Azure DevOps API (relying on the 'ApiUri' value to determine what is being retrieved). + + .EXAMPLE + Invoke-AzDevOpsApiRestMethod -ApiUri 'YourApiUriHere' -HttpMethod 'Patch' -HttpHeaders $YourHttpHeadersHashtableHere ` + -HttpBody $YourHttpBodyHere -RetryAttempts 3 + + Submits a 'Patch' request to the Azure DevOps API with the supplied 'HttpBody' and will attempt to retry 3 times (4 in + total, including the intitial attempt) if unsuccessful. +#> +function Invoke-AzDevOpsApiRestMethod +{ + [CmdletBinding()] + [OutputType([System.Management.Automation.PSObject])] + param + ( + [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] + [Alias('Uri')] + [System.String] + $ApiUri, + + [Parameter(Mandatory=$true)] + [ValidateSet('Get','Post','Patch','Put','Delete')] + [System.String] + [Alias('Method')] + $HttpMethod, + + [Parameter(Mandatory=$true)] + [Hashtable] + [Alias('Headers')] + $HttpHeaders, + + [Parameter()] + [Hashtable] + [Alias('Body')] + $HttpBody = '', + + [Parameter()] + [Int32] + $RetryAttempts = 5, + + [Parameter()] + [Int32] + $RetryIntervalMs = 250 + ) + + # Intially set this value to -1, as the first attempt does not want to be classes as a "RetryAttempt" + $CurrentNoOfRetryAttempts = -1 + + while ($CurrentNoOfRetryAttempts -le $RetryAttempts) + { + try + { + return Invoke-RestMethod -Uri $ApiUri -Method $HttpMethod -Headers $HttpHeaders -Body $HttpBody + } + catch + { + # Increment the number of retries attempted and obtain any exception message + $CurrentNoOfRetryAttempts++ + $restMethodExceptionMessage = $_.Exception.Message + + # Wait before the next attempt/retry + Start-Sleep -Milliseconds $RetryIntervalMs + } + } + + + # If all retry attempts have failed, throw an exception + $errorMessage = $script:localizedData.AzDevOpsApiRestMethodException -f $MyInvocation.MyCommand, $RetryAttempts, $restMethodExceptionMessage + New-InvalidOperationException -Message $errorMessage + +} From ce721b4496f5f6c7a5d969d9a65bf58c1c4c16af Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 09:38:49 +0000 Subject: [PATCH 274/611] Updated/Fixed import of 'CommonTestHelper' module/functions within 'DSC_AzDevOpsProject' integration test script. --- .../DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 3cda33917..004723e5d 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -1,4 +1,4 @@ -#Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\..\Unit\Modules\TestHelpers\CommonTestHelper.psm1') if (-not (Test-BuildCategory -Type 'Integration')) { From 48614c04def5e0d037e5b7179b58f56bb8cff7ed Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 09:58:03 +0000 Subject: [PATCH 275/611] Added 'EnsureProjectIdentical' to 'DSC_AzDevOpsProject' integration tests. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 66 +++++++++++++++++++ .../DSC_AzDevOpsProject.config.ps1 | 33 +++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 004723e5d..ff5fec5c4 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -39,6 +39,12 @@ try } + # TODO: + # Add test for 'EnsureGitProjectAbsent' + # Add test for 'EnsureTfvcProjectAbsent' + # Add test for 'EnsureSourceControlTypeChangeInvalid' + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectPresent_Config'") { BeforeAll { @@ -221,6 +227,66 @@ try + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectIdentical_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureProjectIdentical_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureProjectIdentical" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Present' + $resourceCurrentState.ProjectName | Should -Be 'TestProjectName' + $resourceCurrentState.ProjectDescription | Should -Be 'TestProjectDescription' + $resourceCurrentState.SourceControlType | Should -Be 'Git' # Must be the same (change not supported with this) + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectUpdated_Config'") { BeforeAll { diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index b6008c7e9..7ff0de9b0 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -98,7 +98,7 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config <# .SYNOPSIS - Attempts to ensure an Azure DevOps 'Project' is updated. + Attempts to ensure an Azure DevOps 'Project' is present/added. .NOTES @@ -126,6 +126,37 @@ Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config } +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' is present (and remains + identical to previous state). + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureProjectIdentical_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureProjectIdentical + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = $Node.ProjectName + ProjectDescription = $Node.ProjectDescription + + SourceControlType = $Node.SourceControlType + + Ensure = $Node.Ensure + } + } +} + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' is updated. From 944d0c935dd7c694d3027004adb84f712fdc0764 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 10:43:05 +0000 Subject: [PATCH 276/611] Added 'First' parameter into 'Get-TestCaseValue' and 'Get-TestCase', test helper functions --- .../Modules/TestHelpers/CommonTestCases.psm1 | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index c6012ff34..117745137 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -23,7 +23,11 @@ function Get-TestCaseValue [Parameter(Mandatory = $true)] [ValidateSet('Valid','Invalid','Empty','Null','Whitespace','NullOrWhitespace')] [System.String] - $TestCaseName + $TestCaseName, + + [Parameter()] + [Int32] + $First = -1 ) @@ -521,6 +525,13 @@ function Get-TestCaseValue $testCaseValues.ProjectId = $testCaseValues.ResourceId + if ($null -ne $First -and $First -gt -1) + { + return $testCaseValues[$ScopeName][$TestCaseName] | + Select-Object -First $First + } + + return $testCaseValues[$ScopeName][$TestCaseName] } @@ -550,10 +561,14 @@ function Get-TestCase [Parameter(Mandatory = $true)] [ValidateSet('Valid','Invalid','Empty','Null','Whitespace','NullOrWhitespace')] [System.String] - $TestCaseName + $TestCaseName, + + [Parameter()] + [Int32] + $First = -1 ) - $testCaseValues = Get-TestCaseValue -ScopeName $ScopeName -TestCaseName $TestCaseName + $testCaseValues = Get-TestCaseValue -ScopeName $ScopeName -TestCaseName $TestCaseName -First $First [hashtable[]]$testCases = @() $testCaseValues | ForEach-Object { From c48be693515775ae9740764777d6e8b75c48954c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 10:43:46 +0000 Subject: [PATCH 277/611] Added 'ContentType' into 'Invoke-AzDevOpsApiRestMethod' function --- .../Private/Invoke-AzDevOpsApiRestMethod.ps1 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 index 6475b50c6..777cb1efd 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -71,6 +71,12 @@ function Invoke-AzDevOpsApiRestMethod [Alias('Body')] $HttpBody = '', + [Parameter()] + [System.String] + [Alias('ContentType')] + [ValidateSet('application/json')] + $HttpContentType = 'application/json', + [Parameter()] [Int32] $RetryAttempts = 5, @@ -87,7 +93,15 @@ function Invoke-AzDevOpsApiRestMethod { try { - return Invoke-RestMethod -Uri $ApiUri -Method $HttpMethod -Headers $HttpHeaders -Body $HttpBody + $invokeRestMethodParameters = @{ + Uri = $ApiUri + Method = $HttpMethod + Headers = $HttpHeaders + Body = $HttpBody + ContentType = $HttpContentType + } + + return Invoke-RestMethod @invokeRestMethodParameters } catch { From 992d525e3008ed9ec0d9bef6e1d4c6c64558d290 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 15:01:57 +0000 Subject: [PATCH 278/611] Updated 'Invoke-AzDevOpsApiRestMethod' function 'HttpBody' parameter type to 'System.String' --- .../Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 index 777cb1efd..aaaac472b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -67,7 +67,7 @@ function Invoke-AzDevOpsApiRestMethod $HttpHeaders, [Parameter()] - [Hashtable] + [System.String] [Alias('Body')] $HttpBody = '', From aa9b8d3e39c93f11c1b2f3168887381312c9c70c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 15:02:35 +0000 Subject: [PATCH 279/611] Added 'AzureDevOpsDsc.Common.Tests.Initialization.ps1' script. --- ...eDevOpsDsc.Common.Tests.Initialization.ps1 | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 new file mode 100644 index 000000000..be848b770 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 @@ -0,0 +1,35 @@ +#region HEADER +$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path +$ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { + ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and + $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } + ).BaseName + +#Write-Warning "ProjectPath : $ProjectPath" +#Write-Warning "ProjectName : $ProjectName" + + +$script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 +#Write-Warning "ParentModule : $script:ParentModule" +$script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' +#Write-Warning "SubModulesFolder : $script:SubModulesFolder" + +Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue + + + +$script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' +#Write-Warning "SubModuleName : $script:SubModuleName" +Remove-Module $script:SubModuleName -force -ErrorAction SilentlyContinue +$script:SubmoduleFile = Join-Path $script:SubModulesFolder "$($script:SubModuleName)/$($script:SubModuleName).psm1" +#Write-Warning "SubmoduleFile : $script:SubmoduleFile" + + +#endregion HEADER + +Import-Module $script:SubmoduleFile -Force -ErrorAction Stop + + +# Import helper modules containing helper functions and test values/cases +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestHelper.psm1') -Force +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestCases.psm1') -Force From 0beae408d815376805e88514b34ab0fee31b9214 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 15:03:01 +0000 Subject: [PATCH 280/611] Added 'Get-ParameterSetTestCase' to 'CommonTestCases.psm1' --- .../Modules/TestHelpers/CommonTestCases.psm1 | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 117745137..663d940ae 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -582,6 +582,243 @@ function Get-TestCase } + +<# + .SYNOPSIS + Returns arrays of test cases (hashtables) to be used within tests. + + .PARAMETER ScopeName + Name of the scope for which the test cases are to be returned. + + .PARAMETER TestCaseName + The name of the test cases within the scope determined by the 'ScopeName' + parameter. +#> +function Get-ParameterSetTestCase +{ + [OutputType([hashtable[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + [Alias('FunctionName','MethodName')] + $CommandName, + + [Parameter()] + [System.String] + $ParameterSetName = "__AllParameterSets", + + [Parameter(Mandatory = $true)] + [ValidateSet('Valid','Invalid')] + [System.String] + $TestCaseName, + + [Parameter()] + [Int32] + $First = -1 + ) + + $ParameterSetTestCases = @{} + + + # Invoke-AzDevOpsApiRestMethod + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validHttpMethod = 'Get' #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 + $validHttpHeaders = @{} #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 + $validHttpBody = @{} | ConvertTo-Json -Depth 10 #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 + $validHttpContentType = 'application/json' + $validRetryAttempts = 3 + $validRetryIntervalMs = 10 + + $ParameterSetTestCases."Invoke-AzDevOpsApiRestMethod" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + #HttpBody = $validHttpBody + #HttpContentType = $validHttpContentType + #RetryAttempts = $validRetryAttempts + #RetryIntervalMs = $validRetryIntervalMs + } + ) + + Invalid = @( + @{ + ApiUri = $validApiUri + HttpMethod = $null # Mandatory (Set as $null to avoid Pester prompting for value) + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $null # Mandatory (Set as $null to avoid Pester prompting for value) + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + } + ) + } + } + + [int]$testCaseOffset = 0 + $testCases = $ParameterSetTestCases[$CommandName][$ParameterSetName][$TestCaseName] | ForEach-Object { + @{ + ParameterSetValuesOffset = $testCaseOffset + ParameterSetValuesKey = $_.Keys -join ',' + ParameterSetValues = $_ + } + $testCaseOffset++ + } + + return $testCases +} + + <# .SYNOPSIS Combines/joins 2, input hashtables into 1 output hashtable. From 20a5888910ee6ada51d16ea0b35691dea284b736 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 15:03:22 +0000 Subject: [PATCH 281/611] Updated 'Get-CommandParameterSet' to attempt to obtain private, module functions. --- .../Modules/TestHelpers/CommonTestHelper.psm1 | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 index 7f0d9a12f..e809c4c45 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestHelper.psm1 @@ -190,7 +190,24 @@ function Get-CommandParameterSet ) - $(Get-Command -Module $ModuleName -Name $CommandName).ParameterSets + + [hashtable]$command = $(Get-Command -Module $ModuleName -Name $CommandName -ErrorAction SilentlyContinue) + if ($null -eq $command) + { + $Module = Get-Module -Name $ModuleName -ListAvailable + If ($null -ne $Module) + { + $allCommands = $Module.Invoke({Get-Command -Module $ModuleName}) + $exportedCommands = Get-Command -Module $ModuleName + $command = $(Compare-Object -ReferenceObject $allCommands -DifferenceObject $exportedCommands | + Select-Object -ExpandProperty InputObject) + } + } + + if ($null -ne $command -and $null -ne $command.ParameterSets) + { + return $command.ParameterSets + } } From c5b97d800a74efce5ea4d9c4f4c3a526ef624d8d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 15:04:15 +0000 Subject: [PATCH 282/611] Added initial iteration of 'Invoke-AzDevOpsApiRestMethod.Tests.ps1' --- .../Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 new file mode 100644 index 000000000..56246f1cf --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 @@ -0,0 +1,67 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) + + Describe "$script:subModuleName\$script:commandName" -Tag $script:tag { + + Context "When validating '$script:commandName' function/command parameter sets" { + + $testCasesValidParameterSetNames = @( + @{ + ParameterSetName = '__AllParameterSets' + } + ) + + $testCasesValidParameterSetNames | ForEach-Object { + + $parameterSetName = $_.ParameterSetName + + Context "When validating '$script:commandName' function/command, '$parameterSetName' parameter set" { + + Context "When validating the '$parameterSetName' parameter set" { + + Mock Invoke-RestMethod {} + Mock Start-Sleep {} + Mock New-InvalidOperationException {} + + $testCasesValidParameterSetValues = Get-ParameterSetTestCase -CommandName $script:commandName -ParameterSetName $parameterSetName -TestCaseName 'Valid' + $testCasesInvalidParameterSetValues = Get-ParameterSetTestCase -CommandName $script:commandName -ParameterSetName $parameterSetName -TestCaseName 'Invalid' + + Context "When invoking with 'Valid', parameter set values" { + + It "Should not throw - '' - " -TestCases $testCasesValidParameterSetValues { + param([Hashtable]$ParameterSetValues) + + { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw + } + + } + + Context "When invoking with 'Invalid', parameter set values" { + + It "Should throw - '' - " -TestCases $testCasesInvalidParameterSetValues { + param([Hashtable]$ParameterSetValues) + + { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Throw + } + + } + } + + + } + + } + + } + + } + +} From 3257d0cf2aacee00700b910f3adc87dbcda70c46 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 16:06:16 +0000 Subject: [PATCH 283/611] Updated 'Invoke-AzDevOpsApiRestMethod' tests to include tests per parameter value. --- .../Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 index 56246f1cf..27c57dd08 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 @@ -42,6 +42,33 @@ InModuleScope $script:subModuleName { { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw } + $testCasesValidParameterSetValues | ForEach-Object { + + $_.ParameterSetValues.Keys | ForEach-Object { + + $parameterName = $_ + $testCasesValidParameterValues = Get-TestCase -ScopeName $parameterName -TestCaseName 'Valid' + $testCasesValidParameterSetValuesByParameterName = Join-TestCaseArray -Expand -TestCaseArray @($testCasesValidParameterSetValues, $testCasesValidParameterValues) + + It "Should not throw - '' - ('$parameterName' = '<$parameterName>')" -TestCases $testCasesValidParameterSetValuesByParameterName { + param([Hashtable]$ParameterSetValues) + + { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw + } + + } + } + + } + + Context "When invoking with 'Valid', parameter set values, per" { + + It "Should not throw - '' - " -TestCases $testCasesValidParameterSetValues { + param([Hashtable]$ParameterSetValues) + + { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw + } + } Context "When invoking with 'Invalid', parameter set values" { From 76ba8dd48932778a8705a3ccc68adeae7681da86 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 17:55:08 +0000 Subject: [PATCH 284/611] Added 'Test-AzDevOpsApiHttpRequestHeader' function --- .../Test-AzDevOpsApiHttpRequestHeader.ps1 | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 new file mode 100644 index 000000000..4ac1ea41b --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 @@ -0,0 +1,53 @@ +<# + .SYNOPSIS + Peforms test on a provided 'HttpRequestHeader' to provide a boolean ($true or $false) + return value. Returns $true if the test is successful. + + NOTE: Use of the '-IsValid' switch is required. + + .PARAMETER HttpRequestHeader + The 'HttpRequestHeader' to be tested/validated. + + .PARAMETER IsValid + Use of this switch will validate the format of the 'HttpRequestHeader' + rather than the existence/presence of it. + + Failure to use this switch will throw an exception. + + .EXAMPLE + Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader 'YourHttpRequestHeaderHere' -IsValid + + Returns $true if the 'HttpRequestHeader' provided is of a valid format. + Returns $false if it is not. +#> +function Test-AzDevOpsApiHttpRequestHeader +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [Hashtable] + $HttpRequestHeader, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.SwitchParameter] + $IsValid + ) + + if (!$IsValid) + { + $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand + New-InvalidOperationException -Message $errorMessage + } + + + if ($null -eq $HttpRequestHeader -or + $null -eq $HttpRequestHeader.Authorization -or + $HttpRequestHeader.Authorization -inotlike 'Basic *') + { + return $false + } + + return $true +} From 3e38ee65281fd1d0610c455fed90cc88b3eb010b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 17:56:04 +0000 Subject: [PATCH 285/611] Added use of 'Test-AzDevOpsApiHttpRequestHeader' function in '' function, 'HttpHeaders' parameter validation. And validation on 'RetryAttempts' and 'RetryIntervalMs'. --- .../Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 index aaaac472b..328ec01a2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -62,6 +62,7 @@ function Invoke-AzDevOpsApiRestMethod $HttpMethod, [Parameter(Mandatory=$true)] + [ValidateScript( { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $_ -IsValid })] [Hashtable] [Alias('Headers')] $HttpHeaders, @@ -78,10 +79,12 @@ function Invoke-AzDevOpsApiRestMethod $HttpContentType = 'application/json', [Parameter()] + [ValidateRange(0,5)] [Int32] $RetryAttempts = 5, [Parameter()] + [ValidateRange(250,10000)] [Int32] $RetryIntervalMs = 250 ) From b9b99dd613d092a469a64a56a855c43230d85cdf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 17:59:04 +0000 Subject: [PATCH 286/611] Added 'HttpContentType', 'HttpBody', 'HttpHeaders'. 'RetryAttempts', 'RetryIntervalMs' and 'HttpMethod' test cases values. Also added 'Invalid' set of 'ParameterSet' test cases in 'Get-ParameterSetTestCase'. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 206 +++++++++++++++++- 1 file changed, 200 insertions(+), 6 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 663d940ae..157370d3c 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -123,6 +123,48 @@ function Get-TestCaseValue } + + # HttpContentType + $testCaseValues.HttpContentType = @{ + + Valid = @( + 'application/json' + ) + + Invalid = @( + + 'someInvalidHttpContentType' + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # HttpBody + $testCaseValues.HttpBody = @{ + + Valid = @( + $(@{ + id='someExampleId' + } | ConvertTo-Json -Compress), + $(@{ + name='someExampleName' + } | ConvertTo-Json -Compress) + ) + $testCaseValues.String.Empty + + Invalid = @( + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # ApiUriResourceName $testCaseValues.ApiUriResourceName = @{ @@ -197,6 +239,86 @@ function Get-TestCaseValue } + # HttpHeaders + $testCaseValues.HttpHeaders = @{ + + Valid = $testCaseValues.Pat.Valid | ForEach-Object { + @{ + Authorization = 'Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$_")) + } + } + + Invalid = @( + @{} # Nothing in it + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # RetryAttempts + $testCaseValues.RetryAttempts = @{ + + Valid = @( + 0,1,2,3,4,5 + ) + + Invalid = @( + 6,-1,-10 + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # RetryIntervalMs + $testCaseValues.RetryIntervalMs = @{ + + Valid = @( + 250, 251, 10000 + ) + + Invalid = @( + 249, 10001, -1, 0 + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # HttpMethod + $testCaseValues.HttpMethod = @{ + + Valid = @( + 'Get', + 'Post', + 'Put', + 'Patch', + 'Delete' + ) + + Invalid = @( + 'Unknown', 'Invalid' + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + + + # OrganizationName $testCaseValues.OrganizationName = @{ @@ -624,12 +746,12 @@ function Get-ParameterSetTestCase # Invoke-AzDevOpsApiRestMethod $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 - $validHttpMethod = 'Get' #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 - $validHttpHeaders = @{} #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 - $validHttpBody = @{} | ConvertTo-Json -Depth 10 #Get-TestCaseValue -ScopeName '' -TestCaseName 'Valid' -First 1 - $validHttpContentType = 'application/json' - $validRetryAttempts = 3 - $validRetryIntervalMs = 10 + $validHttpMethod = Get-TestCaseValue -ScopeName 'HttpMethod' -TestCaseName 'Valid' -First 1 + $validHttpHeaders = Get-TestCaseValue -ScopeName 'HttpHeaders' -TestCaseName 'Valid' -First 1 + $validHttpBody = Get-TestCaseValue -ScopeName 'HttpBody' -TestCaseName 'Valid' -First 1 + $validHttpContentType = Get-TestCaseValue -ScopeName 'HttpContentType' -TestCaseName 'Valid' -First 1 + $validRetryAttempts = Get-TestCaseValue -ScopeName 'RetryAttempts' -TestCaseName 'Valid' -First 1 + $validRetryIntervalMs = Get-TestCaseValue -ScopeName 'RetryIntervalMs' -TestCaseName 'Valid' -First 1 $ParameterSetTestCases."Invoke-AzDevOpsApiRestMethod" = @{ @@ -800,7 +922,79 @@ function Get-ParameterSetTestCase HttpContentType = $validHttpContentType RetryAttempts = $validRetryAttempts RetryIntervalMs = $validRetryIntervalMs + }, + + @{ + ApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Invalid' -First 1 + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + + @{ + ApiUri = $validApiUri + HttpMethod = Get-TestCaseValue -ScopeName 'HttpMethod' -TestCaseName 'Invalid' -First 1 + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = Get-TestCaseValue -ScopeName 'HttpHeaders' -TestCaseName 'Invalid' -First 1 + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + + # @{ # No validation for 'HttpBody' to deem it invalid at present. + # ApiUri = $validApiUri + # HttpMethod = $validHttpMethod + # HttpHeaders = $validHttpHeaders + # HttpBody = Get-TestCaseValue -ScopeName 'HttpBody' -TestCaseName 'Invalid' -First 1 + # HttpContentType = $validHttpContentType + # RetryAttempts = $validRetryAttempts + # RetryIntervalMs = $validRetryIntervalMs + # }, + + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = Get-TestCaseValue -ScopeName 'HttpContentType' -TestCaseName 'Invalid' -First 1 + RetryAttempts = $validRetryAttempts + RetryIntervalMs = $validRetryIntervalMs + }, + + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = Get-TestCaseValue -ScopeName 'RetryAttempts' -TestCaseName 'Invalid' -First 1 + RetryIntervalMs = $validRetryIntervalMs + }, + + @{ + ApiUri = $validApiUri + HttpMethod = $validHttpMethod + HttpHeaders = $validHttpHeaders + HttpBody = $validHttpBody + HttpContentType = $validHttpContentType + RetryAttempts = $validRetryAttempts + RetryIntervalMs = Get-TestCaseValue -ScopeName 'RetryIntervalMs' -TestCaseName 'Invalid' -First 1 } + + ) } } From 44077ba50c8d07bdd4d4f4d52d3c52faf2875c16 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 22:48:33 +0000 Subject: [PATCH 287/611] Added validation for presence of 'ScopeName' and/or 'TestCaseName' in 'CommonTestCases.ps1' and additional 'Get-ParameterSetTestCase' test cases for 'Get-' methods. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 401 ++++++++++++++++++ 1 file changed, 401 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 157370d3c..9f2257d22 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -647,6 +647,20 @@ function Get-TestCaseValue $testCaseValues.ProjectId = $testCaseValues.ResourceId + if (!$testCaseValues.ContainsKey($ScopeName)) + { + throw "'Get-TestCaseValue' does not contain/define a scope of '$ScopeName'." + return + } + + if (!$testCaseValues[$ScopeName].ContainsKey($TestCaseName)) + { + throw "'Get-TestCaseValue' does not contain/define test cases for '$TestCaseName' within the '$ScopeName' scope." + return + } + + + if ($null -ne $First -and $First -gt -1) { return $testCaseValues[$ScopeName][$TestCaseName] | @@ -744,6 +758,393 @@ function Get-ParameterSetTestCase $ParameterSetTestCases = @{} + # Get-AzDevOpsApiHttpRequestHeader + $ParameterSetTestCases."Get-AzDevOpsApiHttpRequestHeader" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + Pat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + } + ) + + Invalid = @( + @{ + Pat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Invalid' -First 1 + } + ) + } + } + + + # Get-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Get-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + #ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + #ResourceId = $validResourceId + } + ) + + Invalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + } + ) + } + } + + + # Get-AzDevOpsApiResourceName + $ParameterSetTestCases."Get-AzDevOpsApiResourceName" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsApiResourceUri + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Get-AzDevOpsApiResourceUri" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + ResourceName = $validResourceName + #ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + ResourceName = $validResourceName + #ResourceId = $validResourceId + } + ) + + Invalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + } + ) + } + } + + + # Get-AzDevOpsApiUriAreaName + $ParameterSetTestCases."Get-AzDevOpsApiUriAreaName" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + }, + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsApiUriResourceName + $ParameterSetTestCases."Get-AzDevOpsApiUriResourceName" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + }, + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsApiVersion + $ParameterSetTestCases."Get-AzDevOpsApiVersion" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + Default = $true + }, + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsApiWaitIntervalMs + $ParameterSetTestCases."Get-AzDevOpsApiWaitIntervalMs" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsApiWaitTimeoutMs + $ParameterSetTestCases."Get-AzDevOpsApiWaitTimeoutMs" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{} + ) + + Invalid = @( + ) + } + } + + + # Get-AzDevOpsOperation + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validOperationId = Get-TestCaseValue -ScopeName 'OperationId' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Get-AzDevOpsOperation" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $validOperationId + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + #OperationId = $validOperationId + } + ) + + Invalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + OperationId = $validOperationId + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + }, + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + } + ) + } + } + + + # Get-AzDevOpsProject + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validProjectId = Get-TestCaseValue -ScopeName 'ProjectId' -TestCaseName 'Valid' -First 1 + $validProjectName = Get-TestCaseValue -ScopeName 'ProjectName' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Get-AzDevOpsProject" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + #ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + #ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + #ProjectId = $validProjectId + #ProjectName = $validProjectName + } + ) + + Invalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectId = $validProjectId + ProjectName = $validProjectName + } + ) + } + } + + + # Get-AzDevOpsServicesApiUri + $ParameterSetTestCases."Get-AzDevOpsServicesApiUri" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + OrganizationName = Get-TestCaseValue -ScopeName 'OrganizationName' -TestCaseName 'Valid' -First 1 + } + ) + + Invalid = @( + @{ + OrganizationName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + } + ) + } + } + + + # Get-AzDevOpsServicesUri + $ParameterSetTestCases."Get-AzDevOpsServicesUri" = @{ + + "__AllParameterSets" = @{ + + Valid = @( + @{ + OrganizationName = Get-TestCaseValue -ScopeName 'OrganizationName' -TestCaseName 'Valid' -First 1 + } + ) + + Invalid = @( + @{ + OrganizationName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + } + ) + } + } + + # Invoke-AzDevOpsApiRestMethod $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 $validHttpMethod = Get-TestCaseValue -ScopeName 'HttpMethod' -TestCaseName 'Valid' -First 1 From 3c24a4699a4e43587ed32aaf54ef4dd41de62a1a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 9 Nov 2020 22:54:28 +0000 Subject: [PATCH 288/611] Added 'AzureDevOpsDsc.Common.Functions.Public.Tests.ps1' to test module, function/command, parameter sets. --- ...evOpsDsc.Common.Functions.Public.Tests.ps1 | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 new file mode 100644 index 000000000..c977e5d89 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 @@ -0,0 +1,75 @@ + +# Initialize tests for module function +. $PSScriptRoot\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:publicCommandNames = $($(Get-Command -Module $script:subModuleName).Name) | Where-Object { $_ -ilike 'Get-*'} #| Select-Object -First 2 + + [hashtable[]]$testCasesValidCommandParameterSetNames = $script:publicCommandNames | ForEach-Object { + + $CommandName = $_ + $ParameterSetName = '__AllParameterSets' + $ParameterSetTestCases = $(Get-ParameterSetTestCase -CommandName $_ -ParameterSetName '__AllParameterSets' -TestCaseName 'Valid') + + $ParameterSetTestCases | ForEach-Object { + [hashtable]$testCase = $_ + $testCase.Add('CommandName',$CommandName) + $testCase.Add('ParameterSetName',$ParameterSetName) + + $testCase + } + } + + [hashtable[]]$testCasesInvalidCommandParameterSetNames = $script:publicCommandNames | ForEach-Object { + + $CommandName = $_ + $ParameterSetName = '__AllParameterSets' + $ParameterSetTestCases = $(Get-ParameterSetTestCase -CommandName $_ -ParameterSetName '__AllParameterSets' -TestCaseName 'Invalid') + + $ParameterSetTestCases | ForEach-Object { + [hashtable]$testCase = $_ + $testCase.Add('CommandName',$CommandName) + $testCase.Add('ParameterSetName',$ParameterSetName) + + $testCase + } + } + + + Describe "GENERIC $subModuleName\AzureDevOpsDsc.Common\*\Functions\Public" { + + + Context "When validating function/command parameter sets" { + + BeforeEach { + Mock Invoke-RestMethod {} + Mock Start-Sleep {} + Mock New-InvalidOperationException {} + } + + Context "When invoking function/command with 'Valid', parameter set values" { + + It "Should not throw - '' - '' - " -TestCases $testCasesValidCommandParameterSetNames { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + { & $CommandName @ParameterSetValues } | Should -Not -Throw + } + } + + Context "When invoking function/command with 'Invalid', parameter set values" { + + It "Should throw - '' - '' - " -TestCases $testCasesInvalidCommandParameterSetNames { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + { & $CommandName @ParameterSetValues } | Should -Throw + } + + } + } + + } + +} From 4e01528b35dfd15e3f72a2831ca39ecf2c0efe76 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:02:28 +0000 Subject: [PATCH 289/611] Added functionality for testing combinations of ParameterSetTestCases with all combinations of 'Valid' parameter values for each parameter in parameter set. --- ...evOpsDsc.Common.Functions.Public.Tests.ps1 | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 index c977e5d89..b9dc8757f 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 @@ -18,11 +18,54 @@ InModuleScope $script:subModuleName { [hashtable]$testCase = $_ $testCase.Add('CommandName',$CommandName) $testCase.Add('ParameterSetName',$ParameterSetName) + $testCase.Add('ParameterNames',$_.ParameterSetValues.Keys) $testCase } } + [hashtable[]]$testCasesValidCommandParameterSetNameValidParameterValues = $testCasesValidCommandParameterSetNames | Where-Object { $_.ParameterNames.Count -gt 0 } | ForEach-Object { + + $commandName = $_.CommandName + $parameterNames = $_.ParameterNames + + # Note: Exclude any parameter sets that do not have any parameters and ensure only + # looping through the test cases for the 'CommandName' being looped through in outer loop + $testCasesValidCommandParameterSetNames | Where-Object { $_.ParameterNames.Count -gt 0 -and $_.CommandName -eq $commandName } | ForEach-Object { + + $testCase = $_ + + $parameterNames | ForEach-Object { + + $parameterName = $_ + $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Valid') + + $parameterValues | ForEach-Object { + + $parameterValue = $_ + + $newTestCase = @{} + $testCase.Keys | ForEach-Object { + $newTestCase[$_] = $testCase[$_] + } + $newTestCase.Remove('ParameterSetValues') + $newTestCase.Add('ParameterSetValues',@{}) + $testCase.ParameterSetValues.Keys | ForEach-Object { + $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] + } + $newTestCase.ParameterSetValues[$parameterName] = $parameterValue + $newTestCase.Add('ParameterValue',$parameterValue) + $newTestCase.Add('ParameterName',$parameterName) + + $newTestCase + + } + } + } + } + + + [hashtable[]]$testCasesInvalidCommandParameterSetNames = $script:publicCommandNames | ForEach-Object { $CommandName = $_ @@ -33,6 +76,7 @@ InModuleScope $script:subModuleName { [hashtable]$testCase = $_ $testCase.Add('CommandName',$CommandName) $testCase.Add('ParameterSetName',$ParameterSetName) + $testCase.Add('ParameterNames',$_.Keys) $testCase } @@ -57,8 +101,15 @@ InModuleScope $script:subModuleName { { & $CommandName @ParameterSetValues } | Should -Not -Throw } + + It "Should not throw - '' - '' - ('' = '')" -TestCases $testCasesValidCommandParameterSetNameValidParameterValues { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + { & $CommandName @ParameterSetValues } | Should -Not -Throw + } } + Context "When invoking function/command with 'Invalid', parameter set values" { It "Should throw - '' - '' - " -TestCases $testCasesInvalidCommandParameterSetNames { From 15826f3f053b1c3edcd8db70faffa832614c16e7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:03:09 +0000 Subject: [PATCH 290/611] Added 'Default' scope to $testCaseValues within 'Get-TestCaseValue' helper method. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 9f2257d22..f1057065a 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -477,6 +477,24 @@ function Get-TestCaseValue } + # Default + $testCaseValues.Default = @{ + + Valid = @( + $true, + $false + ) + + Invalid = @( + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # SourceControlType From ac854f66dd146f3bfcfe0d23eac0d4bd3fd08d64 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:07:57 +0000 Subject: [PATCH 291/611] Added functionality for testing combinations of 'Valid' ParameterSetTestCases with all combinations of 'Invalid' parameter values for each parameter in parameter set. --- ...evOpsDsc.Common.Functions.Public.Tests.ps1 | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 index b9dc8757f..fcf7a7722 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 @@ -82,6 +82,46 @@ InModuleScope $script:subModuleName { } } + [hashtable[]]$testCasesValidCommandParameterSetNameInvalidParameterValues = $testCasesValidCommandParameterSetNames | Where-Object { $_.ParameterNames.Count -gt 0 } | ForEach-Object { + + $commandName = $_.CommandName + $parameterNames = $_.ParameterNames + + # Note: Exclude any parameter sets that do not have any parameters and ensure only + # looping through the test cases for the 'CommandName' being looped through in outer loop + $testCasesValidCommandParameterSetNames | Where-Object { $_.ParameterNames.Count -gt 0 -and $_.CommandName -eq $commandName } | ForEach-Object { + + $testCase = $_ + + $parameterNames | ForEach-Object { + + $parameterName = $_ + $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Invalid') + + $parameterValues | ForEach-Object { + + $parameterValue = $_ + + $newTestCase = @{} + $testCase.Keys | ForEach-Object { + $newTestCase[$_] = $testCase[$_] + } + $newTestCase.Remove('ParameterSetValues') + $newTestCase.Add('ParameterSetValues',@{}) + $testCase.ParameterSetValues.Keys | ForEach-Object { + $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] + } + $newTestCase.ParameterSetValues[$parameterName] = $parameterValue + $newTestCase.Add('ParameterValue',$parameterValue) + $newTestCase.Add('ParameterName',$parameterName) + + $newTestCase + + } + } + } + } + Describe "GENERIC $subModuleName\AzureDevOpsDsc.Common\*\Functions\Public" { @@ -118,6 +158,12 @@ InModuleScope $script:subModuleName { { & $CommandName @ParameterSetValues } | Should -Throw } + It "Should throw - '' - '' - ('' = '')" -TestCases $testCasesValidCommandParameterSetNameInvalidParameterValues { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + { & $CommandName @ParameterSetValues } | Should -Throw + } + } } From c3a51ace885eaab170e41129b85b6ce5c04119bf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:25:44 +0000 Subject: [PATCH 292/611] Updated exceptions thrown from 'Get-TestCaseValue' and 'Get-ParameterSetTestCase' helper methods to make exceptions more descriptive. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index f1057065a..930195e16 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -667,13 +667,13 @@ function Get-TestCaseValue if (!$testCaseValues.ContainsKey($ScopeName)) { - throw "'Get-TestCaseValue' does not contain/define a scope of '$ScopeName'." + throw "'Get-TestCaseValue' does not contain/define a scope of '$ScopeName'. Add some test case values (for any required/relevant '$TestCaseName' test cases, if applicable/correct) for the '$ScopeName' scope in the 'Get-TestCaseValue', helper function." return } if (!$testCaseValues[$ScopeName].ContainsKey($TestCaseName)) { - throw "'Get-TestCaseValue' does not contain/define test cases for '$TestCaseName' within the '$ScopeName' scope." + throw "'Get-TestCaseValue' does not contain/define test cases for '$TestCaseName' within the '$ScopeName' scope. Add some '$TestCaseName', test case values for the '$ScopeName' scope in the 'Get-TestCaseValue', helper function." return } @@ -1418,6 +1418,27 @@ function Get-ParameterSetTestCase } } + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) + { + throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." + return + } + + + if (!$ParameterSetTestCases[$CommandName].ContainsKey($ParameterSetName)) + { + throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$ParameterSetName' parameter set of the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$ParameterSetName' parameter set, for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." + return + } + + if (!$ParameterSetTestCases[$CommandName][$ParameterSetName].ContainsKey($TestCaseName)) + { + throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$ParameterSetName' parameter set for the '$CommandName' command/function, specifically for the '$TestCaseName' test cases. Add some parameter set, test case values for '$TestCaseName' test cases (for the '$ParameterSetName' parameter set for the '$CommandName' command/function) in the 'Get-ParameterSetTestCase', helper function." + return + } + + [int]$testCaseOffset = 0 $testCases = $ParameterSetTestCases[$CommandName][$ParameterSetName][$TestCaseName] | ForEach-Object { @{ From 0d7a0eb0f639af6d775e7204b3d6c77d443b8b3f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:48:17 +0000 Subject: [PATCH 293/611] Added test case values for 'Resource', 'Wait' and 'Force' parameters. Also added 'New-AzDevOpsApiResource' parameter set test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 930195e16..491dba511 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -400,6 +400,26 @@ function Get-TestCaseValue } + # Resource + $testCaseValues.Resource = @{ + + Valid = @( + @{ + id = '7149493c-74a4-4496-bdaa-a1b4f24e691d' + someProperty = 'abc' + someOtherProperty = 123 + }, + @{} + ) + + Invalid = @( + ) + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } # ResourceName $testCaseValues.ResourceName = @{ @@ -495,6 +515,13 @@ function Get-TestCaseValue } + # Wait + $testCaseValues.Wait = $testCaseValues.Default + + # Force + $testCaseValues.Force = $testCaseValues.Default + + # SourceControlType @@ -1419,6 +1446,130 @@ function Get-ParameterSetTestCase } + + # New-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'HttpBody' -TestCaseName 'Valid' -First 1 + $validResource = Get-TestCaseValue -ScopeName 'Resource' -TestCaseName 'Valid' -First 1 + $validWait = Get-TestCaseValue -ScopeName 'Wait' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."New-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + #Wait = $validWait + #Force = $validForce + } + ) + + Inalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + Resource = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Wait = $validWait + Force = $validForce + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From ce964c89cfd2a0edc89ca8af895ab8293fd05f38 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 08:56:45 +0000 Subject: [PATCH 294/611] Added 'New-AzDevOpsProject' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 491dba511..43322d672 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1570,6 +1570,117 @@ function Get-ParameterSetTestCase + # New-AzDevOpsProject + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validProjectName = Get-TestCaseValue -ScopeName 'ProjectName' -TestCaseName 'Valid' -First 1 + $validProjectDescription = Get-TestCaseValue -ScopeName 'ProjectDescription' -TestCaseName 'Valid' -First 1 + $validSourceControlType = Get-TestCaseValue -ScopeName 'SourceControlType' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."New-AzDevOpsProject" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + #SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + #SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + #SourceControlType = $validSourceControlType + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + #SourceControlType = $validSourceControlType + #Force = $validForce + } + ) + + Inalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType + Force = $validForce + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 3a8d29becc00c7db04415eacd70342979908c87b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:01:35 +0000 Subject: [PATCH 295/611] Added 'Remove-AzDevOpsProject' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 43322d672..a0b7510aa 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1681,6 +1681,57 @@ function Get-ParameterSetTestCase + # Remove-AzDevOpsProject + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validProjectId = Get-TestCaseValue -ScopeName 'ProjectId' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Remove-AzDevOpsProject" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + #Force = $validForce + } + ) + + Inalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + ProjectId = $validProjectId + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectId = $validProjectId + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Force = $validForce + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From b188ec9d9eedbd20cee1e1052f2852bf3fe26d91 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:16:01 +0000 Subject: [PATCH 296/611] Added 'Remove-AzDevOpsApiResource' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index a0b7510aa..8fd673482 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1732,6 +1732,138 @@ function Get-ParameterSetTestCase + # Remove-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + $validWait = Get-TestCaseValue -ScopeName 'Wait' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Remove-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #Wait = $validWait + #Force = $validForce + } + ) + + Inalid = @( + @{ + #ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + #Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + #ResourceName = $validResourceName + ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + #ResourceId = $validResourceId + Wait = $validWait + Force = $validForce + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 6997c567940fe8d2e505840210fb4c095b198837 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:26:31 +0000 Subject: [PATCH 297/611] Added 'Set-AzDevOpsApiResource' function, parameter set test cases (and corrected 'Invalid' values for 'Remove-AzDevOpsApiResource' function) --- .../Modules/TestHelpers/CommonTestCases.psm1 | 163 +++++++++++++++++- 1 file changed, 159 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 8fd673482..2061a27bd 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1822,7 +1822,7 @@ function Get-ParameterSetTestCase Inalid = @( @{ - #ApiUri = $validApiUri + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) ApiVersion = $validApiVersion Pat = $validPat ResourceName = $validResourceName @@ -1833,7 +1833,7 @@ function Get-ParameterSetTestCase @{ ApiUri = $validApiUri ApiVersion = $validApiVersion - #Pat = $validPat + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) ResourceName = $validResourceName ResourceId = $validResourceId Wait = $validWait @@ -1843,7 +1843,7 @@ function Get-ParameterSetTestCase ApiUri = $validApiUri ApiVersion = $validApiVersion Pat = $validPat - #ResourceName = $validResourceName + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) ResourceId = $validResourceId Wait = $validWait Force = $validForce @@ -1853,7 +1853,162 @@ function Get-ParameterSetTestCase ApiVersion = $validApiVersion Pat = $validPat ResourceName = $validResourceName - #ResourceId = $validResourceId + ResourceId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Wait = $validWait + Force = $validForce + } + ) + + } + } + + + + # Set-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + $validResource = Get-TestCaseValue -ScopeName 'Resource' -TestCaseName 'Valid' -First 1 + $validWait = Get-TestCaseValue -ScopeName 'Wait' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Set-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + #Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + #Wait = $validWait + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + #Wait = $validWait + #Force = $validForce + } + ) + + Inalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Resource = $validResource + Wait = $validWait + Force = $validForce + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + Resource = $null # Mandatory (Set as $null to avoid Pester prompting for value) Wait = $validWait Force = $validForce } From b78d3ecb5ebcbe9d5bc724a33487541dc9182357 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:34:05 +0000 Subject: [PATCH 298/611] Added 'Set-AzDevOpsProject' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 2061a27bd..43b5b28e5 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2019,6 +2019,103 @@ function Get-ParameterSetTestCase + # Set-AzDevOpsProject + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validProjectId = Get-TestCaseValue -ScopeName 'ProjectId' -TestCaseName 'Valid' -First 1 + $validProjectName = Get-TestCaseValue -ScopeName 'ProjectName' -TestCaseName 'Valid' -First 1 + $validProjectDescription = Get-TestCaseValue -ScopeName 'ProjectDescription' -TestCaseName 'Valid' -First 1 + $validSourceControlType = Get-TestCaseValue -ScopeName 'SourceControlType' -TestCaseName 'Valid' -First 1 + $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Set-AzDevOpsProject" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + #Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + #ProjectDescription = $validProjectDescription + #Force = $validForce + } + ) + + Inalid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + SourceControlType = $validSourceControlType # Note: Does not support update, so should not be a parameter in this function + Force = $validForce + }, + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectId = $validProjectId + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectName = $validProjectName + ProjectDescription = $validProjectDescription + Force = $validForce + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectDescription = $validProjectDescription + Force = $validForce + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 830302190df67ccace71bb73361288d0a09d5096 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:44:22 +0000 Subject: [PATCH 299/611] Added $testCaseValues.HttpRequestHeader values and 'Test-AzDevOpsApiHttpRequestHeader' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 43b5b28e5..55bf5679e 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -124,6 +124,30 @@ function Get-TestCaseValue + # HttpRequestHeader + $testCaseValues.HttpRequestHeader = @{ + + Valid = $testCaseValues.Pat.Valid | ForEach-Object { + $Pat = $_ + @{ + Authorization = 'Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat")) + } + } + + Invalid = @( + @{} + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # HttpContentType $testCaseValues.HttpContentType = @{ @@ -2116,6 +2140,37 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiHttpRequestHeader + $validRequestHeader = Get-TestCaseValue -ScopeName 'HttpRequestHeader' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiHttpRequestHeader" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + HttpRequestHeader = $validRequestHeader + IsValid = $true + } + ) + + Inalid = @( + @{ + HttpRequestHeader = $validRequestHeader + #IsValid = $false + }, + @{ + HttpRequestHeader = $validRequestHeader + IsValid = $false + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 545e551d05053cc488291e391d96a0bfb884d504 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:52:51 +0000 Subject: [PATCH 300/611] Added 'Test-AzDevOpsApiResource' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 55bf5679e..1070bf6bb 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2171,6 +2171,71 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + } + ) + + Inalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From fd886274792eea32bf0514b1a6d6745f0835ac14 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:53:26 +0000 Subject: [PATCH 301/611] Added 'ApiVersion' parameter description to 'Set-AzDevOpsApiResource' --- .../Api/Functions/Private/Set-AzDevOpsApiResource.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 index 212a56f1f..e53ff5ad8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 @@ -10,6 +10,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned From 0855bd391eb79ce7c30e2cff270df5cbb3303775 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:53:39 +0000 Subject: [PATCH 302/611] Added 'ApiVersion' parameter description to 'New-AzDevOpsApiResource' --- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 4ec2e1982..20f821a8b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -10,6 +10,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned From bee620a98919ada624b750601df611e4977389be Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:54:00 +0000 Subject: [PATCH 303/611] Added 'ApiVersion', 'Wait' and 'Force' parameter description to 'Set-AzDevOpsApiResource' --- .../Functions/Private/Remove-AzDevOpsApiResource.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 index 92324bc72..9658016d3 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 @@ -10,6 +10,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use. Defaults to value suppored by the module. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned @@ -21,6 +24,13 @@ .PARAMETER ResourceId The 'ResourceId' of the resource being created (typically provided by another function (e.g. 'Remove-AzDevOpsApiProject')). + .PARAMETER Wait + Using this switch ensures that the execution will run synchronously and wait for the resource to be removed before + continuing. By not using this switch, execution will run asynchronously. + + .PARAMETER Force + Using this switch will override any confirmations prior to the deletion/removal of the resource. + .EXAMPLE Remove-AzDevOpsApiResource -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' -ResourceName 'Project' -ResourceId $YourResourceId -Wait From 83b9ea18c9aed059f317084ad611a5558585c031 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 09:54:23 +0000 Subject: [PATCH 304/611] Added 'ApiVersion' parameter (and description) to 'Test-AzDevOpsApiResource' --- .../Api/Functions/Private/Test-AzDevOpsApiResource.ps1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 index 7078a7361..545bcbe78 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 @@ -7,6 +7,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/Resources against the Azure DevOps API. This PAT must have the relevant permissions assigned @@ -39,6 +42,11 @@ function Test-AzDevOpsApiResource [System.String] $ApiUri, + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] From 2dac46a7cce8a45eee610e5a4906a8154819dd1a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:00:45 +0000 Subject: [PATCH 305/611] Added 'Test-AzDevOpsApiResourceId' function, parameter set, test cases (and corrected typo on 'In(v)alid' in a number of test cases). --- .../Modules/TestHelpers/CommonTestCases.psm1 | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 1070bf6bb..f62662830 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1550,7 +1550,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) ApiVersion = $validApiVersion @@ -1673,7 +1673,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) Pat = $validPat @@ -1730,7 +1730,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) Pat = $validPat @@ -1844,7 +1844,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) ApiVersion = $validApiVersion @@ -1985,7 +1985,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) ApiVersion = $validApiVersion @@ -2091,7 +2091,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $validApiUri Pat = $validPat @@ -2155,7 +2155,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ HttpRequestHeader = $validRequestHeader #IsValid = $false @@ -2200,7 +2200,7 @@ function Get-ParameterSetTestCase } ) - Inalid = @( + Invalid = @( @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) ApiVersion = $validApiVersion @@ -2236,6 +2236,37 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiResourceId + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiResourceId" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ResourceId = $validResourceId + IsValid = $true + } + ) + + Invalid = @( + @{ + ResourceId = $validResourceId + #IsValid = $false + }, + @{ + ResourceId = $validResourceId + IsValid = $false + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 47c196ca354ab062e13bef4bb361085e11234767 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:02:10 +0000 Subject: [PATCH 306/611] Added 'Test-AzDevOpsApiResourceName' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index f62662830..f9b801235 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2267,6 +2267,37 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiResourceName + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiResourceName" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ResourceName = $validResourceName + IsValid = $true + } + ) + + Invalid = @( + @{ + ResourceName = $validResourceName + #IsValid = $false + }, + @{ + ResourceName = $validResourceName + IsValid = $false + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From e4f84de2549d8b3aabc85559c8d7f430f27791de Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:03:44 +0000 Subject: [PATCH 307/611] Added 'Test-AzDevOpsApiUri' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index f9b801235..af1ad079b 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2298,6 +2298,37 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiUri + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiUri" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + IsValid = $true + } + ) + + Invalid = @( + @{ + ApiUri = $validApiUri + #IsValid = $false + }, + @{ + ApiUri = $validApiUri + IsValid = $false + } + ) + + } + } + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 6b1dac849a41728f86e2a4d65f844fd1292d73ea Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:05:49 +0000 Subject: [PATCH 308/611] Added 'Test-AzDevOpsApiVersion' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index af1ad079b..688b6c0ee 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2329,6 +2329,38 @@ function Get-ParameterSetTestCase + + # Test-AzDevOpsApiVersion + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsApiVersion" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiVersion = $validApiVersion + IsValid = $true + } + ) + + Invalid = @( + @{ + ApiVersion = $validApiVersion + #IsValid = $false + }, + @{ + ApiVersion = $validApiVersion + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 6da80f8a02b68fd61ff192cba7a0c0f196a09890 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:17:17 +0000 Subject: [PATCH 309/611] Renamed 'Test-AzDevOpsCredential' to 'Test-AzDevOpsPatCredential' and updated validation rules. --- ...ial.ps1 => Test-AzDevOpsPatCredential.ps1} | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) rename source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/{Test-AzDevOpsCredential.ps1 => Test-AzDevOpsPatCredential.ps1} (55%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 similarity index 55% rename from source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsCredential.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 index a0ff38ad7..193138d70 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsCredential.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 @@ -1,26 +1,26 @@ <# .SYNOPSIS - Peforms test on a provided 'Credential' to provide a boolean ($true or $false) + Peforms test on a provided '(Pat)Credential' to provide a boolean ($true or $false) return value. Returns $true if the test is successful. NOTE: Use of the '-IsValid' switch is required. - .PARAMETER Credential - The 'Credential' to be tested/validated. + .PARAMETER PatCredential + The '(Pat)Credential' containing the Personal Access Token (PAT) to be tested/validated. .PARAMETER IsValid - Use of this switch will validate the format of the 'Credential' + Use of this switch will validate the format of the '(Pat)Credential' rather than the existence/presence of it. Failure to use this switch will throw an exception. .EXAMPLE - Test-AzDevOpsCredential -Credential 'YourCredentialHere' -IsValid + Test-AzDevOpsCredential -PatCredential $YourPatCredentialHere$ -IsValid - Returns $true if the 'Credential' provided is of a valid format. + Returns $true if the '(Pat)Credential' provided is of a valid format. Returns $false if it is not. #> -function Test-AzDevOpsCredential +function Test-AzDevOpsPatCredential { [CmdletBinding()] [OutputType([System.Boolean])] @@ -28,7 +28,8 @@ function Test-AzDevOpsCredential ( [Parameter(Mandatory = $true)] [System.Management.Automation.PSCredential] - $Credential, + [Alias('Credential')] + $PatCredential, [Parameter(Mandatory = $true)] [System.Management.Automation.SwitchParameter] @@ -41,8 +42,11 @@ function Test-AzDevOpsCredential New-InvalidOperationException -Message $errorMessage } - # TODO: - # - Validate username is 'PAT' ? + if ($null -eq $PatCredential -or + 'PAT' -ne $PatCredential.UserName) + { + return $false + } return $true } From c089a3d1433e32ccd2ab0a7c5ecc63868429c04a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:30:56 +0000 Subject: [PATCH 310/611] Reordered location of 'HttpRequestHeader' test cases and added 'PatCredential' test cases. Also added 'Test-AzDevOpsPatCredential' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 107 ++++++++++++++---- 1 file changed, 83 insertions(+), 24 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 688b6c0ee..3148b02d1 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -124,30 +124,6 @@ function Get-TestCaseValue - # HttpRequestHeader - $testCaseValues.HttpRequestHeader = @{ - - Valid = $testCaseValues.Pat.Valid | ForEach-Object { - $Pat = $_ - @{ - Authorization = 'Basic ' + - [Convert]::ToBase64String( - [Text.Encoding]::ASCII.GetBytes(":$Pat")) - } - } - - Invalid = @( - @{} - ) + $testCaseValues.String.NullOrWhitespace - - Empty = $testCaseValues.String.Empty - Null = $testCaseValues.String.Null - NullOrWhitespace = $testCaseValues.String.NullOrWhitespace - - } - - - # HttpContentType $testCaseValues.HttpContentType = @{ @@ -263,6 +239,58 @@ function Get-TestCaseValue } + # PatCredential + $testCaseValues.PatCredential = @{ + + Valid = $testCaseValues.Pat.Valid | ForEach-Object { + + $PatCredentialUsername = 'PAT' + [String]$Pat = $_.ToString() + [SecureString]$PatSecure = ConvertTo-SecureString $Pat -AsPlainText -Force + New-Object System.Management.Automation.PSCredential ($PatCredentialUsername, $PatSecure) + + } + + Invalid = $testCaseValues.Pat.Invalid | ForEach-Object { + + $PatCredentialUsername = 'NotPAT' + [String]$Pat = $_.ToString() + [SecureString]$PatSecure = ConvertTo-SecureString $Pat -AsPlainText -Force + New-Object System.Management.Automation.PSCredential ($PatCredentialUsername, $PatSecure) + } + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + + # HttpRequestHeader + $testCaseValues.HttpRequestHeader = @{ + + Valid = $testCaseValues.Pat.Valid | ForEach-Object { + $Pat = $_ + @{ + Authorization = 'Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat")) + } + } + + Invalid = @( + @{} + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + + # HttpHeaders $testCaseValues.HttpHeaders = @{ @@ -2361,6 +2389,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsPatCredential + $validPatCredential = Get-TestCaseValue -ScopeName 'PatCredential' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsPatCredential" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + PatCredential = $validPatCredential + IsValid = $true + } + ) + + Invalid = @( + @{ + PatCredential = $validPatCredential + #IsValid = $false + }, + @{ + PatCredential = $validPatCredential + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 4d84b66c012de7d7df33d939b53587090c06e0f2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:41:23 +0000 Subject: [PATCH 311/611] Added 'Test-AzDevOpsOperation' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 3148b02d1..5bea2367a 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2420,6 +2420,98 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsOperation + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validOperationId = Get-TestCaseValue -ScopeName 'OperationId' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsOperation" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $validOperationId + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $validOperationId + IsSuccessful = $true + } + ) + + Invalid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $validOperationId + # Parameters provided must set only one of the following (not neither, nor both) + IsComplete = $false + IsSuccessful = $false + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $validOperationId + # Parameters provided must set only one of the following (not neither, nor both) + IsComplete = $true + IsSuccessful = $true + }, + + # IsComplete + # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + OperationId = $validOperationId + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + IsComplete = $true + }, + + # IsSuccessful + # TODO: Following 3 need moving to their own 'IsSuccessful' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + OperationId = $validOperationId + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + IsSuccessful = $true + } + ) + + } + } + + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { throw "'Get-ParameterSetTestCase' does not contain/define any parameter set values for the '$CommandName' command/function. Add some parameter set, test case values (typically, for both 'Valid' and 'Invalid' test cases) for the '$CommandName' command/function in the 'Get-ParameterSetTestCase', helper function." From 0513c59f1b7d2a338dc2d1e60b829a1da5cf7b1b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:43:20 +0000 Subject: [PATCH 312/611] Added 'Test-AzDevOpsOperationId' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 5bea2367a..615e13425 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2511,6 +2511,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsOperationId + $validOperationId = Get-TestCaseValue -ScopeName 'OperationId' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsOperationId" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + OperationId = $validOperationId + IsValid = $true + } + ) + + Invalid = @( + @{ + OperationId = $validOperationId + #IsValid = $false + }, + @{ + OperationId = $validOperationId + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 82c696338a8e3e543e195290ac71f34515b8d1aa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:44:51 +0000 Subject: [PATCH 313/611] Added 'Test-AzDevOpsOrganizationName' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 615e13425..1490e6f85 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2542,6 +2542,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsOrganizationName + $validOrganizationName = Get-TestCaseValue -ScopeName 'OrganizationName' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsOrganizationName" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + OrganizationName = $validOrganizationName + IsValid = $true + } + ) + + Invalid = @( + @{ + OrganizationName = $validOrganizationName + #IsValid = $false + }, + @{ + OrganizationName = $validOrganizationName + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 4c9631e777f078012a5169b910750d052f329cdb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:46:38 +0000 Subject: [PATCH 314/611] Added 'Test-AzDevOpsPat' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 1490e6f85..4ac89e6ec 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2573,6 +2573,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsPat + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsPat" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + Pat = $validPat + IsValid = $true + } + ) + + Invalid = @( + @{ + Pat = $validPat + #IsValid = $false + }, + @{ + Pat = $validPat + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 93313b657d50401491eb69b7a227fa0c04bc4a95 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:52:52 +0000 Subject: [PATCH 315/611] Added 'Test-AzDevOpsProject' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 4ac89e6ec..36df2033f 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2604,6 +2604,65 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsProject + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validProjectId = Get-TestCaseValue -ScopeName 'ProjectId' -TestCaseName 'Valid' -First 1 + $validProjectName = Get-TestCaseValue -ScopeName 'ProjectName' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsProject" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + #ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + ProjectId = $validProjectId + #ProjectName = $validProjectName + } + ) + + Invalid = @( + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + Pat = $validPat + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectId = $validProjectId + ProjectName = $validProjectName + }, + @{ + ApiUri = $validApiUri + Pat = $validPat + # Must provide atleast 1 of the below parameters + ProjectId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ProjectName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From c7a978fffe08b42c1edd619a07b168f819e540df Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:54:20 +0000 Subject: [PATCH 316/611] Added 'Test-AzDevOpsProjectDescription' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 36df2033f..cd89333e2 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2663,6 +2663,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsProjectDescription + $validProjectDescription = Get-TestCaseValue -ScopeName 'ProjectDescription' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsProjectDescription" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ProjectDescription = $validProjectDescription + IsValid = $true + } + ) + + Invalid = @( + @{ + ProjectDescription = $validProjectDescription + #IsValid = $false + }, + @{ + ProjectDescription = $validProjectDescription + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From f95c0453aa784b11cd0007fb9303d3210d44848e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:55:37 +0000 Subject: [PATCH 317/611] Added 'Test-AzDevOpsProjectId', parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index cd89333e2..0d757b174 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2694,6 +2694,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsProjectId + $validProjectId = Get-TestCaseValue -ScopeName 'ProjectId' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsProjectId" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ProjectId = $validProjectId + IsValid = $true + } + ) + + Invalid = @( + @{ + ProjectId = $validProjectId + #IsValid = $false + }, + @{ + ProjectId = $validProjectId + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 066259ea00386dfe28a7966c1ea4f567406e5a19 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 10:57:14 +0000 Subject: [PATCH 318/611] Added 'Test-AzDevOpsProjectName' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 0d757b174..758c6578a 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2725,6 +2725,37 @@ function Get-ParameterSetTestCase + # Test-AzDevOpsProjectName + $validProjectName = Get-TestCaseValue -ScopeName 'ProjectName' -TestCaseName 'Valid' -First 1 + + + $ParameterSetTestCases."Test-AzDevOpsProjectName" = @{ + + "__AllParameterSets" = @{ + Valid = @( + @{ + ProjectName = $validProjectName + IsValid = $true + } + ) + + Invalid = @( + @{ + ProjectName = $validProjectName + #IsValid = $false + }, + @{ + ProjectName = $validProjectName + IsValid = $false + } + ) + + } + } + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 7c67a2e05475158a8f073e97fe419a8a78f39ceb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:19:41 +0000 Subject: [PATCH 319/611] Added 'ApiVersion' parameter to 'Wait-AzDevOpsApiResource' and added validation on 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters. --- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index 56d5a8a04..3e89e4524 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -9,6 +9,9 @@ https://dev.azure.com/someOrganizationName/_apis/ + .PARAMETER ApiVersion + The version of the Azure DevOps API to use in the call/execution to/against the API. + .PARAMETER Pat The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations against the Azure DevOps API. This PAT must have the relevant permissions assigned @@ -62,6 +65,11 @@ function Wait-AzDevOpsApiResource [System.String] $ApiUri, + [Parameter()] + [ValidateScript( { Test-AzDevOpsApiVersion -ApiVersion $_ -IsValid })] + [System.String] + $ApiVersion = $(Get-AzDevOpsApiVersion -Default), + [Parameter(Mandatory = $true)] [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] [Alias('PersonalAccessToken')] @@ -80,11 +88,13 @@ function Wait-AzDevOpsApiResource $ResourceId, [Parameter()] + [ValidateRange(250,10000)] [Alias('Interval','IntervalMilliseconds')] [System.UInt32] $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] + [ValidateRange(250,10000)] [Alias('Timeout','TimeoutMilliseconds')] [System.UInt32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), From a9aa8f3bcb9c7adc781815706e5f9a07ab33ed86 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:20:35 +0000 Subject: [PATCH 320/611] Added 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' test cases, in addition to 'Wait-AzDevOpsApiResource' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 309 +++++++++++++++++- 1 file changed, 308 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 758c6578a..31c4dd18c 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -346,6 +346,12 @@ function Get-TestCaseValue } + # WaitIntervalMilliseconds + $testCaseValues.WaitIntervalMilliseconds = $testCaseValues.RetryIntervalMs + + # WaitTimeoutMilliseconds + $testCaseValues.WaitTimeoutMilliseconds = $testCaseValues.RetryIntervalMs + # HttpMethod $testCaseValues.HttpMethod = @{ @@ -575,7 +581,6 @@ function Get-TestCaseValue - # SourceControlType $testCaseValues.SourceControlType = @{ @@ -2756,6 +2761,308 @@ function Get-ParameterSetTestCase + # Wait-AzDevOpsApiResource + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + $validWaitIntervalMilliseconds = Get-TestCaseValue -ScopeName 'WaitIntervalMilliseconds' -TestCaseName 'Valid' -First 1 + $validWaitTimeoutMilliseconds = Get-TestCaseValue -ScopeName 'WaitTimeoutMilliseconds' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Wait-AzDevOpsApiResource" = @{ + + "__AllParameterSets" = @{ + Valid = @( + # IsPresent + # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + + + # IsAbsent + # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + } + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + } + ) + + Invalid = @( + + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + # Must use only 1 of the two, below switches (neither being provided/used is invalid) + IsPresent = $false + IsAbsent = $false + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + # Must use only 1 of the two, below switches (both being provided/used is invalid) + IsPresent = $true + IsAbsent = $true + }, + + # IsPresent + # TODO: Following 3 need moving to their own 'IsPresent' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsPresent = $true + }, + + # IsAbsent + # TODO: Following 3 need moving to their own 'IsAbsent' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceName = $validResourceName + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ResourceId = $validResourceId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + ResourceName = $validResourceName + ResourceId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsAbsent = $true + } + ) + + } + } + + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) { From 7023ff62d6732e10a1bde2f053e75b4d4bdc0a1e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:33:46 +0000 Subject: [PATCH 321/611] Added 'Wait-AzDevOpsOperation' function, parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 265 +++++++++++++++++- 1 file changed, 263 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 31c4dd18c..b79c8f1e7 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -2775,7 +2775,7 @@ function Get-ParameterSetTestCase "__AllParameterSets" = @{ Valid = @( # IsPresent - # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + # TODO: Following 3 need moving to their own 'IsPresent' parameter set (and out of '__AllParameterSets') @{ ApiUri = $validApiUri ApiVersion = $validApiVersion @@ -2859,7 +2859,7 @@ function Get-ParameterSetTestCase # IsAbsent - # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + # TODO: Following 3 need moving to their own 'IsAbsent' parameter set (and out of '__AllParameterSets') @{ ApiUri = $validApiUri ApiVersion = $validApiVersion @@ -3062,6 +3062,267 @@ function Get-ParameterSetTestCase + # Wait-AzDevOpsOperation + $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 + $validOperationId = Get-TestCaseValue -ScopeName 'OperationId' -TestCaseName 'Valid' -First 1 + $validWaitIntervalMilliseconds = Get-TestCaseValue -ScopeName 'WaitIntervalMilliseconds' -TestCaseName 'Valid' -First 1 + $validWaitTimeoutMilliseconds = Get-TestCaseValue -ScopeName 'WaitTimeoutMilliseconds' -TestCaseName 'Valid' -First 1 + + $ParameterSetTestCases."Wait-AzDevOpsOperation" = @{ + + "__AllParameterSets" = @{ + Valid = @( + # IsComplete + # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + + + # IsSuccessful + # TODO: Following 3 need moving to their own 'IsSuccessful' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + } + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + #ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + } + ) + + Invalid = @( + + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + # Must use only 1 of the two, below switches (neither being provided/used is invalid) + IsComplete = $false + IsSuccessful = $false + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + # Must use only 1 of the two, below switches (both being provided/used is invalid) + IsComplete = $true + IsSuccessful = $true + }, + + # IsComplete + # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsComplete = $true + } + + # IsSuccessful + # TODO: Following 3 need moving to their own 'IsSuccessful' parameter set (and out of '__AllParameterSets') + @{ + ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) + OperationId = $validOperationId + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + }, + @{ + ApiUri = $validApiUri + ApiVersion = $validApiVersion + Pat = $validPat + OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) + WaitIntervalMilliseconds = $validWaitIntervalMilliseconds + WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds + IsSuccessful = $true + } + ) + + } + } + + + + + + + + + if (!$ParameterSetTestCases.ContainsKey($CommandName)) From 86fa6a631df7e59e85d0a4a98030e5c39854998e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:36:27 +0000 Subject: [PATCH 322/611] Added 'IsValid', 'IsPresent', 'IsAbsent', 'IsComplete' and 'IsSuccessful' test case values. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index b79c8f1e7..cbf6a4cc2 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -580,6 +580,37 @@ function Get-TestCaseValue $testCaseValues.Force = $testCaseValues.Default + # IsValid + $testCaseValues.IsValid = @{ + + Valid = @( + $true + ) + + Invalid = @( + $false + ) + $testCaseValues.String.NullOrWhitespace + + Empty = $testCaseValues.String.Empty + Null = $testCaseValues.String.Null + NullOrWhitespace = $testCaseValues.String.NullOrWhitespace + + } + + # IsPresent + $testCaseValues.IsPresent = $testCaseValues.IsValid + + # IsAbsent + $testCaseValues.IsAbsent = $testCaseValues.IsValid + + # IsComplete + $testCaseValues.IsComplete = $testCaseValues.IsValid + + # IsSuccessful + $testCaseValues.IsSuccessful = $testCaseValues.IsValid + + + # SourceControlType $testCaseValues.SourceControlType = @{ From 2fab039a9c906631de32d24339357b2f8b15f211 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:44:22 +0000 Subject: [PATCH 323/611] Added parameter validation onto 'Wait-AzDevOpsOperation' function 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters. --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index ad41d8c36..306cbdfad 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -68,11 +68,13 @@ function Wait-AzDevOpsOperation $OperationId, [Parameter()] + [ValidateRange(250,10000)] [Alias('Interval','IntervalMilliseconds')] [System.UInt32] $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] + [ValidateRange(250,10000)] [Alias('Timeout','TimeoutMilliseconds')] [System.UInt32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), From 13cf5b8670ab8fa7c6f7140c2e2ef995a8167aa6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 11:44:59 +0000 Subject: [PATCH 324/611] Corrected assignment of $validResourceName in 'New-AzDevOpsApiResource', parameter set, test cases. --- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index cbf6a4cc2..7ac48528f 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -1539,7 +1539,7 @@ function Get-ParameterSetTestCase $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 - $validResourceName = Get-TestCaseValue -ScopeName 'HttpBody' -TestCaseName 'Valid' -First 1 + $validResourceName = Get-TestCaseValue -ScopeName 'ResourceName' -TestCaseName 'Valid' -First 1 $validResource = Get-TestCaseValue -ScopeName 'Resource' -TestCaseName 'Valid' -First 1 $validWait = Get-TestCaseValue -ScopeName 'Wait' -TestCaseName 'Valid' -First 1 $validForce = Get-TestCaseValue -ScopeName 'Force' -TestCaseName 'Valid' -First 1 From 73a5d9b9989c6d76697187f052ccd4180fe00709 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 12:05:46 +0000 Subject: [PATCH 325/611] Renamed 'Test-AzDevOpsResourceId' to 'Test-AzDevOpsApiResourceId' in validation of 'ResourceId' parameter in 'Test-AzDevOpsApiResource' and 'Wait-AzDevOpsApiResource' functions. --- .../Api/Functions/Private/Test-AzDevOpsApiResource.ps1 | 2 +- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 index 545bcbe78..9ac578457 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 @@ -59,7 +59,7 @@ function Test-AzDevOpsApiResource $ResourceName, [Parameter(Mandatory = $true)] - [ValidateScript({ Test-AzDevOpsResourceId -ResourceId $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] [Alias('Id')] [System.String] $ResourceId diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index 3e89e4524..52543296f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -82,7 +82,7 @@ function Wait-AzDevOpsApiResource $ResourceName, [Parameter(Mandatory = $true)] - [ValidateScript({ Test-AzDevOpsResourceId -ResourceId $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsApiResourceId -ResourceId $_ -IsValid })] [Alias('Id')] [System.String] $ResourceId, From 1fa3cec7c2048fbbacb986246b25fe3227126134 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 12:08:47 +0000 Subject: [PATCH 326/611] Removed 'ApiVersion' parameter from being passed in 'Wait-AzDevOpsOperation', parameter set, test cases. --- .../Modules/TestHelpers/CommonTestCases.psm1 | 95 +------------------ 1 file changed, 3 insertions(+), 92 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 7ac48528f..ec1f902c9 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -3095,7 +3095,6 @@ function Get-ParameterSetTestCase # Wait-AzDevOpsOperation $validApiUri = Get-TestCaseValue -ScopeName 'ApiUri' -TestCaseName 'Valid' -First 1 - $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 $validPat = Get-TestCaseValue -ScopeName 'Pat' -TestCaseName 'Valid' -First 1 $validOperationId = Get-TestCaseValue -ScopeName 'OperationId' -TestCaseName 'Valid' -First 1 $validWaitIntervalMilliseconds = Get-TestCaseValue -ScopeName 'WaitIntervalMilliseconds' -TestCaseName 'Valid' -First 1 @@ -3109,52 +3108,22 @@ function Get-ParameterSetTestCase # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsComplete = $true - }, - @{ - ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds IsComplete = $true - }, - @{ - ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsComplete = $true - }, + } @{ ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds IsComplete = $true - }, - @{ - ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsComplete = $true - }, + } @{ ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3163,16 +3132,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsComplete = $true - }, - @{ - ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3185,7 +3144,6 @@ function Get-ParameterSetTestCase # TODO: Following 3 need moving to their own 'IsSuccessful' parameter set (and out of '__AllParameterSets') @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3194,43 +3152,14 @@ function Get-ParameterSetTestCase } @{ ApiUri = $validApiUri - #ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsSuccessful = $true - }, - @{ - ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsSuccessful = $true - }, - @{ - ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds IsSuccessful = $true - }, - @{ - ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsSuccessful = $true - }, + } @{ ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3239,16 +3168,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion - Pat = $validPat - OperationId = $validOperationId - #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds - #WaitTimeoutMilliseconds = $validWaitTimeoutMilliseconds - IsSuccessful = $true - }, - @{ - ApiUri = $validApiUri - #ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId #WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3261,7 +3180,6 @@ function Get-ParameterSetTestCase @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3272,7 +3190,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3286,7 +3203,6 @@ function Get-ParameterSetTestCase # TODO: Following 3 need moving to their own 'IsComplete' parameter set (and out of '__AllParameterSets') @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) - ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3295,7 +3211,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3304,7 +3219,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $validPat OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3316,7 +3230,6 @@ function Get-ParameterSetTestCase # TODO: Following 3 need moving to their own 'IsSuccessful' parameter set (and out of '__AllParameterSets') @{ ApiUri = $null # Mandatory (Set as $null to avoid Pester prompting for value) - ApiVersion = $validApiVersion Pat = $validPat OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3325,7 +3238,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $null # Mandatory (Set as $null to avoid Pester prompting for value) OperationId = $validOperationId WaitIntervalMilliseconds = $validWaitIntervalMilliseconds @@ -3334,7 +3246,6 @@ function Get-ParameterSetTestCase }, @{ ApiUri = $validApiUri - ApiVersion = $validApiVersion Pat = $validPat OperationId = $null # Mandatory (Set as $null to avoid Pester prompting for value) WaitIntervalMilliseconds = $validWaitIntervalMilliseconds From 722a138ee1a4018165de021861c83dfabbe73c1f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:08:34 +0000 Subject: [PATCH 327/611] Added 'IsPresent' and 'IsAbsent' parameter sets into 'Wait-AzDevOpsApiResource' function --- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index 52543296f..cd0d3bfba 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -99,11 +99,11 @@ function Wait-AzDevOpsApiResource [System.UInt32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsPresent')] [System.Management.Automation.SwitchParameter] $IsPresent, - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsAbsent')] [System.Management.Automation.SwitchParameter] $IsAbsent ) From 6dfcd6c1d6c4388b5eb4813209a50aabcf7dd70d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:09:50 +0000 Subject: [PATCH 328/611] Added 'IsComplete' and 'IsSuccessful' parameter sets into 'Wait-AzDevOpsOperation' function. Also added validation on 'OperationId' parameter. --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 306cbdfad..46ff77a1b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -63,6 +63,7 @@ function Wait-AzDevOpsOperation $Pat, [Parameter(Mandatory = $true)] + [ValidateScript({ Test-AzDevOpsOperationId -OperationId $_ -IsValid })] [Alias('Id')] [System.String] $OperationId, @@ -79,11 +80,11 @@ function Wait-AzDevOpsOperation [System.UInt32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsComplete')] [System.Management.Automation.SwitchParameter] $IsComplete, - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsSuccessful')] [System.Management.Automation.SwitchParameter] $IsSuccessful ) From 2f1d4c76b2ef8ca68d14588d6514ad3aa251f3ca Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:10:26 +0000 Subject: [PATCH 329/611] Added 'IsComplete' and 'IsSuccessful' parameter sets into 'Test-AzDevOpsOperation' function. --- .../Resources/Functions/Public/Test-AzDevOpsOperation.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 5d1071c3a..373c73415 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -71,11 +71,11 @@ function Test-AzDevOpsOperation [System.String] $OperationId, - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsComplete')] [System.Management.Automation.SwitchParameter] $IsComplete, - [Parameter()] + [Parameter(Mandatory = $true, ParameterSetName='IsSuccessful')] [System.Management.Automation.SwitchParameter] $IsSuccessful ) From 7fb7537906b4480212d2866bc3e7da3b7f9ea4a9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:11:47 +0000 Subject: [PATCH 330/611] Removed 'NullOrWhitespace' from 'RetryIntervalMs'. invalid test case values. Also removed 'Invalid' cases that used a non-present, boolean value (as 'Pester was prompting for value). --- .../Modules/TestHelpers/CommonTestCases.psm1 | 56 ++----------------- 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index ec1f902c9..f0a2e8133 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -338,7 +338,7 @@ function Get-TestCaseValue Invalid = @( 249, 10001, -1, 0 - ) + $testCaseValues.String.NullOrWhitespace + ) Empty = $testCaseValues.String.Empty Null = $testCaseValues.String.Null @@ -584,12 +584,12 @@ function Get-TestCaseValue $testCaseValues.IsValid = @{ Valid = @( - $true + $true, + $false ) Invalid = @( - $false - ) + $testCaseValues.String.NullOrWhitespace + ) Empty = $testCaseValues.String.Empty Null = $testCaseValues.String.Null @@ -2220,10 +2220,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - HttpRequestHeader = $validRequestHeader - #IsValid = $false - }, @{ HttpRequestHeader = $validRequestHeader IsValid = $false @@ -2316,10 +2312,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ResourceId = $validResourceId - #IsValid = $false - }, @{ ResourceId = $validResourceId IsValid = $false @@ -2347,10 +2339,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ResourceName = $validResourceName - #IsValid = $false - }, @{ ResourceName = $validResourceName IsValid = $false @@ -2378,10 +2366,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ApiUri = $validApiUri - #IsValid = $false - }, @{ ApiUri = $validApiUri IsValid = $false @@ -2409,10 +2393,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ApiVersion = $validApiVersion - #IsValid = $false - }, @{ ApiVersion = $validApiVersion IsValid = $false @@ -2440,10 +2420,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - PatCredential = $validPatCredential - #IsValid = $false - }, @{ PatCredential = $validPatCredential IsValid = $false @@ -2562,10 +2538,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - OperationId = $validOperationId - #IsValid = $false - }, @{ OperationId = $validOperationId IsValid = $false @@ -2593,10 +2565,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - OrganizationName = $validOrganizationName - #IsValid = $false - }, @{ OrganizationName = $validOrganizationName IsValid = $false @@ -2624,10 +2592,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - Pat = $validPat - #IsValid = $false - }, @{ Pat = $validPat IsValid = $false @@ -2714,10 +2678,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ProjectDescription = $validProjectDescription - #IsValid = $false - }, @{ ProjectDescription = $validProjectDescription IsValid = $false @@ -2745,10 +2705,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ProjectId = $validProjectId - #IsValid = $false - }, @{ ProjectId = $validProjectId IsValid = $false @@ -2776,10 +2732,6 @@ function Get-ParameterSetTestCase ) Invalid = @( - @{ - ProjectName = $validProjectName - #IsValid = $false - }, @{ ProjectName = $validProjectName IsValid = $false From b579465a4689604d575243e26fb04779fd88157e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:38:58 +0000 Subject: [PATCH 331/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsProjectName' function, 'IsValid' parameter --- .../Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 index 8a27c3647..d680fbddf 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsProjectName $ProjectName, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From d852cd9ce93ead1a33f7172447c481155e8d504f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:39:09 +0000 Subject: [PATCH 332/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsApiHttpRequestHeader' function, 'IsValid' parameter --- .../Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 index 4ac1ea41b..c6934608a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsApiHttpRequestHeader $HttpRequestHeader, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 7b9bd9ed4a5c93af5655fd9eaad079225e1ae43a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:39:22 +0000 Subject: [PATCH 333/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsApiResourceId' function, 'IsValid' parameter --- .../Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 index 772cee951..bd371e61b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsApiResourceId $ResourceId, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 489c60863f4d88131b2f2162c31fe8bee9cb1c21 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:39:34 +0000 Subject: [PATCH 334/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsApiResourceName' function, 'IsValid' parameter --- .../Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 index 6d8580607..1ba68f599 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsApiResourceName $ResourceName, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 4d87a79fefa43db24a7c4c11950744f1787e59f4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:39:54 +0000 Subject: [PATCH 335/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsApiUri' function, 'IsValid' parameter --- .../Api/Functions/Private/Test-AzDevOpsApiUri.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 index 70732570c..827af4c12 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsApiUri $ApiUri, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 97854c0d7b7de5dae547eda8c52d34dfa2c07cac Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:40:11 +0000 Subject: [PATCH 336/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsApiVersion' function, 'IsValid' parameter --- .../Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 index eaaa592f4..1efd0382c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 @@ -32,6 +32,7 @@ function Test-AzDevOpsApiVersion $ApiVersion, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From c6aa8a83231167c217a78e33db08f7256c406b33 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:40:22 +0000 Subject: [PATCH 337/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsPatCredential' function, 'IsValid' parameter --- .../Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 index 193138d70..a6b874890 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 @@ -32,6 +32,7 @@ function Test-AzDevOpsPatCredential $PatCredential, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From cafb40fa06b536b11a812feadd59014e7f83f239 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:40:31 +0000 Subject: [PATCH 338/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsOperationId' function, 'IsValid' parameter --- .../Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 index 2a512cd24..2276e4f59 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsOperationId $OperationId, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 373fff4a93db6e36348cdfacd0f08b47b124757c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:40:40 +0000 Subject: [PATCH 339/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsOrganizationName' function, 'IsValid' parameter --- .../Functions/Private/Test-AzDevOpsOrganizationName.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index 7ad2f3f72..c2d1f4049 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsOrganizationName $OrganizationName, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 7116d7ad29b1a687e58d8db886a8b0fe1bd0f293 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:40:50 +0000 Subject: [PATCH 340/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsPat' function, 'IsValid' parameter --- .../Resources/Functions/Private/Test-AzDevOpsPat.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 index ec74b65fd..74dab2389 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsPat $Pat, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 46f757ac7e0eea40236c1073aeaa29933d3f2e12 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:41:01 +0000 Subject: [PATCH 341/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsProjectDescription' function, 'IsValid' parameter --- .../Functions/Private/Test-AzDevOpsProjectDescription.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 index 46003d8b3..27a95e5d0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -32,6 +32,7 @@ function Test-AzDevOpsProjectDescription $ProjectDescription, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 542834de0e54f9cbaca7badcd5b8e3a025e25711 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:41:09 +0000 Subject: [PATCH 342/611] Added 'ValidateSet($true)' attribute Added 'ValidateSet($true)' attribute to '' function, 'IsValid' parameter to 'Test-AzDevOpsProjectId' function, 'IsValid' parameter --- .../Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 index 5ea136872..4f60337c0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -31,6 +31,7 @@ function Test-AzDevOpsProjectId $ProjectId, [Parameter(Mandatory = $true)] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsValid ) From 8f85463611158dd452ca757a6f9289962faaa2fc Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 14:49:03 +0000 Subject: [PATCH 343/611] Made a number of changes to how test cases for testing parameter sets of functions/commands updated --- ...evOpsDsc.Common.Functions.Public.Tests.ps1 | 126 ++++++++++++------ 1 file changed, 86 insertions(+), 40 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 index fcf7a7722..3c13b21c4 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 @@ -6,7 +6,7 @@ InModuleScope $script:subModuleName { $script:subModuleName = 'AzureDevOpsDsc.Common' - $script:publicCommandNames = $($(Get-Command -Module $script:subModuleName).Name) | Where-Object { $_ -ilike 'Get-*'} #| Select-Object -First 2 + $script:publicCommandNames = $($(Get-Command -Module $script:subModuleName).Name) [hashtable[]]$testCasesValidCommandParameterSetNames = $script:publicCommandNames | ForEach-Object { @@ -38,27 +38,29 @@ InModuleScope $script:subModuleName { $parameterNames | ForEach-Object { $parameterName = $_ - $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Valid') + $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Valid' -First 1) $parameterValues | ForEach-Object { $parameterValue = $_ - $newTestCase = @{} - $testCase.Keys | ForEach-Object { - $newTestCase[$_] = $testCase[$_] + if ($testCase.ParameterSetValues.ContainsKey($parameterName)) # Only want to generate new records if 'ParameterName' is in the set of 'ParameterSetValues' keys + { + $newTestCase = @{} + $testCase.Keys | ForEach-Object { + $newTestCase[$_] = $testCase[$_] + } + $newTestCase.Remove('ParameterSetValues') + $newTestCase.Add('ParameterSetValues',@{}) + $testCase.ParameterSetValues.Keys | ForEach-Object { + $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] + } + $newTestCase.ParameterSetValues[$parameterName] = $parameterValue + $newTestCase.Add('ParameterValue',$parameterValue) + $newTestCase.Add('ParameterName',$parameterName) + + $newTestCase } - $newTestCase.Remove('ParameterSetValues') - $newTestCase.Add('ParameterSetValues',@{}) - $testCase.ParameterSetValues.Keys | ForEach-Object { - $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] - } - $newTestCase.ParameterSetValues[$parameterName] = $parameterValue - $newTestCase.Add('ParameterValue',$parameterValue) - $newTestCase.Add('ParameterName',$parameterName) - - $newTestCase - } } } @@ -96,27 +98,29 @@ InModuleScope $script:subModuleName { $parameterNames | ForEach-Object { $parameterName = $_ - $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Invalid') + $parameterValues = $(Get-TestCaseValue -ScopeName $parameterName -TestCaseName 'Invalid' -First 1) $parameterValues | ForEach-Object { - $parameterValue = $_ - - $newTestCase = @{} - $testCase.Keys | ForEach-Object { - $newTestCase[$_] = $testCase[$_] - } - $newTestCase.Remove('ParameterSetValues') - $newTestCase.Add('ParameterSetValues',@{}) - $testCase.ParameterSetValues.Keys | ForEach-Object { - $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] - } - $newTestCase.ParameterSetValues[$parameterName] = $parameterValue - $newTestCase.Add('ParameterValue',$parameterValue) - $newTestCase.Add('ParameterName',$parameterName) + if ($testCase.ParameterSetValues.ContainsKey($parameterName)) # Only want to generate new records if 'ParameterName' is in the set of 'ParameterSetValues' keys + { + $parameterValue = $_ - $newTestCase + $newTestCase = @{} + $testCase.Keys | ForEach-Object { + $newTestCase[$_] = $testCase[$_] + } + $newTestCase.Remove('ParameterSetValues') + $newTestCase.Add('ParameterSetValues',@{}) + $testCase.ParameterSetValues.Keys | ForEach-Object { + $newTestCase.ParameterSetValues[$_] = $testCase.ParameterSetValues[$_] + } + $newTestCase.ParameterSetValues[$parameterName] = $parameterValue + $newTestCase.Add('ParameterValue',$parameterValue) + $newTestCase.Add('ParameterName',$parameterName) + $newTestCase + } } } } @@ -129,9 +133,15 @@ InModuleScope $script:subModuleName { Context "When validating function/command parameter sets" { BeforeEach { - Mock Invoke-RestMethod {} + + Mock Invoke-RestMethod { + return @{ + id = '14c15b78-b85d-401f-8095-504c57bbd79e' + } + } + Mock Start-Sleep {} - Mock New-InvalidOperationException {} + #Mock New-InvalidOperationException {} # Don't mock this. Want exception to be thrown by it. } Context "When invoking function/command with 'Valid', parameter set values" { @@ -139,12 +149,14 @@ InModuleScope $script:subModuleName { It "Should not throw - '' - '' - " -TestCases $testCasesValidCommandParameterSetNames { param([string]$CommandName, [Hashtable]$ParameterSetValues) + Mock -CommandName $CommandName -MockWith {} { & $CommandName @ParameterSetValues } | Should -Not -Throw } It "Should not throw - '' - '' - ('' = '')" -TestCases $testCasesValidCommandParameterSetNameValidParameterValues { param([string]$CommandName, [Hashtable]$ParameterSetValues) + Mock -CommandName $CommandName -MockWith {} { & $CommandName @ParameterSetValues } | Should -Not -Throw } } @@ -152,18 +164,52 @@ InModuleScope $script:subModuleName { Context "When invoking function/command with 'Invalid', parameter set values" { - It "Should throw - '' - '' - " -TestCases $testCasesInvalidCommandParameterSetNames { - param([string]$CommandName, [Hashtable]$ParameterSetValues) + Context "When 'IsValid' parameter name is not present" { + + It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | + Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }) + { + param([string]$CommandName, [Hashtable]$ParameterSetValues) - { & $CommandName @ParameterSetValues } | Should -Throw + Mock -CommandName $CommandName -MockWith {} + { & $CommandName @ParameterSetValues } | Should -Throw + } + + It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | + Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }) + { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + Mock -CommandName $CommandName -MockWith {} + { & $CommandName @ParameterSetValues } | Should -Throw + } } - It "Should throw - '' - '' - ('' = '')" -TestCases $testCasesValidCommandParameterSetNameInvalidParameterValues { - param([string]$CommandName, [Hashtable]$ParameterSetValues) + Context "When 'IsValid' parameter name is present" { + + # Don't want this to throw an exception - Typically they need to return a $false return value if input parameters are invalid. + + It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | + Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) + { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + Mock -CommandName $CommandName -MockWith {} + { & $CommandName @ParameterSetValues } | Should -Not -Throw + } + + It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | + Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) + { + param([string]$CommandName, [Hashtable]$ParameterSetValues) + + Mock -CommandName $CommandName -MockWith {} + { & $CommandName @ParameterSetValues } | Should -Not -Throw + } - { & $CommandName @ParameterSetValues } | Should -Throw } + } } From 42f2614e4ff73b1d5023c9d627ff8c460e77ed50 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 15:35:13 +0000 Subject: [PATCH 344/611] Updated 'Wait-AzDevOpsOperation' to handle 'IsComplete' and 'IsSuccessful' parameter sets. --- .../Private/Wait-AzDevOpsOperation.ps1 | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 46ff77a1b..76e9fed00 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -103,9 +103,23 @@ function Wait-AzDevOpsOperation [System.DateTime]$waitStartDateTime = [System.DateTime]::UtcNow - while (!(Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` - -OperationId $OperationId ` - -IsComplete:$IsComplete -IsSuccessful:$IsSuccessful)) + $testOperationParameters = @{ + ApiUri = $ApiUri + Pat = $Pat + OperationId = $OperationId + } + + if ($IsComplete) + { + $testOperationParameters.IsComplete = $IsComplete + } + + if ($IsSuccessful) + { + $testOperationParameters.IsSuccessful = $IsSuccessful + } + + while (!(Test-AzDevOpsOperation @testOperationParameters)) { Start-Sleep -Milliseconds $WaitIntervalMilliseconds From 73834ec9feaa140a660f45ed3ff543ae309732fb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 15:40:43 +0000 Subject: [PATCH 345/611] Added 'EnsureGitProjectAbsent1' and 'EnsureGitProjectAbsent2' configurations for 'DSC_AzDevOpsProject', DSC resource. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 115 +++++++++++++++++- .../DSC_AzDevOpsProject.config.ps1 | 62 ++++++++++ 2 files changed, 175 insertions(+), 2 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index ff5fec5c4..be94a1071 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -39,12 +39,67 @@ try } - # TODO: - # Add test for 'EnsureGitProjectAbsent' # Add test for 'EnsureTfvcProjectAbsent' # Add test for 'EnsureSourceControlTypeChangeInvalid' + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectAbsent1_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureGitProjectAbsent1_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureGitProjectAbsent1" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Absent' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectPresent_Config'") { BeforeAll { @@ -104,6 +159,62 @@ try } + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectAbsent2_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureGitProjectAbsent2_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureGitProjectAbsent2" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Absent' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectPresent_Config'") { diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 7ff0de9b0..fc00da337 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -36,6 +36,37 @@ #} +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' (that uses 'Git' for source control) is absent (before it's added again). + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent1_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureGitProjectAbsent1 + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestGitProjectName' + #ProjectDescription = 'TestGitProjectDescription' + + #SourceControlType = 'Git' + + Ensure = 'Absent' + } + } +} + + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' (that uses 'Git' for source control) is present. @@ -66,6 +97,37 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectPresent_Config } +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' (that uses 'Git' for source control) is absent (after it's been added). + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent2_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureGitProjectAbsent2 + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestGitProjectName' + #ProjectDescription = 'TestGitProjectDescription' + + #SourceControlType = 'Git' + + Ensure = 'Absent' + } + } +} + + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is present. From 4d34a83dfffe0b6764ad62cc9785536857e24a85 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 16:02:41 +0000 Subject: [PATCH 346/611] Added 'EnsureTfvcProjectAbsent1' and 'EnsureTfvcProjectAbsent2', integration test configurations for 'DSC_AzDevOpsProject' DSC resource. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 116 +++++++++++++++++- .../DSC_AzDevOpsProject.config.ps1 | 63 ++++++++++ 2 files changed, 177 insertions(+), 2 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index be94a1071..56ae95ab7 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -39,8 +39,7 @@ try } - # Add test for 'EnsureTfvcProjectAbsent' - # Add test for 'EnsureSourceControlTypeChangeInvalid' + # TODO: Add test for 'EnsureSourceControlTypeChangeInvalid' Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectAbsent1_Config'") { @@ -216,6 +215,63 @@ try + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectAbsent1_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureTfvcProjectAbsent1_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureTfvcProjectAbsent1" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Absent' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectPresent_Config'") { BeforeAll { @@ -275,6 +331,62 @@ try } + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectAbsent2_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_EnsureTfvcProjectAbsent2_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_EnsureTfvcProjectAbsent2" + } + + + It 'Should not throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Not -Throw + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + + It 'Should have set the resource and all the parameters should match' { + $resourceCurrentState = $script:currentConfiguration | Where-Object -FilterScript { + $_.ConfigurationName -eq $configurationName ` + -and $_.ResourceId -eq $resourceId + } + + $resourceCurrentState.Ensure | Should -Be 'Absent' + } + + + It 'Should return $true when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -Be 'True' + } + } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureProjectPresent_Config'") { diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index fc00da337..247af3687 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -128,6 +128,37 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent2_Config +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is absent (before it gets added). + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent1_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent1 + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestTfvcProjectName' + #ProjectDescription = 'TestTfvcProjectDescription' + + #SourceControlType = 'Tfvc' + + Ensure = 'Absent' + } + } +} + + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is present. @@ -158,6 +189,38 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config } + +<# + .SYNOPSIS + Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is absent (after it's previously been added). + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent2_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent2 + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestTfvcProjectName' + #ProjectDescription = 'TestTfvcProjectDescription' + + #SourceControlType = 'Tfvc' + + Ensure = 'Absent' + } + } +} + + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' is present/added. From e84924eb005ea10099574c9f0e7a20e54b366453 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 16:43:38 +0000 Subject: [PATCH 347/611] Added 'UpdateGitProjectToTfvc' and 'UpdateTfvcProjectToGit' integration tests for 'DSC_AzDevOpsProject', DSC resource. --- .../DSC_AzDevOpsProject.Integration.Tests.ps1 | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 index 56ae95ab7..f75d5f982 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 @@ -158,6 +158,52 @@ try } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_UpdateGitProjectToTfvc_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_UpdateGitProjectToTfvc_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_UpdateGitProjectToTfvc" + } + + + It 'Should throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Throw # Note: This operation is unsupported so we expect it to throw an exception + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + It 'Should return $false or $null when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -BeIn @('False',$null) + } + } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureGitProjectAbsent2_Config'") { BeforeAll { @@ -331,6 +377,52 @@ try } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_UpdateTfvcProjectToGit_Config'") { + + BeforeAll { + $configurationName = "$($script:dscResourceName)_UpdateTfvcProjectToGit_Config" + $resourceId = "[$($script:dscResourceFriendlyName)]Integration_Test_UpdateTfvcProjectToGit" + } + + + It 'Should throw when compiling MOF and when calling "Start-DscConfiguration"' { + { + $configurationParameters = @{ + OutputPath = $TestDrive + # The variable $ConfigurationData was dot-sourced above. + ConfigurationData = $ConfigurationData + } + + . $configFile + & $configurationName @configurationParameters + + $startDscConfigurationParameters = @{ + Path = $TestDrive + ComputerName = 'localhost' + Wait = $true + Verbose = $true + Force = $true + ErrorAction = 'Stop' + } + + Start-DscConfiguration @startDscConfigurationParameters + } | Should -Throw # Note: This operation is unsupported so we expect it to throw an exception + } + + + It 'Should not throw when calling "Get-DscConfiguration"' { + { + $script:currentConfiguration = Get-DscConfiguration -Verbose -ErrorAction Stop + } | Should -Not -Throw + } + + It 'Should return $false or $null when Test-DscConfiguration is run' { + Test-DscConfiguration -Verbose | Should -BeIn @('False',$null) + } + } + + Context ("When compiling, applying and testing the MOF - '$($script:dscResourceName)_EnsureTfvcProjectAbsent2_Config'") { BeforeAll { From 570e3f2d6f705b28935d175ed1dc951234709e63 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 16:46:28 +0000 Subject: [PATCH 348/611] Added configuration files for 'UpdateGitProjectToTfvc' and 'UpdateTfvcProjectToGit', integration tests for 'DSC_AzDevOpsProject', DSC resource. --- .../DSC_AzDevOpsProject.config.ps1 | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 247af3687..c9aeaa00d 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -97,6 +97,39 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectPresent_Config } + +<# + .SYNOPSIS + Attempts to update an Azure DevOps 'Project' (that uses 'Git' for source control) tp + use 'Tfvc' (Team Foundation Version Control). Note that this is an invalid/unsupported + operation. + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_UpdateGitProjectToTfvc_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_UpdateGitProjectToTfvc + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestGitProjectName' + ProjectDescription = 'TestGitProjectDescription' + + SourceControlType = 'Vsts' + + Ensure = $Node.Ensure + } + } +} + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' (that uses 'Git' for source control) is absent (after it's been added). @@ -190,6 +223,38 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config +<# + .SYNOPSIS + Attempts to update an Azure DevOps 'Project' (that uses 'Tfvc' (Team Foundation Version Control)) to + use 'Git' for source control. Note that this is an invalid/unsupported operation. + + .NOTES + +#> +Configuration DSC_AzDevOpsProject_UpdateTfvcProjectToGit_Config +{ + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + + node $AllNodes.NodeName + { + DSC_AzDevOpsProject Integration_Test_UpdateTfvcProjectToGit + { + ApiUri = $Node.ApiUri + Pat = $Node.Pat + + #ProjectId = $Node.ProjectId + ProjectName = 'TestTfvcProjectName' + ProjectDescription = 'TestTfvcProjectDescription' + + SourceControlType = 'Vsts' + + Ensure = $Node.Ensure + } + } +} + + + <# .SYNOPSIS Attempts to ensure an Azure DevOps 'Project' (that uses 'TFVC' for source control) is absent (after it's previously been added). From 06c5d7155fd46c0acd1b240291ee6707eb9096c5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 17:33:21 +0000 Subject: [PATCH 349/611] Updated formattting in 'AzureDevOpsDsc.Common.Functions.Public.Tests.ps1' --- ...reDevOpsDsc.Common.Functions.Public.Tests.ps1 | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 index 3c13b21c4..14c632f93 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 @@ -166,18 +166,14 @@ InModuleScope $script:subModuleName { Context "When 'IsValid' parameter name is not present" { - It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | - Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }) - { + It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }) { param([string]$CommandName, [Hashtable]$ParameterSetValues) Mock -CommandName $CommandName -MockWith {} { & $CommandName @ParameterSetValues } | Should -Throw } - It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | - Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }) - { + It "Should throw - '' - '' - " -TestCases $($testCasesInvalidCommandParameterSetNames | Where-Object { $_.ParameterSetValuesKey -notlike '*IsValid*' }){ param([string]$CommandName, [Hashtable]$ParameterSetValues) Mock -CommandName $CommandName -MockWith {} @@ -189,18 +185,14 @@ InModuleScope $script:subModuleName { # Don't want this to throw an exception - Typically they need to return a $false return value if input parameters are invalid. - It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | - Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) - { + It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) { param([string]$CommandName, [Hashtable]$ParameterSetValues) Mock -CommandName $CommandName -MockWith {} { & $CommandName @ParameterSetValues } | Should -Not -Throw } - It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | - Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) - { + It "Should not throw - '' - '' - ('' = '')" -TestCases $($testCasesValidCommandParameterSetNameInvalidParameterValues | Where-Object { $_.ParameterSetValuesKey -like '*IsValid*' }) { param([string]$CommandName, [Hashtable]$ParameterSetValues) Mock -CommandName $CommandName -MockWith {} From 89652e543ea5581dc23617ce0507a24fbcb203b4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 17:34:16 +0000 Subject: [PATCH 350/611] Renamed 'AzureDevOpsDsc.Common.Functions.Public.Tests.ps1' to 'AzureDevOpsDsc.Common.Functions.Tests.ps1' --- ...blic.Tests.ps1 => AzureDevOpsDsc.Common.Functions.Tests.ps1} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/Unit/Modules/{AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 => AzureDevOpsDsc.Common.Functions.Tests.ps1} (99%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 similarity index 99% rename from tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 index 14c632f93..285158a91 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Public.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 @@ -127,7 +127,7 @@ InModuleScope $script:subModuleName { } - Describe "GENERIC $subModuleName\AzureDevOpsDsc.Common\*\Functions\Public" { + Describe "$subModuleName\AzureDevOpsDsc.Common\*\Functions" { Context "When validating function/command parameter sets" { From 3522fe50e442f334cfd948276dad0b6a26292554 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 17:34:59 +0000 Subject: [PATCH 351/611] Updated 'RequiredModules.psd1' to use 'Pester' v4.10.1 --- RequiredModules.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RequiredModules.psd1 b/RequiredModules.psd1 index 148916393..dd32e5874 100644 --- a/RequiredModules.psd1 +++ b/RequiredModules.psd1 @@ -10,7 +10,7 @@ InvokeBuild = 'latest' PSScriptAnalyzer = 'latest' - Pester = 'latest' + Pester = '4.10.1' Plaster = 'latest' ModuleBuilder = 'latest' ChangelogManagement = 'latest' From 03a0c6faccad226a2593144c5d6b54b965f6a227 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 18:07:46 +0000 Subject: [PATCH 352/611] Added 'Get-AzDevOpsApiHttpRequestHeader' function, unit tests. --- ...Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 85 ++++++++++--------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 62d1aad2e..f9870e3ad 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -1,76 +1,77 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiHttpRequestHeader' -Tag 'GetAzDevOpsApiHttpRequestHeader' { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Context 'When called with valid parameters' { - BeforeAll { - } + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When called with valid "Pat" parameter' { + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + Context 'When input parameters are valid' { - It 'Should not throw - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + It 'Should not throw - ""' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Not -Throw - } + { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Not -Throw + } - It 'Should return "hashtable" - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + It 'Should output a "Hashtable" - ""' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - $result = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - $result.GetType() | Should -Be $($([hashtable]::new()).GetType()) - } + $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - It 'Should return correct "Authorization" hashtable property value - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + $httpRequestHeader.GetType() | Should -Be $(@{}.GetType()) + } - $result = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - $result.Authorization | Should -Be $('Basic ' + - [Convert]::ToBase64String( - [Text.Encoding]::ASCII.GetBytes(":$Pat"))) - } + It 'Should output a "Hashtable" with an "Authorization" key - ""' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - } + $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + $httpRequestHeader.ContainsKey('Authorization') | Should -BeTrue + } + It 'Should output a "Hashtable" with an "Authorization" key that has a value beginning with "Basic " - ""' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - } + $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - Context 'When called with invalid parameters' { - BeforeAll { + $httpRequestHeader.Authorization | Should -BeLike "Basic *" } - Context 'When called with invalid "Pat" parameter' { + It 'Should output a "Hashtable" with an "Authorization" key that has a value as expected - "" ' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$Pat")) + $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) + $httpRequestHeader.Authorization | Should -BeExactly $Authorization + } - { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Throw + It 'Should output a "Hashtable" that is successfully validated by "Test-AzDevOpsApiHttpRequestHeader"' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - } - } + $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - Context 'When called with empty "Pat" parameter' { + Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $httpRequestHeader -IsValid | Should -BeTrue + } - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' + } - It "Should throw - ''" -TestCases $testCasesEmptyPats { - param ([string]$Pat) + Context "When input parameters are invalid" { - { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Throw + It 'Should throw - ""' -TestCases $testCasesInvalidPats { + param ([System.String]$Pat) - } + { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Throw } - } + } } - } From 6dd276a531294b03fcfb1d3e4e386a08a51eb4c6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 18:49:09 +0000 Subject: [PATCH 353/611] Added 'Get-AzDevOpsApiResourceName' function, unit tests. --- .../Private/Get-AzDevOpsApiResourceName.ps1 | 9 ++-- .../Get-AzDevOpsApiResourceName.Tests.ps1 | 54 ++++++++++++++----- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 index a1eab1b8d..caa28bbda 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.ps1 @@ -1,6 +1,7 @@ <# .SYNOPSIS - Returns an array of all the Azure DevOps API, 'Resource' names that can used/managed. + Returns an array of all the Azure DevOps API, 'Resource' names that can used/managed + in the Azure DevOps API (and supported by the 'AzureDevOpsDsc' module). .EXAMPLE Get-AzDevOpsApiResourceName @@ -10,13 +11,11 @@ function Get-AzDevOpsApiResourceName { [CmdletBinding()] - [OutputType([System.Object[]])] + [OutputType([System.String[]])] param () - [string[]]$resourceNames = @( + return [System.String[]]@( 'Operation', 'Project' ) - - return $resourceNames } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index 1a5a3ae2e..ce52da93a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -1,37 +1,63 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiResourceName' -Tag 'GetAzDevOpsApiResourceName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When called with valid parameters' { - - $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + Context 'When input parameters are valid' { It 'Should not throw' { - param () { Get-AzDevOpsApiResourceName } | Should -Not -Throw } - It 'Should return "object[]"' { - param () + It 'Should output a "System.String[]" type containing atleast 1 string value' { + + [System.String[]]$resourceNames = Get-AzDevOpsApiResourceName + + $resourceNames.Count | Should -BeGreaterThan 0 + } + + It 'Should output a "System.String[]" type containing no empty values' { + + [System.String[]]$resourceNames = Get-AzDevOpsApiResourceName - $result = Get-AzDevOpsApiResourceName - $result.GetType() | Should -Be @('ResourceName1','ResourceName2').GetType() + [System.String]::Empty | Should -Not -BeIn $resourceNames } - It "Should return all resources that are present in $testCasesValidResourceName variable - ''" -TestCases $testCasesValidResourceNames { - param ($ResourceName) + It 'Should output a "System.String[]" type containing no $null values' { - $ResourceName | Should -BeIn $(Get-AzDevOpsApiResourceName) + [System.String[]]$resourceNames = Get-AzDevOpsApiResourceName + + $null | Should -Not -BeIn $resourceNames + } + + # Create test cases for each 'ResourceName' returned by 'Get-AzDevOpsApiResourceName' + [Hashtable[]]$testCasesResourceNames = Get-AzDevOpsApiResourceName | + ForEach-Object { + @{ + ResourceName = $_ + } + } + + It 'Should output values that are all validated by "Test-AzDevOpsApiResourceName" - ""' -TestCases $testCasesResourceNames { + param ([System.String]$ResourceName) + + Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid | Should -BeTrue } } - } + Context "When input parameters are invalid" { + # N/A - No parameters passed to function + + } + } } From bac792c4848296860f681db8af0ded9871b493b7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 19:36:50 +0000 Subject: [PATCH 354/611] Added 'Get-AzDevOpsApiUriResourceName', unit tests --- .../Get-AzDevOpsApiUriResourceName.ps1 | 4 +- .../Get-AzDevOpsApiUriResourceName.Tests.ps1 | 112 +++++++++++------- 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 index 123891c59..1b8bf82c3 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.ps1 @@ -16,7 +16,7 @@ function Get-AzDevOpsApiUriResourceName { [CmdletBinding()] - [OutputType([System.Object[]])] + [OutputType([System.String[]])] param ( [Parameter()] @@ -35,5 +35,5 @@ function Get-AzDevOpsApiUriResourceName return $apiResourceNameToApiUriResourceName[$ResourceName] } - return $apiResourceNameToApiUriResourceName.Values + return [System.String[]]$($apiResourceNameToApiUriResourceName.Values) } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 index 37b665d1e..60be6c52b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 @@ -1,83 +1,115 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiUriResourceName' -Tag 'GetAzDevOpsApiUriResourceName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When called with valid parameters' { + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' - Context 'When called without "-ResourceName" parameter' { + Context 'When input parameters are valid' { - BeforeAll { - - $testCasesValidApiUriResourceName = Get-TestCase -ScopeName 'ApiUriResourceName' -TestCaseName 'Valid' - } + Context 'When called with no parameter values' { It 'Should not throw' { - param () { Get-AzDevOpsApiUriResourceName } | Should -Not -Throw } - It 'Should return "object[]" or "string"' { - param () - - $result = Get-AzDevOpsApiUriResourceName - $result.GetType() | Should -BeIn @(@('ApiUriResourceName1','ApiUriResourceName2').GetType(),'ApiUriResourceName1'.GetType()) - } + It 'Should output a "System.String[]" type containing more than 1 value' { - It 'Should return all resources that are present in $testCasesValidApiUriResourceName variable'{ - param () + [System.String[]]$uriResourceNames = Get-AzDevOpsApiUriResourceName - [string[]]$result = Get-AzDevOpsApiUriResourceName - $result.Count | Should -Be $($testCasesValidApiUriResourceName.Count) + $uriResourceNames.Count | Should -BeGreaterThan 1 } - } - Context 'When called with valid "-ResourceName" parameter' { + It 'Should output a "System.String[]" type containing no empty values' { - $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + [System.String[]]$uriResourceNames = Get-AzDevOpsApiUriResourceName - BeforeAll { + [System.String]::Empty | Should -Not -BeIn $uriResourceNames } - It 'Should not throw - ""' -TestCases $testCasesValidResourceName { - param ([string]$ResourceName) - Write-Verbose $ResourceName + It 'Should output a "System.String[]" type containing no $null values' { + + [System.String[]]$uriResourceNames = Get-AzDevOpsApiUriResourceName - { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName} | Should -Not -Throw + $null | Should -Not -BeIn $uriResourceNames } - It 'Should return "string" - ""' -TestCases $testCasesValidResourceName { - param ([string]$ResourceName) + It 'Should output a "System.String[]" type containing unique values' { - [string]$result = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName - $result.GetType() | Should -Be @('ApiUriResourceName1'.GetType()) + [System.String[]]$uriResourceNames = Get-AzDevOpsApiUriResourceName + + $uriResourceNames.Count | Should -Be $($uriResourceNames | Select-Object -Unique).Count } + # Create test cases for each 'UriResourceName' returned by 'Get-AzDevOpsApiUriResourceName' + #[Hashtable[]]$testCasesUriResourceNames = Get-AzDevOpsApiUriResourceName | + # ForEach-Object { + # @{ + # UriResourceName = $_ + # } + # } + + # TODO: Uncomment this test once 'Test-AzDevOpsApiUriResourceName' function available + #It 'Should output values that are all validated by "Test-AzDevOpsApiUriResourceName" - ""' -TestCases $testCasesUriResourceNames { + # param ([System.String]$UriResourceName) + # + # Test-AzDevOpsApiUriResourceName -UriResourceName $UriResourceName -IsValid | Should -BeTrue + #} } - Context 'When called with invalid "-ResourceName" parameter' { + Context 'When called with a "ResourceName" parameter value' { - $testCasesInvalidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + It 'Should not throw - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) - BeforeAll { + { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName } | Should -Not -Throw } - It 'Should throw - ""' -TestCases $testCasesInvalidResourceName { - param ([string]$ResourceName) - Write-Verbose $ResourceName + It 'Should output a "System.String[]" type containing exactly 1 value - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String[]]$uriResourceNames = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName - { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName} | Should -Throw + $uriResourceNames.Count | Should -BeExactly 1 } - } + It 'Should output a "System.String" type that is not null or empty - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String]$uriResourceName = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName + + $uriResourceName | Should -Not -BeNullOrEmpty + } + It 'Should output a "System.String" type that is lowercase - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String]$uriResourceName = Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName + + $uriResourceName | Should -BeExactly $($uriResourceName.ToLower()) + } + } } - } + Context "When input parameters are invalid" { + + Context 'When called with a "ResourceName" parameter value' { + It 'Should throw - ""' -TestCases $testCasesInvalidResourceNames { + param ([System.String]$ResourceName) + + { Get-AzDevOpsApiUriResourceName -ResourceName $ResourceName } | Should -Throw + } + } + } + } } From 242228c631d62d94a3c0bad8e83f88efc8872cf9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 19:37:25 +0000 Subject: [PATCH 355/611] Made minor renames of 'It' statements in 'Get-AzDevOpsApiHttpRequestHeader', unit tests --- .../Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index f9870e3ad..91894959c 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -21,7 +21,7 @@ InModuleScope $script:subModuleName { { Get-AzDevOpsApiHttpRequestHeader -Pat $Pat } | Should -Not -Throw } - It 'Should output a "Hashtable" - ""' -TestCases $testCasesValidPats { + It 'Should output a "Hashtable" type - ""' -TestCases $testCasesValidPats { param ([System.String]$Pat) $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat @@ -29,7 +29,7 @@ InModuleScope $script:subModuleName { $httpRequestHeader.GetType() | Should -Be $(@{}.GetType()) } - It 'Should output a "Hashtable" with an "Authorization" key - ""' -TestCases $testCasesValidPats { + It 'Should output a "Hashtable" type containing an "Authorization" key - ""' -TestCases $testCasesValidPats { param ([System.String]$Pat) $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat @@ -37,7 +37,7 @@ InModuleScope $script:subModuleName { $httpRequestHeader.ContainsKey('Authorization') | Should -BeTrue } - It 'Should output a "Hashtable" with an "Authorization" key that has a value beginning with "Basic " - ""' -TestCases $testCasesValidPats { + It 'Should output a "Hashtable" type containing an "Authorization" key that has a value beginning with "Basic " - ""' -TestCases $testCasesValidPats { param ([System.String]$Pat) $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat @@ -45,7 +45,7 @@ InModuleScope $script:subModuleName { $httpRequestHeader.Authorization | Should -BeLike "Basic *" } - It 'Should output a "Hashtable" with an "Authorization" key that has a value as expected - "" ' -TestCases $testCasesValidPats { + It 'Should output a "Hashtable" type containing an "Authorization" key that has a value as expected - "" ' -TestCases $testCasesValidPats { param ([System.String]$Pat) $Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$Pat")) @@ -54,7 +54,7 @@ InModuleScope $script:subModuleName { $httpRequestHeader.Authorization | Should -BeExactly $Authorization } - It 'Should output a "Hashtable" that is successfully validated by "Test-AzDevOpsApiHttpRequestHeader"' -TestCases $testCasesValidPats { + It 'Should output a "Hashtable" type that is successfully validated by "Test-AzDevOpsApiHttpRequestHeader" - ""' -TestCases $testCasesValidPats { param ([System.String]$Pat) $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat From abfbbea3d58df21e360fc0e90e2dcd98138a1ba3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:02:07 +0000 Subject: [PATCH 356/611] Added unit test for 'Get-AzDevOpsApiResourceName' to ensure unique values are returned. --- .../Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index ce52da93a..70eb4c28d 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -38,6 +38,13 @@ InModuleScope $script:subModuleName { $null | Should -Not -BeIn $resourceNames } + It 'Should output a "System.String[]" type containing unique values' { + + [System.String[]]$resourceNames = Get-AzDevOpsApiResourceName + + $resourceNames.Count | Should -Be $($resourceNames | Select-Object -Unique).Count + } + # Create test cases for each 'ResourceName' returned by 'Get-AzDevOpsApiResourceName' [Hashtable[]]$testCasesResourceNames = Get-AzDevOpsApiResourceName | ForEach-Object { From 7c955fd6d9834f0b876e2c5a7736e650d9bb6418 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:03:52 +0000 Subject: [PATCH 357/611] Added unit tests for 'Get-AzDevOpsApiVersion' function. --- .../Private/Get-AzDevOpsApiVersion.Tests.ps1 | 123 +++++++++++++----- 1 file changed, 92 insertions(+), 31 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 index ddf592f83..4824a7c94 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -1,72 +1,133 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiVersion' -Tag 'GetAzDevOpsApiVersion' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When called with valid parameters' { + $testCasesValidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' + $testCasesInvalidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + $supportedApiVersion = '6.0' - Context 'When called without "-Default" switch' { - BeforeAll { + Context 'When input parameters are valid' { - $testCasesValidApiVersion = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' - } + + Context 'When called with no parameter values' { It 'Should not throw' { - param () { Get-AzDevOpsApiVersion } | Should -Not -Throw } - It 'Should return "object[]" or "string"' { - param () + # Note: Only applicable if only 1 'ApiVersion' is supported + It "Should output a 'System.String' type containing an 'ApiVersion' of '$supportedApiVersion'" { + + [System.String]$apiVersion = Get-AzDevOpsApiVersion - $result = Get-AzDevOpsApiVersion - $result.GetType() | Should -BeIn @(@('ApiVersion1','ApiVersion2').GetType(),'ApiVersion1'.GetType()) + $apiVersion | Should -BeExactly $supportedApiVersion } - It 'Should return all resources that are present in $testCasesValidApiVersion variable'{ - param () + # Note: Only applicable if only 1 'ApiVersion' is supported + It 'Should output a "System.String[]" type containing no empty values' { - [string[]]$result = Get-AzDevOpsApiVersion - $result.Count | Should -Be $($testCasesValidApiVersion.Count) + [System.String[]]$apiVersions = Get-AzDevOpsApiVersion + + [System.String]::Empty | Should -Not -BeIn $apiVersions + } + + It 'Should output a "System.String[]" type containing no $null values' { + + [System.String[]]$apiVersions = Get-AzDevOpsApiVersion + + $null | Should -Not -BeIn $apiVersions + } + + It 'Should output a "System.String[]" type containing unique values' { + + [System.String[]]$apiVersions = Get-AzDevOpsApiVersion + + $apiVersions.Count | Should -Be $($apiVersions | Select-Object -Unique).Count + } + + #Create test cases for each 'ApiVersion' returned by 'Get-AzDevOpsApiVersion' + [Hashtable[]]$testCasesApiVersions = Get-AzDevOpsApiVersion | + ForEach-Object { + @{ + ApiVersion = $_ + } + } + + It 'Should output values that are all validated by "Test-AzDevOpsApiVersion" - ""' -TestCases $testCasesApiVersions { + param ([System.String]$ApiVersion) + + Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid | Should -BeTrue + } + + It 'Should output values that are in the valid, "ApiVersion" test cases - ""' -TestCases $testCasesValidApiVersions { + param ([System.String]$ApiVersion) + + $ApiVersion | Should -BeIn $([System.String[]]$(Get-AzDevOpsApiVersion)) } - } - Context 'When called with "-Default" switch' { + It 'Should not output values that are in the invalid, "ApiVersion" test cases - ""' -TestCases $testCasesInvalidApiVersions { + param ([System.String]$ApiVersion) - BeforeAll { - $defaultApiVersion = '6.0' # Note: This will need changing if the API version supported is updated - $testCasesValidApiVersion = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' + $ApiVersion | Should -Not -BeIn $([System.String[]]$(Get-AzDevOpsApiVersion)) } + } + + + Context 'When called with the "Default" switch parameter' { It 'Should not throw' { - param () { Get-AzDevOpsApiVersion -Default } | Should -Not -Throw } - It 'Should return "string"' { - param () + It 'Should output a "System.String[]" type containing exactly 1 value' { + + [System.String[]]$apiVersions = Get-AzDevOpsApiVersion -Default + + $apiVersions.Count | Should -BeExactly 1 + } + + It 'Should output a "System.String" type that is not null or empty' { + + [System.String]$uriResourceName = Get-AzDevOpsApiVersion -Default - [string]$result = Get-AzDevOpsApiVersion -Default - $result.GetType() | Should -Be @('ApiVersion1'.GetType()) + $uriResourceName | Should -Not -BeNullOrEmpty } - It "Should return the 'default' version ($defaultApiVersion)"{ - param () + It "Should output a 'System.String' type containing an 'ApiVersion' of '$supportedApiVersion'" { - [string]$result = Get-AzDevOpsApiVersion -Default - $result | Should -Be $defaultApiVersion + [System.String]$apiVersion = Get-AzDevOpsApiVersion -Default + + $apiVersion | Should -BeExactly $supportedApiVersion } } + + # Effectively identical to 'When called with no parameter values' context (with test cases above) + Context 'When called with a "Default" switch parameter value of $false' { + + It 'Should not throw' { + + { Get-AzDevOpsApiVersion -Default:$false } | Should -Not -Throw + } + } } - } + Context "When input parameters are invalid" { + + # N/A - Only the 'Default' switch parameter on this function/commands + + } + } } From c31b850621fed3ec9c7796a1b82af0afac55cd3a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:08:26 +0000 Subject: [PATCH 358/611] Made minor, casing change in 'Get-AzDevOpsApiHttpRequestHeader' unit tests --- .../Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 91894959c..25bce84d4 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -48,10 +48,10 @@ InModuleScope $script:subModuleName { It 'Should output a "Hashtable" type containing an "Authorization" key that has a value as expected - "" ' -TestCases $testCasesValidPats { param ([System.String]$Pat) - $Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$Pat")) + $authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$Pat")) $httpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat - $httpRequestHeader.Authorization | Should -BeExactly $Authorization + $httpRequestHeader.Authorization | Should -BeExactly $authorization } It 'Should output a "Hashtable" type that is successfully validated by "Test-AzDevOpsApiHttpRequestHeader" - ""' -TestCases $testCasesValidPats { From bddb6774cfb85fd7cf0de2f5c3dcfd309aee6ea3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:10:55 +0000 Subject: [PATCH 359/611] Minor spacing changes in 'Get-AzDevOpsApiHttpRequestHeader' and 'Get-AzDevOpsApiUriResourceName' unit tests --- .../Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 2 ++ .../Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 25bce84d4..513b1466c 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -13,6 +13,7 @@ InModuleScope $script:subModuleName { $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + Context 'When input parameters are valid' { It 'Should not throw - ""' -TestCases $testCasesValidPats { @@ -64,6 +65,7 @@ InModuleScope $script:subModuleName { } + Context "When input parameters are invalid" { It 'Should throw - ""' -TestCases $testCasesInvalidPats { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 index 60be6c52b..ff29b312a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 @@ -13,8 +13,10 @@ InModuleScope $script:subModuleName { $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + Context 'When input parameters are valid' { + Context 'When called with no parameter values' { It 'Should not throw' { @@ -66,6 +68,7 @@ InModuleScope $script:subModuleName { #} } + Context 'When called with a "ResourceName" parameter value' { It 'Should not throw - ""' -TestCases $testCasesValidResourceNames { @@ -100,6 +103,7 @@ InModuleScope $script:subModuleName { } } + Context "When input parameters are invalid" { Context 'When called with a "ResourceName" parameter value' { From 6401e0cfafb70c03dd11b7d7e0283d46f6d1600f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:28:40 +0000 Subject: [PATCH 360/611] Added unit tests for 'Get-AzDevOpsApiWaitIntervalMs' and 'Get-AzDevOpsApiWaitTimeoutMs' functions/commands. --- .../Private/Get-AzDevOpsApiWaitIntervalMs.ps1 | 2 +- .../Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 | 2 +- .../Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 | 43 +++++++++++++++++++ .../Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 | 43 +++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 index 30ae0467f..6c22badc5 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.ps1 @@ -12,7 +12,7 @@ function Get-AzDevOpsApiWaitIntervalMs { [CmdletBinding()] - [OutputType([int])] + [OutputType([Int32])] param () return 500 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 index 13c296b55..3e8dec726 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.ps1 @@ -12,7 +12,7 @@ function Get-AzDevOpsApiWaitTimeoutMs { [CmdletBinding()] - [OutputType([int])] + [OutputType([Int32])] param () return 10000 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 new file mode 100644 index 000000000..2d4a8b231 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 @@ -0,0 +1,43 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + [Int32]$expectedWaitIntervalMs = 500 + + + Context 'When input parameters are valid' { + + + Context 'When called with no parameter values' { + + It 'Should not throw' { + + { Get-AzDevOpsApiWaitIntervalMs } | Should -Not -Throw + } + + It "Should output a 'Int32' type containing an 'WaitIntervalMs' of '$expectedWaitIntervalMs'" { + + [Int32]$waitIntervalMs = Get-AzDevOpsApiWaitIntervalMs + + $waitIntervalMs | Should -BeExactly $expectedWaitIntervalMs + } + } + + } + + + Context "When input parameters are invalid" { + + # N/A - No parameters on this function/command + + } + } +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 new file mode 100644 index 000000000..876d60077 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 @@ -0,0 +1,43 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + [Int32]$expectedWaitTimeoutMs = 10000 + + + Context 'When input parameters are valid' { + + + Context 'When called with no parameter values' { + + It 'Should not throw' { + + { Get-AzDevOpsApiWaitTimeoutMs } | Should -Not -Throw + } + + It "Should output a 'Int32' type containing an 'WaitTimeoutMs' of '$expectedWaitTimeoutMs'" { + + [Int32]$waitTimeoutMs = Get-AzDevOpsApiWaitTimeoutMs + + $waitTimeoutMs | Should -BeExactly $expectedWaitTimeoutMs + } + } + + } + + + Context "When input parameters are invalid" { + + # N/A - No parameters on this function/command + + } + } +} From b9d5fa3aab30a7401e99e4841b07febe8430a16c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:53:37 +0000 Subject: [PATCH 361/611] Added 'Get-AzDevOpsApiUriAreaName' function, unit tests. --- .../Private/Get-AzDevOpsApiUriAreaName.ps1 | 1 + .../Get-AzDevOpsApiUriAreaName.Tests.ps1 | 114 ++++++++++++------ 2 files changed, 76 insertions(+), 39 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 index d70fc4de7..d5845780f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.ps1 @@ -28,6 +28,7 @@ function Get-AzDevOpsApiUriAreaName [hashtable]$resourceNameToApiUriAreaName = @{ Operation = 'core' # Note: Not explicitly listed here in documentation + Profile = 'profile' Project = 'core' } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 index 14065ea18..d70099ff3 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 @@ -1,83 +1,119 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiUriAreaName' -Tag 'GetAzDevOpsApiUriAreaName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When called with valid parameters' { + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' - Context 'When called without "-ResourceName" parameter' { - BeforeAll { + Context 'When input parameters are valid' { - $testCasesValidApiUriAreaName = Get-TestCase -ScopeName 'ApiUriAreaName' -TestCaseName 'Valid' - } + + Context 'When called with no parameter values' { It 'Should not throw' { - param () { Get-AzDevOpsApiUriAreaName } | Should -Not -Throw } - It 'Should return "object[]" or "string"' { - param () - - $result = Get-AzDevOpsApiUriAreaName - $result.GetType() | Should -BeIn @(@('ApiUriAreaName1','ApiUriAreaName2').GetType(),'ApiUriAreaName1'.GetType()) - } + It 'Should output a "System.String[]" type containing more than 1 value' { - It 'Should return all resources that are present in $testCasesValidApiUriAreaName variable'{ - param () + [System.String[]]$uriAreaNames = Get-AzDevOpsApiUriAreaName - [string[]]$result = Get-AzDevOpsApiUriAreaName - $result.Count | Should -Be $($testCasesValidApiUriAreaName.Count) + $uriAreaNames.Count | Should -BeGreaterThan 1 } - } - Context 'When called with valid "-ResourceName" parameter' { + It 'Should output a "System.String[]" type containing no empty values' { - $testCasesValidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + [System.String[]]$uriAreaNames = Get-AzDevOpsApiUriAreaName - BeforeAll { + [System.String]::Empty | Should -Not -BeIn $uriAreaNames } - It 'Should not throw - ""' -TestCases $testCasesValidResourceName { - param ([string]$ResourceName) - Write-Verbose $ResourceName + It 'Should output a "System.String[]" type containing no $null values' { + + [System.String[]]$uriAreaNames = Get-AzDevOpsApiUriAreaName - { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName} | Should -Not -Throw + $null | Should -Not -BeIn $uriAreaNames } - It 'Should return "string" - ""' -TestCases $testCasesValidResourceName { - param ([string]$ResourceName) + It 'Should output a "System.String[]" type containing unique values' { + + [System.String[]]$uriAreaNames = Get-AzDevOpsApiUriAreaName - [string]$result = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName - $result.GetType() | Should -Be @('ApiUriAreaName1'.GetType()) + $uriAreaNames.Count | Should -Be $($uriAreaNames | Select-Object -Unique).Count } + # Create test cases for each 'UriResourceName' returned by 'Get-AzDevOpsApiUriAreaName' + #[Hashtable[]]$testCasesUriResourceNames = Get-AzDevOpsApiUriAreaName | + # ForEach-Object { + # @{ + # UriResourceName = $_ + # } + # } + + # TODO: Uncomment this test once 'Test-AzDevOpsApiUriAreaName' function available + #It 'Should output values that are all validated by "Test-AzDevOpsApiUriAreaName" - ""' -TestCases $testCasesUriResourceNames { + # param ([System.String]$UriResourceName) + # + # Test-AzDevOpsApiUriAreaName -UriResourceName $UriResourceName -IsValid | Should -BeTrue + #} } - Context 'When called with invalid "-ResourceName" parameter' { - $testCasesInvalidResourceName = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + Context 'When called with a "ResourceName" parameter value' { - BeforeAll { + It 'Should not throw - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName } | Should -Not -Throw } - It 'Should throw - ""' -TestCases $testCasesInvalidResourceName { - param ([string]$ResourceName) - Write-Verbose $ResourceName + It 'Should output a "System.String[]" type containing exactly 1 value - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String[]]$uriAreaNames = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName - { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName} | Should -Throw + $uriAreaNames.Count | Should -BeExactly 1 } - } + It 'Should output a "System.String" type that is not null or empty - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String]$uriResourceName = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName + + $uriResourceName | Should -Not -BeNullOrEmpty + } + It 'Should output a "System.String" type that is lowercase - ""' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) + + [System.String]$uriResourceName = Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName + + $uriResourceName | Should -BeExactly $($uriResourceName.ToLower()) + } + } } - } + Context "When input parameters are invalid" { + + Context 'When called with a "ResourceName" parameter value' { + + It 'Should throw - ""' -TestCases $testCasesInvalidResourceNames { + param ([System.String]$ResourceName) + + { Get-AzDevOpsApiUriAreaName -ResourceName $ResourceName } | Should -Throw + } + } + } + } } From b95efffe2855a00cf2bfef15ae25739aa2bae001 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:54:40 +0000 Subject: [PATCH 362/611] Updated line spacing in 'Get-AzDevOpsApiResourceName' --- .../Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index 70eb4c28d..f1a333219 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -10,6 +10,7 @@ InModuleScope $script:subModuleName { Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + Context 'When input parameters are valid' { It 'Should not throw' { @@ -61,6 +62,7 @@ InModuleScope $script:subModuleName { } + Context "When input parameters are invalid" { # N/A - No parameters passed to function From d7c9b253f683505000ac1f7f853a5dc89af01b37 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:55:16 +0000 Subject: [PATCH 363/611] Revert "Updated line spacing in 'Get-AzDevOpsApiResourceName'" This reverts commit b95efffe2855a00cf2bfef15ae25739aa2bae001. --- .../Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index f1a333219..70eb4c28d 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -10,7 +10,6 @@ InModuleScope $script:subModuleName { Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { - Context 'When input parameters are valid' { It 'Should not throw' { @@ -62,7 +61,6 @@ InModuleScope $script:subModuleName { } - Context "When input parameters are invalid" { # N/A - No parameters passed to function From aa2a56b9bc3047649cfaad63fadf56897ebb863c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:57:24 +0000 Subject: [PATCH 364/611] Updated line spacing in 'Get-AzDevOpsApiResourceName' test cases. --- .../Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index 70eb4c28d..f1a333219 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -10,6 +10,7 @@ InModuleScope $script:subModuleName { Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + Context 'When input parameters are valid' { It 'Should not throw' { @@ -61,6 +62,7 @@ InModuleScope $script:subModuleName { } + Context "When input parameters are invalid" { # N/A - No parameters passed to function From 02207ba45297d90209b3c234ddc7b4c219bb0b56 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:57:44 +0000 Subject: [PATCH 365/611] Added placeholder scripts for future, unit tests. --- .../Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 | 0 .../Functions/Private/_TODO2.Get-AzDevOpsApiResourceUri.Tests.ps1 | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResourceUri.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResourceUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResourceUri.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From 1b0cccd9c7f3aaea0f8c36994e9d1cf417f6a2d5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:58:26 +0000 Subject: [PATCH 366/611] Removed empty, TODO files --- .../Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 | 1 - .../Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 | 1 - .../Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 | 1 - .../Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 | 1 - 4 files changed, 4 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO_New-AzDevOpsApiObject.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO_Wait-AzDevOpsOperation.ps1 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Remove-AzDevOpsProject.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO_Set-AzDevOpsProject.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - From ce75a7b181748d9da2e3b5d31e9741ce1740644e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 10 Nov 2020 20:59:14 +0000 Subject: [PATCH 367/611] Removed empty, test files. --- .../Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 | 1 - .../Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 | 1 - 2 files changed, 2 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Remove-AzDevOpsProject.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Set-AzDevOpsProject.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - From be9a9f32646f47f8e5a78378eb991010c5d9c792 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:13:06 +0000 Subject: [PATCH 368/611] Added empty, test script placeholder files --- .../Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 0 .../Functions/Private/_TODO2.New-AzDevOpsApiResource.Tests.ps1 | 0 .../Functions/Private/_TODO2.Remove-AzDevOpsApiResource.Tests.ps1 | 0 .../Functions/Private/_TODO2.Set-AzDevOpsApiResource.Tests.ps1 | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.New-AzDevOpsApiResource.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Remove-AzDevOpsApiResource.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Set-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.New-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.New-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Remove-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Remove-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Set-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Set-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From 65518dfd67c402f03d16cc9f0b6125643b6a4fd5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:40:46 +0000 Subject: [PATCH 369/611] Added 'Test-AzDevOpsApiHttpRequestHeader' function, unit tests --- ...est-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 new file mode 100644 index 000000000..7c2977a37 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -0,0 +1,100 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + $testCasesValidHttpRequestHeaders = Get-TestCase -ScopeName 'HttpRequestHeader' -TestCaseName 'Valid' + $testCasesInvalidHttpRequestHeaders = Get-TestCase -ScopeName 'HttpRequestHeader' -TestCaseName 'Invalid' + + + Context 'When input parameters are valid' { + + + Context 'When called with "HttpRequestHeader" parameter value and the "IsValid" switch' { + + + Context 'When "HttpRequestHeader" parameter value is a valid "HttpRequestHeader"' { + + It 'Should not throw - ""' -TestCases $testCasesValidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid } | Should -Not -Throw + } + + It 'Should return $true' -TestCases $testCasesValidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid | Should -BeTrue + } + } + + + Context 'When "HttpRequestHeader" parameter value is an invalid "HttpRequestHeader"' { + + It 'Should not throw - ""' -TestCases $testCasesInvalidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid } | Should -Not -Throw + } + + It 'Should return $false' -TestCases $testCasesInvalidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid | Should -BeFalse + } + } + } + } + + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + param ([Hashtable]$HttpRequestHeader) + + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader:$null } | Should -Throw + } + } + + + Context 'When "HttpRequestHeader" parameter value is a valid "HttpRequestHeader"' { + + + Context 'When called with "HttpRequestHeader" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesValidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid:$false } | Should -Throw + } + } + } + + + Context 'When "HttpRequestHeader" parameter value is an invalid "HttpRequestHeader"' { + + + Context 'When called with "HttpRequestHeader" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesInvalidHttpRequestHeaders { + param ([Hashtable]$HttpRequestHeader) + + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid:$false } | Should -Throw + } + } + } + + + } + } +} From fefdb46c075d1c855a4a3368d00da8b4dc55a087 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:50:30 +0000 Subject: [PATCH 370/611] Added unit tests for 'Test-AzDevOpsApiResourceId' --- .../Test-AzDevOpsApiResourceId.Tests.ps1 | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 index 999f48d5a..8ba9ff817 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 @@ -1,98 +1,100 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiResourceId' -Tag 'TestAzDevOpsApiResourceId' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' - $testCasesEmptyResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Empty' $testCasesInvalidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "ResourceId" parameter value and the "IsValid" switch' { + - Context 'When called with valid "ResourceId" parameter' { + Context 'When "ResourceId" parameter value is a valid "ResourceId"' { It 'Should not throw - ""' -TestCases $testCasesValidResourceIds { - param ([string]$ResourceId) + param ([System.String]$ResourceId) { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidResourceIds { - param ([string]$ResourceId) + It 'Should return $true' -TestCases $testCasesValidResourceIds { + param ([System.String]$ResourceId) - $result = Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid - $result | Should -Be $true + Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid | Should -BeTrue } } - Context 'When called with invalid "ResourceId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyResourceIds { - param ([string]$ResourceId) - - { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Throw - } + Context 'When "ResourceId" parameter value is an invalid "ResourceId"' { It 'Should not throw - ""' -TestCases $testCasesInvalidResourceIds { - param ([string]$ResourceId) + param ([System.String]$ResourceId) { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidResourceIds { - param ([string]$ResourceId) + It 'Should return $false' -TestCases $testCasesInvalidResourceIds { + param ([System.String]$ResourceId) - $result = Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid - $result | Should -Be $false + Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + param ([System.String]$ResourceId) + + { Test-AzDevOpsApiResourceId -ResourceId:$null } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ResourceId" parameter' { + Context 'When "ResourceId" parameter value is a valid "ResourceId"' { + + + Context 'When called with "ResourceId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidResourceIds { - param ([string]$ResourceId) + param ([System.String]$ResourceId) { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ResourceId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyResourceIds { - param ([string]$ResourceId) + Context 'When "ResourceId" parameter value is an invalid "ResourceId"' { - { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw - } + + Context 'When called with "ResourceId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidResourceIds { - param ([string]$ResourceId) + param ([System.String]$ResourceId) { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid:$false } | Should -Throw } - } - } - } + + } } } From 50fe5d2806f4e78a097431e7711bf2be39c69f01 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:50:39 +0000 Subject: [PATCH 371/611] Added unit tests for 'Test-AzDevOpsApiResourceName' --- .../Test-AzDevOpsApiResourceName.Tests.ps1 | 90 +++++++++---------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 index 9141424e0..503388668 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 @@ -1,110 +1,100 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiResourceName' -Tag 'TestAzDevOpsApiResourceName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' - $testCasesEmptyResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Empty' $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' - Context 'When validating, valid "ResourceName" test cases' { - It 'Should also be returned from "Get-AzDevOpsApiResourceName" function - ' -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + Context 'When input parameters are valid' { - $($(Get-AzDevOpsApiResourceName | - Where-Object { $_ -ceq $ResourceName})) | Should -Be $ResourceName - } - - } + Context 'When called with "ResourceName" parameter value and the "IsValid" switch' { - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { - - Context 'When called with valid "ResourceName" parameter' { + Context 'When "ResourceName" parameter value is a valid "ResourceName"' { It 'Should not throw - ""' -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + param ([System.String]$ResourceName) { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + It 'Should return $true' -TestCases $testCasesValidResourceNames { + param ([System.String]$ResourceName) - $result = Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid - $result | Should -Be $true + Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid | Should -BeTrue } } - Context 'When called with invalid "ResourceName" parameter' { - - It 'Should throw - ""' -TestCases $testCasesEmptyResourceNames { - param ([string]$ResourceName) - { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Throw - } + Context 'When "ResourceName" parameter value is an invalid "ResourceName"' { It 'Should not throw - ""' -TestCases $testCasesInvalidResourceNames { - param ([string]$ResourceName) + param ([System.String]$ResourceName) { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidResourceNames { - param ([string]$ResourceName) + It 'Should return $false' -TestCases $testCasesInvalidResourceNames { + param ([System.String]$ResourceName) - $result = Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid - $result | Should -Be $false + Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + param ([System.String]$ResourceName) + + { Test-AzDevOpsApiResourceName -ResourceName:$null } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ResourceName" parameter' { + Context 'When "ResourceName" parameter value is a valid "ResourceName"' { + + + Context 'When called with "ResourceName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidResourceNames { - param ([string]$ResourceName) + param ([System.String]$ResourceName) { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ResourceName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyResourceNames { - param ([string]$ResourceName) + Context 'When "ResourceName" parameter value is an invalid "ResourceName"' { - { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw - } + + Context 'When called with "ResourceName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidResourceNames { - param ([string]$ResourceName) + param ([System.String]$ResourceName) { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid:$false } | Should -Throw } - } - } - } + + } } } From 986aa711639e77769a46ba872ec05f9585319b2b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:50:51 +0000 Subject: [PATCH 372/611] Added unit tests for 'Test-AzDevOpsApiUri' --- .../Functions/Private/Test-AzDevOpsApiUri.ps1 | 4 +- .../Private/Test-AzDevOpsApiUri.Tests.ps1 | 84 ++++++++++--------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 index 827af4c12..96a607772 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -42,8 +42,8 @@ function Test-AzDevOpsApiUri New-InvalidOperationException -Message $errorMessage } - if(($ApiUri -inotlike 'http://*' -and $ApiUri -inotlike 'https://*') -or - $ApiUri -inotlike '*/_apis/') + if (($ApiUri -inotlike 'http://*' -and $ApiUri -inotlike 'https://*') -or + $ApiUri -inotlike '*/_apis/') { return $false } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 4e43f5b83..03943a167 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -1,98 +1,100 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiUri' -Tag 'TestAzDevOpsApiUri' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "ApiUri" parameter value and the "IsValid" switch' { + - Context 'When called with valid "ApiUri" parameter' { + Context 'When "ApiUri" parameter value is a valid "ApiUri"' { It 'Should not throw - ""' -TestCases $testCasesValidApiUris { - param ([string]$ApiUri) + param ([System.String]$ApiUri) { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidApiUris { - param ([string]$ApiUri) + It 'Should return $true' -TestCases $testCasesValidApiUris { + param ([System.String]$ApiUri) - $result = Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid - $result | Should -Be $true + Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid | Should -BeTrue } } - Context 'When called with invalid "ApiUri" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyApiUris { - param ([string]$ApiUri) - - { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Throw - } + Context 'When "ApiUri" parameter value is an invalid "ApiUri"' { It 'Should not throw - ""' -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) + param ([System.String]$ApiUri) { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) + It 'Should return $false' -TestCases $testCasesInvalidApiUris { + param ([System.String]$ApiUri) - $result = Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid - $result | Should -Be $false + Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + param ([System.String]$ApiUri) + + { Test-AzDevOpsApiUri -ApiUri:$null } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ApiUri" parameter' { + Context 'When "ApiUri" parameter value is a valid "ApiUri"' { + + + Context 'When called with "ApiUri" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidApiUris { - param ([string]$ApiUri) + param ([System.String]$ApiUri) { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ApiUri" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyApiUris { - param ([string]$ApiUri) + Context 'When "ApiUri" parameter value is an invalid "ApiUri"' { - { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw - } + + Context 'When called with "ApiUri" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) + param ([System.String]$ApiUri) { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid:$false } | Should -Throw } - } - } - } + + } } } From 13476191764f2e90220e9694b5da7eab6317dbc9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:51:05 +0000 Subject: [PATCH 373/611] Added unit tests for 'Test-AzDevOpsApiVersion' --- .../Private/Test-AzDevOpsApiVersion.Tests.ps1 | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index 4e0729dae..eda7e0e49 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -1,98 +1,100 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsApiVersion' -Tag 'TestAzDevOpsApiVersion' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' - $testCasesEmptyApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Empty' $testCasesInvalidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "ApiVersion" parameter value and the "IsValid" switch' { + - Context 'When called with valid "ApiVersion" parameter' { + Context 'When "ApiVersion" parameter value is a valid "ApiVersion"' { It 'Should not throw - ""' -TestCases $testCasesValidApiVersions { - param ([string]$ApiVersion) + param ([System.String]$ApiVersion) { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidApiVersions { - param ([string]$ApiVersion) + It 'Should return $true' -TestCases $testCasesValidApiVersions { + param ([System.String]$ApiVersion) - $result = Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid - $result | Should -Be $true + Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid | Should -BeTrue } } - Context 'When called with invalid "ApiVersion" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyApiVersions { - param ([string]$ApiVersion) - - { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Throw - } + Context 'When "ApiVersion" parameter value is an invalid "ApiVersion"' { It 'Should not throw - ""' -TestCases $testCasesInvalidApiVersions { - param ([string]$ApiVersion) + param ([System.String]$ApiVersion) { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidApiVersions { - param ([string]$ApiVersion) + It 'Should return $false' -TestCases $testCasesInvalidApiVersions { + param ([System.String]$ApiVersion) - $result = Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid - $result | Should -Be $false + Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + param ([System.String]$ApiVersion) + + { Test-AzDevOpsApiVersion -ApiVersion:$null } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ApiVersion" parameter' { + Context 'When "ApiVersion" parameter value is a valid "ApiVersion"' { + + + Context 'When called with "ApiVersion" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidApiVersions { - param ([string]$ApiVersion) + param ([System.String]$ApiVersion) { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ApiVersion" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyApiVersions { - param ([string]$ApiVersion) + Context 'When "ApiVersion" parameter value is an invalid "ApiVersion"' { - { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw - } + + Context 'When called with "ApiVersion" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidApiVersions { - param ([string]$ApiVersion) + param ([System.String]$ApiVersion) { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid:$false } | Should -Throw } - } - } - } + + } } } From c715b8309a3523f750156739b9901e682c2760f5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:51:44 +0000 Subject: [PATCH 374/611] Added placeholder script for 'Test-AzDevOpsApiResource' unit tests --- .../Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From f41641565c3a1a46e7bcdf205c8e04742e419da0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:53:29 +0000 Subject: [PATCH 375/611] Added placeholder script for 'Wait-AzDevOpsApiResource', unit tests --- .../Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From dd3c48cecb74c8055ffbb66fc1f0635cbb446c55 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 08:54:10 +0000 Subject: [PATCH 376/611] Deleted 'New-AzDevOpsConnection' script/function --- .../Public/New-AzDevOpsConnection.ps1 | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 deleted file mode 100644 index 17af57686..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/New-AzDevOpsConnection.ps1 +++ /dev/null @@ -1,59 +0,0 @@ -# <# -# .SYNOPSIS -# Creates a 'Connection' (assocated with the Organization/ApiUrl) to be used with other functions/cmdlets in this PSModule. - -# .PARAMETER ApiUri -# The URI of the Azure DevOps API to be connected to. For example: - -# https://dev.azure.com/someOrganizationName/_apis/ - -# .PARAMETER Pat -# The 'Personal Access Token' (PAT) to be used by any subsequent requests/operations -# against the Azure DevOps API. This PAT must have the relevant permissions assigned -# for the subsequent operations being performed. - -# .PARAMETER Credential -# The 'Credential' to be used by any subsequent requests against the Azure DevOps API. -# This credential must have the relevant permissions assigned for the subsequent operations -# being performed. - -# .EXAMPLE -# New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Pat 'YourPatHere' - -# Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'Personal Access Token' (PAT)) to be used with other functions/cmdlets in this PSModule. - -# .EXAMPLE -# New-AzDevOpsConnection -ApiUri 'YourApiUriHere' -Credential $YourCredentialHere - -# Creates a 'Connection' (assocated with the Organization/ApiUrl and using a provided 'PSCredential' object) to be used with other functions/cmdlets in this PSModule. -# #> -# function New-AzDevOpsConnection -# { -# [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] -# [OutputType([System.Object])] -# param -# ( -# [Parameter(Mandatory = $true)] -# [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] -# [Alias('Uri')] -# [System.String] -# $ApiUri, - -# [Parameter(Mandatory = $true, ParameterSetName = 'Pat')] -# [ValidateScript({ Test-AzDevOpsPat -Pat $_ -IsValid })] -# [Alias('PersonalAccessToken')] -# [System.String] -# $Pat, - -# [Parameter(Mandatory = $true, ParameterSetName = 'Credential')] -# [ValidateScript({ Test-AzDevOpsCredential -Credential $_ -IsValid })] -# [System.Management.Automation.PSCredential] -# $Credential -# ) - -# [System.Object]$connection = $null - -# # TODO! - -# return $connection -# } From e9eb9c4cb9e09ca0264e4bad5c77fc43e5219702 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:06:34 +0000 Subject: [PATCH 377/611] Added 'Test-AzDevOpsPatCredential' function, unit tests --- .../Test-AzDevOpsPatCredential.Tests.ps1 | 99 +++++++++++++++++++ .../Modules/TestHelpers/CommonTestCases.psm1 | 17 ++-- 2 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 new file mode 100644 index 000000000..07ecd5f32 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 @@ -0,0 +1,99 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + $testCasesValidPatCredentials = Get-TestCase -ScopeName 'PatCredential' -TestCaseName 'Valid' + $testCasesInvalidPatCredentials = Get-TestCase -ScopeName 'PatCredential' -TestCaseName 'Invalid' + + + Context 'When input parameters are valid' { + + + Context 'When called with "PatCredential" parameter value and the "IsValid" switch' { + + + Context 'When "PatCredential" parameter value is a valid "PatCredential"' { + + It 'Should not throw - ""' -TestCases $testCasesValidPatCredentials { + param ([PSCredential]$PatCredential) + + { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid } | Should -Not -Throw + } + + It 'Should return $true' -TestCases $testCasesValidPatCredentials { + param ([PSCredential]$PatCredential) + + Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid | Should -BeTrue + } + } + + + Context 'When "PatCredential" parameter value is an invalid "PatCredential"' { + + It 'Should not throw - ""' -TestCases $testCasesInvalidPatCredentials { + param ([PSCredential]$PatCredential) + + { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid } | Should -Not -Throw + } + + It 'Should return $false' -TestCases $testCasesInvalidPatCredentials { + param ([PSCredential]$PatCredential) + + Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid | Should -BeFalse + } + } + } + } + + + Context "When input parameters are invalid" { + + + Context 'When called with no/null/empty parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsPatCredential -PatCredential $([PSCredential]::Empty) -IsValid:$false } | Should -Throw + } + } + + + Context 'When "PatCredential" parameter value is a valid "PatCredential"' { + + + Context 'When called with "PatCredential" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesValidPatCredentials { + param ([PSCredential]$PatCredential) + + { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid:$false } | Should -Throw + } + } + } + + + Context 'When "PatCredential" parameter value is an invalid "PatCredential"' { + + + Context 'When called with "PatCredential" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesInvalidPatCredentials { + param ([PSCredential]$PatCredential) + + { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid:$false } | Should -Throw + } + } + } + + + } + } +} diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index f0a2e8133..0be5e73bc 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -259,9 +259,8 @@ function Get-TestCaseValue New-Object System.Management.Automation.PSCredential ($PatCredentialUsername, $PatSecure) } - Empty = $testCaseValues.String.Empty + Empty = @([PSCredential]::Empty) Null = $testCaseValues.String.Null - NullOrWhitespace = $testCaseValues.String.NullOrWhitespace } @@ -274,14 +273,20 @@ function Get-TestCaseValue $Pat = $_ @{ Authorization = 'Basic ' + - [Convert]::ToBase64String( - [Text.Encoding]::ASCII.GetBytes(":$Pat")) + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat")) } } Invalid = @( - @{} - ) + $testCaseValues.String.NullOrWhitespace + @{}, + @{ + # Note: Spelled with an 's' + Authorisation = 'Basic ' + + [Convert]::ToBase64String( + [Text.Encoding]::ASCII.GetBytes(":$Pat")) + } + ) Empty = $testCaseValues.String.Empty Null = $testCaseValues.String.Null From 06f9b6c213b5e917deb95bc017950b1ef2bb7edd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:10:12 +0000 Subject: [PATCH 378/611] Updated a number of test scripts to include an '-IsValid:$false' parameter usage in the 'When called with no/null parameter values/switches' context --- .../Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 3 +-- .../Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 | 3 +-- .../Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 | 3 +-- .../Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 | 3 +-- .../Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 7c2977a37..cffcc7339 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -60,9 +60,8 @@ InModuleScope $script:subModuleName { Context 'When called with no/null parameter values/switches' { It 'Should throw' { - param ([Hashtable]$HttpRequestHeader) - { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader:$null } | Should -Throw + { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader:$null -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 index 8ba9ff817..fe00c8a5b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 @@ -60,9 +60,8 @@ InModuleScope $script:subModuleName { Context 'When called with no/null parameter values/switches' { It 'Should throw' { - param ([System.String]$ResourceId) - { Test-AzDevOpsApiResourceId -ResourceId:$null } | Should -Throw + { Test-AzDevOpsApiResourceId -ResourceId:$null -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 index 503388668..603c60cc8 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 @@ -60,9 +60,8 @@ InModuleScope $script:subModuleName { Context 'When called with no/null parameter values/switches' { It 'Should throw' { - param ([System.String]$ResourceName) - { Test-AzDevOpsApiResourceName -ResourceName:$null } | Should -Throw + { Test-AzDevOpsApiResourceName -ResourceName:$null -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 03943a167..29bceb935 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -60,9 +60,8 @@ InModuleScope $script:subModuleName { Context 'When called with no/null parameter values/switches' { It 'Should throw' { - param ([System.String]$ApiUri) - { Test-AzDevOpsApiUri -ApiUri:$null } | Should -Throw + { Test-AzDevOpsApiUri -ApiUri:$null -IsValid:$false } | Should -Throw } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index eda7e0e49..2e43ada3f 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -60,9 +60,8 @@ InModuleScope $script:subModuleName { Context 'When called with no/null parameter values/switches' { It 'Should throw' { - param ([System.String]$ApiVersion) - { Test-AzDevOpsApiVersion -ApiVersion:$null } | Should -Throw + { Test-AzDevOpsApiVersion -ApiVersion:$null -IsValid:$false } | Should -Throw } } From 401ede926f426a8c85e58830bc269fd464dd644b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:19:47 +0000 Subject: [PATCH 379/611] Added unit tests for 'Test-AzDevOpsOperationId', 'Test-AzDevOpsOrganizationName', 'Test-AzDevOpsPat', 'Test-AzDevOpsProjectDescription', 'Test-AzDevOpsProjectId' and Test-AzDevOpsProjectName' functions --- .../Test-AzDevOpsOperationId.Tests.ps1 | 95 ++++++++----------- .../Test-AzDevOpsOrganizationName.Tests.ps1 | 83 ++++++++-------- .../Private/Test-AzDevOpsPat.Tests.ps1 | 83 ++++++++-------- .../Test-AzDevOpsProjectDescription.Tests.ps1 | 79 +++++++-------- .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 95 ++++++++----------- .../Test-AzDevOpsProjectName.Tests.ps1 | 83 ++++++++-------- 6 files changed, 248 insertions(+), 270 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index 6cc8302db..d27dbb562 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -1,112 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOperationId' -Tag 'TestAzDevOpsOperationId' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' - $testCasesEmptyOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Empty' $testCasesInvalidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { - Context 'When called with valid "OperationId" parameter' { - It 'Should not throw - ""' -TestCases $testCasesValidOperationIds { - param ([string]$OperationId) + Context 'When called with "OperationId" parameter value and the "IsValid" switch' { - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw - } - It 'Should return $true - ""' -TestCases $testCasesValidOperationIds { - param ([string]$OperationId) + Context 'When "OperationId" parameter value is a valid "OperationId"' { - $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $true + It 'Should not throw - ""' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw } - It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidOperationIds { - param ([string]$OperationId) + It 'Should return $true' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) - $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid) + Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeTrue } } - Context 'When called with invalid "OperationId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyOperationIds { - param ([string]$OperationId) - - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Throw - } + Context 'When "OperationId" parameter value is an invalid "OperationId"' { It 'Should not throw - ""' -TestCases $testCasesInvalidOperationIds { - param ([string]$OperationId) + param ([System.String]$OperationId) { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidOperationIds { - param ([string]$OperationId) + It 'Should return $false' -TestCases $testCasesInvalidOperationIds { + param ([System.String]$OperationId) - $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $false + Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeFalse } + } + } + } - It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesInvalidOperationIds { - param ([string]$OperationId) - $result = Test-AzDevOpsOperationId -OperationId $OperationId -IsValid - $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid) - } - } + Context "When input parameters are invalid" { - } - } + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { - Context 'When called with invalid parameters' { - BeforeAll { + { Test-AzDevOpsOperationId -OperationId:$null -IsValid:$false } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "OperationId" parameter' { + Context 'When "OperationId" parameter value is a valid "OperationId"' { + + + Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidOperationIds { - param ([string]$OperationId) + param ([System.String]$OperationId) { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "OperationId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyOperationIds { - param ([string]$OperationId) + Context 'When "OperationId" parameter value is an invalid "OperationId"' { - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw - } + + Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidOperationIds { - param ([string]$OperationId) + param ([System.String]$OperationId) { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw } - } - } - } + + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index 433dc2fba..634bf36b9 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -1,100 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOrganizationName' -Tag 'TestAzDevOpsOrganizationName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' - $testCasesEmptyOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Empty' $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "OrganizationName" parameter value and the "IsValid" switch' { + - Context 'When called with valid "OrganizationName" parameter' { + Context 'When "OrganizationName" parameter value is a valid "OrganizationName"' { It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) + param ([System.String]$OrganizationName) { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) + It 'Should return $true' -TestCases $testCasesValidOrganizationNames { + param ([System.String]$OrganizationName) - $result = Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid - $result | Should -Be $true + Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid | Should -BeTrue } } - Context 'When called with invalid "OrganizationName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyOrganizationNames { - param ([string]$OrganizationName) - - { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Throw - } + Context 'When "OrganizationName" parameter value is an invalid "OrganizationName"' { It 'Should not throw - ""' -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) + param ([System.String]$OrganizationName) { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) + It 'Should return $false' -TestCases $testCasesInvalidOrganizationNames { + param ([System.String]$OrganizationName) - $result = Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid - $result | Should -Be $false + Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsOrganizationName -OrganizationName:$null -IsValid:$false } | Should -Throw + } } - $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' - Context 'When called without using "-IsValid" switch' { + Context 'When "OrganizationName" parameter value is a valid "OrganizationName"' { + - Context 'When called with valid "OrganizationName" parameter' { + Context 'When called with "OrganizationName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) + param ([System.String]$OrganizationName) { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "OrganizationName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyOrganizationNames { - param ([string]$OrganizationName) + Context 'When "OrganizationName" parameter value is an invalid "OrganizationName"' { - { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw - } + + Context 'When called with "OrganizationName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) + param ([System.String]$OrganizationName) { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid:$false } | Should -Throw } - } - } - } + + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index 1906aef1e..e5551e916 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -1,98 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsPat' -Tag 'TestAzDevOpsPat' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "Pat" parameter value and the "IsValid" switch' { + - Context 'When called with valid "Pat" parameter' { + Context 'When "Pat" parameter value is a valid "Pat"' { It 'Should not throw - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + param ([System.String]$Pat) { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + It 'Should return $true' -TestCases $testCasesValidPats { + param ([System.String]$Pat) - $result = Test-AzDevOpsPat -Pat $Pat -IsValid - $result | Should -Be $true + Test-AzDevOpsPat -Pat $Pat -IsValid | Should -BeTrue } } - Context 'When called with invalid "Pat" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyPats { - param ([string]$Pat) - - { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Throw - } + Context 'When "Pat" parameter value is an invalid "Pat"' { It 'Should not throw - ""' -TestCases $testCasesInvalidPats { - param ([string]$Pat) + param ([System.String]$Pat) { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidPats { - param ([string]$Pat) + It 'Should return $false' -TestCases $testCasesInvalidPats { + param ([System.String]$Pat) - $result = Test-AzDevOpsPat -Pat $Pat -IsValid - $result | Should -Be $false + Test-AzDevOpsPat -Pat $Pat -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsPat -Pat:$null -IsValid:$false } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "Pat" parameter' { + Context 'When "Pat" parameter value is a valid "Pat"' { + + + Context 'When called with "Pat" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidPats { - param ([string]$Pat) + param ([System.String]$Pat) { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "Pat" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyPats { - param ([string]$Pat) + Context 'When "Pat" parameter value is an invalid "Pat"' { - { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw - } + + Context 'When called with "Pat" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidPats { - param ([string]$Pat) + param ([System.String]$Pat) { Test-AzDevOpsPat -Pat $Pat -IsValid:$false } | Should -Throw } - } - } - } + + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 index 33894e905..55b0aec6b 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -1,94 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectDescription' -Tag 'TestAzDevOpsProjectDescription' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Valid' - $testCasesEmptyProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Empty' $testCasesInvalidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "ProjectDescription" parameter value and the "IsValid" switch' { - Context 'When called with valid "ProjectDescription" parameter' { + + Context 'When "ProjectDescription" parameter value is a valid "ProjectDescription"' { It 'Should not throw - ""' -TestCases $testCasesValidProjectDescriptions { - param ([string]$ProjectDescription) + param ([System.String]$ProjectDescription) { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidProjectDescriptions { - param ([string]$ProjectDescription) + It 'Should return $true' -TestCases $testCasesValidProjectDescriptions { + param ([System.String]$ProjectDescription) - $result = Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid - $result | Should -Be $true + Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid | Should -BeTrue } } - Context 'When called with invalid "ProjectDescription" parameter' { + + Context 'When "ProjectDescription" parameter value is an invalid "ProjectDescription"' { It 'Should not throw - ""' -TestCases $testCasesInvalidProjectDescriptions { - param ([string]$ProjectDescription) + param ([System.String]$ProjectDescription) { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidProjectDescriptions { - param ([string]$ProjectDescription) + It 'Should return $false' -TestCases $testCasesInvalidProjectDescriptions { + param ([System.String]$ProjectDescription) - $result = Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid - $result | Should -Be $false + Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsProjectDescription -ProjectDescription:$null -IsValid:$false } | Should -Throw + } } - $testCasesValidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Valid' - Context 'When called without using "-IsValid" switch' { + Context 'When "ProjectDescription" parameter value is a valid "ProjectDescription"' { + - Context 'When called with valid "ProjectDescription" parameter' { + Context 'When called with "ProjectDescription" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidProjectDescriptions { - param ([string]$ProjectDescription) + param ([System.String]$ProjectDescription) { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ProjectDescription" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectDescriptions { - param ([string]$ProjectDescription) + Context 'When "ProjectDescription" parameter value is an invalid "ProjectDescription"' { - { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw - } + + Context 'When called with "ProjectDescription" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidProjectDescriptions { - param ([string]$ProjectDescription) + param ([System.String]$ProjectDescription) { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid:$false } | Should -Throw } - } - } - } + + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index 09b6142d8..56f6c00b1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -1,112 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectId' -Tag 'TestAzDevOpsProjectId' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $testCasesEmptyProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Empty' $testCasesInvalidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { - Context 'When called with valid "ProjectId" parameter' { - It 'Should not throw - ""' -TestCases $testCasesValidProjectIds { - param ([string]$ProjectId) + Context 'When called with "ProjectId" parameter value and the "IsValid" switch' { - { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw - } - It 'Should return $true - ""' -TestCases $testCasesValidProjectIds { - param ([string]$ProjectId) + Context 'When "ProjectId" parameter value is a valid "ProjectId"' { - $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $true + It 'Should not throw - ""' -TestCases $testCasesValidProjectIds { + param ([System.String]$ProjectId) + + { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw } - It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidProjectIds { - param ([string]$ProjectId) + It 'Should return $true' -TestCases $testCasesValidProjectIds { + param ([System.String]$ProjectId) - $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid) + Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid | Should -BeTrue } } - Context 'When called with invalid "ProjectId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectIds { - param ([string]$ProjectId) - - { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Throw - } + Context 'When "ProjectId" parameter value is an invalid "ProjectId"' { It 'Should not throw - ""' -TestCases $testCasesInvalidProjectIds { - param ([string]$ProjectId) + param ([System.String]$ProjectId) { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidProjectIds { - param ([string]$ProjectId) + It 'Should return $false' -TestCases $testCasesInvalidProjectIds { + param ([System.String]$ProjectId) - $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $false + Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid | Should -BeFalse } + } + } + } - It 'Should return same as "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesInvalidProjectIds { - param ([string]$ProjectId) - $result = Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid - $result | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid) - } - } + Context "When input parameters are invalid" { - } - } + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { - Context 'When called with invalid parameters' { - BeforeAll { + { Test-AzDevOpsProjectId -ProjectId:$null -IsValid:$false } | Should -Throw + } } - Context 'When called without using "-IsValid" switch' { - Context 'When called with valid "ProjectId" parameter' { + Context 'When "ProjectId" parameter value is a valid "ProjectId"' { + + + Context 'When called with "ProjectId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidProjectIds { - param ([string]$ProjectId) + param ([System.String]$ProjectId) { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ProjectId" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectIds { - param ([string]$ProjectId) + Context 'When "ProjectId" parameter value is an invalid "ProjectId"' { - { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw - } + + Context 'When called with "ProjectId" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidProjectIds { - param ([string]$ProjectId) + param ([System.String]$ProjectId) { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid:$false } | Should -Throw } - } - } - } + + } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index cca5643e7..f4539c8f7 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -1,100 +1,99 @@ # Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 InModuleScope $script:subModuleName { + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:tag = @($($script:commandName -replace '-')) - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProjectName' -Tag 'TestAzDevOpsProjectName' { + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $testCasesEmptyProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Empty' $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' - Context 'When called with valid parameters' { - BeforeAll { - } - Context 'When called using "-IsValid" switch' { + Context 'When input parameters are valid' { + + + Context 'When called with "ProjectName" parameter value and the "IsValid" switch' { + - Context 'When called with valid "ProjectName" parameter' { + Context 'When "ProjectName" parameter value is a valid "ProjectName"' { It 'Should not throw - ""' -TestCases $testCasesValidProjectNames { - param ([string]$ProjectName) + param ([System.String]$ProjectName) { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw } - It 'Should return $true - ""' -TestCases $testCasesValidProjectNames { - param ([string]$ProjectName) + It 'Should return $true' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) - $result = Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid - $result | Should -Be $true + Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeTrue } } - Context 'When called with invalid "ProjectName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectNames { - param ([string]$ProjectName) - - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Throw - } + Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { It 'Should not throw - ""' -TestCases $testCasesInvalidProjectNames { - param ([string]$ProjectName) + param ([System.String]$ProjectName) { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw } - It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { - param ([string]$ProjectName) + It 'Should return $false' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) - $result = Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid - $result | Should -Be $false + Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeFalse } } - } - } - Context 'When called with invalid parameters' { - BeforeAll { + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsProjectName -ProjectName:$null -IsValid:$false } | Should -Throw + } } - $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - Context 'When called without using "-IsValid" switch' { + Context 'When "ProjectName" parameter value is a valid "ProjectName"' { + - Context 'When called with valid "ProjectName" parameter' { + Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesValidProjectNames { - param ([string]$ProjectName) + param ([System.String]$ProjectName) { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw } - } + } - Context 'When called with invalid "ProjectName" parameter' { - It 'Should throw - ""' -TestCases $testCasesEmptyProjectNames { - param ([string]$ProjectName) + Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw - } + + Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { It 'Should throw - ""' -TestCases $testCasesInvalidProjectNames { - param ([string]$ProjectName) + param ([System.String]$ProjectName) { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw } - } - } - } + + } } } From eb0f0d93ccdb747331b88f04cd4141d21c841682 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:27:33 +0000 Subject: [PATCH 380/611] Added test case name/value into certain 'Should return $true/$false" unit tests. --- .../Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 | 4 ++-- .../Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 | 4 ++-- .../Private/Test-AzDevOpsProjectDescription.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 index cffcc7339..c36573d68 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidHttpRequestHeaders { + It 'Should return $true - ""' -TestCases $testCasesValidHttpRequestHeaders { param ([Hashtable]$HttpRequestHeader) Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidHttpRequestHeaders { + It 'Should return $false - ""' -TestCases $testCasesInvalidHttpRequestHeaders { param ([Hashtable]$HttpRequestHeader) Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $HttpRequestHeader -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 index fe00c8a5b..26764c537 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidResourceIds { + It 'Should return $true - ""' -TestCases $testCasesValidResourceIds { param ([System.String]$ResourceId) Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidResourceIds { + It 'Should return $false - ""' -TestCases $testCasesInvalidResourceIds { param ([System.String]$ResourceId) Test-AzDevOpsApiResourceId -ResourceId $ResourceId -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 index 603c60cc8..0eb0e8b5a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidResourceNames { + It 'Should return $true - ""' -TestCases $testCasesValidResourceNames { param ([System.String]$ResourceName) Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidResourceNames { + It 'Should return $false - ""' -TestCases $testCasesInvalidResourceNames { param ([System.String]$ResourceName) Test-AzDevOpsApiResourceName -ResourceName $ResourceName -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 29bceb935..7766f9ceb 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidApiUris { + It 'Should return $true - ""' -TestCases $testCasesValidApiUris { param ([System.String]$ApiUri) Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidApiUris { + It 'Should return $false - ""' -TestCases $testCasesInvalidApiUris { param ([System.String]$ApiUri) Test-AzDevOpsApiUri -ApiUri $ApiUri -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index 2e43ada3f..9ae090295 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidApiVersions { + It 'Should return $true - ""' -TestCases $testCasesValidApiVersions { param ([System.String]$ApiVersion) Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidApiVersions { + It 'Should return $false - ""' -TestCases $testCasesInvalidApiVersions { param ([System.String]$ApiVersion) Test-AzDevOpsApiVersion -ApiVersion $ApiVersion -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 index 07ecd5f32..1ab0f4956 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidPatCredentials { + It 'Should return $true - ""' -TestCases $testCasesValidPatCredentials { param ([PSCredential]$PatCredential) Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidPatCredentials { + It 'Should return $false - ""' -TestCases $testCasesInvalidPatCredentials { param ([PSCredential]$PatCredential) Test-AzDevOpsPatCredential -PatCredential $PatCredential -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index d27dbb562..087edf02d 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidOperationIds { + It 'Should return $true - ""' -TestCases $testCasesValidOperationIds { param ([System.String]$OperationId) Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidOperationIds { + It 'Should return $false - ""' -TestCases $testCasesInvalidOperationIds { param ([System.String]$OperationId) Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index 634bf36b9..f73a477d1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidOrganizationNames { + It 'Should return $true - ""' -TestCases $testCasesValidOrganizationNames { param ([System.String]$OrganizationName) Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidOrganizationNames { + It 'Should return $false - ""' -TestCases $testCasesInvalidOrganizationNames { param ([System.String]$OrganizationName) Test-AzDevOpsOrganizationName -OrganizationName $OrganizationName -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index e5551e916..4e56fa319 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidPats { + It 'Should return $true - ""' -TestCases $testCasesValidPats { param ([System.String]$Pat) Test-AzDevOpsPat -Pat $Pat -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsPat -Pat $Pat -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidPats { + It 'Should return $false - ""' -TestCases $testCasesInvalidPats { param ([System.String]$Pat) Test-AzDevOpsPat -Pat $Pat -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 index 55b0aec6b..9d5f589ae 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidProjectDescriptions { + It 'Should return $true - ""' -TestCases $testCasesValidProjectDescriptions { param ([System.String]$ProjectDescription) Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidProjectDescriptions { + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectDescriptions { param ([System.String]$ProjectDescription) Test-AzDevOpsProjectDescription -ProjectDescription $ProjectDescription -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index 56f6c00b1..bf7b38b63 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidProjectIds { + It 'Should return $true - ""' -TestCases $testCasesValidProjectIds { param ([System.String]$ProjectId) Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidProjectIds { + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectIds { param ([System.String]$ProjectId) Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid | Should -BeFalse diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index f4539c8f7..f98640e31 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -28,7 +28,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw } - It 'Should return $true' -TestCases $testCasesValidProjectNames { + It 'Should return $true - ""' -TestCases $testCasesValidProjectNames { param ([System.String]$ProjectName) Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeTrue @@ -44,7 +44,7 @@ InModuleScope $script:subModuleName { { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw } - It 'Should return $false' -TestCases $testCasesInvalidProjectNames { + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { param ([System.String]$ProjectName) Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeFalse From 03c33cc85842c867df3085fb62421e63eff0e660 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:30:49 +0000 Subject: [PATCH 381/611] Renamed a number of '\Resources\Functions\Public' test files to '...Tests.Old.ps1' --- ...OpsOperation.Tests.ps1 => Get-AzDevOpsOperation.Tests.Old.ps1} | 0 ...zDevOpsProject.Tests.ps1 => Get-AzDevOpsProject.Tests.Old.ps1} | 0 ...zDevOpsProject.Tests.ps1 => New-AzDevOpsProject.Tests.Old.ps1} | 0 ...psOperation.Tests.ps1 => Test-AzDevOpsOperation.Tests.Old.ps1} | 0 ...DevOpsProject.Tests.ps1 => Test-AzDevOpsProject.Tests.Old.ps1} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{Get-AzDevOpsOperation.Tests.ps1 => Get-AzDevOpsOperation.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{Get-AzDevOpsProject.Tests.ps1 => Get-AzDevOpsProject.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{New-AzDevOpsProject.Tests.ps1 => New-AzDevOpsProject.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{Test-AzDevOpsOperation.Tests.ps1 => Test-AzDevOpsOperation.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/{Test-AzDevOpsProject.Tests.ps1 => Test-AzDevOpsProject.Tests.Old.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/New-AzDevOpsProject.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 From 0d6e9e0182fc248dd6409dffdc57b1f4fe840c4b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:31:55 +0000 Subject: [PATCH 382/611] Deleted, non-required test scripts --- .../Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 | 1 - .../Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 | 1 - 2 files changed, 2 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_TODO_New-AzDevOpsCredential.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 deleted file mode 100644 index 8b1378917..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_TODO_New-AzDevOpsConnection.Tests.ps1 +++ /dev/null @@ -1 +0,0 @@ - From 3e406596c6fff86e9e5fc97ce0ba063b99ac8cf5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:32:30 +0000 Subject: [PATCH 383/611] Added placeholder script for 'Wait-AzDevOpsOperation' function, unit tests --- .../Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From 6a94b8c8c1d90805228b85a5d66a66280e451440 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:34:35 +0000 Subject: [PATCH 384/611] Renamed unit test scripts for 'Get-AzDevOpsApiResource' and 'Invoke-AzDevOpsApiRestMethod' functions to add an '.Old' suffix. --- ...piResource.Tests.ps1 => Get-AzDevOpsApiResource.Tests.Old.ps1} | 0 ...ethod.Tests.ps1 => Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Get-AzDevOpsApiResource.Tests.ps1 => Get-AzDevOpsApiResource.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Invoke-AzDevOpsApiRestMethod.Tests.ps1 => Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 From 2a3759d892d8ee02706a99e73bcee3e390162968 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:38:38 +0000 Subject: [PATCH 385/611] Renamed old, test file for generic, function tests --- ...SEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/{AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 => _USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.Resources.Functions.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 From 28993c5d1a7d3128010671449f9a8eeed6a4e4ab Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:39:40 +0000 Subject: [PATCH 386/611] Moved useful tests script into 'tests\Unit\Modules' directory. --- ...USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/{AzureDevOpsDsc.Common => }/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 b/tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 rename to tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 From ddb3ae9cabddc4b169618d9c8e2ff6a009832a23 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:58:44 +0000 Subject: [PATCH 387/611] Renamed 'Get-AzDevOpsServicesApiUri' and 'Get-AzDevOpsServicesUri' with '.Old' prefix --- ...sApiUri.Tests.ps1 => Get-AzDevOpsServicesApiUri.Tests.Old.ps1} | 0 ...ervicesUri.Tests.ps1 => Get-AzDevOpsServicesUri.Tests.Old.ps1} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/{Get-AzDevOpsServicesApiUri.Tests.ps1 => Get-AzDevOpsServicesApiUri.Tests.Old.ps1} (100%) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/{Get-AzDevOpsServicesUri.Tests.ps1 => Get-AzDevOpsServicesUri.Tests.Old.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 From 360a79698b59c1cbe3dfd1d91ef306fc4a1fa93d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 09:58:58 +0000 Subject: [PATCH 388/611] Added 'JaCoCo_coverage.xml' to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index ab2af191a..399209b3a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ output/ markdownissues.txt node_modules package-lock.json + +JaCoCo_coverage.xml From 1065a4407c98b9174cc95fe1649bf18eb88fc80a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 20:00:00 +0000 Subject: [PATCH 389/611] Updated 'Wait-AzDevOpsApiResource' function 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' to be 'Int32' types (rather than UInt32) --- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index cd0d3bfba..e7e7b8357 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -90,13 +90,13 @@ function Wait-AzDevOpsApiResource [Parameter()] [ValidateRange(250,10000)] [Alias('Interval','IntervalMilliseconds')] - [System.UInt32] + [System.Int32] $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] [ValidateRange(250,10000)] [Alias('Timeout','TimeoutMilliseconds')] - [System.UInt32] + [System.Int32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter(Mandatory = $true, ParameterSetName='IsPresent')] From 4c3ac6dddc1cadf800c027cbdca06859f65ccef7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 20:01:07 +0000 Subject: [PATCH 390/611] Updated 'Wait-AzDevOpsOperation' function 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' to be 'Int32' types (rather than UInt32). Also implemented use of 'Get-Date' and 'Test-AzDevOpsTimeoutExceeded'. --- .../Functions/Private/Wait-AzDevOpsOperation.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 76e9fed00..5dd81425b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -71,13 +71,13 @@ function Wait-AzDevOpsOperation [Parameter()] [ValidateRange(250,10000)] [Alias('Interval','IntervalMilliseconds')] - [System.UInt32] + [System.Int32] $WaitIntervalMilliseconds = $(Get-AzDevOpsApiWaitIntervalMs), [Parameter()] [ValidateRange(250,10000)] [Alias('Timeout','TimeoutMilliseconds')] - [System.UInt32] + [System.Int32] $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter(Mandatory = $true, ParameterSetName='IsComplete')] @@ -101,7 +101,7 @@ function Wait-AzDevOpsOperation } - [System.DateTime]$waitStartDateTime = [System.DateTime]::UtcNow + [System.DateTime]$waitStartDateTime = $(Get-Date).ToUniversalTime() $testOperationParameters = @{ ApiUri = $ApiUri @@ -123,7 +123,7 @@ function Wait-AzDevOpsOperation { Start-Sleep -Milliseconds $WaitIntervalMilliseconds - if ($(New-TimeSpan -Start $waitStartDateTime -End $([System.DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) + if (Test-AzDevOpsTimeoutExceeded -StartTime $waitStartDateTime -End $($(Get-Date).ToUniversalTime()) -TimeoutMs $WaitTimeoutMilliseconds ) { $errorMessage = $script:localizedData.AzDevOpsOperationWaitTimeoutExceeded -f $MyInvocation.MyCommand, $OperationId, $WaitTimeoutMilliseconds New-InvalidOperationException -Message $errorMessage From 3109337c8942f67b183b0a9a4acb7ced1142d94e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 20:11:39 +0000 Subject: [PATCH 391/611] Added 'Test-AzDevOpsTimeoutExceeded' function. --- .../Private/Test-AzDevOpsTimeoutExceeded.ps1 | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 new file mode 100644 index 000000000..404a3697d --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 @@ -0,0 +1,50 @@ +<# + .SYNOPSIS + Peforms test on the provided 'StartTime' and 'EndTime', and the provided 'TimeoutMs' + value to indicate if a timeout duration has expired. + + Returns $true if the test is the duration/difference of time (in Milliseconds) between + the 2 times is greater than the 'TimeOutMs' value (indicates the timeout has been exceeded). + + Returns $false otherwise. + + NOTE: Ensure both 'StartTime' and 'EndTime' use values in the same time zone. + + .PARAMETER StartTime + The 'StartTime' of when the timeout duration began. + + .PARAMETER EndTime + The 'EndTime' of when the timeout duration ended (typically the current time). + + .PARAMETER TimeoutMs + The number of milliseconds set as the timeout to evaluate against. + + .EXAMPLE + Test-AzDevOpsTimeoutExceeded -StartTime $someStartTime -EndTime $someEndTime -TimeoutMs 1000 + + Returns $true if the duration between the value of $someStartTime and $someEndTime is greater than + 1000 milliseconds (1 second). + + Returns $false if it is not. +#> +function Test-AzDevOpsTimeoutExceeded +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [Datetime] + $StartTime, + + [Parameter(Mandatory = $true)] + [Datetime] + $EndTime, + + [Parameter(Mandatory = $true)] + [Int32] + $TimeoutMs + ) + + return $($(New-TimeSpan -Start $StartTime -End $EndTime).Milliseconds -gt $TimeoutMs) +} From 9ca61d5c1cbd6fcea993aa37280849dbaf82d559 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 22:30:03 +0000 Subject: [PATCH 392/611] Added first attempt at 'Wait-AzDevOpsOperation', function, unit tests (supporting code coverage). --- .../Private/Wait-AzDevOpsOperation.Tests.ps1 | 649 ++++++++++++++++++ 1 file changed, 649 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..a6fb3f6c4 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1,649 @@ + +$script:moduleName = 'AzureDevOpsDsc' +$script:subModuleName = 'AzureDevOpsDsc.Common' +Import-Module -Name $(((Get-Module -Name $script:moduleName -ListAvailable | Select-Object -First 1)).ModuleBase +'\'+ $script:moduleName + ".psd1") -Force -Verbose + +InModuleScope $script:subModuleName { + + $script:moduleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:moduleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:moduleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + # Get default, parameter values + $defaultWaitIntervalMilliseconds = Get-AzDevOpsApiWaitIntervalMs + $defaultWaitTimeoutMilliseconds = Get-AzDevOpsApiWaitTimeoutMs + + # Mock functions called in function + Mock Get-AzDevOpsApiWaitIntervalMs {} + Mock Get-AzDevOpsApiWaitTimeoutMs {} + # Mock Get-Date {} # Do not mock + # Mock New-InvalidOperationException {} # Do not mock + Mock Start-Sleep {} + Mock Test-AzDevOpsOperation {} + Mock Test-AzDevOpsTimeoutExceeded {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesValidApiUriPatOperationIds3 = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidOperationIds) -Expand + $testCasesValidApiUriPatOperationIds3 = $testCasesValidApiUriPatOperationIds3 | Select-Object -First 3 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatOperationIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidOperationIds) -Expand + $testCasesInvalidApiUriPatOperationIds3 = $testCasesInvalidApiUriPatOperationIds | Select-Object -First 3 + + + Context 'When input parameters are valid' { + + + Context "When called with all, mandatory parameters ('ApiUri', 'Pat' and 'OperationId')" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Throw + } + + + Context "When also called with mandatory, 'IsComplete', switch parameter" { + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } + Mock Test-AzDevOpsOperation { return $true } + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Not -Throw + } + + It "Should output null/nothing - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $output = Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + $output | Should -BeNullOrEmpty + } + + It "Should invoke 'Get-AzDevOpsApiWaitIntervalMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-AzDevOpsApiWaitTimeoutMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 1 -Exactly -Scope It + } + + + Context "When 'Test-AzDevOpsOperation' returns true" { + + It "Should invoke 'Test-AzDevOpsOperation' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Test-AzDevOpsOperation { return $true } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Test-AzDevOpsOperation' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Get-Date' -Times 1 -Exactly -Scope It + } + + It "Should not invoke 'Start-Sleep' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Test-AzDevOpsTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Test-AzDevOpsTimeoutExceeded {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 0 -Exactly -Scope It + } + } + + + Context "When 'Test-AzDevOpsOperation' returns false, then true" { + + + Context "When 'WaitTimeoutMilliseconds' has not been exceeded" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsOperation { + $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) + return !($script:mockTestAzDevOpsOperationInvoked) + } + Mock Test-AzDevOpsTimeoutExceeded { return $false } + + It "Should invoke 'Test-AzDevOpsOperation' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false + Mock Test-AzDevOpsOperation { + $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) + return !($script:mockTestAzDevOpsOperationInvoked) + } + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Test-AzDevOpsOperation' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Get-Date' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Start-Sleep' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Test-AzDevOpsTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock + Mock Test-AzDevOpsTimeoutExceeded { return $false } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 1 -Exactly -Scope It + } + + } + } + + + Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsTimeoutExceeded' returns true)" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsOperation { return $false } # i.e. Operation has not completed + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Throw + } + } + + + Context "When also called with optional, 'WaitIntervalMilliseconds' parameter" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + + } + + + Context "When also called with optional, 'WaitTimeoutMilliseconds' parameter" { + + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + Context "When also called with both optional, 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + } + + + Context "When also called with mandatory, 'IsSuccessful', switch parameter" { + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } + Mock Test-AzDevOpsOperation { return $true } + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Not -Throw + } + + It "Should output null/nothing - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $output = Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + $output | Should -BeNullOrEmpty + } + + It "Should invoke 'Get-AzDevOpsApiWaitIntervalMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-AzDevOpsApiWaitTimeoutMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 1 -Exactly -Scope It + } + + + Context "When 'Test-AzDevOpsOperation' returns true" { + + It "Should invoke 'Test-AzDevOpsOperation' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Test-AzDevOpsOperation { return $true } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Test-AzDevOpsOperation' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Get-Date' -Times 1 -Exactly -Scope It + } + + It "Should not invoke 'Start-Sleep' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Test-AzDevOpsTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Test-AzDevOpsTimeoutExceeded {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 0 -Exactly -Scope It + } + } + + + Context "When 'Test-AzDevOpsOperation' returns false, then true" { + + + Context "When 'WaitTimeoutMilliseconds' has not been exceeded" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsOperation { + $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) + return !($script:mockTestAzDevOpsOperationInvoked) + } + Mock Test-AzDevOpsTimeoutExceeded { return $false } + + It "Should invoke 'Test-AzDevOpsOperation' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false + Mock Test-AzDevOpsOperation { + $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) + return !($script:mockTestAzDevOpsOperationInvoked) + } + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Test-AzDevOpsOperation' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Get-Date' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Start-Sleep' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Test-AzDevOpsTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock + Mock Test-AzDevOpsTimeoutExceeded { return $false } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful + + Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 1 -Exactly -Scope It + } + + } + } + + + Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsTimeoutExceeded' returns true)" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsOperation { return $false } # i.e. Operation has not completed + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Throw + } + } + + + Context "When also called with optional, 'WaitIntervalMilliseconds' parameter" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + + } + + + Context "When also called with optional, 'WaitTimeoutMilliseconds' parameter" { + + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + Context "When also called with both optional, 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + } + } + + + + + + + + + + + + + + + # EXISTING - TO REMOVE BELOW + Context 'When called with "OperationId" parameter value and the "IsValid" switch' { + + + Context 'When "OperationId" parameter value is a valid "OperationId"' { + + It 'Should not throw - ""' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) + + Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeTrue + } + } + + + Context 'When "OperationId" parameter value is an invalid "OperationId"' { + + It 'Should not throw - ""' -TestCases $testCasesInvalidOperationIds { + param ([System.String]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidOperationIds { + param ([System.String]$OperationId) + + Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeFalse + } + } + } + } + + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsOperationId -OperationId:$null -IsValid:$false } | Should -Throw + } + } + + + Context 'When "OperationId" parameter value is a valid "OperationId"' { + + + Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw + } + } + } + + + Context 'When "OperationId" parameter value is an invalid "OperationId"' { + + + Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesInvalidOperationIds { + param ([System.String]$OperationId) + + { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw + } + } + } + + + } + } +} From 29df5190fb1be7715b555b82b4441dd43227f491 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 22:49:14 +0000 Subject: [PATCH 393/611] Updated 'AzureDevOpsDsc.Common.TestInitialization' script to find/import modules correctly in order to support function, unit tests. --- ...ureDevOpsDsc.Common.TestInitialization.ps1 | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 index 787378387..f0960d985 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 @@ -12,18 +12,11 @@ if (-not (Test-BuildCategory -Type 'Unit')) } $script:dscModuleName = 'AzureDevOpsDsc' +$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") $script:subModuleName = 'AzureDevOpsDsc.Common' +Import-Module -Name $script:dscModuleFile -Force -Verbose -#region HEADER -Remove-Module -Name $script:subModuleName -Force -ErrorAction 'SilentlyContinue' - -$script:parentModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 -$script:subModulesFolder = Join-Path -Path $script:parentModule.ModuleBase -ChildPath 'Modules' - -$script:subModulePath = Join-Path -Path $script:subModulesFolder -ChildPath $script:subModuleName - -Import-Module -Name $script:subModulePath -Force -ErrorAction 'Stop' -#endregion HEADER - -# Loading mocked classes -#Add-Type -Path (Join-Path -Path (Join-Path -Path $PSScriptRoot -ChildPath 'Stubs') -ChildPath 'SomeExampleMockedClass.cs') +$script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' +$script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" +Import-Module -Name $script:subModuleFile -Force -Verbose From 87677b3ae6afb267aa07c958f3f9d949edaa174c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 22:50:24 +0000 Subject: [PATCH 394/611] Commented out all 'AzureDevOpsDsc.Common.Tests.Initialization.ps1' script for now. --- ...eDevOpsDsc.Common.Tests.Initialization.ps1 | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 index be848b770..131f5dd13 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 @@ -1,35 +1,34 @@ -#region HEADER -$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path -$ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { - ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and - $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } - ).BaseName +# #region HEADER +# $ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path +# $ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { +# ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and +# $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } +# ).BaseName -#Write-Warning "ProjectPath : $ProjectPath" -#Write-Warning "ProjectName : $ProjectName" +# #Write-Warning "ProjectPath : $ProjectPath" +# #Write-Warning "ProjectName : $ProjectName" -$script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 -#Write-Warning "ParentModule : $script:ParentModule" -$script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' -#Write-Warning "SubModulesFolder : $script:SubModulesFolder" +# $script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 +# #Write-Warning "ParentModule : $script:ParentModule" +# $script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' +# #Write-Warning "SubModulesFolder : $script:SubModulesFolder" -Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue +# Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue -$script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' -#Write-Warning "SubModuleName : $script:SubModuleName" -Remove-Module $script:SubModuleName -force -ErrorAction SilentlyContinue -$script:SubmoduleFile = Join-Path $script:SubModulesFolder "$($script:SubModuleName)/$($script:SubModuleName).psm1" -#Write-Warning "SubmoduleFile : $script:SubmoduleFile" +# $script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' +# #Write-Warning "SubModuleName : $script:SubModuleName" +# #Remove-Module $script:SubModuleName -force -ErrorAction SilentlyContinue +# #Write-Warning "SubmoduleFile : $script:SubmoduleFile" -#endregion HEADER +# #endregion HEADER -Import-Module $script:SubmoduleFile -Force -ErrorAction Stop +# #Import-Module $script:SubmoduleFile -Force -ErrorAction Stop -# Import helper modules containing helper functions and test values/cases -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestHelper.psm1') -Force -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestCases.psm1') -Force +# # Import helper modules containing helper functions and test values/cases +# Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestHelper.psm1') -Force +# Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestCases.psm1') -Force From 623754954e2dd2a0fc542b76b3e5ab010e85ed07 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 22:53:25 +0000 Subject: [PATCH 395/611] Added placeholder script for 'Test-AzDevOpsTimeoutExceeded', unit tests. --- .../Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From 14aa894ae159113ae96e6c473093ee9cc152c861 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 22:58:48 +0000 Subject: [PATCH 396/611] Updated a number of tests to amend the way that the set is setup and the file(s) are sourced for code coverage. --- .../Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiVersion.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 | 8 ++++++++ .../Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 | 8 ++++++++ .../Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsApiResourceId.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsApiResourceName.Tests.ps1 | 8 ++++++++ .../Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsApiVersion.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsPatCredential.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsOperationId.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsOrganizationName.Tests.ps1 | 8 ++++++++ .../Functions/Private/Test-AzDevOpsPat.Tests.ps1 | 8 ++++++++ .../Test-AzDevOpsProjectDescription.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsProjectId.Tests.ps1 | 8 ++++++++ .../Private/Test-AzDevOpsProjectName.Tests.ps1 | 8 ++++++++ .../Private/Wait-AzDevOpsOperation.Tests.ps1 | 12 ++++++------ 20 files changed, 158 insertions(+), 6 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 513b1466c..270d79152 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index f1a333219..80549fa49 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 index d70099ff3..4b4e8f3db 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 index ff29b312a..d8611ccc3 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 index 4824a7c94..a8fab12b7 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 index 2d4a8b231..936946e83 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { [Int32]$expectedWaitIntervalMs = 500 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 index 876d60077..648c76c0a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { [Int32]$expectedWaitTimeoutMs = 10000 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 index c36573d68..996f48f38 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidHttpRequestHeaders = Get-TestCase -ScopeName 'HttpRequestHeader' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 index 26764c537..98f3125f6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 index 0eb0e8b5a..24450a00e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 7766f9ceb..3f7993d87 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index 9ae090295..01d62c4c6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidApiVersions = Get-TestCase -ScopeName 'ApiVersion' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 index 1ab0f4956..92b1e0db6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidPatCredentials = Get-TestCase -ScopeName 'PatCredential' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index 087edf02d..963b9f8f6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index f73a477d1..05e326561 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index 4e56fa319..6926a0e96 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 index 9d5f589ae..78417c629 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectDescriptions = Get-TestCase -ScopeName 'ProjectDescription' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index bf7b38b63..bf3015f27 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index f98640e31..e41e3ab76 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -4,10 +4,18 @@ InModuleScope $script:subModuleName { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) + . $script:commandScriptPath + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 index a6fb3f6c4..36a3d00ec 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -1,16 +1,16 @@ -$script:moduleName = 'AzureDevOpsDsc' -$script:subModuleName = 'AzureDevOpsDsc.Common' -Import-Module -Name $(((Get-Module -Name $script:moduleName -ListAvailable | Select-Object -First 1)).ModuleBase +'\'+ $script:moduleName + ".psd1") -Force -Verbose +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + InModuleScope $script:subModuleName { - $script:moduleName = 'AzureDevOpsDsc' - $script:moduleVersion = $(Get-Module -Name $script:moduleName -ListAvailable | Select-Object -First 1).Version + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:moduleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath From 59eb4f26eb0b8bb685c540d64a6f40b82e74468f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 23:18:41 +0000 Subject: [PATCH 397/611] Updated 'InModuleScope' name to be hard-coded, 'AzureDevOpsDsc.Common' value in a number of 'Private' (Resources) function, test scripts --- .../Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 | 2 +- .../Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 | 2 +- .../Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 | 2 +- .../Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index 963b9f8f6..e3e48a152 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 index 05e326561..6313548bf 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 index 6926a0e96..381c4d6d6 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 index 78417c629..5646337fe 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index bf3015f27..5c26bed22 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index e41e3ab76..ddaff3343 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 index 36a3d00ec..4b54f436e 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -3,7 +3,7 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version From b26acd1ad7fd0a4813ffaaa85963cf008840ff42 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 11 Nov 2020 23:22:55 +0000 Subject: [PATCH 398/611] Updated a number of test scripts to amend 'InModuleScope'. module name and amend path of dot-sourced, function script. --- .../Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 4 ++-- .../Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 | 4 ++-- .../Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 | 4 ++-- .../Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 | 4 ++-- .../Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 | 4 ++-- .../Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 | 4 ++-- .../Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 | 4 ++-- .../Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 | 4 ++-- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 270d79152..b03170072 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 index 80549fa49..68f829c67 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResourceName.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 index 4b4e8f3db..d075813bd 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriAreaName.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 index d8611ccc3..639639ea3 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiUriResourceName.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 index a8fab12b7..8e28c30b7 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiVersion.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 index 936946e83..f79fa9e34 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitIntervalMs.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 index 648c76c0a..3d2df3ff4 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiWaitTimeoutMs.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 index 996f48f38..deb54d585 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 index 98f3125f6..0951e05da 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 index 24450a00e..873bb161c 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 index 3f7993d87..92cc4d3d8 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 index 01d62c4c6..9e81ef7ab 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 index 92b1e0db6..87b2a93f8 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.Tests.ps1 @@ -3,14 +3,14 @@ . $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 -InModuleScope $script:subModuleName { +InModuleScope 'AzureDevOpsDsc.Common' { $script:dscModuleName = 'AzureDevOpsDsc' $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Connection\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath From b8fd0b7de781dd1365082ef88f45aa5616f0be63 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 09:05:40 +0000 Subject: [PATCH 399/611] Removed validation of 'IsComplete' and 'IsSuccessful' parameters within 'Wait-AzDevOpsOperation' function. --- .../Functions/Private/Wait-AzDevOpsOperation.ps1 | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 5dd81425b..756af6ff2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -89,18 +89,6 @@ function Wait-AzDevOpsOperation $IsSuccessful ) - if (!$IsComplete -and !$IsSuccessful) - { - $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - elseif ($IsComplete -and $IsSuccessful) - { - $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - - [System.DateTime]$waitStartDateTime = $(Get-Date).ToUniversalTime() $testOperationParameters = @{ From 1de00857eaa1eb590b80c0c3d3579da89df57307 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 09:06:00 +0000 Subject: [PATCH 400/611] Added test to support removal of validation of 'IsComplete' and 'IsSuccessful' parameters within 'Wait-AzDevOpsOperation' function. --- .../Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 index 4b54f436e..13563c624 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -551,6 +551,16 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } + + + Context "When also called with both mandatory, 'IsComplete' and 'IsSuccessful', switch parameters" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) + + { Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -IsSuccessful } | Should -Throw + } + } } From 2ba23cc82a236905823f75773cdaf66e73d1920b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 09:14:09 +0000 Subject: [PATCH 401/611] Removed functionality to validate use of 'IsValid' parameter within 'Test-' functions (as this is now done via the parameter validation 'Parameter/Mandatory' and 'ValidateSet' attributes). --- .../Private/Test-AzDevOpsApiHttpRequestHeader.ps1 | 7 ------- .../Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 | 6 ------ .../Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 | 6 ------ .../Api/Functions/Private/Test-AzDevOpsApiUri.ps1 | 6 ------ .../Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 | 6 ------ .../Functions/Private/Test-AzDevOpsPatCredential.ps1 | 6 ------ .../Functions/Private/Test-AzDevOpsOperationId.ps1 | 6 ------ .../Functions/Private/Test-AzDevOpsOrganizationName.ps1 | 6 ------ .../Resources/Functions/Private/Test-AzDevOpsPat.ps1 | 6 ------ .../Functions/Private/Test-AzDevOpsProjectDescription.ps1 | 6 ------ .../Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 | 6 ------ .../Functions/Private/Test-AzDevOpsProjectName.ps1 | 6 ------ 12 files changed, 73 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 index c6934608a..6527f3b59 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 @@ -36,13 +36,6 @@ function Test-AzDevOpsApiHttpRequestHeader $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - - if ($null -eq $HttpRequestHeader -or $null -eq $HttpRequestHeader.Authorization -or $HttpRequestHeader.Authorization -inotlike 'Basic *') diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 index bd371e61b..4741cdf76 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsApiResourceId $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if (![guid]::TryParse($ResourceId, $([ref][guid]::Empty))) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 index 1ba68f599..06526e626 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsApiResourceName $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if (!($(Get-AzDevOpsApiResourceName).Contains($ResourceName))) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 index 96a607772..7be92d8ec 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsApiUri $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if (($ApiUri -inotlike 'http://*' -and $ApiUri -inotlike 'https://*') -or $ApiUri -inotlike '*/_apis/') { diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 index 1efd0382c..0c51ee871 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 @@ -37,12 +37,6 @@ function Test-AzDevOpsApiVersion $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - $supportedApiVersions = @( '6.0' ) diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 index a6b874890..a1d7cdc35 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 @@ -37,12 +37,6 @@ function Test-AzDevOpsPatCredential $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if ($null -eq $PatCredential -or 'PAT' -ne $PatCredential.UserName) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 index 2276e4f59..3641eefa7 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsOperationId $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if (!(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid:$IsValid)) { return $false diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index c2d1f4049..f1400570f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsOrganizationName $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if ([System.String]::IsNullOrWhiteSpace($OrganizationName) -or ($OrganizationName.Contains(' ') -or $OrganizationName.Contains('%') -or $OrganizationName.Contains('*') -or $OrganizationName.StartsWith(' ') -or $OrganizationName.EndsWith(' '))) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 index 74dab2389..d9f10b394 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsPat $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if ([System.String]::IsNullOrWhiteSpace($Pat) -or $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT { diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 index 27a95e5d0..8abf48832 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -37,12 +37,6 @@ function Test-AzDevOpsProjectDescription $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if ($ProjectDescription -eq $null -or ($ProjectDescription.Contains('%') -or $ProjectDescription.Contains('*') -or $ProjectDescription.StartsWith(' ') -or $ProjectDescription.EndsWith(' '))) { diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 index 4f60337c0..a5f0b646b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsProjectId $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if (!(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid:$IsValid)) { return $false diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 index d680fbddf..7e513559a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -36,12 +36,6 @@ function Test-AzDevOpsProjectName $IsValid ) - if (!$IsValid) - { - $errorMessage = $script:localizedData.MandatoryIsValidSwitchNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - if ([System.String]::IsNullOrWhiteSpace($ProjectName) -or ($ProjectName.Contains('%') -or $ProjectName.Contains('*') -or $ProjectName.StartsWith(' ') -or $ProjectName.EndsWith(' '))) { From f77fe4a716ae23f83eac9b6f3c2a0535edb34bcc Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 09:24:11 +0000 Subject: [PATCH 402/611] Updated a number of 'Test-', method bodies to make them less verbose and reduce the number of lines. --- .../Private/Test-AzDevOpsApiHttpRequestHeader.ps1 | 11 +++-------- .../Private/Test-AzDevOpsApiResourceId.ps1 | 8 +------- .../Private/Test-AzDevOpsApiResourceName.ps1 | 8 +------- .../Api/Functions/Private/Test-AzDevOpsApiUri.ps1 | 10 +++------- .../Functions/Private/Test-AzDevOpsApiVersion.ps1 | 7 +------ .../Private/Test-AzDevOpsPatCredential.ps1 | 9 ++------- .../Functions/Private/Test-AzDevOpsOperationId.ps1 | 7 +------ .../Private/Test-AzDevOpsOrganizationName.ps1 | 13 ++++++------- .../Functions/Private/Test-AzDevOpsPat.ps1 | 9 ++------- .../Private/Test-AzDevOpsProjectDescription.ps1 | 12 +++++------- .../Functions/Private/Test-AzDevOpsProjectId.ps1 | 7 +------ .../Functions/Private/Test-AzDevOpsProjectName.ps1 | 12 +++++------- 12 files changed, 31 insertions(+), 82 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 index 6527f3b59..f52ff871b 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiHttpRequestHeader.ps1 @@ -36,12 +36,7 @@ function Test-AzDevOpsApiHttpRequestHeader $IsValid ) - if ($null -eq $HttpRequestHeader -or - $null -eq $HttpRequestHeader.Authorization -or - $HttpRequestHeader.Authorization -inotlike 'Basic *') - { - return $false - } - - return $true + return !($null -eq $HttpRequestHeader -or + $null -eq $HttpRequestHeader.Authorization -or + $HttpRequestHeader.Authorization -inotlike 'Basic *') } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 index 4741cdf76..c585b21cc 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceId.ps1 @@ -37,11 +37,5 @@ function Test-AzDevOpsApiResourceId ) - if (![guid]::TryParse($ResourceId, $([ref][guid]::Empty))) - { - return $false - } - - - return $true + return !(![guid]::TryParse($ResourceId, $([ref][guid]::Empty))) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 index 06526e626..1fd11df8f 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResourceName.ps1 @@ -37,11 +37,5 @@ function Test-AzDevOpsApiResourceName ) - if (!($(Get-AzDevOpsApiResourceName).Contains($ResourceName))) - { - return $false - } - - - return $true + return !(!($(Get-AzDevOpsApiResourceName).Contains($ResourceName))) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 index 7be92d8ec..9378da005 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiUri.ps1 @@ -36,11 +36,7 @@ function Test-AzDevOpsApiUri $IsValid ) - if (($ApiUri -inotlike 'http://*' -and $ApiUri -inotlike 'https://*') -or - $ApiUri -inotlike '*/_apis/') - { - return $false - } - - return $true + return !(($ApiUri -inotlike 'http://*' -and + $ApiUri -inotlike 'https://*') -or + $ApiUri -inotlike '*/_apis/') } diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 index 0c51ee871..fc30e8857 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiVersion.ps1 @@ -41,10 +41,5 @@ function Test-AzDevOpsApiVersion '6.0' ) - if (!$supportedApiVersions.Contains($ApiVersion)) - { - return $false - } - - return $true + return !(!$supportedApiVersions.Contains($ApiVersion)) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 index a1d7cdc35..293087ae8 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/Test-AzDevOpsPatCredential.ps1 @@ -37,11 +37,6 @@ function Test-AzDevOpsPatCredential $IsValid ) - if ($null -eq $PatCredential -or - 'PAT' -ne $PatCredential.UserName) - { - return $false - } - - return $true + return !($null -eq $PatCredential -or + 'PAT' -ne $PatCredential.UserName) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 index 3641eefa7..0c735ea88 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.ps1 @@ -36,10 +36,5 @@ function Test-AzDevOpsOperationId $IsValid ) - if (!(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid:$IsValid)) - { - return $false - } - - return $true + return $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid:$IsValid) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 index f1400570f..fb8aa0e17 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOrganizationName.ps1 @@ -36,11 +36,10 @@ function Test-AzDevOpsOrganizationName $IsValid ) - if ([System.String]::IsNullOrWhiteSpace($OrganizationName) -or - ($OrganizationName.Contains(' ') -or $OrganizationName.Contains('%') -or $OrganizationName.Contains('*') -or $OrganizationName.StartsWith(' ') -or $OrganizationName.EndsWith(' '))) - { - return $false - } - - return $true + return !([System.String]::IsNullOrWhiteSpace($OrganizationName) -or + ($OrganizationName.Contains(' ') -or + $OrganizationName.Contains('%') -or + $OrganizationName.Contains('*') -or + $OrganizationName.StartsWith(' ') -or + $OrganizationName.EndsWith(' '))) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 index d9f10b394..f58cab88d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsPat.ps1 @@ -36,11 +36,6 @@ function Test-AzDevOpsPat $IsValid ) - if ([System.String]::IsNullOrWhiteSpace($Pat) -or - $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT - { - return $false - } - - return $true + return !([System.String]::IsNullOrWhiteSpace($Pat) -or + $Pat.Length -ne 52) # Note: 52 is the current/expected length of PAT } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 index 8abf48832..d393daff2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectDescription.ps1 @@ -37,11 +37,9 @@ function Test-AzDevOpsProjectDescription $IsValid ) - if ($ProjectDescription -eq $null -or - ($ProjectDescription.Contains('%') -or $ProjectDescription.Contains('*') -or $ProjectDescription.StartsWith(' ') -or $ProjectDescription.EndsWith(' '))) - { - return $false - } - - return $true + return !($ProjectDescription -eq $null -or + ($ProjectDescription.Contains('%') -or + $ProjectDescription.Contains('*') -or + $ProjectDescription.StartsWith(' ') -or + $ProjectDescription.EndsWith(' '))) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 index a5f0b646b..bd67bdd13 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.ps1 @@ -36,10 +36,5 @@ function Test-AzDevOpsProjectId $IsValid ) - if (!(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid:$IsValid)) - { - return $false - } - - return $true + return $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid:$IsValid) } diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 index 7e513559a..d53be5507 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -36,11 +36,9 @@ function Test-AzDevOpsProjectName $IsValid ) - if ([System.String]::IsNullOrWhiteSpace($ProjectName) -or - ($ProjectName.Contains('%') -or $ProjectName.Contains('*') -or $ProjectName.StartsWith(' ') -or $ProjectName.EndsWith(' '))) - { - return $false - } - - return $true + return !([System.String]::IsNullOrWhiteSpace($ProjectName) -or + ($ProjectName.Contains('%') -or + $ProjectName.Contains('*') -or + $ProjectName.StartsWith(' ') -or + $ProjectName.EndsWith(' '))) } From 3c06babbe97572a9446ff3d8eee1748c310a48d7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 09:29:55 +0000 Subject: [PATCH 403/611] Added tests for 'Test-AzDevOpsOperationId' and 'Test-AzDevOpsProjectId' to ensure they return same result/value as 'Test-AzDevOpsApiResourceId' --- .../Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 | 6 ++++++ .../Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 index e3e48a152..1b3d59fa9 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsOperationId.Tests.ps1 @@ -27,6 +27,12 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When called with "OperationId" parameter value and the "IsValid" switch' { + It 'Should return identical value to "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidOperationIds { + param ([System.String]$OperationId) + + Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $OperationId -IsValid) + } + Context 'When "OperationId" parameter value is a valid "OperationId"' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 index 5c26bed22..2b0143fa5 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectId.Tests.ps1 @@ -27,6 +27,12 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When called with "ProjectId" parameter value and the "IsValid" switch' { + It 'Should return identical value to "Test-AzDevOpsApiResourceId" - ""' -TestCases $testCasesValidProjectIds { + param ([System.String]$ProjectId) + + Test-AzDevOpsProjectId -ProjectId $ProjectId -IsValid | Should -Be $(Test-AzDevOpsApiResourceId -ResourceId $ProjectId -IsValid) + } + Context 'When "ProjectId" parameter value is a valid "ProjectId"' { From a5ce24cab3a1489d594cad26bd46015068cfc843 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:12:19 +0000 Subject: [PATCH 404/611] Added unit tests for 'Test-AzDevOpsTimeoutExceeded' --- .../Private/Test-AzDevOpsTimeoutExceeded.ps1 | 3 +- ...DO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 | 0 .../Test-AzDevOpsTimeoutExceeded.Tests.ps1 | 202 ++++++++++++++++++ 3 files changed, 204 insertions(+), 1 deletion(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 index 404a3697d..9686db6a9 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 @@ -42,9 +42,10 @@ function Test-AzDevOpsTimeoutExceeded $EndTime, [Parameter(Mandatory = $true)] + [ValidateRange(250,10000)] [Int32] $TimeoutMs ) - return $($(New-TimeSpan -Start $StartTime -End $EndTime).Milliseconds -gt $TimeoutMs) + return $($(New-TimeSpan -Start $StartTime -End $EndTime).TotalMilliseconds -gt $TimeoutMs) } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/TODO2.Test-AzDevOpsTimeoutExceeded.Tests.ps1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 new file mode 100644 index 000000000..befd6406b --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 @@ -0,0 +1,202 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + $testCasesTimeoutExceeded = @( + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 1) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 252) # 1ms longer than timeout + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,12, 09,35,01, 0) # 1s longer than timeout + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,12, 09,35,01, 0) # 1s longer than timeout + TimeoutMs = 999 # Almost 1 second + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 1) + EndTime = [DateTime]::new(2020,11,12, 09,36,00, 1) # 1m longer than timeout + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 999) + EndTime = [DateTime]::new(2020,11,12, 10,35,00, 999) # 1h longer than timeout + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,13, 09,35,00, 0) # 1 day longer than timeout + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,12,12, 09,35,00, 0) # 1 month longer than timeout + TimeoutMs = 500 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2021,11,12, 09,35,00, 0) # 1 year longer than timeout + TimeoutMs = 10000 + } + ) + $testCasesTimeoutNotExceeded = @( + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 0) # Identical to StartTime + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 1) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 1) # Identical to StartTime + TimeoutMs = 500 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 1) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 250) # 1ms shorter than timeout (compared to StartTime) + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 249) # 1ms shorter than timeout (compared to StartTime) + TimeoutMs = 250 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + EndTime = [DateTime]::new(2020,11,12, 09,35,01, 0) # 1s longer than timeout + TimeoutMs = 1000 # 1 second + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 502) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 1) # EndTime 501ms before StartTime (negative timespan) + TimeoutMs = 550 + }, + @{ + StartTime = [DateTime]::new(2020,11,12, 09,35,00, 501) + EndTime = [DateTime]::new(2020,11,12, 09,35,00, 0) # EndTime 501ms before StartTime (negative timespan) + TimeoutMs = 500 + } + ) + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory "StartTime", "EndTime" and "TimeoutMs" parameter values' { + + Context 'When called with values that should generate an exceeded timeout' { + + It 'Should not throw - "","",""' -TestCases $testCasesTimeoutExceeded { + param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) + + { Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw + } + + It 'Should return $true - "","",""' -TestCases $testCasesTimeoutExceeded { + param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) + + Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeTrue + } + } + + Context 'When called with values that should not generate an exceeded timeout' { + + It 'Should not throw - "","",""' -TestCases $testCasesTimeoutNotExceeded { + param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) + + { Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw + } + + It 'Should return $false - "","",""' -TestCases $testCasesTimeoutNotExceeded { + param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) + + Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeFalse + } + } + } + } + + + Context "When input parameters are invalid" { + + [DateTime]$testTime = [DateTime]::new(2020,11,12, 09,35,00, 0) + [Int32]$testTimeoutMs = 250 + + Context 'When called with no/null parameter values' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $null } | Should -Throw + } + } + + Context 'When called with no/null "StartTime" parameter value' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $testTimeoutMs } | Should -Throw + } + } + + Context 'When called with no/null "EndTime" parameter value' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw + } + } + + Context 'When called with no/null "StartTime" and "EndTime" parameter values' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw + } + } + + Context 'When called with no/null "TimeoutMs" parameter value' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $testTime -TimeoutMs $null } | Should -Throw + } + } + + Context 'When called with no/null "StartTime" and "TimeoutMs" parameter values' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $null } | Should -Throw + } + } + + Context 'When called with no/null "EndTime" and "TimeoutMs" parameter values' { + + It 'Should throw' { + + { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $null } | Should -Throw + } + } + } + } +} From 87d491807a42cd201c56b803a317b4d8d4a056ab Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:14:13 +0000 Subject: [PATCH 405/611] Moved 'Test-AzDevOpsTimeoutExceeded' function (and unit tests) into 'Api' subfolder(s) --- .../Private/Test-AzDevOpsTimeoutExceeded.ps1 | 51 +++++++++++++++++++ ...Test-AzDevOpsApiTimeoutExceeded.Tests.ps1} | 0 2 files changed, 51 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 rename tests/Unit/Modules/AzureDevOpsDsc.Common/{Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 => Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1} (100%) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 new file mode 100644 index 000000000..9686db6a9 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 @@ -0,0 +1,51 @@ +<# + .SYNOPSIS + Peforms test on the provided 'StartTime' and 'EndTime', and the provided 'TimeoutMs' + value to indicate if a timeout duration has expired. + + Returns $true if the test is the duration/difference of time (in Milliseconds) between + the 2 times is greater than the 'TimeOutMs' value (indicates the timeout has been exceeded). + + Returns $false otherwise. + + NOTE: Ensure both 'StartTime' and 'EndTime' use values in the same time zone. + + .PARAMETER StartTime + The 'StartTime' of when the timeout duration began. + + .PARAMETER EndTime + The 'EndTime' of when the timeout duration ended (typically the current time). + + .PARAMETER TimeoutMs + The number of milliseconds set as the timeout to evaluate against. + + .EXAMPLE + Test-AzDevOpsTimeoutExceeded -StartTime $someStartTime -EndTime $someEndTime -TimeoutMs 1000 + + Returns $true if the duration between the value of $someStartTime and $someEndTime is greater than + 1000 milliseconds (1 second). + + Returns $false if it is not. +#> +function Test-AzDevOpsTimeoutExceeded +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [Datetime] + $StartTime, + + [Parameter(Mandatory = $true)] + [Datetime] + $EndTime, + + [Parameter(Mandatory = $true)] + [ValidateRange(250,10000)] + [Int32] + $TimeoutMs + ) + + return $($(New-TimeSpan -Start $StartTime -End $EndTime).TotalMilliseconds -gt $TimeoutMs) +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 From c0ee06682a27fab2781e8952e58a77907d2fa253 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:22:26 +0000 Subject: [PATCH 406/611] Renamed/Updated 'Test-AzDevOpsTimeoutExceeded' function to 'Test-AzDevOpsApiTimeoutExceeded' --- ...s1 => Test-AzDevOpsApiTimeoutExceeded.ps1} | 4 +- .../Private/Test-AzDevOpsTimeoutExceeded.ps1 | 51 ------------------- .../Private/Wait-AzDevOpsOperation.ps1 | 2 +- .../Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 | 24 ++++----- .../Private/Wait-AzDevOpsOperation.Tests.ps1 | 38 +++++++------- 5 files changed, 34 insertions(+), 85 deletions(-) rename source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{Test-AzDevOpsTimeoutExceeded.ps1 => Test-AzDevOpsApiTimeoutExceeded.ps1} (90%) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.ps1 similarity index 90% rename from source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 rename to source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.ps1 index 9686db6a9..29f986c11 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.ps1 @@ -20,14 +20,14 @@ The number of milliseconds set as the timeout to evaluate against. .EXAMPLE - Test-AzDevOpsTimeoutExceeded -StartTime $someStartTime -EndTime $someEndTime -TimeoutMs 1000 + Test-AzDevOpsApiTimeoutExceeded -StartTime $someStartTime -EndTime $someEndTime -TimeoutMs 1000 Returns $true if the duration between the value of $someStartTime and $someEndTime is greater than 1000 milliseconds (1 second). Returns $false if it is not. #> -function Test-AzDevOpsTimeoutExceeded +function Test-AzDevOpsApiTimeoutExceeded { [CmdletBinding()] [OutputType([System.Boolean])] diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 deleted file mode 100644 index 9686db6a9..000000000 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsTimeoutExceeded.ps1 +++ /dev/null @@ -1,51 +0,0 @@ -<# - .SYNOPSIS - Peforms test on the provided 'StartTime' and 'EndTime', and the provided 'TimeoutMs' - value to indicate if a timeout duration has expired. - - Returns $true if the test is the duration/difference of time (in Milliseconds) between - the 2 times is greater than the 'TimeOutMs' value (indicates the timeout has been exceeded). - - Returns $false otherwise. - - NOTE: Ensure both 'StartTime' and 'EndTime' use values in the same time zone. - - .PARAMETER StartTime - The 'StartTime' of when the timeout duration began. - - .PARAMETER EndTime - The 'EndTime' of when the timeout duration ended (typically the current time). - - .PARAMETER TimeoutMs - The number of milliseconds set as the timeout to evaluate against. - - .EXAMPLE - Test-AzDevOpsTimeoutExceeded -StartTime $someStartTime -EndTime $someEndTime -TimeoutMs 1000 - - Returns $true if the duration between the value of $someStartTime and $someEndTime is greater than - 1000 milliseconds (1 second). - - Returns $false if it is not. -#> -function Test-AzDevOpsTimeoutExceeded -{ - [CmdletBinding()] - [OutputType([System.Boolean])] - param - ( - [Parameter(Mandatory = $true)] - [Datetime] - $StartTime, - - [Parameter(Mandatory = $true)] - [Datetime] - $EndTime, - - [Parameter(Mandatory = $true)] - [ValidateRange(250,10000)] - [Int32] - $TimeoutMs - ) - - return $($(New-TimeSpan -Start $StartTime -End $EndTime).TotalMilliseconds -gt $TimeoutMs) -} diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 756af6ff2..75cb1b62e 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -111,7 +111,7 @@ function Wait-AzDevOpsOperation { Start-Sleep -Milliseconds $WaitIntervalMilliseconds - if (Test-AzDevOpsTimeoutExceeded -StartTime $waitStartDateTime -End $($(Get-Date).ToUniversalTime()) -TimeoutMs $WaitTimeoutMilliseconds ) + if (Test-AzDevOpsApiTimeoutExceeded -StartTime $waitStartDateTime -End $($(Get-Date).ToUniversalTime()) -TimeoutMs $WaitTimeoutMilliseconds ) { $errorMessage = $script:localizedData.AzDevOpsOperationWaitTimeoutExceeded -f $MyInvocation.MyCommand, $OperationId, $WaitTimeoutMilliseconds New-InvalidOperationException -Message $errorMessage diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 index befd6406b..36c3088d9 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiTimeoutExceeded.Tests.ps1 @@ -10,7 +10,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $script:subModuleName = 'AzureDevOpsDsc.Common' $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Private\$($script:commandName).ps1" + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" $script:tag = @($($script:commandName -replace '-')) . $script:commandScriptPath @@ -109,13 +109,13 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should not throw - "","",""' -TestCases $testCasesTimeoutExceeded { param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) - { Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw } It 'Should return $true - "","",""' -TestCases $testCasesTimeoutExceeded { param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) - Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeTrue + Test-AzDevOpsApiTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeTrue } } @@ -124,13 +124,13 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should not throw - "","",""' -TestCases $testCasesTimeoutNotExceeded { param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) - { Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs } | Should -Not -Throw } It 'Should return $false - "","",""' -TestCases $testCasesTimeoutNotExceeded { param ([Datetime]$StartTime, [Datetime]$EndTime, [Int32]$TimeoutMs) - Test-AzDevOpsTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeFalse + Test-AzDevOpsApiTimeoutExceeded -StartTime $StartTime -EndTime $EndTime -TimeoutMs $TimeoutMs | Should -BeFalse } } } @@ -146,7 +146,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $null } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $null } | Should -Throw } } @@ -154,7 +154,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $testTimeoutMs } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $testTimeoutMs } | Should -Throw } } @@ -162,7 +162,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw } } @@ -170,7 +170,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $null -EndTime $null -TimeoutMs $testTimeoutMs } | Should -Throw } } @@ -178,7 +178,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $testTime -TimeoutMs $null } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $testTime -EndTime $testTime -TimeoutMs $null } | Should -Throw } } @@ -186,7 +186,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $null } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $null -EndTime $testTime -TimeoutMs $null } | Should -Throw } } @@ -194,7 +194,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should throw' { - { Test-AzDevOpsTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $null } | Should -Throw + { Test-AzDevOpsApiTimeoutExceeded -StartTime $testTime -EndTime $null -TimeoutMs $null } | Should -Throw } } } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 index 13563c624..7796bde92 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -29,7 +29,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { # Mock New-InvalidOperationException {} # Do not mock Mock Start-Sleep {} Mock Test-AzDevOpsOperation {} - Mock Test-AzDevOpsTimeoutExceeded {} + Mock Test-AzDevOpsApiTimeoutExceeded {} # Generate valid, test cases $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' @@ -136,14 +136,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It } - It "Should not invoke 'Test-AzDevOpsTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + It "Should not invoke 'Test-AzDevOpsApiTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) - Mock Test-AzDevOpsTimeoutExceeded {} -Verifiable + Mock Test-AzDevOpsApiTimeoutExceeded {} -Verifiable Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete - Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 0 -Exactly -Scope It + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 0 -Exactly -Scope It } } @@ -157,7 +157,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) return !($script:mockTestAzDevOpsOperationInvoked) } - Mock Test-AzDevOpsTimeoutExceeded { return $false } + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } It "Should invoke 'Test-AzDevOpsOperation' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) @@ -194,24 +194,24 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It } - It "Should invoke 'Test-AzDevOpsTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + It "Should invoke 'Test-AzDevOpsApiTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock - Mock Test-AzDevOpsTimeoutExceeded { return $false } -Verifiable + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } -Verifiable Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete - Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 1 -Exactly -Scope It + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 1 -Exactly -Scope It } } } - Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsTimeoutExceeded' returns true)" { + Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsApiTimeoutExceeded' returns true)" { Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms - Mock Test-AzDevOpsTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsApiTimeoutExceeded { return $true } # i.e. Timeout exceeded Mock Test-AzDevOpsOperation { return $false } # i.e. Operation has not completed It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { @@ -381,14 +381,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It } - It "Should not invoke 'Test-AzDevOpsTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + It "Should not invoke 'Test-AzDevOpsApiTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) - Mock Test-AzDevOpsTimeoutExceeded {} -Verifiable + Mock Test-AzDevOpsApiTimeoutExceeded {} -Verifiable Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful - Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 0 -Exactly -Scope It + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 0 -Exactly -Scope It } } @@ -402,7 +402,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $script:mockTestAzDevOpsOperationInvoked = !($script:mockTestAzDevOpsOperationInvoked) return !($script:mockTestAzDevOpsOperationInvoked) } - Mock Test-AzDevOpsTimeoutExceeded { return $false } + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } It "Should invoke 'Test-AzDevOpsOperation' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) @@ -439,24 +439,24 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It } - It "Should invoke 'Test-AzDevOpsTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { + It "Should invoke 'Test-AzDevOpsApiTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$OperationId ) $script:mockTestAzDevOpsOperationInvoked = $false # for 'Test-AzDevOpsOperation' mock - Mock Test-AzDevOpsTimeoutExceeded { return $false } -Verifiable + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } -Verifiable Wait-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful - Assert-MockCalled 'Test-AzDevOpsTimeoutExceeded' -Times 1 -Exactly -Scope It + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 1 -Exactly -Scope It } } } - Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsTimeoutExceeded' returns true)" { + Context "When 'Test-AzDevOpsOperation' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsApiTimeoutExceeded' returns true)" { Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms - Mock Test-AzDevOpsTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsApiTimeoutExceeded { return $true } # i.e. Timeout exceeded Mock Test-AzDevOpsOperation { return $false } # i.e. Operation has not completed It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatOperationIds3 { From 4b180d08fa1450f8ba1c5e4ef65ce25f67c2dccf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:53:47 +0000 Subject: [PATCH 407/611] Added 'ValidateSet' parameter attributes on 'Wait-AzDevOpsOperation', 'IsComplete' and 'IsSuccessful' parameters/switches --- .../Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 index 75cb1b62e..ff8ae7cad 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.ps1 @@ -81,10 +81,12 @@ function Wait-AzDevOpsOperation $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter(Mandatory = $true, ParameterSetName='IsComplete')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsComplete, [Parameter(Mandatory = $true, ParameterSetName='IsSuccessful')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsSuccessful ) From be0a4727276eaa7da24ae8b9878cc8f3026f55ab Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:55:18 +0000 Subject: [PATCH 408/611] Updated 'Wait-AzDevOpsApiResource' function to add validation to 'IsPresent' and 'IsAbsent' switches, replace use of [DateTime]::UtcNow, and make use of 'Test-AzDevOpsApiTimeoutExceeded' function. --- .../Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index e7e7b8357..cd08f67fb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -100,10 +100,12 @@ function Wait-AzDevOpsApiResource $WaitTimeoutMilliseconds = $(Get-AzDevOpsApiWaitTimeoutMs), [Parameter(Mandatory = $true, ParameterSetName='IsPresent')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsPresent, [Parameter(Mandatory = $true, ParameterSetName='IsAbsent')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsAbsent ) @@ -120,7 +122,7 @@ function Wait-AzDevOpsApiResource } - [System.DateTime]$waitStartDateTime = [System.DateTime]::UtcNow + [System.DateTime]$waitStartDateTime = $(Get-Date).ToUniversalTime() [bool]$testAzDevOpsApiResource = Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` -ResourceName $ResourceName ` @@ -134,7 +136,7 @@ function Wait-AzDevOpsApiResource { Start-Sleep -Milliseconds $WaitIntervalMilliseconds - if ($(New-TimeSpan -Start $waitStartDateTime -End $([System.DateTime]::UtcNow)).Milliseconds -gt $WaitTimeoutMilliseconds) + if (Test-AzDevOpsApiTimeoutExceeded -StartTime $waitStartDateTime -End $($(Get-Date).ToUniversalTime()) -TimeoutMs $WaitTimeoutMilliseconds ) { $errorMessage = $script:localizedData.AzDevOpsApiResourceWaitTimeoutExceeded -f $MyInvocation.MyCommand, $ResourceName, $ResourceId, $WaitTimeoutMilliseconds New-InvalidOperationException -Message $errorMessage From 61e3817f551f7fc593d6e9082f94d77670909ad4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:55:53 +0000 Subject: [PATCH 409/611] Removed, non-relevant tests from 'Wait-AzDevOpsOperation' function, unit tests --- .../Private/Wait-AzDevOpsOperation.Tests.ps1 | 87 +------------------ 1 file changed, 1 insertion(+), 86 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 index 7796bde92..c3278f53d 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Wait-AzDevOpsOperation.Tests.ps1 @@ -562,97 +562,12 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } } - - - - - - - - - - - - - - - # EXISTING - TO REMOVE BELOW - Context 'When called with "OperationId" parameter value and the "IsValid" switch' { - - - Context 'When "OperationId" parameter value is a valid "OperationId"' { - - It 'Should not throw - ""' -TestCases $testCasesValidOperationIds { - param ([System.String]$OperationId) - - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw - } - - It 'Should return $true - ""' -TestCases $testCasesValidOperationIds { - param ([System.String]$OperationId) - - Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeTrue - } - } - - - Context 'When "OperationId" parameter value is an invalid "OperationId"' { - - It 'Should not throw - ""' -TestCases $testCasesInvalidOperationIds { - param ([System.String]$OperationId) - - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid } | Should -Not -Throw - } - - It 'Should return $false - ""' -TestCases $testCasesInvalidOperationIds { - param ([System.String]$OperationId) - - Test-AzDevOpsOperationId -OperationId $OperationId -IsValid | Should -BeFalse - } - } - } } Context "When input parameters are invalid" { - - Context 'When called with no/null parameter values/switches' { - - It 'Should throw' { - - { Test-AzDevOpsOperationId -OperationId:$null -IsValid:$false } | Should -Throw - } - } - - - Context 'When "OperationId" parameter value is a valid "OperationId"' { - - - Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { - - It 'Should throw - ""' -TestCases $testCasesValidOperationIds { - param ([System.String]$OperationId) - - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw - } - } - } - - - Context 'When "OperationId" parameter value is an invalid "OperationId"' { - - - Context 'When called with "OperationId" parameter value but a $false "IsValid" switch value' { - - It 'Should throw - ""' -TestCases $testCasesInvalidOperationIds { - param ([System.String]$OperationId) - - { Test-AzDevOpsOperationId -OperationId $OperationId -IsValid:$false } | Should -Throw - } - } - } - + # TODO } } From 096d86b9541765aa39d709d9604ffc3644933954 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:56:59 +0000 Subject: [PATCH 410/611] Added 'Wait-AzDevOpsApiResource' function, unit tests --- .../Wait-AzDevOpsApiResource.Tests.ps1 | 574 ++++++++++++++++++ .../_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 | 0 2 files changed, 574 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..8c42d4085 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 @@ -0,0 +1,574 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + # Get default, parameter values + $defaultWaitIntervalMilliseconds = Get-AzDevOpsApiWaitIntervalMs + $defaultWaitTimeoutMilliseconds = Get-AzDevOpsApiWaitTimeoutMs + + # Mock functions called in function + Mock Get-AzDevOpsApiWaitIntervalMs {} + Mock Get-AzDevOpsApiWaitTimeoutMs {} + # Mock Get-Date {} # Do not mock + # Mock New-InvalidOperationException {} # Do not mock + Mock Start-Sleep {} + Mock Test-AzDevOpsApiResource {} + Mock Test-AzDevOpsApiTimeoutExceeded {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' + $testCasesValidApiUriPatResourceIds3 = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidResourceIds) -Expand + $testCasesValidApiUriPatResourceIds3 = $testCasesValidApiUriPatResourceIds3 | Select-Object -First 3 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatResourceIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidResourceIds) -Expand + $testCasesInvalidApiUriPatResourceIds3 = $testCasesInvalidApiUriPatResourceIds | Select-Object -First 3 + + + Context 'When input parameters are valid' { + + + Context "When called with all, mandatory parameters ('ApiUri', 'Pat' and 'ResourceId')" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceId $ResourceId } | Should -Throw + } + + + Context "When also called with mandatory, 'IsPresent', switch parameter" { + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } + Mock Test-AzDevOpsApiResource { return $true } + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent } | Should -Not -Throw + } + + It "Should output null/nothing - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $output = Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + $output | Should -BeNullOrEmpty + } + + It "Should invoke 'Get-AzDevOpsApiWaitIntervalMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-AzDevOpsApiWaitTimeoutMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 1 -Exactly -Scope It + } + + + Context "When 'Test-AzDevOpsApiResource' returns true" { + + It "Should invoke 'Test-AzDevOpsApiResource' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Test-AzDevOpsApiResource { return $true } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Test-AzDevOpsApiResource' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Get-Date' -Times 1 -Exactly -Scope It + } + + It "Should not invoke 'Start-Sleep' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Test-AzDevOpsApiTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Test-AzDevOpsApiTimeoutExceeded {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 0 -Exactly -Scope It + } + } + + + Context "When 'Test-AzDevOpsApiResource' returns false, then true" { + + + Context "When 'WaitTimeoutMilliseconds' has not been exceeded" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsApiResource { + $script:mockTestAzDevOpsApiResourceInvoked = !($script:mockTestAzDevOpsApiResourceInvoked) + return !($script:mockTestAzDevOpsApiResourceInvoked) + } + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } + + It "Should invoke 'Test-AzDevOpsApiResource' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false + Mock Test-AzDevOpsApiResource { + $script:mockTestAzDevOpsApiResourceInvoked = !($script:mockTestAzDevOpsApiResourceInvoked) + return !($script:mockTestAzDevOpsApiResourceInvoked) + } + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Test-AzDevOpsApiResource' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Get-Date' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Start-Sleep' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false # for 'Test-AzDevOpsApiResource' mock + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Test-AzDevOpsApiTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false # for 'Test-AzDevOpsApiResource' mock + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent + + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 1 -Exactly -Scope It + } + + } + } + + + Context "When 'Test-AzDevOpsApiResource' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsApiTimeoutExceeded' returns true)" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsApiTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsApiResource { return $false } # i.e. ApiResource has not completed + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent } | Should -Throw + } + } + + + Context "When also called with optional, 'WaitIntervalMilliseconds' parameter" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + + } + + + Context "When also called with optional, 'WaitTimeoutMilliseconds' parameter" { + + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + Context "When also called with both optional, 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + } + + + Context "When also called with mandatory, 'IsAbsent', switch parameter" { + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } + Mock Test-AzDevOpsApiResource { return $false } + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent } | Should -Not -Throw + } + + It "Should output null/nothing - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $output = Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + $output | Should -BeNullOrEmpty + } + + It "Should invoke 'Get-AzDevOpsApiWaitIntervalMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-AzDevOpsApiWaitTimeoutMs' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 1 -Exactly -Scope It + } + + + Context "When 'Test-AzDevOpsApiResource' returns false" { + + It "Should invoke 'Test-AzDevOpsApiResource' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Test-AzDevOpsApiResource { return $false } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Test-AzDevOpsApiResource' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Get-Date' -Times 1 -Exactly -Scope It + } + + It "Should not invoke 'Start-Sleep' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Start-Sleep' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Test-AzDevOpsApiTimeoutExceeded' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Test-AzDevOpsApiTimeoutExceeded {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 0 -Exactly -Scope It + } + } + + + Context "When 'Test-AzDevOpsApiResource' returns true, then false" { + + + Context "When 'WaitTimeoutMilliseconds' has not been exceeded" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsApiResource { + $script:mockTestAzDevOpsApiResourceInvoked = !($script:mockTestAzDevOpsApiResourceInvoked) + return $script:mockTestAzDevOpsApiResourceInvoked + } + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } + + It "Should invoke 'Test-AzDevOpsApiResource' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false + Mock Test-AzDevOpsApiResource { + $script:mockTestAzDevOpsApiResourceInvoked = !($script:mockTestAzDevOpsApiResourceInvoked) + return $script:mockTestAzDevOpsApiResourceInvoked + } + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Test-AzDevOpsApiResource' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Get-Date' exactly twice - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-Date { return [DateTime]::get_UtcNow() } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Get-Date' -Times 2 -Exactly -Scope It + } + + It "Should invoke 'Start-Sleep' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false # for 'Test-AzDevOpsApiResource' mock + Mock Start-Sleep {} -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Start-Sleep' -Times 1 -Exactly -Scope It + } + + It "Should invoke 'Test-AzDevOpsApiTimeoutExceeded' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + $script:mockTestAzDevOpsApiResourceInvoked = $false # for 'Test-AzDevOpsApiResource' mock + Mock Test-AzDevOpsApiTimeoutExceeded { return $false } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent + + Assert-MockCalled 'Test-AzDevOpsApiTimeoutExceeded' -Times 1 -Exactly -Scope It + } + + } + } + + + Context "When 'Test-AzDevOpsApiResource' returns false, and exceeds timeout (i.e. 'Test-AzDevOpsApiTimeoutExceeded' returns true)" { + Mock Get-AzDevOpsApiWaitTimeoutMs {250} # 250ms + Mock Test-AzDevOpsApiTimeoutExceeded { return $true } # i.e. Timeout exceeded + Mock Test-AzDevOpsApiResource { return $true } # i.e. ApiResource has not completed + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent } | Should -Throw + } + } + + + Context "When also called with optional, 'WaitIntervalMilliseconds' parameter" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + + } + + + Context "When also called with optional, 'WaitTimeoutMilliseconds' parameter" { + + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + + Context "When also called with both optional, 'WaitIntervalMilliseconds' and 'WaitTimeoutMilliseconds' parameters" { + + $exampleWaitIntervalMilliseconds = $defaultWaitIntervalMilliseconds + $exampleWaitTimeoutMilliseconds = $defaultWaitTimeoutMilliseconds + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds } | Should -Not -Throw + } + + It "Should not invoke 'Get-AzDevOpsApiWaitIntervalMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitIntervalMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitIntervalMs' -Times 0 -Exactly -Scope It + } + + It "Should not invoke 'Get-AzDevOpsApiWaitTimeoutMs' - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + Mock Get-AzDevOpsApiWaitTimeoutMs { return 250 } -Verifiable + + Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent ` + -WaitTimeoutMilliseconds $exampleWaitTimeoutMilliseconds -WaitIntervalMilliseconds $exampleWaitIntervalMilliseconds + + Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 0 -Exactly -Scope It + } + + } + + } + + + Context "When also called with both mandatory, 'IsPresent' and 'IsAbsent', switch parameters" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param ( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent -IsAbsent } | Should -Throw + } + } + } + } + + + Context "When input parameters are invalid" { + + # TODO + + } + } +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Wait-AzDevOpsApiResource.Tests.ps1 deleted file mode 100644 index e69de29bb..000000000 From 72c29fa3242a06baf41b200d6b7ab9dca5fcfe3b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 10:57:27 +0000 Subject: [PATCH 411/611] Removed 'Wait-AzDevOpsOperation', unit tests placeholder file. --- .../Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_TODO2.Wait-AzDevOpsOperation.Tests.ps1 deleted file mode 100644 index e69de29bb..000000000 From 578246538b327fce6086abbe5bffa94649de7fdd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 11:02:23 +0000 Subject: [PATCH 412/611] Removed checks on 'IsPresent' and 'IsAbsent' in 'Wait-AzDevOpsApiResource' function --- .../Functions/Private/Wait-AzDevOpsApiResource.ps1 | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 index cd08f67fb..3ab7de4fb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.ps1 @@ -110,18 +110,6 @@ function Wait-AzDevOpsApiResource $IsAbsent ) - if (!$IsPresent -and !$IsAbsent) - { - $errorMessage = $script:localizedData.MandatoryIsPresentAndIsAbsentSwitchesNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - elseif ($IsPresent -and $IsAbsent) - { - $errorMessage = $script:localizedData.MandatoryIsPresentAndIsAbsentSwitchesBothUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - - [System.DateTime]$waitStartDateTime = $(Get-Date).ToUniversalTime() [bool]$testAzDevOpsApiResource = Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` From 12427d1c6a349ab186b9c1890efbfab1f6397aad Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:01:45 +0000 Subject: [PATCH 413/611] Added 'HttpRequestHeader' parameter alias to 'Invoke-AzDevOpsApiRestMethod' function and amended 'while' loop, retry logic. --- .../Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 index 328ec01a2..944a3e2d0 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -64,7 +64,7 @@ function Invoke-AzDevOpsApiRestMethod [Parameter(Mandatory=$true)] [ValidateScript( { Test-AzDevOpsApiHttpRequestHeader -HttpRequestHeader $_ -IsValid })] [Hashtable] - [Alias('Headers')] + [Alias('Headers','HttpRequestHeader')] $HttpHeaders, [Parameter()] @@ -92,7 +92,7 @@ function Invoke-AzDevOpsApiRestMethod # Intially set this value to -1, as the first attempt does not want to be classes as a "RetryAttempt" $CurrentNoOfRetryAttempts = -1 - while ($CurrentNoOfRetryAttempts -le $RetryAttempts) + while ($CurrentNoOfRetryAttempts -lt $RetryAttempts) { try { From 6e0bfadc8eb8d9d3756d802effdb19d0c0bf771a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:02:05 +0000 Subject: [PATCH 414/611] Added 'Invoke-AzDevOpsApiRestMethod' function, unit tests --- .../Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 new file mode 100644 index 000000000..77312e4b0 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 @@ -0,0 +1,196 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + # Get default, parameter values + $defaultHttpContentType = 'application/json' + $defaultHttpBody = '' + $defaultRetryAttempts = 5 + $defaultRetryIntervalMs = 250 + + # Mock functions called in function + Mock Invoke-RestMethod {} + # Mock New-InvalidOperationException {} # Do not mock + Mock Start-Sleep {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidHttpMethods = Get-TestCase -ScopeName 'HttpMethod' -TestCaseName 'Valid' + $testCasesValidHttpRequestHeaders = Get-TestCase -ScopeName 'HttpRequestHeader' -TestCaseName 'Valid' + $testCasesValidApiUriHttpMethodHttpRequestHeaders = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidHttpMethods, + $testCasesValidHttpRequestHeaders) -Expand + $testCasesValidApiUriHttpMethodHttpRequestHeaders3 = $testCasesValidApiUriHttpMethodHttpRequestHeaders | Select-Object -First 3 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidHttpMethods = Get-TestCase -ScopeName 'HttpMethod' -TestCaseName 'Invalid' + $testCasesInvalidHttpRequestHeaders = Get-TestCase -ScopeName 'HttpRequestHeader' -TestCaseName 'Invalid' + $testCasesInvalidApiUriHttpMethodHttpRequestHeaders = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidHttpMethods, + $testCasesInvalidHttpRequestHeaders) -Expand + $testCasesInvalidApiUriHttpMethodHttpRequestHeaders3 = $testCasesInvalidApiUriHttpMethodHttpRequestHeaders | Select-Object -First 3 + + + Context 'When input parameters are valid' { + + Context 'When called just with mandatory, "ApiUri", "HttpMethod" and "HttpRequestHeader" parameters' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader } | Should -Not -Throw + } + + It 'Should output nothing/null - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + $output = Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader + + $output | Should -BeNullOrEmpty + } + + It 'Should invoke "Invoke-RestMethod" exactly once - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + Mock Invoke-RestMethod {} -Verifiable + + Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader + + Assert-MockCalled Invoke-RestMethod -Times 1 -Exactly -Scope 'It' + } + + Context 'When "Invoke-RestMethod" throws an exception on every retry' { + Mock Invoke-RestMethod { throw "Some exception" } + + It 'Should invoke "Invoke-RestMethod" number of times equal to "RetryAttempts" parameter value + 1 - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + Mock Invoke-RestMethod { throw "Some exception" } -Verifiable + Mock New-InvalidOperationException {} + + Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader + + Assert-MockCalled Invoke-RestMethod -Times $($defaultRetryAttempts+1) -Exactly -Scope 'It' + } + + + It 'Should invoke "Start-Sleep"number of times equal to "RetryAttempts" parameter value + 1 - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + Mock Start-Sleep { } -Verifiable + + Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader + + Assert-MockCalled Start-Sleep -Times $($defaultRetryAttempts+1) -Exactly -Scope 'It' + } + + + It 'Should invoke "New-InvalidOperationException" exactly once - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + Mock New-InvalidOperationException {} -Verifiable + + Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader + + Assert-MockCalled New-InvalidOperationException -Times 1 -Exactly -Scope 'It' + } + + } + + } + } + + + Context 'When input parameters are invalid' { + + Context 'When called without mandatory, "ApiUri" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $null -HttpMethod $HttpMethod -HttpRequestHeader $HttpRequestHeader } | Should -Throw + } + + } + + Context 'When called without mandatory, "HttpMethod" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $null -HttpRequestHeader $HttpRequestHeader } | Should -Throw + } + + } + + Context 'When called without mandatory, "ApiUri" and "HttpMethod" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $null -HttpMethod $null -HttpRequestHeader $HttpRequestHeader } | Should -Throw + } + + } + + Context 'When called without mandatory, "HttpRequestHeader" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $HttpMethod -HttpRequestHeader $null } | Should -Throw + } + + } + + Context 'When called without mandatory, "ApiUri" and "HttpRequestHeader" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $null -HttpMethod $HttpMethod -HttpRequestHeader $null } | Should -Throw + } + + } + + Context 'When called without mandatory, "HttpMethod" and "HttpRequestHeader" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $ApiUri -HttpMethod $null -HttpRequestHeader $null } | Should -Throw + } + + } + + Context 'When called without mandatory, "ApiUri", "HttpMethod" and "HttpRequestHeader" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) + + { Invoke-AzDevOpsApiRestMethod -ApiUri $null -HttpMethod $null -HttpRequestHeader $null } | Should -Throw + } + + } + } + } +} From ae832094a015b800447281fffd88819894e3fa74 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:03:12 +0000 Subject: [PATCH 415/611] Corrected some test cases in 'Wait-AzDevOpsApiResource' function, unit tests --- .../Private/Wait-AzDevOpsApiResource.Tests.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 index 8c42d4085..d78a50f70 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 @@ -35,20 +35,20 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' - $testCasesValidApiUriPatResourceIds3 = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUriPatResourceIds = Join-TestCaseArray -TestCaseArray @( $testCasesValidApiUris, $testCasesValidPats, $testCasesValidResourceIds) -Expand - $testCasesValidApiUriPatResourceIds3 = $testCasesValidApiUriPatResourceIds3 | Select-Object -First 3 + $testCasesValidApiUriPatResourceIds3 = $testCasesValidApiUriPatResourceIds | Select-Object -First 3 # Generate invalid, test cases $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' $testCasesInvalidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Invalid' $testCasesInvalidApiUriPatResourceIds = Join-TestCaseArray -TestCaseArray @( - $testCasesValidApiUris, - $testCasesValidPats, - $testCasesValidResourceIds) -Expand + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidResourceIds) -Expand $testCasesInvalidApiUriPatResourceIds3 = $testCasesInvalidApiUriPatResourceIds | Select-Object -First 3 From 58abd429bd65f885a1e9043f594b18372c5c8b09 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:15:36 +0000 Subject: [PATCH 416/611] Added additional, unit tests for 'Wait-AzDevOpsApiResource' function around 'ApiVersion' parameter. --- .../Wait-AzDevOpsApiResource.Tests.ps1 | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 index d78a50f70..82764c11a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 @@ -41,6 +41,8 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidResourceIds) -Expand $testCasesValidApiUriPatResourceIds3 = $testCasesValidApiUriPatResourceIds | Select-Object -First 3 + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' + # Generate invalid, test cases $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' @@ -51,6 +53,8 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesInvalidResourceIds) -Expand $testCasesInvalidApiUriPatResourceIds3 = $testCasesInvalidApiUriPatResourceIds | Select-Object -First 3 + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + Context 'When input parameters are valid' { @@ -103,6 +107,23 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Get-AzDevOpsApiWaitTimeoutMs' -Times 1 -Exactly -Scope It } + Context "When also called with valid 'ApiVersion' parameter value" { + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $validApiVersion -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent } | Should -Not -Throw + } + } + + Context "When also called with invalid 'ApiVersion' parameter value" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $invalidApiVersion -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsPresent } | Should -Throw + } + } Context "When 'Test-AzDevOpsApiResource' returns true" { @@ -349,6 +370,26 @@ InModuleScope 'AzureDevOpsDsc.Common' { } + Context "When also called with valid 'ApiVersion' parameter value" { + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $validApiVersion -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent } | Should -Not -Throw + } + } + + + Context "When also called with invalid 'ApiVersion' parameter value" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { + param( [System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceId ) + + { Wait-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $invalidApiVersion -Pat $Pat -ResourceName 'Project' -ResourceId $ResourceId -IsAbsent } | Should -Throw + } + } + + Context "When 'Test-AzDevOpsApiResource' returns false" { It "Should invoke 'Test-AzDevOpsApiResource' exactly once - '', '', ''" -TestCases $testCasesValidApiUriPatResourceIds3 { From 20b77ca7651ed51aacae7af3a8ab4caf81b4eab6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:21:07 +0000 Subject: [PATCH 417/611] Added code coverage output file into 'build.yaml' file. --- build.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 4004f8ddb..7d00824be 100644 --- a/build.yaml +++ b/build.yaml @@ -61,12 +61,14 @@ BuildWorkflow: Pester: OutputFormat: NUnitXML ExcludeFromCodeCoverage: + - Modules/DscResource.Common Script: - tests/Unit - - tests/Integration ExcludeTag: Tag: CodeCoverageThreshold: 85 + CodeCoverageOutputFile: JaCoCo_coverage.xml + CodeCoverageOutputFileEncoding: ascii DscTest: ExcludeTag: From 2bd99b278a0248ee3511e2bb56b437fedc7c2104 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 12:22:47 +0000 Subject: [PATCH 418/611] Deleted 'Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1' --- ...Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 | 94 ------------------- 1 file changed, 94 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 deleted file mode 100644 index 27c57dd08..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.Old.ps1 +++ /dev/null @@ -1,94 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 - - -InModuleScope $script:subModuleName { - - $script:subModuleName = 'AzureDevOpsDsc.Common' - $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') - $script:tag = @($($script:commandName -replace '-')) - - Describe "$script:subModuleName\$script:commandName" -Tag $script:tag { - - Context "When validating '$script:commandName' function/command parameter sets" { - - $testCasesValidParameterSetNames = @( - @{ - ParameterSetName = '__AllParameterSets' - } - ) - - $testCasesValidParameterSetNames | ForEach-Object { - - $parameterSetName = $_.ParameterSetName - - Context "When validating '$script:commandName' function/command, '$parameterSetName' parameter set" { - - Context "When validating the '$parameterSetName' parameter set" { - - Mock Invoke-RestMethod {} - Mock Start-Sleep {} - Mock New-InvalidOperationException {} - - $testCasesValidParameterSetValues = Get-ParameterSetTestCase -CommandName $script:commandName -ParameterSetName $parameterSetName -TestCaseName 'Valid' - $testCasesInvalidParameterSetValues = Get-ParameterSetTestCase -CommandName $script:commandName -ParameterSetName $parameterSetName -TestCaseName 'Invalid' - - Context "When invoking with 'Valid', parameter set values" { - - It "Should not throw - '' - " -TestCases $testCasesValidParameterSetValues { - param([Hashtable]$ParameterSetValues) - - { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw - } - - $testCasesValidParameterSetValues | ForEach-Object { - - $_.ParameterSetValues.Keys | ForEach-Object { - - $parameterName = $_ - $testCasesValidParameterValues = Get-TestCase -ScopeName $parameterName -TestCaseName 'Valid' - $testCasesValidParameterSetValuesByParameterName = Join-TestCaseArray -Expand -TestCaseArray @($testCasesValidParameterSetValues, $testCasesValidParameterValues) - - It "Should not throw - '' - ('$parameterName' = '<$parameterName>')" -TestCases $testCasesValidParameterSetValuesByParameterName { - param([Hashtable]$ParameterSetValues) - - { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw - } - - } - } - - } - - Context "When invoking with 'Valid', parameter set values, per" { - - It "Should not throw - '' - " -TestCases $testCasesValidParameterSetValues { - param([Hashtable]$ParameterSetValues) - - { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Not -Throw - } - - } - - Context "When invoking with 'Invalid', parameter set values" { - - It "Should throw - '' - " -TestCases $testCasesInvalidParameterSetValues { - param([Hashtable]$ParameterSetValues) - - { Invoke-AzDevOpsApiRestMethod @ParameterSetValues } | Should -Throw - } - - } - } - - - } - - } - - } - - } - -} From 6a12961ace4710caac9bc3a94522860f9f9ddfaf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 14:10:38 +0000 Subject: [PATCH 419/611] Added 'Get-AzDevOpsApiResource' function, unit tests. --- .../Get-AzDevOpsApiResource.Tests.Old.ps1 | 219 ---------------- .../Private/Get-AzDevOpsApiResource.Tests.ps1 | 234 ++++++++++++++++++ .../_TODO2.Get-AzDevOpsApiResource.Tests.ps1 | 0 3 files changed, 234 insertions(+), 219 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 deleted file mode 100644 index 794c2add6..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.Old.ps1 +++ /dev/null @@ -1,219 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsApiResource' -Tag 'GetAzDevOpsApiResource' { - - Context 'When called with valid parameters' { - BeforeAll { - - [string]$nonPresentResourceId = '114bff8d-6169-45cf-b085-fe121267e7aa' - - Mock Invoke-RestMethod -Verifiable { - - $response = @" - { - "count": 2, - "value": [ - { - "id": "$ResourceId", - "name": "Test Project 1", - "description": "Test Project Description 1", - "url": "https://dev.azure.com/fabrikam/_apis/projects/$ResourceId", - "state": "wellFormed" - }, - { - "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", - "name": "Test Project 2", - "description": "Test Project Description 2", - "url": "https://dev.azure.com/fabrikam/_apis/projects/8d4bff8d-6169-45cf-b085-fe12ad67e76b", - "state": "wellFormed" - } - ] - } -"@ | ConvertFrom-Json - - if (![string]::IsNullOrWhiteSpace($ResourceId)) - { - $response = $response.value | - Where-Object { $_.id -eq $ResourceId} | - Where-Object { $_.id -ne $nonPresentResourceId} - } - - #if ([string]::IsNullOrWhiteSpace($ResourceId)) - #{ - # $response = $response.Value - #} - #else { - # $response = $response.Value | - # Where-Object { $_.id -eq $ResourceId } - #} - - return $response - } - } - - $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - - $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' - $testCasesValidApiUriPatResourceNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidResourceNames - - $testCasesValidResourceIds = Get-TestCase -ScopeName 'ResourceId' -TestCaseName 'Valid' - $testCasesValidApiUriPatResourceNameResourceIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatResourceNameCombined, $testCasesValidResourceIds - - Context 'When called with no "ResourceId" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - - { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - - $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName - #Write-Warning "x" - #Write-Warning "$ApiUri" - #Write-Warning "$Pat" - #Write-Warning "$ResourceName" - #Write-Warning "$result" - #Write-Warning "yy" - - #$result - - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - - Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName | Out-Null - Should -Invoke Invoke-RestMethod -Times 1 -Exactly -Scope It - } - - } - - - Context 'When called with an "ResourceId" parameter' { - - It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - - { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - - $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId - - $result.GetType() | Should -Be $(New-Object -TypeName PSCustomObject).GetType() - } - - It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameResourceIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName, [string]$ResourceId) - - Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $ResourceId | Out-Null - Should -Invoke Invoke-RestMethod -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It - } - - Context 'When a "Resource" with supplied "ResourceId" parameter value does not exist' { - - It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ResourceName) - - $result = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $nonPresentResourceId # Non-present "ResourceId" - $result | Should -Be $null - } - } - - } - - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "Pat" parameter' { - - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - - Context 'When called without "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Get-AzDevOpsApiResource -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with valid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $validApiUri = 'https://someuri.api/_apis/' - { Get-AzDevOpsApiResource -ApiUri $validApiUri -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with invalid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $invalidApiUri = 'someInvalidApiUrl' - { Get-AzDevOpsApiResource -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw - - } - } - } - - Context 'When called with invalid "ApiUri" parameter' { - - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' - $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - - Context 'When called without "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - { Get-AzDevOpsApiResource -ApiUri $ApiUri } | Should -Throw - - } - } - - Context 'When called with valid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $validPat = '1234567890123456789012345678901234567890123456789012' - { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $validPat } | Should -Throw - - } - } - - Context 'When called with invalid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $invalidPat = '123456789012' - { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw - - } - } - } - } - - } - -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 new file mode 100644 index 000000000..f75ed80f8 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 @@ -0,0 +1,234 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + # Get default, parameter values + $defaultApiVersion = Get-AzDevOpsApiVersion -Default + + # Helper function for generating fake resource, JSON response + Function Get-MockResourceJson + { + param + ( + [System.String] + $ResourceId + ) + + return '{ + "count": 2, + "value": [ + { + "id": "$ResourceId", + "name": "Test Resource 1", + "description": "Test Resource Description 1", + "url": "https://dev.azure.com/fabrikam/_apis/resources/$ResourceId", + "state": "wellFormed" + }, + { + "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "name": "Test Resource 2", + "description": "Test Resource Description 2", + "url": "https://dev.azure.com/fabrikam/_apis/resources/8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "state": "wellFormed" + } + ] + }' + } + $noOfMockResources = $(Get-MockResourceJson -ResourceId $([GUID]::NewGuid()) | ConvertFrom-Json).Count + $resourceIdThatExists = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' + $resourceIdThatDoesNotExist = '114bff8d-6169-45cf-b085-fe121267e7aa' + $resourceIdThatIsInvalid = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Invalid' + + # Mock functions called in function + Mock Invoke-RestMethod { + + $resources = Get-MockResourceJson -ResourceId $ResourceId | ConvertFrom-Json + $nonPresentResourceId = $resourceIdThatDoesNotExist + + if (![string]::IsNullOrWhiteSpace($ResourceId)) + { + $resources = $resources.value | + Where-Object { $_.id -eq $ResourceId} | + Where-Object { $_.id -ne $nonPresentResourceId} + } + + return $resources + } + # Mock Get-AzDevOpsApiResourceUri # Do not mock + # Mock Get-AzDevOpsApiHttpRequestHeader # Do not mock + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesValidApiUriPatResourceNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidResourceNames) -Expand + $testCasesValidApiUriPatResourceNames3 = $testCasesValidApiUriPatResourceNames | Select-Object -First 3 + + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatResourceNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidResourceNames) -Expand + $testCasesInvalidApiUriPatResourceNames3 = $testCasesInvalidApiUriPatResourceNames | Select-Object -First 3 + + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + + + Context 'When input parameters are valid' { + + Context 'When called with mandatory, "ApiUri", "Pat" and "ResourceName" parameters' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName } | Should -Not -Throw + } + + It 'Should return a type of "System.Management.Automation.PsObject[]" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + + $true | Should -Be $true # Note: Will always evaluate true (but strong-typing of $resources variable would fail this test anyway) + } + + It 'Should return all resources - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + + $resources.Count | Should -Be $noOfMockResources + } + } + + + Context 'When called with mandatory, "ApiUri", "Pat", "ResourceName" and "ResourceId" parameters' { + + Context 'When the "ResourceId" parameter value is invalid' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatIsInvalid } | Should -Throw + } + } + + Context 'When a resource with the "ResourceId" parameter value does exist' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists } | Should -Not -Throw + } + + It 'Should return a type of "System.Management.Automation.PsObject[]" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists + + $true | Should -Be $true # Note: Will always evaluate true (but strong-typing of $resources variable would fail this test anyway) + } + + It 'Should return only 1 resource - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists + + $resources.Count | Should -Be 1 + } + } + + + Context 'When a resource with the "ResourceId" parameter value does not exist' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatDoesNotExist } | Should -Not -Throw + } + + It 'Should return a type of "System.Management.Automation.PsObject[]" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatDoesNotExist + + $true | Should -Be $true # Note: Will always evaluate true (but strong-typing of $resources variable would fail this test anyway) + } + + It 'Should return no resources - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatDoesNotExist + + $resources.Count | Should -Be 0 + } + + It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + $resource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatDoesNotExist + + $resource | Should -Be $null + } + } + + + Context "When also called with valid 'ApiVersion' parameter value" { + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $validApiVersion -Pat $Pat -ResourceName $ResourceName } | Should -Not -Throw + } + } + + Context "When also called with invalid 'ApiVersion' parameter value" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $invalidApiVersion -Pat $Pat -ResourceName $ResourceName } | Should -Throw + } + } + } + } + + + Context 'When input parameters are invalid' { + + Context 'When called with mandatory, "ApiUri", "Pat" and "ResourceName" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesinvalidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName } | Should -Throw + } + } + + } + } +} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Get-AzDevOpsApiResource.Tests.ps1 deleted file mode 100644 index e69de29bb..000000000 From 5df73e61efe1c5b903be91902a95fce625a85b8b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 15:45:44 +0000 Subject: [PATCH 420/611] Corrected 'It' name in 'Invoke-AzDevOpsApiRestMethod' function, unit tests. --- .../Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 index 77312e4b0..5ffa3bbc0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.Tests.ps1 @@ -93,7 +93,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { } - It 'Should invoke "Start-Sleep"number of times equal to "RetryAttempts" parameter value + 1 - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { + It 'Should invoke "Start-Sleep" number of times equal to "RetryAttempts" parameter value + 1 - "", "", ""' -TestCases $testCasesValidApiUriHttpMethodHttpRequestHeaders3 { param ([System.String]$ApiUri, [System.String]$HttpMethod, [Hashtable]$HttpRequestHeader) Mock Start-Sleep { } -Verifiable From f5576d8b6a86e21436a4ae8dc476a0c1fe64463e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 15:53:33 +0000 Subject: [PATCH 421/611] Added 'Get-AzDevOpsApiResource' function, unit tests --- .../Private/Get-AzDevOpsApiResource.Tests.ps1 | 84 ++++++++++++++----- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 index f75ed80f8..e2d1909be 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 @@ -24,48 +24,49 @@ InModuleScope 'AzureDevOpsDsc.Common' { # Helper function for generating fake resource, JSON response Function Get-MockResourceJson { - param - ( - [System.String] - $ResourceId - ) - return '{ - "count": 2, + "count": 3, "value": [ { - "id": "$ResourceId", + "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", "name": "Test Resource 1", "description": "Test Resource Description 1", - "url": "https://dev.azure.com/fabrikam/_apis/resources/$ResourceId", + "url": "https://dev.azure.com/fabrikam/_apis/resources/8d4bff8d-6169-45cf-b085-fe12ad67e76b", "state": "wellFormed" }, { - "id": "8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "id": "114bff8d-6169-45cf-b085-fe121267e7aa", "name": "Test Resource 2", "description": "Test Resource Description 2", - "url": "https://dev.azure.com/fabrikam/_apis/resources/8d4bff8d-6169-45cf-b085-fe12ad67e76b", + "url": "https://dev.azure.com/fabrikam/_apis/resources/114bff8d-6169-45cf-b085-fe121267e7aa", + "state": "wellFormed" + }, + { + "id": "a654b805-6be9-477b-a00c-bd76949192c3", + "name": "Test Resource 3", + "description": "Test Resource Description 3", + "url": "https://dev.azure.com/fabrikam/_apis/resources/a654b805-6be9-477b-a00c-bd76949192c3", "state": "wellFormed" } ] }' } - $noOfMockResources = $(Get-MockResourceJson -ResourceId $([GUID]::NewGuid()) | ConvertFrom-Json).Count - $resourceIdThatExists = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' - $resourceIdThatDoesNotExist = '114bff8d-6169-45cf-b085-fe121267e7aa' + $noOfMockResources = $((Get-MockResourceJson | ConvertFrom-Json).value).Count + $resourceIdThatExists = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' # Same as 'Test Resource 1' in 'Get-MockResourceJson', JSON output + $resourceIdThatDoesNotExist = '7f5a49c8-9424-4ec5-b4b7-1dc76cd05149' $resourceIdThatIsInvalid = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Invalid' # Mock functions called in function Mock Invoke-RestMethod { - $resources = Get-MockResourceJson -ResourceId $ResourceId | ConvertFrom-Json - $nonPresentResourceId = $resourceIdThatDoesNotExist + #$resourceIdThatExists = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' + [PSObject]$resources = Get-MockResourceJson | ConvertFrom-Json if (![string]::IsNullOrWhiteSpace($ResourceId)) { - $resources = $resources.value | - Where-Object { $_.id -eq $ResourceId} | - Where-Object { $_.id -ne $nonPresentResourceId} + [PSObject[]]$resources = $resources.value + [PSObject]$resources = $resources | + Where-Object { $_.id -eq $ResourceId} } return $resources @@ -123,6 +124,37 @@ InModuleScope 'AzureDevOpsDsc.Common' { $resources.Count | Should -Be $noOfMockResources } + + It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Get-AzDevOpsApiResourceUri {} -Verifiable + + $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + + Assert-MockCalled 'Get-AzDevOpsApiResourceUri' -Times 1 -Exactly + } + + It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Get-AzDevOpsApiHttpRequestHeader {} -Verifiable + + $resources = Get-AzDevOpsApiHttpRequestHeader -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + + Assert-MockCalled 'Get-AzDevOpsApiHttpRequestHeader' -Times 1 -Exactly + } + + It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Invoke-RestMethod {} -Verifiable + + $resources = Invoke-RestMethod -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + + Assert-MockCalled 'Invoke-RestMethod' -Times 1 -Exactly + } + } @@ -153,12 +185,20 @@ InModuleScope 'AzureDevOpsDsc.Common' { $true | Should -Be $true # Note: Will always evaluate true (but strong-typing of $resources variable would fail this test anyway) } - It 'Should return only 1 resource - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + It 'Should not return a $null - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) - [System.Management.Automation.PsObject[]]$resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists + [System.Management.Automation.PsObject]$resource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists + + $resource | Should -Not -BeNullOrEmpty + } + + It 'Should return a resource with the correct "id"/"ResourceId" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + [System.Management.Automation.PsObject]$resource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $resourceIdThatExists - $resources.Count | Should -Be 1 + $resource.id | Should -Be $resourceIdThatExists } } From b641646e8bec2f0f18723219d59762a25ef3540a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 15:53:53 +0000 Subject: [PATCH 422/611] Simplified 'Get-AzDevOpsApiResource' function --- .../Private/Get-AzDevOpsApiResource.ps1 | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 index 4c805739a..3e4f09bb2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 @@ -40,7 +40,7 @@ function Get-AzDevOpsApiResource { [CmdletBinding()] - [OutputType([System.Object[]])] + [OutputType([System.Management.Automation.PSObject[]])] param ( [Parameter(Mandatory=$true)] @@ -71,35 +71,37 @@ function Get-AzDevOpsApiResource $ResourceId ) - if ($ResourceId -contains '*') - { - $ResourceId = $null - } + # Prepare 'Get-AzDevOpsApiResourceUri' method parameters $apiResourceUriParameters = @{ ApiUri = $ApiUri ApiVersion = $ApiVersion ResourceName = $ResourceName } - if (![string]::IsNullOrWhiteSpace($ResourceId)) + + if (![System.String]::IsNullOrWhiteSpace($ResourceId)) { $apiResourceUriParameters.ResourceId = $ResourceId } - [string]$apiResourceUri = Get-AzDevOpsApiResourceUri @apiResourceUriParameters - [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat + # Prepare 'Invoke-RestMethod' method parameters + $invokeRestMethodParameters = @{ + Uri = $(Get-AzDevOpsApiResourceUri @apiResourceUriParameters) + Method = 'Get' + Headers = $(Get-AzDevOpsApiHttpRequestHeader -Pat $Pat) + } - [System.Object[]]$apiResources = @() - $apiResources += Invoke-RestMethod -Uri $apiResourceUri -Method 'Get' -Headers $apiHttpRequestHeader + [System.Management.Automation.PSObject]$apiResources = Invoke-RestMethod @invokeRestMethodParameters # If not a single, resource request, set from the resource(s) in the 'value' property within the response - if ([System.String]::IsNullOrWhiteSpace($ResourceId)) + if ($null -ne $apiResources.value) { - [System.Object[]]$apiResources = $apiResources.value + [System.Management.Automation.PSObject[]]$apiResources = $apiResources.value } + return $apiResources } From d1193b5dd910bf29cc4552a728d2156a751a22ac Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:04:11 +0000 Subject: [PATCH 423/611] Added tests for 'Get-AzDevOpsApiResource' function to ensure execution of referenced functions. --- .../Private/Get-AzDevOpsApiResource.Tests.ps1 | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 index e2d1909be..71a9eeba0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 @@ -128,31 +128,35 @@ InModuleScope 'AzureDevOpsDsc.Common' { It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) - Mock Get-AzDevOpsApiResourceUri {} -Verifiable + Mock Get-AzDevOpsApiResourceUri { + return "http://someUri.api/" + } -Verifiable $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName - Assert-MockCalled 'Get-AzDevOpsApiResourceUri' -Times 1 -Exactly + Assert-MockCalled 'Get-AzDevOpsApiResourceUri' -Times 1 -Exactly -Scope 'It' } - It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + It 'Should invoke "Get-AzDevOpsApiHttpRequestHeader" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) - Mock Get-AzDevOpsApiHttpRequestHeader {} -Verifiable + Mock Get-AzDevOpsApiHttpRequestHeader { + Get-TestCaseValue -ScopeName 'HttpRequestHeader' -TestCaseName 'Valid' -First 1 + } -Verifiable - $resources = Get-AzDevOpsApiHttpRequestHeader -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName - Assert-MockCalled 'Get-AzDevOpsApiHttpRequestHeader' -Times 1 -Exactly + Assert-MockCalled 'Get-AzDevOpsApiHttpRequestHeader' -Times 1 -Exactly -Scope 'It' } - It 'Should invoke "Get-AzDevOpsApiResourceUri" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + It 'Should invoke "Invoke-RestMethod" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) Mock Invoke-RestMethod {} -Verifiable - $resources = Invoke-RestMethod -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName + $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName - Assert-MockCalled 'Invoke-RestMethod' -Times 1 -Exactly + Assert-MockCalled 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' } } From c11ef77f67552c435dc7ddc5ea7660348b022551 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:17:02 +0000 Subject: [PATCH 424/611] Removed '_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1' placeholder file --- .../Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Invoke-AzDevOpsApiRestMethod.Tests.ps1 deleted file mode 100644 index e69de29bb..000000000 From 9d41b9c848ff1e72b923b72b087706043f1f7f01 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:20:05 +0000 Subject: [PATCH 425/611] Renamed '_TODO2.Test-AzDevOpsApiResource.Tests.ps1' to 'Test-AzDevOpsApiResource.Tests.ps1' --- ...psApiResource.Tests.ps1 => Test-AzDevOpsApiResource.Tests.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/{_TODO2.Test-AzDevOpsApiResource.Tests.ps1 => Test-AzDevOpsApiResource.Tests.ps1} (100%) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 similarity index 100% rename from tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_TODO2.Test-AzDevOpsApiResource.Tests.ps1 rename to tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 From a596593ec03334442f539b2c4e268707808fcd33 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:52:27 +0000 Subject: [PATCH 426/611] Added 'First' parameter to calls to 'Get-TestCaseValue' from a couple of test scripts. --- .../Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 | 4 ++-- .../Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 index 71a9eeba0..92267ee27 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 @@ -84,7 +84,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidResourceNames) -Expand $testCasesValidApiUriPatResourceNames3 = $testCasesValidApiUriPatResourceNames | Select-Object -First 3 - $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 # Generate invalid, test cases $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' @@ -96,7 +96,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesInvalidResourceNames) -Expand $testCasesInvalidApiUriPatResourceNames3 = $testCasesInvalidApiUriPatResourceNames | Select-Object -First 3 - $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' -First 1 Context 'When input parameters are valid' { diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 index 82764c11a..c5be79a5f 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Wait-AzDevOpsApiResource.Tests.ps1 @@ -41,7 +41,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidResourceIds) -Expand $testCasesValidApiUriPatResourceIds3 = $testCasesValidApiUriPatResourceIds | Select-Object -First 3 - $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 # Generate invalid, test cases $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' @@ -53,7 +53,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesInvalidResourceIds) -Expand $testCasesInvalidApiUriPatResourceIds3 = $testCasesInvalidApiUriPatResourceIds | Select-Object -First 3 - $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' -First 1 Context 'When input parameters are valid' { From 209959a3f67621ae6b6f2772ec92848a4f197151 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:52:58 +0000 Subject: [PATCH 427/611] Changed $apiResource variable type within 'Test-AzDevOpsApiResource' --- .../Api/Functions/Private/Test-AzDevOpsApiResource.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 index 9ac578457..fcdb07a69 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.ps1 @@ -65,9 +65,9 @@ function Test-AzDevOpsApiResource $ResourceId ) - [object[]]$apiResource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` - -ResourceName $ResourceName ` - -ResourceId $ResourceId + [System.Management.Automation.PSObject[]]$apiResource = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat ` + -ResourceName $ResourceName ` + -ResourceId $ResourceId return ($apiResource.Count -gt 0) } From 9fe8361a72d9ef9cffa0976e0808cb7834be4092 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 16:53:28 +0000 Subject: [PATCH 428/611] Added 'Test-AzDevOpsApiResource' function, unit tests --- .../Test-AzDevOpsApiResource.Tests.ps1 | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 index e69de29bb..161d2add0 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Test-AzDevOpsApiResource.Tests.ps1 @@ -0,0 +1,165 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Api\Functions\Private\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Api\Function\$script:commandName" -Tag $script:tag { + + + # Mock functions called in function + Mock Get-AzDevOpsApiResource {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' + $testCasesValidApiUriPatResourceNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidResourceNames) -Expand + $testCasesValidApiUriPatResourceNames3 = $testCasesValidApiUriPatResourceNames | Select-Object -First 3 + + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + $validResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Valid' -First 1 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatResourceNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidResourceNames) -Expand + $testCasesInvalidApiUriPatResourceNames3 = $testCasesInvalidApiUriPatResourceNames | Select-Object -First 3 + + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' -First 1 + $invalidResourceId = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Invalid' -First 1 + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory, "ApiUri", "Pat", "ResourceName" and "ResourceId" parameters' { + + Context 'When the "ResourceId" parameter value is invalid' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $invalidResourceId } | Should -Throw + } + } + + Context 'When the "ResourceId" parameter value is valid' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId } | Should -Not -Throw + } + + It 'Should return a type of "boolean" - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + $output = Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId + + $output | Should -BeOfType [boolean] + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When the resource exists' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Get-AzDevOpsApiResource { + return [System.Management.Automation.PSObject[]]@( + [System.Management.Automation.PSObject]@{ + id = '9a7ee4cf-7fa7-40e1-a3c0-1d0aacdaad92' + }, + [System.Management.Automation.PSObject]@{ + id = 'db79312c-8231-48b7-9967-db1bad53c881' + } + ) + } + + Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId | Should -BeTrue + } + + } + + + Context 'When the resource does not exist' { + + It 'Should return $false - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + Mock Get-AzDevOpsApiResource { + return [System.Management.Automation.PSObject[]]@() + } + + Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId | Should -BeFalse + } + + } + + } + + Context "When also called with valid 'ApiVersion' parameter value" { + + It "Should not throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Test-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $validApiVersion -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId } | Should -Not -Throw + } + } + + Context "When also called with invalid 'ApiVersion' parameter value" { + + It "Should throw - '', '', ''" -TestCases $testCasesValidApiUriPatResourceNames3 { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Test-AzDevOpsApiResource -ApiUri $ApiUri -ApiVersion $invalidApiVersion -Pat $Pat -ResourceName $ResourceName -ResourceId $validResourceId } | Should -Throw + } + } + } + } + + + Context 'When input parameters are invalid' { + + Context 'When called with mandatory, "ApiUri", "Pat" and "ResourceName" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesinvalidApiUriPatResourceNames { + param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) + + { Test-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName } | Should -Throw + } + } + + } + } +} From 4c226c8222de41d7166bb47a6633281e46f45540 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 17:44:30 +0000 Subject: [PATCH 429/611] Updated $operation variable data type, and validation on 'IsComplete' and 'IsSuccessful' parameters within 'Test-AzDevOpsOperation' function. --- .../Resources/Functions/Public/Test-AzDevOpsOperation.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 373c73415..86912d151 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -72,10 +72,12 @@ function Test-AzDevOpsOperation $OperationId, [Parameter(Mandatory = $true, ParameterSetName='IsComplete')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsComplete, [Parameter(Mandatory = $true, ParameterSetName='IsSuccessful')] + [ValidateSet($true)] [System.Management.Automation.SwitchParameter] $IsSuccessful ) @@ -92,8 +94,8 @@ function Test-AzDevOpsOperation } - [object[]]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` - -OperationId $OperationId + [System.Management.Automation.PSObject]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` + -OperationId $OperationId # Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus From 2bdebda37c3b1c5cd47bda44c2125b9b35b09314 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 17:44:45 +0000 Subject: [PATCH 430/611] Added unit tests for 'Test-AzDevOpsOperation' function. --- .../Public/Test-AzDevOpsOperation.Tests.ps1 | 284 ++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..134fb732b --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1,284 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Resources\Functions\Public\$script:commandName" -Tag $script:tag { + + + # Mock functions called in function + Mock Get-AzDevOpsOperation {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesValidApiUriPatOperationIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidOperationIds) -Expand + $testCasesValidApiUriPatOperationIds3 = $testCasesValidApiUriPatOperationIds | Select-Object -First 3 + + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatOperationIds = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidOperationIds) -Expand + $testCasesInvalidApiUriPatOperationIds3 = $testCasesInvalidApiUriPatOperationIds | Select-Object -First 3 + + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' -First 1 + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory "ApiUri", "Pat" and "OperationId" parameters' { + + + Context 'When also called with both "IsComplete" switch' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsOperation" only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation {} -Verifiable + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete + + Assert-MockCalled 'Get-AzDevOpsOperation' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When "Operation" has completed' { + + Context 'When status" of "Operation" is "succeeded"' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'succeeded' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Should -BeTrue + } + } + + Context 'When status" of "Operation" is "cancelled"' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'cancelled' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Should -BeTrue + } + } + + Context 'When status" of "Operation" is "failed"' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'failed' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Should -BeTrue + } + } + + } + + + Context 'When "Operation" has not completed' { + + It 'Should return $false - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'AnyNonCompletedStatus' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Should -BeFalse + } + } + } + + + Context 'When also called with both "IsSuccessful" switch' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Not -Throw + } + + + Context 'When "Operation" has succeeded' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'succeeded' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful | Should -BeTrue + } + } + + + Context 'When "Operation" has not succeeded' { + + It 'Should return $false - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsOperation { + return $([PSObject]@{ + status = 'ANotSucceededStatus' + }) + } + + Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful | Should -BeFalse + } + } + } + + } + } + + Context 'When input parameters are invalid' { + + + Context 'When called with mandatory "ApiUri", "Pat" and "OperationId" parameters' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete:$null } | Should -Throw + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful:$null } | Should -Throw + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete:$null -IsSuccessful:$null } | Should -Throw + } + + Context 'When also called with both "IsComplete" and "IsSuccessful" switches' { + + It 'Should throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -IsSuccessful } | Should -Throw + } + + } + + } + + + Context 'When called with invalid "ApiUri", "Pat" and "OperationId" parameters, and "IsComplete" switch' { + + It 'Should throw - "", "", ""' -TestCases $testCasesInvalidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Throw + } + + } + + + Context 'When called with invalid "ApiUri", "Pat" and "OperationId" parameters, and "IsSuccessful" switch' { + + It 'Should throw - "", "", ""' -TestCases $testCasesInvalidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Throw + } + + } + + } + + + + + + + + + Context "When input parameters are invalid" { + + + Context 'When called with no/null parameter values/switches' { + + It 'Should throw' { + + { Test-AzDevOpsProjectName -ProjectName:$null -IsValid:$false } | Should -Throw + } + } + + + Context 'When "ProjectName" parameter value is a valid "ProjectName"' { + + + Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw + } + } + } + + + Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { + + + Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { + + It 'Should throw - ""' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw + } + } + } + + + } + } +} From fe151d9fa6c6bc4ac58da0d289f1dee7c3d2617b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 17:45:57 +0000 Subject: [PATCH 431/611] Simplified 'Test-AzDevOpsOperation' function --- .../Public/Test-AzDevOpsOperation.ps1 | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 index 86912d151..2b71121fc 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.ps1 @@ -82,28 +82,10 @@ function Test-AzDevOpsOperation $IsSuccessful ) - if (!$IsComplete -and !$IsSuccessful) - { - $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesNotUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - elseif ($IsComplete -and $IsSuccessful) - { - $errorMessage = $script:localizedData.MandatoryIsCompleteAndIsSuccessfulSwitchesBothUsed -f $MyInvocation.MyCommand - New-InvalidOperationException -Message $errorMessage - } - - [System.Management.Automation.PSObject]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat ` -OperationId $OperationId - # Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/operations/operations/get?view=azure-devops-rest-6.0#operationstatus - if (($IsSuccessful -and ($operation.status -eq 'succeeded')) -or - ($IsComplete -and ($operation.status -in @('succeeded', 'cancelled', 'failed')))) - { - return $true - } - - return $false + return (($IsSuccessful -and ($operation.status -eq 'succeeded')) -or + ($IsComplete -and ($operation.status -in @('succeeded', 'cancelled', 'failed')))) } From 86079bdabfc35fb8405dbcb94a4d10431d20387c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 17:50:02 +0000 Subject: [PATCH 432/611] Removed 'Test-AzDevOpsOperation.Tests.Old.ps1' --- .../Test-AzDevOpsOperation.Tests.Old.ps1 | 376 ------------------ 1 file changed, 376 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 deleted file mode 100644 index f99adfff0..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.Old.ps1 +++ /dev/null @@ -1,376 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsOperation' -Tag 'GetAzDevOpsOperation' { - - Context 'When called with valid parameters' { - BeforeEach { - $mockOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' - $mockSucceededOperationId = $mockOperationIds[0].OperationId - $mockCancelledOperationId = $mockOperationIds[1].OperationId - $mockFailedOperationId = $mockOperationIds[2].OperationId - $mockOperations = $mockOperationIds - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return $mockOperations | ForEach-Object { - @{ - id = $_.OperationId - status = & { - switch ($_.OperationId) - { - $mockSucceededOperationId { - return 'succeeded' - break - } - $mockCancelledOperationId { - break - return 'cancelled' - } - $mockFailedOperationId { - break - return 'failed' - } - default { - return 'inProgress' - break - } - } - } - } - } - } - } - - - $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - - $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' - $testCasesValidApiUriPatOperationIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidOperationIds - - - Context 'When called with an "OperationId" parameter but with no "IsComplete" switch and no "IsSuccessful" switch' { - - It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Throw - } - - } - - - Context 'When called with an "OperationId" parameter but with both an "IsComplete" switch and an "IsSuccessful" switch' { - - It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete -IsSuccessful } | Should -Throw - } - - } - - - Context 'When called with an "OperationId" parameter and just the "IsSuccessful" switch' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful } | Should -Not -Throw - } - - It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful - $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() - } - - It 'Should call "Get-AzDevOpsOperation" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsSuccessful | Out-Null - Should -Invoke Get-AzDevOpsOperation -ModuleName $script:subModuleName -Times 1 -Scope It - } - - Context 'When an "Operation" with supplied "OperationId" parameter value does not exist' { - - BeforeEach { - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @(@{}) - } - } - - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121117e7aa' -IsSuccessful # Non-present "OperationId" - $result | Should -BeFalse - } - } - - Context 'When a "Operation" with supplied "OperationId" parameter value does exist' { - - Context 'When the "Operation" present has a "status" of "succeeded"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockSucceededOperationId - status = 'succeeded' - } - } - } - - It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockSucceededOperationId -IsSuccessful - $result | Should -BeTrue - } - } - - Context 'When the "Operation" present has a "status" of "cancelled"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockCancelledOperationId - status = 'cancelled' - } - } - } - - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockCancelledOperationId -IsSuccessful - $result | Should -BeFalse - } - } - - Context 'When the "Operation" present has a "status" of "failed"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockFailedOperationId - status = 'failed' - } - } - } - - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockFailedOperationId -IsSuccessful - $result | Should -BeFalse - } - } - } - - } - - - - - Context 'When called with an "OperationId" parameter and just the "IsComplete" switch' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete } | Should -Not -Throw - } - - It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete - $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() - } - - It 'Should call "Get-AzDevOpsOperation" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId -IsComplete | Out-Null - Should -Invoke Get-AzDevOpsOperation -ModuleName $script:subModuleName -Times 1 -Scope It - } - - Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @(@{}) - } - } - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121267e7aa' -IsComplete # Non-present "OperationId" - $result | Should -BeFalse - } - } - - Context 'When a "Operation" with supplied "OperationId" parameter value does exist' { - - Context 'When the "Operation" present has a "status" of "succeeded"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockSucceededOperationId - status = 'succeeded' - } - } - } - - It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockSucceededOperationId -IsComplete - $result | Should -BeTrue - } - } - - Context 'When the "Operation" present has a "status" of "cancelled"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockCancelledOperationId - status = 'cancelled' - } - } - } - - It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockCancelledOperationId -IsComplete - $result | Should -BeTrue - } - } - - Context 'When the "Operation" present has a "status" of "failed"' { - - BeforeEach { - - Mock -ModuleName $script:subModuleName Get-AzDevOpsOperation { - - return @{ - id = $mockFailedOperationId - status = 'failed' - } - } - } - - It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $mockFailedOperationId -IsComplete - $result | Should -BeTrue - } - } - } - - } - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "Pat" parameter' { - - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - - Context 'When called without "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Test-AzDevOpsOperation -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with valid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $validApiUri = 'https://someuri.api/_apis/' - { Test-AzDevOpsOperation -ApiUri $validApiUri -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with invalid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $invalidApiUri = 'someInvalidApiUrl' - { Test-AzDevOpsOperation -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw - - } - } - } - - Context 'When called with invalid "ApiUri" parameter' { - - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' - $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - - Context 'When called without "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - { Test-AzDevOpsOperation -ApiUri $ApiUri } | Should -Throw - - } - } - - Context 'When called with valid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $validPat = '1234567890123456789012345678901234567890123456789012' - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $validPat } | Should -Throw - - } - } - - Context 'When called with invalid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $invalidPat = '123456789012' - { Test-AzDevOpsOperation -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw - - } - } - } - } - - } - -} From 40075a460be73141b3ed73334601c03ee0d14f28 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 18:16:55 +0000 Subject: [PATCH 433/611] Removed non-required unit tests for 'Test-AzDevOpsOperation' --- .../Public/Test-AzDevOpsOperation.Tests.ps1 | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 index 134fb732b..ac2bef1c1 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsOperation.Tests.ps1 @@ -231,54 +231,5 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } - - - - - - - - - Context "When input parameters are invalid" { - - - Context 'When called with no/null parameter values/switches' { - - It 'Should throw' { - - { Test-AzDevOpsProjectName -ProjectName:$null -IsValid:$false } | Should -Throw - } - } - - - Context 'When "ProjectName" parameter value is a valid "ProjectName"' { - - - Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { - - It 'Should throw - ""' -TestCases $testCasesValidProjectNames { - param ([System.String]$ProjectName) - - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw - } - } - } - - - Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { - - - Context 'When called with "ProjectName" parameter value but a $false "IsValid" switch value' { - - It 'Should throw - ""' -TestCases $testCasesInvalidProjectNames { - param ([System.String]$ProjectName) - - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid:$false } | Should -Throw - } - } - } - - - } } } From 1951b3e36da66e483a9ba13d693a1cef22957ff5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 12 Nov 2020 18:35:59 +0000 Subject: [PATCH 434/611] Added 'Test-AzDevOpsProject' function, unit tests --- .../Public/Test-AzDevOpsProject.Tests.Old.ps1 | 212 --------------- .../Public/Test-AzDevOpsProject.Tests.ps1 | 242 ++++++++++++++++++ 2 files changed, 242 insertions(+), 212 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 deleted file mode 100644 index 3363691db..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.Old.ps1 +++ /dev/null @@ -1,212 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - - Describe 'AzureDevOpsDsc.Common\Test-AzDevOpsProject' -Tag 'GetAzDevOpsProject' { - - Context 'When called with valid parameters' { - BeforeAll { - $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames - - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { - - return $mockProjects | ForEach-Object { - @{ - id = $_.ProjectId - name = $_.ProjectName - } - } - } - } - - - $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - - $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $testCasesValidApiUriPatProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectNames - - $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $testCasesValidApiUriPatProjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectIds - - - Context 'When called with no "ProjectId" parameter and no "ProjectName" parameter' { - - It 'Should throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Throw - } - - } - - - Context 'When called with no "ProjectId" parameter but with a "ProjectName" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw - } - - It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName - $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() - } - - Context 'When a "Project" with supplied "ProjectName" parameter value exists' { - - It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It - } - } - - Context 'When a "Project" with supplied "ProjectName" parameter value does not exist' { - - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName 'NonPresentProjectName' - $result | Should -BeFalse - } - } - } - - - Context 'When called with no "ProjectName" parameter but with a "ProjectId" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw - } - - It 'Should return "bool" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId - $result.GetType() | Should -BeIn $([System.Boolean]::new()).GetType() - } - - It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It - } - - Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { - - It 'Should return $false - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ProjectId" - $result | Should -BeFalse - } - } - - Context 'When a "Project" with supplied "ProjectId" parameter value does exist' { - - It 'Should return $true - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $($mockProjectIds[0].ProjectId) - $result | Should -BeTrue - } - } - - } - - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "Pat" parameter' { - - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - - Context 'When called without "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Test-AzDevOpsProject -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with valid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $validApiUri = 'https://someuri.api/_apis/' - { Test-AzDevOpsProject -ApiUri $validApiUri -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with invalid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $invalidApiUri = 'someInvalidApiUrl' - { Test-AzDevOpsProject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw - - } - } - } - - Context 'When called with invalid "ApiUri" parameter' { - - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' - $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - - Context 'When called without "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - { Test-AzDevOpsProject -ApiUri $ApiUri } | Should -Throw - - } - } - - Context 'When called with valid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $validPat = '1234567890123456789012345678901234567890123456789012' - { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $validPat } | Should -Throw - - } - } - - Context 'When called with invalid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $invalidPat = '123456789012' - { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw - - } - } - } - } - - } - -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..d3026ee0a --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 @@ -0,0 +1,242 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Resources\Functions\Public\$script:commandName" -Tag $script:tag { + + + # Mock functions called in function + Mock Get-AzDevOpsProject {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectIds) -Expand + $testCasesValidApiUriPatProjectIds3 = $testCasesValidApiUriPatProjectIds | Select-Object -First 3 + + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectNames) -Expand + $testCasesValidApiUriPatProjectNames3 = $testCasesValidApiUriPatProjectNames | Select-Object -First 3 + + $testCasesValidApiUriPatProjectIdProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectIds, + $testCasesValidProjectNames) -Expand + $testCasesValidApiUriPatProjectIdProjectNames3 = $testCasesValidApiUriPatProjectIdProjectNames | Select-Object -First 3 + + $validApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Valid' -First 1 + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatProjectIds = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectIds) -Expand + $testCasesInvalidApiUriPatProjectIds3 = $testCasesInvalidApiUriPatProjectIds | Select-Object -First 3 + + $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectNames) -Expand + $testCasesInvalidApiUriPatProjectNames3 = $testCasesInvalidApiUriPatProjectNames | Select-Object -First 3 + + $testCasesInvalidApiUriPatProjectIdProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectIds, + $testCasesInvalidProjectNames) -Expand + $testCasesInvalidApiUriPatProjectIdProjectNames3 = $testCasesInvalidApiUriPatProjectIdProjectNames | Select-Object -First 3 + + $invalidApiVersion = Get-TestCaseValue -ScopeName 'ApiVersion' -TestCaseName 'Invalid' -First 1 + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory "ApiUri", "Pat" and "ProjectId" parameters' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsProject" only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Mock Get-AzDevOpsProject {} -Verifiable + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null + + Assert-MockCalled 'Get-AzDevOpsProject' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When "Get-AzDevOpsProject" returns a present record (with an "id" property)' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Mock Get-AzDevOpsProject { + return $([PSObject]@{ + id = "62d7a991-b78e-4386-b14e-e4eb2a805947" + }) + } + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Should -BeTrue + } + } + + + Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Mock Get-AzDevOpsProject {} + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Should -BeFalse + } + } + } + + + Context 'When called with mandatory "ApiUri", "Pat" and "ProjectName" parameters' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsProject" only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Mock Get-AzDevOpsProject {} -Verifiable + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName + + Assert-MockCalled 'Get-AzDevOpsProject' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When "Get-AzDevOpsProject" returns a present record (with an "id" property)' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Mock Get-AzDevOpsProject { + return $([PSObject]@{ + id = "62d7a991-b78e-4386-b14e-e4eb2a805947" + }) + } + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Should -BeTrue + } + } + + + Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { + + It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Mock Get-AzDevOpsProject {} + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Should -BeFalse + } + } + + } + + + Context 'When called with mandatory "ApiUri", "Pat", "ProjectId" and "ProjectName" parameters' { + + It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsProject" only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + Mock Get-AzDevOpsProject {} -Verifiable + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName + + Assert-MockCalled 'Get-AzDevOpsProject' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When "Get-AzDevOpsProject" returns a present record (with an "id" property)' { + + It 'Should return $true - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + Mock Get-AzDevOpsProject { + return $([PSObject]@{ + id = "62d7a991-b78e-4386-b14e-e4eb2a805947" + }) + } + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName | Should -BeTrue + } + } + + + Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { + + It 'Should return $true - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + Mock Get-AzDevOpsProject {} + + Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName | Should -BeFalse + } + } + + } + } + + + Context 'When input parameters are invalid' { + + + Context 'When called with mandatory "ApiUri", "Pat", "ProjectId" and "ProjectName" parameters' { + + It 'Should throw - "", "", "", ""' -TestCases $testCasesInvalidApiUriPatProjectIdProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + { Test-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName } | Should -Throw + } + + } + } + } +} From 13bdaef910ca5d42604fe7ca76b29099da45c79f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 09:42:17 +0000 Subject: [PATCH 435/611] Tidied up 'Get-AzDevOpsOperation' function --- .../Public/Get-AzDevOpsOperation.ps1 | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 index cf24bc608..70bf16a4d 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.ps1 @@ -23,7 +23,7 @@ function Get-AzDevOpsOperation { [CmdletBinding()] - [OutputType([System.Object[]])] + [OutputType([System.Management.Automation.PSObject[]])] param ( [Parameter(Mandatory = $true)] @@ -45,26 +45,23 @@ function Get-AzDevOpsOperation $OperationId ) - + # Prepare parameters for 'Get-AzDevOpsApiResource' invocation $azDevOpsApiResourceParameters = @{ ApiUri = $ApiUri; Pat = $Pat; - ResourceName = 'Operation'} - - - If(![string]::IsNullOrWhiteSpace($OperationId)){ + ResourceName = 'Operation' + } + If(![System.String]::IsNullOrWhiteSpace($OperationId)){ $azDevOpsApiResourceParameters.ResourceId = $OperationId } + # Obtain "Operation" resources + [System.Management.Automation.PSObject[]]$apiResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters - [System.Object[]]$apiResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters - - - If(![string]::IsNullOrWhiteSpace($OperationId)){ - $apiResources = $apiResources | - Where-Object id -ilike $OperationId + # Filter "Operation" resources + If(![System.String]::IsNullOrWhiteSpace($OperationId)){ + $apiResources = $apiResources | Where-Object { $_.id -eq $OperationId } } - - return [object[]]$apiResources + return [System.Management.Automation.PSObject[]]$apiResources } From e88852b9fd33c3fcde0a2ae57da3cea43c14c4c0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 09:43:31 +0000 Subject: [PATCH 436/611] Corrected 'It' descriptions in 'Test-AzDevOpsProject' function, unit tests. --- .../Functions/Public/Test-AzDevOpsProject.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 index d3026ee0a..6979a2b19 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Test-AzDevOpsProject.Tests.ps1 @@ -115,7 +115,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { - It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { + It 'Should return $false - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) Mock Get-AzDevOpsProject {} @@ -163,7 +163,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { - It 'Should return $true - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { + It 'Should return $false - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) Mock Get-AzDevOpsProject {} @@ -212,7 +212,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When "Get-AzDevOpsProject" does not return a record (with no "id" property)' { - It 'Should return $true - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { + It 'Should return $false - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) Mock Get-AzDevOpsProject {} From c8c6d750e99300c9c4e79566e4fd1a16d2ccc199 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 09:48:59 +0000 Subject: [PATCH 437/611] Added 'Get-AzDevOpsOperation' function, unit tests --- .../Get-AzDevOpsOperation.Tests.Old.ps1 | 171 ------------- .../Public/Get-AzDevOpsOperation.Tests.ps1 | 231 ++++++++++++++++++ 2 files changed, 231 insertions(+), 171 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 deleted file mode 100644 index 7d247f79a..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.Old.ps1 +++ /dev/null @@ -1,171 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsOperation' -Tag 'GetAzDevOpsOperation' { - - Context 'When called with valid parameters' { - BeforeAll { - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { - return $(Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid') | - ForEach-Object { - @{ - id = $_.OperationId - } - } - } - } - - - $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - - $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' - $testCasesValidApiUriPatOperationIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidOperationIds - - - Context 'When called with no "OperationId" parameter' { - - It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - It 'Should call "Get-AzDevOpsApiResource" function only once - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It - } - - } - - - Context 'When called with a "OperationId" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - It 'Should call "Get-AzDevOpsApiResource" function only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$OperationId) - - Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Exactly -Scope It - } - - Context 'When a "Operation" with supplied "OperationId" parameter value does not exist' { - - It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "OperationId" - $result | Should -Be $null - } - } - - } - - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "Pat" parameter' { - - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - - Context 'When called without "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Get-AzDevOpsOperation -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with valid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $validApiUri = 'https://someuri.api/_apis/' - { Get-AzDevOpsOperation -ApiUri $validApiUri -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with invalid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $invalidApiUri = 'someInvalidApiUrl' - { Get-AzDevOpsOperation -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw - - } - } - } - - Context 'When called with invalid "ApiUri" parameter' { - - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' - $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - - Context 'When called without "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - { Get-AzDevOpsOperation -ApiUri $ApiUri } | Should -Throw - - } - } - - Context 'When called with valid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $validPat = '1234567890123456789012345678901234567890123456789012' - { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $validPat } | Should -Throw - - } - } - - Context 'When called with invalid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $invalidPat = '123456789012' - { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw - - } - } - } - } - - } - -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 new file mode 100644 index 000000000..b782cf35b --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -0,0 +1,231 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Resources\Functions\Public\$script:commandName" -Tag $script:tag { + + # Mock functions called in function + Mock Get-AzDevOpsApiResource {} + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPats = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats) -Expand + $testCasesValidApiUriPats3 = $testCasesValidApiUriPats | Select-Object -First 3 + + $testCasesValidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Valid' + $testCasesValidApiUriPatOperationIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidOperationIds) -Expand + $testCasesValidApiUriPatOperationIds3 = $testCasesValidApiUriPatOperationIds | Select-Object -First 3 + + $validOperationIdThatExists = '3456bc8e-0c47-440e-bd49-6db608abb461' + $validOperationIdThatDoesNotExist = '9b03d056-cd1c-4f51-b007-5d1d896e38f0' + + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPats = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats) -Expand + $testCasesInvalidApiUriPats3 = $testCasesInvalidApiUriPats | Select-Object -First 3 + + $testCasesInvalidOperationIds = Get-TestCase -ScopeName 'OperationId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatOperationIds = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidOperationIds) -Expand + $testCasesInvalidApiUriPatOperationIds3 = $testCasesInvalidApiUriPatOperationIds | Select-Object -First 3 + + + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory "ApiUri" and "Pat" parameters' { + + It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + Context 'When "Operation" resources do exist' { + + It 'Should return same number of "Operation" resources as "Get-AzDevOpsApiResource" does - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + Mock Get-AzDevOpsApiResource { + return @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validOperationIdThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + }), + $([System.Management.Automation.PSObject]@{ + id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + }), + $([System.Management.Automation.PSObject]@{ + id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + }) + ) + } + + $operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat + + $operations.Count | Should -Be $($(Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Operation').Count) + } + + } + + Context 'When "Operation" resources do not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + $operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat + $operations | Should -BeNullOrEmpty + } + + It 'Should return no "Operation" resources - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat + $operations.Count | Should -Be 0 + } + } + + + Context 'When also called with optional, "OperationId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", "", ""' -TestCases $testCasesValidApiUriPatOperationIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When an "Operation" resource exists' { + + Mock Get-AzDevOpsApiResource { + return @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validOperationIdThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + }) + ) + } + + It 'Should return exactly 1 "Operation" resource - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatExists + $operations.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Operation" resource - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatExists + + $operation.id | Should -Be $validOperationIdThatExists + } + + } + + + Context 'When an "Operation" resource does not exist' { + + It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatDoesNotExist + $operations | Should -BeNullOrEmpty + } + + It 'Should return no "Operation" resources - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatDoesNotExist + $operations.Count | Should -Be 0 + } + } + } + } + } + + + Context 'When input parameters are invalid' { + + + Context 'When called with invalid, mandatory "ApiUri" and "Pat" parameters' { + + It 'Should throw - "", ""' -TestCases $testCasesInvalidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat } | Should -Throw + } + + + Context 'When also called with invalid, optional, "OperationId" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesInvalidApiUriPatOperationIds { + param ([string]$ApiUri, [string]$Pat, [string]$OperationId) + + { Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $OperationId } | Should -Throw + } + } + + } + + } + } +} From 7317231bcd2b781988273950803174806bf9998c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 10:32:49 +0000 Subject: [PATCH 438/611] Made minor updates to test case, 'It' descriptions in 'Get-AzDevOpsOperation' function, unit tests --- .../Functions/Public/Get-AzDevOpsOperation.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 index b782cf35b..e1ec2dd0d 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsOperation.Tests.ps1 @@ -164,14 +164,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { ) } - It 'Should return exactly 1 "Operation" resource - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + It 'Should return exactly 1 "Operation" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { param ([string]$ApiUri, [string]$Pat) [System.Management.Automation.PSObject[]]$operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatExists $operations.Count | Should -Be 1 } - It 'Should return exactly 1 "Operation" resource - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + It 'Should return exactly 1 "Operation" resource with identical "id" - "", ""' -TestCases $testCasesValidApiUriPats3 { param ([string]$ApiUri, [string]$Pat) [System.Management.Automation.PSObject]$operation = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatExists @@ -184,14 +184,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When an "Operation" resource does not exist' { - It 'Should return $null - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { param ([string]$ApiUri, [string]$Pat) $operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatDoesNotExist $operations | Should -BeNullOrEmpty } - It 'Should return no "Operation" resources - "", "", ""' -TestCases $testCasesValidApiUriPats3 { + It 'Should return no "Operation" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { param ([string]$ApiUri, [string]$Pat) [System.Management.Automation.PSObject[]]$operations = Get-AzDevOpsOperation -ApiUri $ApiUri -Pat $Pat -OperationId $validOperationIdThatDoesNotExist From 86f766023e4fac52844f13d709692e94d2d90fe4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 14:05:42 +0000 Subject: [PATCH 439/611] Updated 'Get-AzDevOpsProject' to add comments and simplify function execution/body. --- .../Functions/Public/Get-AzDevOpsProject.ps1 | 52 ++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 index 1afc12e15..d0eb7c6cb 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 @@ -13,7 +13,7 @@ for the subsequent operations being performed. .PARAMETER ProjectId - The 'id' of the 'Project' being obtained/requested. Wildcards (e.g. '*') are allowed. + The 'id' of the 'Project' being obtained/requested. .PARAMETER ProjectName The 'name' of the 'Project' being obtained/requested. Wildcards (e.g. '*') are allowed. @@ -46,7 +46,7 @@ function Get-AzDevOpsProject { [CmdletBinding()] - [OutputType([System.Object[]])] + [OutputType([System.Management.Automation.PSObject[]])] param ( [Parameter(Mandatory = $true)] @@ -74,46 +74,40 @@ function Get-AzDevOpsProject $ProjectName ) - + # Prepare initial 'Get-AzDevOpsApiResource' function parameters $azDevOpsApiResourceParameters = @{ - ApiUri = $ApiUri; - Pat = $Pat; - ResourceName = 'Project'} - - - If(![string]::IsNullOrWhiteSpace($ProjectId)){ + ApiUri = $ApiUri + Pat = $Pat + ResourceName = 'Project' + } + If(![System.String]::IsNullOrWhiteSpace($ProjectId)){ $azDevOpsApiResourceParameters.ResourceId = $ProjectId } + # Obtain all 'Projects' (Note: This returns a limited set of properties, hence why subsequent calls are made) + [System.Management.Automation.PSObject[]]$apiListResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters + [System.Management.Automation.PSObject[]]$projects = @() - [object[]]$apiListResources = Get-AzDevOpsApiResource @azDevOpsApiResourceParameters - - - If(![string]::IsNullOrWhiteSpace($ProjectId)){ + # Filter projects by 'ProjectId' + If(![System.String]::IsNullOrWhiteSpace($ProjectId)){ $apiListResources = $apiListResources | - Where-Object id -ilike $ProjectId + Where-Object id -eq $ProjectId } - - If(![string]::IsNullOrWhiteSpace($ProjectName)){ + # Filter projects by 'ProjectName' (using 'ilike') + If(![System.String]::IsNullOrWhiteSpace($ProjectName)){ $apiListResources = $apiListResources | Where-Object name -ilike $ProjectName } - [object[]]$projects = @() - + # For each project (if any), call 'Get-AzDevOpsApiResource' again to obtain all 'Project' properties if ($apiListResources.Count -gt 0) { - $apiListResources | - ForEach-Object { - - $azDevOpsProjectParameters = @{ - ApiUri = $ApiUri; - Pat = $Pat; - ResourceName = 'Project' - ResourceId = $_.id} - $projects += $(Get-AzDevOpsApiResource @azDevOpsProjectParameters) - } + $apiListResources | ForEach-Object { + $azDevOpsApiResourceParameters.ResourceId = $_.id + $projects += $(Get-AzDevOpsApiResource @azDevOpsApiResourceParameters) + } } - return [object[]]$projects + + return [System.Management.Automation.PSObject[]]$projects } From 043594760d8cd55e02c4c5abcb0cefa6ce8fa731 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 14:20:52 +0000 Subject: [PATCH 440/611] Added 'Get-AzDevOpsProject' function, unit tests --- .../Public/Get-AzDevOpsProject.Tests.ps1 | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..6c6079475 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -0,0 +1,261 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Resources\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Resources\Functions\Public\$script:commandName" -Tag $script:tag { + + # Mock functions called in function + Mock Get-AzDevOpsApiResource {} -ModuleName $script:subModuleName + + # Generate valid, test cases + $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' + $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' + $testCasesValidApiUriPats = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats) -Expand + $testCasesValidApiUriPats3 = $testCasesValidApiUriPats | Select-Object -First 3 + + $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectIds = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectIds) -Expand + $testCasesValidApiUriPatProjectIds3 = $testCasesValidApiUriPatProjectIds | Select-Object -First 3 + + $validProjectIdThatExists = '3456bc8e-0c47-440e-bd49-6db608abb461' + $validProjectIdThatDoesNotExist = '9b03d056-cd1c-4f51-b007-5d1d896e38f0' + + + # Generate invalid, test cases + $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' + $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPats = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats) -Expand + $testCasesInvalidApiUriPats3 = $testCasesInvalidApiUriPats | Select-Object -First 3 + + $testCasesInvalidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatProjectIds = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectIds) -Expand + $testCasesInvalidApiUriPatProjectIds3 = $testCasesInvalidApiUriPatProjectIds | Select-Object -First 3 + + + + + Context 'When input parameters are valid' { + + + Context 'When called with mandatory "ApiUri" and "Pat" parameters' { + Mock Get-AzDevOpsApiResource {} + + It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + Context 'When "Project" resources do exist' { + + It 'Should return same number of "Project" resources as "Get-AzDevOpsApiResource" does - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + Mock Get-AzDevOpsApiResource { + [System.Management.Automation.PSObject[]]$projects = @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + }), + $([System.Management.Automation.PSObject]@{ + id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + }), + $([System.Management.Automation.PSObject]@{ + id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + }) + ) + + if ($script:mockGetAzDevOpsApiResourceInvoked) + { + $projects = $projects | + Where-Object { $_.id -eq '3456bc8e-0c47-440e-bd49-6db608abb461' } # Same as $validProjectIdThatExists + } + $script:mockGetAzDevOpsApiResourceInvoked = $true + + return $projects + } -ModuleName $script:subModuleName + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat + + $projects.Count | Should -Be $($(Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project').Count) + } + + } + + Context 'When "Project" resources do not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat + $projects.Count | Should -Be 0 + } + } + + + Context 'When also called with optional, "ProjectId" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIds3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When an "Project" resource exists' { + + + Mock Get-AzDevOpsApiResource { + [System.Management.Automation.PSObject[]]$projects = @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + }), + $([System.Management.Automation.PSObject]@{ + id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + }), + $([System.Management.Automation.PSObject]@{ + id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + }) + ) + + if ($script:mockGetAzDevOpsApiResourceInvoked) + { + $projects = $projects | + Where-Object { $_.id -eq '3456bc8e-0c47-440e-bd49-6db608abb461' } # Same as $validProjectIdThatExists + } + $script:mockGetAzDevOpsApiResourceInvoked = $true + + return $projects + } -ModuleName $script:subModuleName + + It 'Should return exactly 1 "Project" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists + $projects.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Project" resource with identical "id" - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists + + $project.id | Should -Be $validProjectIdThatExists + } + + } + + + Context 'When an "Project" resource does not exist' { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatDoesNotExist + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatDoesNotExist + $projects.Count | Should -Be 0 + } + } + } + } + } + + + Context 'When input parameters are invalid' { + + + Context 'When called with invalid, mandatory "ApiUri" and "Pat" parameters' { + + It 'Should throw - "", ""' -TestCases $testCasesInvalidApiUriPats { + param ([string]$ApiUri, [string]$Pat) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Throw + } + + + Context 'When also called with invalid, optional, "ProjectId" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesInvalidApiUriPatProjectIds { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Throw + } + } + + } + + } + } +} From e96d2c3037d120b535050c6cd1365e5ccba2c200 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 14:51:17 +0000 Subject: [PATCH 441/611] Added 'AllowWildcard' switch to 'Test-AzDevOpsProjectName' function --- .../Functions/Private/Test-AzDevOpsProjectName.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 index d53be5507..b9991873c 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.ps1 @@ -33,12 +33,16 @@ function Test-AzDevOpsProjectName [Parameter(Mandatory = $true)] [ValidateSet($true)] [System.Management.Automation.SwitchParameter] - $IsValid + $IsValid, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $AllowWildcard ) return !([System.String]::IsNullOrWhiteSpace($ProjectName) -or ($ProjectName.Contains('%') -or - $ProjectName.Contains('*') -or + (!$AllowWildcard -and $ProjectName.Contains('*')) -or $ProjectName.StartsWith(' ') -or $ProjectName.EndsWith(' '))) } From 9d0faf7b5a8328370b12b4bcec01146212b701e0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 14:52:02 +0000 Subject: [PATCH 442/611] Updated 'Get-AzDevOpsProject' to make use of 'AllowWildcard' switch on 'ProjectName' parameter validation. --- .../Resources/Functions/Public/Get-AzDevOpsProject.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 index d0eb7c6cb..3fdca1c4a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.ps1 @@ -68,7 +68,7 @@ function Get-AzDevOpsProject $ProjectId, [Parameter()] - [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid })] + [ValidateScript({ Test-AzDevOpsProjectName -ProjectName $_ -IsValid -AllowWildcard })] [Alias('Name')] [System.String] $ProjectName From 8a96e78b3447fb029d6049f7b706ee594bfda786 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 14:52:55 +0000 Subject: [PATCH 443/611] Added unit tests for 'Get-AzDevOpsApiResource' when invoked with 'ProjectName' parameter. --- .../Public/Get-AzDevOpsProject.Tests.ps1 | 184 +++++++++++++++++- 1 file changed, 183 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index 6c6079475..a21f384ba 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -36,8 +36,19 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidProjectIds) -Expand $testCasesValidApiUriPatProjectIds3 = $testCasesValidApiUriPatProjectIds | Select-Object -First 3 + $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' + $testCasesValidApiUriPatProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectNames) -Expand + $testCasesValidApiUriPatProjectNames3 = $testCasesValidApiUriPatProjectNames | Select-Object -First 3 + $validProjectIdThatExists = '3456bc8e-0c47-440e-bd49-6db608abb461' + $validProjectNameThatExists = 'AProjectThatExists' + $validProjectNameThatExistsByLike = 'AProjectThatExi*' $validProjectIdThatDoesNotExist = '9b03d056-cd1c-4f51-b007-5d1d896e38f0' + $validProjectNameThatDoesNotExist = 'AProjectThatDoesNotExist' + $validProjectNameThatDoesNotExistByLike = '*AProject*ThatDoes*NotExist*AtAll*' # Generate invalid, test cases @@ -89,18 +100,23 @@ InModuleScope 'AzureDevOpsDsc.Common' { [System.Management.Automation.PSObject[]]$projects = @( $([System.Management.Automation.PSObject]@{ id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + name = 'SomeProject' }), $([System.Management.Automation.PSObject]@{ id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + name = 'AProjectThatExists' # Same as $validProjectNameThatExists }), $([System.Management.Automation.PSObject]@{ id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + name = 'Another Project' }), $([System.Management.Automation.PSObject]@{ id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + name = 'Yet Another Project' }), $([System.Management.Automation.PSObject]@{ id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + name = 'The Last Project' }) ) @@ -114,9 +130,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { return $projects } -ModuleName $script:subModuleName + + $script:mockGetAzDevOpsApiResourceInvoked = $false + $noOfProjects = $($(Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project').Count) + $script:mockGetAzDevOpsApiResourceInvoked = $false + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat - $projects.Count | Should -Be $($(Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName 'Project').Count) + $projects.Count | Should -Be $noOfProjects } } @@ -165,18 +186,23 @@ InModuleScope 'AzureDevOpsDsc.Common' { [System.Management.Automation.PSObject[]]$projects = @( $([System.Management.Automation.PSObject]@{ id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + name = 'SomeProject' }), $([System.Management.Automation.PSObject]@{ id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + name = 'AProjectThatExists' # Same as $validProjectNameThatExists }), $([System.Management.Automation.PSObject]@{ id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + name = 'Another Project' }), $([System.Management.Automation.PSObject]@{ id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + name = 'Yet Another Project' }), $([System.Management.Automation.PSObject]@{ id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + name = 'The Last Project' }) ) @@ -229,6 +255,152 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } } + + + Context 'When also called with optional, "ProjectName" parameter' { + + It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNames3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When an "Project" resource exists' { + + + Mock Get-AzDevOpsApiResource { + [System.Management.Automation.PSObject[]]$projects = @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + name = 'SomeProject' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + name = 'AProjectThatExists' # Same as $validProjectNameThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + name = 'Another Project' + }), + $([System.Management.Automation.PSObject]@{ + id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + name = 'Yet Another Project' + }), + $([System.Management.Automation.PSObject]@{ + id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + name = 'The Last Project' + }) + ) + + if ($script:mockGetAzDevOpsApiResourceInvoked) + { + $projects = $projects | + Where-Object { $_.id -eq '3456bc8e-0c47-440e-bd49-6db608abb461' } # Same as $validProjectIdThatExists + } + $script:mockGetAzDevOpsApiResourceInvoked = $true + + return $projects + } -ModuleName $script:subModuleName + + + Context "When using an exact 'ProjectName' that exists'" { + + It 'Should return exactly 1 "Project" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatExists + $projects.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Project" resource with identical "name" - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatExists + + $project.name | Should -Be $validProjectNameThatExists + } + } + + + Context "When using a wildcard 'ProjectName' that exists'" { + + It 'Should return exactly 1 "Project" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatExistsByLike + $projects.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Project" resource with similar/like "name" - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatExistsByLike + + $project.name | Should -BeLike $validProjectNameThatExists + } + } + + } + + + Context 'When an "Project" resource does not exist' { + + + Context "When using an exact 'ProjectName' that does not exist'" { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExist + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExist + $projects.Count | Should -Be 0 + } + } + + + Context "When using a wildcard 'ProjectName' that does not exist'" { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExistByLike + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExistByLike + $projects.Count | Should -Be 0 + } + } + } + } } } @@ -254,6 +426,16 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } + + Context 'When also called with invalid, optional, "ProjectName" parameter' { + + It 'Should throw - "", "", ""' -TestCases $testCasesInvalidApiUriPatProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Throw + } + } + } } From d0637c235f38208ef0579abec67975b1dacc3b72 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:03:54 +0000 Subject: [PATCH 444/611] Updated 'Test-AzDevOpsProjectName' function, unit tests to include tests around 'AllowWildcard', switch parameter --- .../Test-AzDevOpsProjectName.Tests.ps1 | 78 +++++++++++++++---- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 index ddaff3343..640587681 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/Test-AzDevOpsProjectName.Tests.ps1 @@ -28,34 +28,84 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When called with "ProjectName" parameter value and the "IsValid" switch' { - Context 'When "ProjectName" parameter value is a valid "ProjectName"' { + Context 'When called without additional "AllowWildcard" switch' { - It 'Should not throw - ""' -TestCases $testCasesValidProjectNames { - param ([System.String]$ProjectName) - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + Context 'When "ProjectName" contains a wildcard character (*)' { + + It 'Should return $false - "**"' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + Test-AzDevOpsProjectName -ProjectName $('*'+$ProjectName+'*') -IsValid | Should -BeFalse + } } - It 'Should return $true - ""' -TestCases $testCasesValidProjectNames { - param ([System.String]$ProjectName) - Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeTrue + Context 'When "ProjectName" parameter value is a valid "ProjectName"' { + + It 'Should not throw - ""' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $true - ""' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeTrue + } + } + + + Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { + + It 'Should not throw - ""' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) + + Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeFalse + } } } - Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { + Context 'When called with additional "AllowWildcard" switch' { - It 'Should not throw - ""' -TestCases $testCasesInvalidProjectNames { - param ([System.String]$ProjectName) - { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + Context 'When "ProjectName" parameter value is a valid "ProjectName"' { + + It 'Should not throw - "**"' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $('*'+$ProjectName+'*') -IsValid -AllowWildcard } | Should -Not -Throw + } + + It 'Should return $true - "**"' -TestCases $testCasesValidProjectNames { + param ([System.String]$ProjectName) + + Test-AzDevOpsProjectName -ProjectName $('*'+$ProjectName+'*') -IsValid -AllowWildcard | Should -BeTrue + } } - It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { - param ([System.String]$ProjectName) - Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeFalse + Context 'When "ProjectName" parameter value is an invalid "ProjectName"' { + + It 'Should not throw - ""' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) + + { Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid } | Should -Not -Throw + } + + It 'Should return $false - ""' -TestCases $testCasesInvalidProjectNames { + param ([System.String]$ProjectName) + + Test-AzDevOpsProjectName -ProjectName $ProjectName -IsValid | Should -BeFalse + } } } } From ae22b94d07b0c9075b4ea42454508cbe24a13b93 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:18:22 +0000 Subject: [PATCH 445/611] Added 'Get-AzDevOpsProject' function, unit tests for calls using both 'ProjectId' and 'ProjectDescription' parameters. --- .../Public/Get-AzDevOpsProject.Tests.ps1 | 182 +++++++++++++++++- 1 file changed, 181 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 index a21f384ba..22b9da85f 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.ps1 @@ -43,6 +43,13 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesValidProjectNames) -Expand $testCasesValidApiUriPatProjectNames3 = $testCasesValidApiUriPatProjectNames | Select-Object -First 3 + $testCasesValidApiUriPatProjectIdProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesValidApiUris, + $testCasesValidPats, + $testCasesValidProjectIds, + $testCasesValidProjectNames) -Expand + $testCasesValidApiUriPatProjectIdProjectNames3 = $testCasesValidApiUriPatProjectIdProjectNames | Select-Object -First 3 + $validProjectIdThatExists = '3456bc8e-0c47-440e-bd49-6db608abb461' $validProjectNameThatExists = 'AProjectThatExists' $validProjectNameThatExistsByLike = 'AProjectThatExi*' @@ -66,6 +73,19 @@ InModuleScope 'AzureDevOpsDsc.Common' { $testCasesInvalidProjectIds) -Expand $testCasesInvalidApiUriPatProjectIds3 = $testCasesInvalidApiUriPatProjectIds | Select-Object -First 3 + $testCasesInvalidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Invalid' + $testCasesInvalidApiUriPatProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectNames) -Expand + $testCasesInvalidApiUriPatProjectNames3 = $testCasesInvalidApiUriPatProjectNames | Select-Object -First 3 + + $testCasesInvalidApiUriPatProjectIdProjectNames = Join-TestCaseArray -TestCaseArray @( + $testCasesInvalidApiUris, + $testCasesInvalidPats, + $testCasesInvalidProjectIds, + $testCasesInvalidProjectNames) -Expand + $testCasesInvalidApiUriPatProjectIdProjectNames3 = $testCasesInvalidApiUriPatProjectIdProjectNames | Select-Object -First 3 @@ -91,6 +111,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' } + Context 'When "Project" resources do exist' { It 'Should return same number of "Project" resources as "Get-AzDevOpsApiResource" does - "", ""' -TestCases $testCasesValidApiUriPats { @@ -142,6 +163,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { } + Context 'When "Project" resources do not exist' { It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats { @@ -355,7 +377,155 @@ InModuleScope 'AzureDevOpsDsc.Common' { [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatExistsByLike - $project.name | Should -BeLike $validProjectNameThatExists + $project.name | Should -BeLike $validProjectNameThatExistsByLike + } + } + + } + + + Context 'When an "Project" resource does not exist' { + + + Context "When using an exact 'ProjectName' that does not exist'" { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExist + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExist + $projects.Count | Should -Be 0 + } + } + + + Context "When using a wildcard 'ProjectName' that does not exist'" { + + It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExistByLike + $projects | Should -BeNullOrEmpty + } + + It 'Should return no "Project" resources - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $validProjectNameThatDoesNotExistByLike + $projects.Count | Should -Be 0 + } + } + } + } + + + Context 'When also called with optional, "ProjectId" and "ProjectName" parameters' { + + It 'Should not throw - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName } | Should -Not -Throw + } + + It 'Should invoke "Get-AzDevOpsApiResource" only once - "", "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdProjectNames3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + Mock Get-AzDevOpsApiResource {} -Verifiable + + Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId -ProjectName $ProjectName | Out-Null + + Assert-MockCalled 'Get-AzDevOpsApiResource' -Times 1 -Exactly -Scope 'It' + } + + + Context 'When an "Project" resource exists' { + + + Mock Get-AzDevOpsApiResource { + [System.Management.Automation.PSObject[]]$projects = @( + $([System.Management.Automation.PSObject]@{ + id = '6c5cfb48-ef00-4965-9e8b-8890cea541b0' + name = 'SomeProject' + }), + $([System.Management.Automation.PSObject]@{ + id = '3456bc8e-0c47-440e-bd49-6db608abb461' # Same as $validProjectIdThatExists + name = 'AProjectThatExists' # Same as $validProjectNameThatExists + }), + $([System.Management.Automation.PSObject]@{ + id = 'a058fe7e-b336-4d7f-9131-59ab9640bef4' + name = 'Another Project' + }), + $([System.Management.Automation.PSObject]@{ + id = '9b8dc0c7-36cb-45aa-8177-945583fe253c' + name = 'Yet Another Project' + }), + $([System.Management.Automation.PSObject]@{ + id = '19aea70c-1339-44b1-b7a3-9d8e6c421a74' + name = 'The Last Project' + }) + ) + + if ($script:mockGetAzDevOpsApiResourceInvoked) + { + $projects = $projects | + Where-Object { $_.id -eq '3456bc8e-0c47-440e-bd49-6db608abb461' } # Same as $validProjectIdThatExists + } + $script:mockGetAzDevOpsApiResourceInvoked = $true + + return $projects + } -ModuleName $script:subModuleName + + + Context "When using an exact 'ProjectName' that exists'" { + + It 'Should return exactly 1 "Project" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists -ProjectName $validProjectNameThatExists + $projects.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Project" resource with identical "id" and "name" - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists -ProjectName $validProjectNameThatExists + + $project.id | Should -Be $validProjectIdThatExists + $project.name | Should -Be $validProjectNameThatExists + } + } + + + Context "When using a wildcard 'ProjectName' that exists'" { + + It 'Should return exactly 1 "Project" resource - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject[]]$projects = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists -ProjectName $validProjectNameThatExistsByLike + $projects.Count | Should -Be 1 + } + + It 'Should return exactly 1 "Project" resource with identical "id" and similar/like "name" - "", ""' -TestCases $testCasesValidApiUriPats3 { + param ([string]$ApiUri, [string]$Pat) + + $script:mockGetAzDevOpsApiResourceInvoked = $false # For mock of 'Get-AzDevOpsApiResource' + + [System.Management.Automation.PSObject]$project = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $validProjectIdThatExists -ProjectName $validProjectNameThatExistsByLike + + $project.id | Should -Be $validProjectIdThatExists + $project.name | Should -BeLike $validProjectNameThatExistsByLike } } @@ -436,6 +606,16 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } + + Context 'When also called with invalid, optional, "ProjectId" and "ProjectName" parameters' { + + It 'Should throw - "", "", "", ""' -TestCases $testCasesInvalidApiUriPatProjectIdProjectNames3 { + param ([string]$ApiUri, [string]$Pat, [string]$ProjectId, [string]$ProjectName) + + { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Throw + } + } + } } From cc806dcf6a417c733e6c4e7ea22fd27565e1ce17 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:19:26 +0000 Subject: [PATCH 446/611] Deleted old 'Get-AzDevOpsProject' function, unit tests file. --- .../Public/Get-AzDevOpsProject.Tests.Old.ps1 | 216 ------------------ 1 file changed, 216 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 deleted file mode 100644 index 152a906cb..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/Get-AzDevOpsProject.Tests.Old.ps1 +++ /dev/null @@ -1,216 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsProject' -Tag 'GetAzDevOpsProject' { - - Context 'When called with valid parameters' { - BeforeAll { - $mockProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $mockProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $mockProjects = Join-TestCaseArray -Expand -TestCases $mockProjectIds, $mockProjectNames - - Mock -ModuleName $script:subModuleName Get-AzDevOpsApiResource { - - return $mockProjects | ForEach-Object { - @{ - id = $_.ProjectId - name = $_.ProjectName - } - } - } - } - - - $testCasesValidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Valid' - $testCasesValidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Valid' - $testCasesValidApiUriPatCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUris, $testCasesValidPats - - $testCasesValidProjectNames = Get-TestCase -ScopeName 'ProjectName' -TestCaseName 'Valid' - $testCasesValidApiUriPatProjectNameCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectNames - - $testCasesValidProjectIds = Get-TestCase -ScopeName 'ProjectId' -TestCaseName 'Valid' - $testCasesValidApiUriPatProjectIdCombined = Join-TestCaseArray -Expand -TestCases $testCasesValidApiUriPatCombined, $testCasesValidProjectIds - - - Context 'When called with no "ProjectId" parameter and no "ProjectName" parameter' { - - It 'Should not throw - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - It 'Should call "Get-AzDevOpsApiResource" function once per project present/available + 1 initial call - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times $($mockProjects.Count + 1) -Exactly -Scope It - } - - } - - - Context 'When called with no "ProjectId" parameter but with a "ProjectName" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - Context 'When a "Project" with supplied "ProjectName" parameter value exists' { - - It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectNameCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectName) - - Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName $ProjectName | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It - } - } - - Context 'When a "Project" with supplied "ProjectName" parameter value does not exist' { - - It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectName 'NonPresentProjectName' - $result | Should -Be $null - } - } - } - - - Context 'When called with no "ProjectName" parameter but with a "ProjectId" parameter' { - - It 'Should not throw - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId } | Should -Not -Throw - } - - It 'Should return "object[]" or "hashtable" - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId - $result.GetType() | Should -BeIn @(@(@{},@{}).GetType(),@{}.GetType()) - } - - It 'Should call "Get-AzDevOpsApiResource" function atleast once - "", "", ""' -TestCases $testCasesValidApiUriPatProjectIdCombined { - param ([string]$ApiUri, [string]$Pat, [string]$ProjectId) - - Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId $ProjectId | Out-Null - Should -Invoke Get-AzDevOpsApiResource -ModuleName $script:subModuleName -Times 1 -Scope It - } - - Context 'When a "Project" with supplied "ProjectId" parameter value does not exist' { - - It 'Should return $null - "", ""' -TestCases $testCasesValidApiUriPatCombined { - param ([string]$ApiUri, [string]$Pat) - - $result = Get-AzDevOpsProject -ApiUri $ApiUri -Pat $Pat -ProjectId '114bff8d-6169-45cf-b085-fe121267e7aa' # Non-present "ProjectId" - $result | Should -Be $null - } - } - - } - - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "Pat" parameter' { - - $testCasesEmptyPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Empty' - $testCasesInvalidPats = Get-TestCase -ScopeName 'Pat' -TestCaseName 'Invalid' - - Context 'When called without "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - { Get-AzDevOpsProject -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with valid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $validApiUri = 'https://someuri.api/_apis/' - { Get-AzDevOpsProject -ApiUri $validApiUri -Pat $Pat } | Should -Throw - - } - } - - Context 'When called with invalid "ApiUri" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidPats { - param ([string]$Pat) - - $invalidApiUri = 'someInvalidApiUrl' - { Get-AzDevOpsProject -ApiUri $invalidApiUri -Pat $Pat } | Should -Throw - - } - } - } - - Context 'When called with invalid "ApiUri" parameter' { - - $testCasesEmptyApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Empty' - $testCasesInvalidApiUris = Get-TestCase -ScopeName 'ApiUri' -TestCaseName 'Invalid' - - Context 'When called without "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - { Get-AzDevOpsProject -ApiUri $ApiUri } | Should -Throw - - } - } - - Context 'When called with valid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $validPat = '1234567890123456789012345678901234567890123456789012' - { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $validPat } | Should -Throw - - } - } - - Context 'When called with invalid "Pat" parameter' { - It "Should throw - ''" -TestCases $testCasesInvalidApiUris { - param ([string]$ApiUri) - - $invalidPat = '123456789012' - { Get-AzDevOpsProject -ApiUri $ApiUri -Pat $invalidPat } | Should -Throw - - } - } - } - } - - } - -} From 5687d0447a8a4daaab6db79010211514faef7cd7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:24:56 +0000 Subject: [PATCH 447/611] Added placeholder scripts for unit tests --- .../Functions/Public/_TODO2.New-AzDevOpsProject.Tests.ps1 | 0 .../Functions/Public/_TODO2.Remove-AzDevOpsProject.Tests.ps1 | 0 .../Functions/Public/_TODO2.Set-AzDevOpsProject.Tests.ps1 | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.New-AzDevOpsProject.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Remove-AzDevOpsProject.Tests.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Set-AzDevOpsProject.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.New-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.New-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Remove-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Remove-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Set-AzDevOpsProject.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_TODO2.Set-AzDevOpsProject.Tests.ps1 new file mode 100644 index 000000000..e69de29bb From 78520c56df2e845c2bc7e5e367fe631eba9582de Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:41:13 +0000 Subject: [PATCH 448/611] Simplified 'Get-AzDevOpsServicesUri' function body --- .../Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 index 2c5cdf66c..27e28db4a 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.ps1 @@ -12,7 +12,6 @@ #> function Get-AzDevOpsServicesUri { - [CmdletBinding()] [OutputType([System.String])] param @@ -23,9 +22,5 @@ function Get-AzDevOpsServicesUri $OrganizationName ) - $OrganizationName = $OrganizationName.ToLower() - - [System.String]$uri = "https://dev.azure.com/$OrganizationName/" - - return $uri + return "https://dev.azure.com/$($OrganizationName.ToLower())/" } From 9f2146bcdfe5e050a9dd9a84e7430072a57c149c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:42:16 +0000 Subject: [PATCH 449/611] Added 'Get-AzDevOpsServicesUri' function, unit tests (and removed old ones). --- .../Get-AzDevOpsServicesUri.Tests.Old.ps1 | 60 ----------------- .../Public/Get-AzDevOpsServicesUri.Tests.ps1 | 64 +++++++++++++++++++ 2 files changed, 64 insertions(+), 60 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 deleted file mode 100644 index 22ab49c0e..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.Old.ps1 +++ /dev/null @@ -1,60 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesUri' -Tag 'GetAzDevOpsServicesUri' { - - Context 'When called with valid parameters' { - BeforeAll { - } - - Context 'When called with valid "Organisation" parameter' { - - $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' - - It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Not -Throw - } - - It 'Should return "https://dev.azure.com//" - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName - $result | Should -Be "https://dev.azure.com/$OrganizationName/" - } - } - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "OrganizationName" parameter' { - - $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' - - It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw - - } - - It 'Should return URI in lowercase' { - $OrganizationName = 'UPPERcasedORGANIZATIONname' - - $result = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName - $result | Should -BeExactly $(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName).ToLower() - } - } - } - - } - -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 new file mode 100644 index 000000000..7e73844d3 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -0,0 +1,64 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Services\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Services\Functions\Public\$script:commandName" -Tag $script:tag { + + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' + $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' + + + Context 'When called with valid parameters' { + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Not -Throw + } + + It 'Should return correct, URI - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + Get-AzDevOpsServicesUri -OrganizationName $OrganizationName | + Should -BeExactly "https://dev.azure.com/$($OrganizationName.ToLower())/" + } + + + Context 'When called with uppercase "OrganizationName" parameter value - ""' { + + It 'Should return URI in lowercase' { + + Get-AzDevOpsServicesUri -OrganizationName $($OrganizationName.ToUpper()) | + Should -BeExactly $($(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName).ToLower()) + } + } + } + + + Context 'When called with invalid parameters' { + + It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesUri -OrganizationName $OrganizationName } | Should -Throw + + } + + } + + } +} From 0765c1b7b8cb338c352567bfdc3afedc72f4b009 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:49:16 +0000 Subject: [PATCH 450/611] Corrected unit test for 'Get-AzDevOpsServicesUri' --- .../Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 index 7e73844d3..ec9dfbf88 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesUri.Tests.ps1 @@ -40,7 +40,8 @@ InModuleScope 'AzureDevOpsDsc.Common' { Context 'When called with uppercase "OrganizationName" parameter value - ""' { - It 'Should return URI in lowercase' { + It 'Should return URI in lowercase' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) Get-AzDevOpsServicesUri -OrganizationName $($OrganizationName.ToUpper()) | Should -BeExactly $($(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName).ToLower()) From 6c2731ca8cfd9afa8d109c1a08696da402fa8072 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:49:39 +0000 Subject: [PATCH 451/611] Simplified 'Get-AzDevOpsServicesApiUri' function --- .../Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 index e19e3a649..8e8818057 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.ps1 @@ -22,7 +22,5 @@ function Get-AzDevOpsServicesApiUri $OrganizationName ) - [System.String]$uri = Get-AzDevOpsServicesUri -OrganizationName $OrganizationName - - return $uri + "_apis/" + return $(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName) + "_apis/" } From 3c37c4c8d2d2cffeb15889a94172b7f662253cfe Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:49:56 +0000 Subject: [PATCH 452/611] Added unit tests for 'Get-AzDevOpsServicesApiUri' function --- .../Get-AzDevOpsServicesApiUri.Tests.Old.ps1 | 69 ------------------- .../Get-AzDevOpsServicesApiUri.Tests.ps1 | 65 +++++++++++++++++ 2 files changed, 65 insertions(+), 69 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 create mode 100644 tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 deleted file mode 100644 index 4ec8e1628..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.Old.ps1 +++ /dev/null @@ -1,69 +0,0 @@ - -# Initialize tests for module function -. $PSScriptRoot\..\..\..\AzureDevOpsDsc.Common.TestInitialization.ps1 - - -InModuleScope $script:subModuleName { - Describe 'AzureDevOpsDsc.Common\Get-AzDevOpsServicesApiUri' -Tag 'GetAzDevOpsServicesApiUri' { - - Context 'When called with valid parameters' { - BeforeAll { - } - - Context 'When called with valid "Organisation" parameter' { - - $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' - - It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Not -Throw - } - - It 'Should return "https://dev.azure.com//_apis/" - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName - $result | Should -Be "https://dev.azure.com/$OrganizationName/_apis/" - } - - It 'Should return $("Get-AzDevOpsServicesUri"+"_apis/") - ""' -TestCases $testCasesValidOrganizationNames { - param ([string]$OrganizationName) - - $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName - $result | Should -Be $($(Get-AzDevOpsServicesUri -OrganizationName $OrganizationName) + '_apis/') - } - - It 'Should return URI in lowercase' { - $OrganizationName = 'UPPERcasedORGANIZATIONname' - - $result = Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName - $result | Should -BeExactly $(Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName).ToLower() - } - - } - - - - } - - Context 'When called with invalid parameters' { - BeforeAll { - } - - Context 'When called with invalid "OrganizationName" parameter' { - - $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' - - It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { - param ([string]$OrganizationName) - - { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Throw - - } - } - } - - } - -} diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 new file mode 100644 index 000000000..1401defb2 --- /dev/null +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/Get-AzDevOpsServicesApiUri.Tests.ps1 @@ -0,0 +1,65 @@ + +# Initialize tests for module function +. $PSScriptRoot\..\..\..\..\AzureDevOpsDsc.Common.Tests.Initialization.ps1 + + +InModuleScope 'AzureDevOpsDsc.Common' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Modules\$($script:subModuleName)\Services\Functions\Public\$($script:commandName).ps1" + $script:tag = @($($script:commandName -replace '-')) + + . $script:commandScriptPath + + + Describe "$script:subModuleName\Services\Functions\Public\$script:commandName" -Tag $script:tag { + + $testCasesValidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Valid' + $testCasesInvalidOrganizationNames = Get-TestCase -ScopeName 'OrganizationName' -TestCaseName 'Invalid' + + + Context 'When called with valid parameters' { + + It 'Should not throw - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Not -Throw + } + + It 'Should return correct, URI - ""' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName | + Should -BeExactly "https://dev.azure.com/$($OrganizationName.ToLower())/_apis/" + } + + + Context 'When called with uppercase "OrganizationName" parameter value - ""' { + + It 'Should return URI in lowercase' -TestCases $testCasesValidOrganizationNames { + param ([string]$OrganizationName) + + Get-AzDevOpsServicesApiUri -OrganizationName $($OrganizationName.ToUpper()) | + Should -BeExactly $($(Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName).ToLower()) + } + } + } + + + Context 'When called with invalid parameters' { + + It "Should throw - ''" -TestCases $testCasesInvalidOrganizationNames { + param ([string]$OrganizationName) + + { Get-AzDevOpsServicesApiUri -OrganizationName $OrganizationName } | Should -Throw + + } + + } + + } +} From 622bef237e4e41289e0c0c2e50614440908b9a68 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 15:59:37 +0000 Subject: [PATCH 453/611] Deleted 'AzureDevOpsDsc.Server' and 'AzureDevOpsDsc.Server' empty, nested modules. --- .../AzureDevOpsDsc.Server.psd1 | 42 ------------------- .../AzureDevOpsDsc.Server.psm1 | 32 -------------- .../en-US/AzureDevOpsDsc.Server.strings.psd1 | 5 --- .../AzureDevOpsDsc.Services.psd1 | 42 ------------------- .../AzureDevOpsDsc.Services.psm1 | 32 -------------- .../AzureDevOpsDsc.Services.strings.psd1 | 5 --- 6 files changed, 158 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 delete mode 100644 source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 delete mode 100644 source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 delete mode 100644 source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 delete mode 100644 source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 delete mode 100644 source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 deleted file mode 100644 index a76a0190a..000000000 --- a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psd1 +++ /dev/null @@ -1,42 +0,0 @@ -@{ - RootModule = 'AzureDevOpsDsc.Server.psm1' - - # Version number of this module. - ModuleVersion = '1.0.0' - - # ID used to uniquely identify this module - GUID = 'e849d233-8ee3-47a8-aec2-e61c460bdeb8' - - # Author of this module - Author = 'DSC Community' - - # Company or vendor of this module - CompanyName = 'DSC Community' - - # Copyright statement for this module - Copyright = 'Copyright the DSC Community contributors. All rights reserved.' - - # Description of the functionality provided by this module - Description = 'Functions used by the DSC resources in AzureDevOpsDsc (specifically for the "Server" edition of Azure DevOps).' - - # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. - FunctionsToExport = @() - - # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. - CmdletsToExport = @() - - # Variables to export from this module - VariablesToExport = @() - - # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. - AliasesToExport = @() - - # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. - PrivateData = @{ - - PSData = @{ - } # End of PSData hashtable - - } # End of PrivateData hashtable -} - diff --git a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 b/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 deleted file mode 100644 index 8aebd50b5..000000000 --- a/source/Modules/AzureDevOpsDsc.Server/AzureDevOpsDsc.Server.psm1 +++ /dev/null @@ -1,32 +0,0 @@ -# Setup/Import 'DscResource.Server' helper module -#$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Server' -#Import-Module -Name $script:resourceHelperModulePath - - -$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - - -# Obtain all functions within PSModule -$functionSubDirectoryPaths = @( - "$PSScriptRoot\Functions\Public" - "$PSScriptRoot\Functions\Private" -) -$functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" - - -# Loop through all PSModule functions and import/dot-source them (and export them if 'Public') -ForEach ($function in $functions) -{ - Write-Verbose "Dot-sourcing '$($function.FullName)'..." - . ( - [ScriptBlock]::Create( - [Io.File]::ReadAllText($($function.FullName)) - ) - ) - - if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") - { - Write-Verbose "Exporting '$($function.BaseName)'..." - Export-ModuleMember -Function $($function.BaseName) - } -} diff --git a/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 b/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 deleted file mode 100644 index afc431975..000000000 --- a/source/Modules/AzureDevOpsDsc.Server/en-US/AzureDevOpsDsc.Server.strings.psd1 +++ /dev/null @@ -1,5 +0,0 @@ -# Localized resources for helper module AzureDevOpsDsc.Server. - -ConvertFrom-StringData @' - -'@ diff --git a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 deleted file mode 100644 index 976ef504e..000000000 --- a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psd1 +++ /dev/null @@ -1,42 +0,0 @@ -@{ - RootModule = 'AzureDevOpsDsc.Services.psm1' - - # Version number of this module. - ModuleVersion = '1.0.0' - - # ID used to uniquely identify this module - GUID = '07a3beb5-6c1b-4aad-9cf3-24e98b009838' - - # Author of this module - Author = 'DSC Community' - - # Company or vendor of this module - CompanyName = 'DSC Community' - - # Copyright statement for this module - Copyright = 'Copyright the DSC Community contributors. All rights reserved.' - - # Description of the functionality provided by this module - Description = 'Functions used by the DSC resources in AzureDevOpsDsc (specifically for the cloud-hosted, "Services" edition of Azure DevOps).' - - # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. - FunctionsToExport = @() - - # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. - CmdletsToExport = @() - - # Variables to export from this module - VariablesToExport = @() - - # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. - AliasesToExport = @() - - # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. - PrivateData = @{ - - PSData = @{ - } # End of PSData hashtable - - } # End of PrivateData hashtable -} - diff --git a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 b/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 deleted file mode 100644 index 527ae037c..000000000 --- a/source/Modules/AzureDevOpsDsc.Services/AzureDevOpsDsc.Services.psm1 +++ /dev/null @@ -1,32 +0,0 @@ -# Setup/Import 'DscResource.Services' helper module -#$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Services' -#Import-Module -Name $script:resourceHelperModulePath - - -$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - - -# Obtain all functions within PSModule -$functionSubDirectoryPaths = @( - "$PSScriptRoot\Functions\Public" - "$PSScriptRoot\Functions\Private" -) -$functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" - - -# Loop through all PSModule functions and import/dot-source them (and export them if 'Public') -ForEach ($function in $functions) -{ - Write-Verbose "Dot-sourcing '$($function.FullName)'..." - . ( - [ScriptBlock]::Create( - [Io.File]::ReadAllText($($function.FullName)) - ) - ) - - if ($function.FullName -ilike "$PSScriptRoot\Functions\Public\*") - { - Write-Verbose "Exporting '$($function.BaseName)'..." - Export-ModuleMember -Function $($function.BaseName) - } -} diff --git a/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 b/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 deleted file mode 100644 index d5be1267c..000000000 --- a/source/Modules/AzureDevOpsDsc.Services/en-US/AzureDevOpsDsc.Services.strings.psd1 +++ /dev/null @@ -1,5 +0,0 @@ -# Localized resources for helper module AzureDevOpsDsc.Services. - -ConvertFrom-StringData @' - -'@ From 260473ec1c1043ef6a910718ab308e6163fb7035 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 16:05:17 +0000 Subject: [PATCH 454/611] Removed additional references to 'AzureDevOpsDsc.Server' and 'AzureDevOpsDsc.Services' modules within the 'AzureDevOpsDsc.psm1' script. --- source/AzureDevOpsDsc.psm1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index e44b29731..446a75db7 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,11 +1,7 @@ $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' -$script:azureDevOpsDscServerModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Server' -$script:azureDevOpsDscServicesModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Services' #$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath -Import-Module -Name $script:azureDevOpsDscServerModulePath -Import-Module -Name $script:azureDevOpsDscServicesModulePath #Import-Module -Name $script:dscResourceCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' From 5b6f63fd5e616c301b20c17efce53a12f5c77b90 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 17:02:24 +0000 Subject: [PATCH 455/611] Added empty, 'README.md' files in 'DSCClassResources' and 'DSCResources' folders --- source/DSCClassResources/README.md | 0 source/DSCResources/README.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/DSCClassResources/README.md create mode 100644 source/DSCResources/README.md diff --git a/source/DSCClassResources/README.md b/source/DSCClassResources/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/DSCResources/README.md b/source/DSCResources/README.md new file mode 100644 index 000000000..e69de29bb From f1c3500f584ab582070b1d75bafdc99588bd101d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 17:15:55 +0000 Subject: [PATCH 456/611] Added '_README.md' files into a number of function directories. --- source/DSCClassResources/{README.md => _README.md} | 0 source/DSCResources/{README.md => _README.md} | 0 .../AzureDevOpsDsc.Common/Api/Functions/Private/_README.md | 0 .../Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Server/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Server/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Services/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Services/Functions/Public/_README.md | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename source/DSCClassResources/{README.md => _README.md} (100%) rename source/DSCResources/{README.md => _README.md} (100%) create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md create mode 100644 source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md diff --git a/source/DSCClassResources/README.md b/source/DSCClassResources/_README.md similarity index 100% rename from source/DSCClassResources/README.md rename to source/DSCClassResources/_README.md diff --git a/source/DSCResources/README.md b/source/DSCResources/_README.md similarity index 100% rename from source/DSCResources/README.md rename to source/DSCResources/_README.md diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md new file mode 100644 index 000000000..e69de29bb From b50240bf2ddd57df13b570d94760db4727e4b759 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 17:47:02 +0000 Subject: [PATCH 457/611] Added use of 'AZUREDEVOPS_INTEGRATION_APIURI' and 'AZUREDEVOPS_INTEGRATION_PAT' into 'DSC_AzDevOpsProject.config.ps1' for supporting integration test execution. --- .../DSC_AzDevOpsProject.config.ps1 | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index c9aeaa00d..51cd26f70 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -2,6 +2,23 @@ # Integration Test Config Template Version: 1.2.0 #endregion +# Attempt to obtain 'ApiUri' and 'PAT' from AzureDevOps build pipeline +# (NOTE: The Organisation/ApiUri used will be updated/changed as part of +# the tests and any projects, teams etc. are likely to be removed/lost) +Write-Output "INTEGRATION-AZUREDEVOPS-APIURI: $(${env:AZUREDEVOPS_INTEGRATION_APIURI})" +if ([String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_APIURI}) -or [String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_PAT})) +{ + $IntegrationApiUri = ${env:AZUREDEVOPS_INTEGRATION_APIURI} + $IntegrationPat = ${env:AZUREDEVOPS_INTEGRATION_PAT} +} +else +{ + throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests." + return +} + + + #$configFile = [System.IO.Path]::ChangeExtension($MyInvocation.MyCommand.Path, 'json') #if (Test-Path -Path $configFile) #{ @@ -18,8 +35,8 @@ @{ NodeName = 'localhost' - ApiUri = 'InsertApiUriHere' - Pat = 'InsertPatHere' + ApiUri = $IntegrationApiUri + Pat = $IntegrationPat #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' ProjectName = 'TestProjectName' From ea90da20214d908bc080882160f29646b4fc8122 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 17:50:13 +0000 Subject: [PATCH 458/611] Added 'return' into common, function tests to skip these. --- tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 index 285158a91..bbb279170 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 @@ -2,6 +2,7 @@ # Initialize tests for module function . $PSScriptRoot\AzureDevOpsDsc.Common.Tests.Initialization.ps1 +return InModuleScope $script:subModuleName { From 4c4fee828a3d822b5865f4e43fd83aaa3b1e2be5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 20:42:55 +0000 Subject: [PATCH 459/611] Removed 'CodeCoverage' from being performed as part of 'test_windows_ps' job in Azure DevOps pipeline configuration. --- azure-pipelines.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 17031e235..a8dceafda 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -161,7 +161,7 @@ stages: displayName: 'Run Tests' inputs: filePath: './build.ps1' - arguments: '-tasks test' + arguments: '-tasks test -CodeCoverageThreshold 0' pwsh: false - task: PublishTestResults@2 @@ -172,13 +172,13 @@ stages: testResultsFiles: 'output/testResults/NUnit*.xml' testRunTitle: 'Windows Server Core (Windows PowerShell)' - - task: PublishCodeCoverageResults@1 - displayName: 'Publish Code Coverage' - condition: succeededOrFailed() - inputs: - codeCoverageTool: 'JaCoCo' - summaryFileLocation: 'output/testResults/CodeCov*.xml' - pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' + #- task: PublishCodeCoverageResults@1 + # displayName: 'Publish Code Coverage' + # condition: succeededOrFailed() + # inputs: + # codeCoverageTool: 'JaCoCo' + # summaryFileLocation: 'output/testResults/CodeCov*.xml' + # pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_macos displayName: 'macOS' From f16b4a08a5e02968a96493e686f0d3cfe57c0ea5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 20:57:26 +0000 Subject: [PATCH 460/611] Added 'tests/Integration' folder into Pester scripts directories (within 'build.yaml' configuration). --- build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.yaml b/build.yaml index 7d00824be..cf62eb7a2 100644 --- a/build.yaml +++ b/build.yaml @@ -63,6 +63,7 @@ Pester: ExcludeFromCodeCoverage: - Modules/DscResource.Common Script: + - tests/Integration - tests/Unit ExcludeTag: Tag: From 749908528b97e3d879310b797b3a2e7841e48ccd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 21:41:44 +0000 Subject: [PATCH 461/611] Updated 'azure-pipelines.yml' to include 'Integration' tests (and temporarily disable some jobs from running) --- azure-pipelines.yml | 82 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 11 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a8dceafda..37b563714 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -46,8 +46,9 @@ stages: - stage: Test dependsOn: Build jobs: - - job: test_linux - displayName: 'Linux' + - job: test_unit_linux + condition: failed() + displayName: 'Linux - Unit Tests' timeoutInMinutes: 0 pool: vmImage: 'ubuntu 16.04' @@ -69,7 +70,7 @@ stages: - task: PowerShell@2 name: test - displayName: 'Run Tests' + displayName: 'Run Unit Tests' inputs: filePath: './build.ps1' arguments: '-tasks test' @@ -90,8 +91,8 @@ stages: summaryFileLocation: 'output/testResults/CodeCov*.xml' pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - - job: test_windows_core - displayName: 'Windows (PowerShell Core)' + - job: test_unit_windows_core + displayName: 'Windows (PowerShell Core) - Unit Tests' timeoutInMinutes: 0 pool: vmImage: 'windows-2019' @@ -113,7 +114,7 @@ stages: - task: PowerShell@2 name: test - displayName: 'Run Tests' + displayName: 'Run Unit Tests' inputs: filePath: './build.ps1' arguments: '-tasks test' @@ -135,8 +136,66 @@ stages: summaryFileLocation: 'output/testResults/CodeCov*.xml' pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - - job: test_windows_ps - displayName: 'Windows (Windows PowerShell)' + - job: test_integration_windows_core + displayName: 'Windows (PowerShell Core) - Integration Tests' + timeoutInMinutes: 0 + variables: + # This sets environment variable $env:CI. + CI: true + # This sets environment variable $env:CONFIGURATION. + configuration: Integration + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: 'Download Build Artifact' + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'output' + downloadPath: '$(Build.SourcesDirectory)' + + - task: PowerShell@2 + name: configureWinRM + displayName: 'Configure WinRM' + inputs: + targetType: 'inline' + script: 'winrm quickconfig -quiet' + pwsh: false + + - powershell: | + ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( + 'tests/Integration/' + ) + name: test + displayName: 'Run Integration Tests' + + - task: PowerShell@2 + name: test + displayName: 'Run Unit Tests' + inputs: + filePath: './build.ps1' + arguments: '-tasks test' + pwsh: true + + - task: PublishTestResults@2 + displayName: 'Publish Test Results' + condition: succeededOrFailed() + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: 'output/testResults/NUnit*.xml' + testRunTitle: 'Windows Server Core (PowerShell Core)' + + - task: PublishCodeCoverageResults@1 + displayName: 'Publish Code Coverage' + condition: succeededOrFailed() + inputs: + codeCoverageTool: 'JaCoCo' + summaryFileLocation: 'output/testResults/CodeCov*.xml' + pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' + + - job: test_unit_windows_ps + displayName: 'Windows (Windows PowerShell) - Unit Tests' timeoutInMinutes: 0 pool: vmImage: 'windows-2019' @@ -158,7 +217,7 @@ stages: - task: PowerShell@2 name: test - displayName: 'Run Tests' + displayName: 'Run Unit Tests' inputs: filePath: './build.ps1' arguments: '-tasks test -CodeCoverageThreshold 0' @@ -180,7 +239,8 @@ stages: # summaryFileLocation: 'output/testResults/CodeCov*.xml' # pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - - job: test_macos + - job: test_unit_macos + condition: failed() displayName: 'macOS' timeoutInMinutes: 0 pool: @@ -203,7 +263,7 @@ stages: - task: PowerShell@2 name: test - displayName: 'Run Tests' + displayName: 'Run Unit Tests' inputs: filePath: './build.ps1' arguments: '-tasks test' From 1f6d9ad0a58dca458954119e872719f81e556a54 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 21:48:39 +0000 Subject: [PATCH 462/611] Updated 'testRunTitle' (within azure-pipelines.yml' to include test types. Also removed 'Run Unit Tests' task from Integration tests --- azure-pipelines.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 37b563714..6ec3d3155 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -81,7 +81,7 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'Linux' + testRunTitle: 'Linux - Unit' - task: PublishCodeCoverageResults@1 displayName: 'Publish Code Coverage' @@ -126,7 +126,7 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'Windows Server Core (PowerShell Core)' + testRunTitle: 'Windows Server Core (PowerShell Core) - Unit' - task: PublishCodeCoverageResults@1 displayName: 'Publish Code Coverage' @@ -170,21 +170,13 @@ stages: name: test displayName: 'Run Integration Tests' - - task: PowerShell@2 - name: test - displayName: 'Run Unit Tests' - inputs: - filePath: './build.ps1' - arguments: '-tasks test' - pwsh: true - - task: PublishTestResults@2 displayName: 'Publish Test Results' condition: succeededOrFailed() inputs: testResultsFormat: 'NUnit' testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'Windows Server Core (PowerShell Core)' + testRunTitle: 'Windows Server Core (PowerShell Core) - Integration' - task: PublishCodeCoverageResults@1 displayName: 'Publish Code Coverage' @@ -229,7 +221,7 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'Windows Server Core (Windows PowerShell)' + testRunTitle: 'Windows Server Core (Windows PowerShell) - Unit' #- task: PublishCodeCoverageResults@1 # displayName: 'Publish Code Coverage' @@ -275,7 +267,7 @@ stages: inputs: testResultsFormat: 'NUnit' testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'MacOS' + testRunTitle: 'MacOS - Unit' - task: PublishCodeCoverageResults@1 displayName: 'Publish Code Coverage' From d50b6a3c620cae52bd0f524ce8f971ba52562d91 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 21:51:28 +0000 Subject: [PATCH 463/611] Updated 'test_unit_macos' display name to include 'Unit Tests' --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6ec3d3155..3fbc25a51 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -233,7 +233,7 @@ stages: - job: test_unit_macos condition: failed() - displayName: 'macOS' + displayName: 'macOS - Unit Tests' timeoutInMinutes: 0 pool: vmImage: 'macos-latest' From 9642f4a2b717c87b0e267a2bfa13be148d56fd43 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 22:01:26 +0000 Subject: [PATCH 464/611] Updated 'azure-pipelines.yml' so only 'Integration' tests will run. --- azure-pipelines.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3fbc25a51..81518b671 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -92,6 +92,7 @@ stages: pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_unit_windows_core + condition: failed() displayName: 'Windows (PowerShell Core) - Unit Tests' timeoutInMinutes: 0 pool: @@ -187,6 +188,7 @@ stages: pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_unit_windows_ps + condition: failed() displayName: 'Windows (Windows PowerShell) - Unit Tests' timeoutInMinutes: 0 pool: From 927e68dba4aa933ccb62e4f24dbcdc1d57fe97a8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 22:25:31 +0000 Subject: [PATCH 465/611] Removed/Updated references to 'SQL Server'/'SQL. --- README.md | 2 +- source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 | 1 - .../Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 74aaf072b..2269046a2 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,4 @@ documentation on each PR merge. You can review the [Examples](/source/Examples) directory in the AzureDevOpsDsc module for some general use scenarios for all of the resources that are in the module. -The resource examples are also available in the [SqlServeDsc Wiki](https://github.com/dsccommunity/AzureDevOpsDsc/wiki). +The resource examples are also available in the [AzureDevOpsDsc Wiki](https://github.com/dsccommunity/AzureDevOpsDsc/wiki). diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 index aad54740e..0b08d74a9 100644 --- a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 +++ b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 @@ -33,7 +33,6 @@ Configuration Example ProjectDescription = 'A Test Project' #ProjectId = 'TestProject' - #PsDscRunAsCredential = $SqlAdministratorCredential } } diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 index 1c96fde11..c353977fe 100644 --- a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 +++ b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 @@ -34,7 +34,6 @@ Configuration Example ProjectName = 'A New Test Project Name' ProjectDescription = 'A test project' - #PsDscRunAsCredential = $SqlAdministratorCredential } } From cdd647fd9ed76112fc83d15f3f563472815ecde2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 13 Nov 2020 22:28:42 +0000 Subject: [PATCH 466/611] Updated assignment of 'ApiUri' and 'Pat' within 'DSC_AzDevOpsProject', integration tests configuration --- .../DSC_AzDevOpsProject.config.ps1 | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 51cd26f70..8f3125e70 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -5,15 +5,27 @@ # Attempt to obtain 'ApiUri' and 'PAT' from AzureDevOps build pipeline # (NOTE: The Organisation/ApiUri used will be updated/changed as part of # the tests and any projects, teams etc. are likely to be removed/lost) -Write-Output "INTEGRATION-AZUREDEVOPS-APIURI: $(${env:AZUREDEVOPS_INTEGRATION_APIURI})" -if ([String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_APIURI}) -or [String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_PAT})) +$IntegrationApiUri = $null +if (![String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_APIURI})) { $IntegrationApiUri = ${env:AZUREDEVOPS_INTEGRATION_APIURI} + Write-Verbose "Updated AzureDevOps 'ApiUri' to '$(${env:AZUREDEVOPS_INTEGRATION_APIURI})'" +} + +$IntegrationPat = $null +if (![String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_PAT})) +{ $IntegrationPat = ${env:AZUREDEVOPS_INTEGRATION_PAT} + Write-Verbose "Updated AzureDevOps 'Pat' (Personal Access Token)." } -else + + +# Verify 'ApiUri' and 'Pat' were obtained +if ($null -in @($IntegrationApiUri, $IntegrationPat)) { - throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests." + throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ` + Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` + IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." return } From f7481d4609686443c82850571c04b7f83b694b36 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 00:04:23 +0000 Subject: [PATCH 467/611] Updated environment variable names (for 'ApiUri' and 'Pat' in 'DSC_AzDevOpsProject.config.ps1' --- .../DSCClassResources/DSC_AzDevOpsProject.config.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 8f3125e70..e3a6210d9 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -6,16 +6,16 @@ # (NOTE: The Organisation/ApiUri used will be updated/changed as part of # the tests and any projects, teams etc. are likely to be removed/lost) $IntegrationApiUri = $null -if (![String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_APIURI})) +if (![String]::IsNullOrWhitespace($env:AZUREDEVOPS_INTEGRATION_APIURI)) { - $IntegrationApiUri = ${env:AZUREDEVOPS_INTEGRATION_APIURI} - Write-Verbose "Updated AzureDevOps 'ApiUri' to '$(${env:AZUREDEVOPS_INTEGRATION_APIURI})'" + $IntegrationApiUri = $env:AZUREDEVOPS_INTEGRATION_APIURI + Write-Verbose "Updated AzureDevOps 'ApiUri' to '$($env:AZUREDEVOPS_INTEGRATION_APIURI)'" } $IntegrationPat = $null -if (![String]::IsNullOrWhitespace(${env:AZUREDEVOPS_INTEGRATION_PAT})) +if (![String]::IsNullOrWhitespace($env:AZUREDEVOPS_INTEGRATION_PAT)) { - $IntegrationPat = ${env:AZUREDEVOPS_INTEGRATION_PAT} + $IntegrationPat = $env:AZUREDEVOPS_INTEGRATION_PAT Write-Verbose "Updated AzureDevOps 'Pat' (Personal Access Token)." } From 49313e20c94344ba22074755b0d1779230891de6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 00:19:30 +0000 Subject: [PATCH 468/611] Added 'integrationBuildVariable' step to integration tests job in 'azure-pipelines.yml' --- azure-pipelines.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 81518b671..90e17810f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -164,6 +164,12 @@ stages: script: 'winrm quickconfig -quiet' pwsh: false + - powershell: | + echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" + echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" + name: integrationBuildVariable + displayName: 'Set Environment Variables' + - powershell: | ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( 'tests/Integration/' From 402654943f8a70dd883804b49c06d0ca2c64013a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 00:37:09 +0000 Subject: [PATCH 469/611] Updated 'azure-pipelines.yml' and integration test configuration to attempt to retrieve 'ApiUri' and 'Pat' in test/configuration script. --- azure-pipelines.yml | 12 +++++----- .../DSC_AzDevOpsProject.config.ps1 | 22 ++++--------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 90e17810f..0d6d06cb0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -145,6 +145,8 @@ stages: CI: true # This sets environment variable $env:CONFIGURATION. configuration: Integration + azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) + azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Path) pool: vmImage: 'windows-2019' steps: @@ -164,11 +166,11 @@ stages: script: 'winrm quickconfig -quiet' pwsh: false - - powershell: | - echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" - echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" - name: integrationBuildVariable - displayName: 'Set Environment Variables' + #- powershell: | + # echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" + # echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" + # name: integrationBuildVariable + # displayName: 'Set Environment Variables' - powershell: | ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index e3a6210d9..232c173d7 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -5,25 +5,11 @@ # Attempt to obtain 'ApiUri' and 'PAT' from AzureDevOps build pipeline # (NOTE: The Organisation/ApiUri used will be updated/changed as part of # the tests and any projects, teams etc. are likely to be removed/lost) -$IntegrationApiUri = $null -if (![String]::IsNullOrWhitespace($env:AZUREDEVOPS_INTEGRATION_APIURI)) -{ - $IntegrationApiUri = $env:AZUREDEVOPS_INTEGRATION_APIURI - Write-Verbose "Updated AzureDevOps 'ApiUri' to '$($env:AZUREDEVOPS_INTEGRATION_APIURI)'" -} - -$IntegrationPat = $null -if (![String]::IsNullOrWhitespace($env:AZUREDEVOPS_INTEGRATION_PAT)) -{ - $IntegrationPat = $env:AZUREDEVOPS_INTEGRATION_PAT - Write-Verbose "Updated AzureDevOps 'Pat' (Personal Access Token)." -} - # Verify 'ApiUri' and 'Pat' were obtained -if ($null -in @($IntegrationApiUri, $IntegrationPat)) +if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) { - throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ` + throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPSINTEGRATIONAPIURI))', Pat='ApiUri='$($($env:AZUREDEVOPSINTEGRATIONAPIURI).Substring(0,2)).'` Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." return @@ -47,8 +33,8 @@ if ($null -in @($IntegrationApiUri, $IntegrationPat)) @{ NodeName = 'localhost' - ApiUri = $IntegrationApiUri - Pat = $IntegrationPat + ApiUri = $env:AZUREDEVOPSINTEGRATIONAPIURI + Pat = $env:AZUREDEVOPSINTEGRATIONPAT #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' ProjectName = 'TestProjectName' From cf91965ff1efb27201422d27bb4a16a812532956 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 00:48:44 +0000 Subject: [PATCH 470/611] Corrected typo for $(AzureDevOps.Integration.Pat) in 'azure-pipelines.yml' --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0d6d06cb0..782c15f16 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -146,7 +146,7 @@ stages: # This sets environment variable $env:CONFIGURATION. configuration: Integration azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) - azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Path) + azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) pool: vmImage: 'windows-2019' steps: From 2cdfdac804b9645e02069592e946fc508421b4aa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 01:02:07 +0000 Subject: [PATCH 471/611] Updated build and integration tests to use $env:AZUREDEVOPS_INTEGRATION_APIURI and $env:AZUREDEVOPS_INTEGRATION_PAT --- azure-pipelines.yml | 8 ++++++-- .../DSC_AzDevOpsProject.config.ps1 | 20 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 782c15f16..906f81408 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -167,17 +167,21 @@ stages: pwsh: false #- powershell: | - # echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" - # echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" + # # name: integrationBuildVariable # displayName: 'Set Environment Variables' - powershell: | + echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" + echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" + ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( 'tests/Integration/' ) name: test displayName: 'Run Integration Tests' + variables: + azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) - task: PublishTestResults@2 displayName: 'Publish Test Results' diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 232c173d7..332545119 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -7,16 +7,23 @@ # the tests and any projects, teams etc. are likely to be removed/lost) # Verify 'ApiUri' and 'Pat' were obtained -if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) +#if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) +#{ +# throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPSINTEGRATIONAPIURI)', Pat(2)='$($($env:AZUREDEVOPSINTEGRATIONPAT).Substring(0,2)).'` +# Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` +# IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." +# return +#} + +if ($null -in @($env:AZUREDEVOPS_INTEGRATION_APIURI, $env:AZUREDEVOPS_INTEGRATION_PAT)) { - throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPSINTEGRATIONAPIURI))', Pat='ApiUri='$($($env:AZUREDEVOPSINTEGRATIONAPIURI).Substring(0,2)).'` + throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPS_INTEGRATION_APIURI)', Pat(2)='$($($env:AZUREDEVOPS_INTEGRATION_PAT).Substring(0,2)).'` Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." return } - #$configFile = [System.IO.Path]::ChangeExtension($MyInvocation.MyCommand.Path, 'json') #if (Test-Path -Path $configFile) #{ @@ -33,8 +40,11 @@ if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPA @{ NodeName = 'localhost' - ApiUri = $env:AZUREDEVOPSINTEGRATIONAPIURI - Pat = $env:AZUREDEVOPSINTEGRATIONPAT + #ApiUri = $env:AZUREDEVOPSINTEGRATIONAPIURI + #Pat = $env:AZUREDEVOPSINTEGRATIONPAT + ApiUri = $env:AZUREDEVOPS_INTEGRATION_APIURI + Pat = $env:AZUREDEVOPS_INTEGRATION_PAT + #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' ProjectName = 'TestProjectName' From 1db488d20b60f2e5e65a11d51550ba95e2ca8266 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 01:03:22 +0000 Subject: [PATCH 472/611] Removed invalid 'variables' option from 'azure-pipelines.yml' --- azure-pipelines.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 906f81408..f17bdec76 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -180,8 +180,6 @@ stages: ) name: test displayName: 'Run Integration Tests' - variables: - azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) - task: PublishTestResults@2 displayName: 'Publish Test Results' From 2cf87eb1a53cc26a2c3740e121abc31a4076cada Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 01:15:23 +0000 Subject: [PATCH 473/611] Updated build configuration for integration tests back to using $env:AZUREDEVOPSINTEGRATIONAPIURI and $env:AZUREDEVOPSINTEGRATIONPAT --- azure-pipelines.yml | 8 +++----- .../DSC_AzDevOpsProject.config.ps1 | 13 ++++++------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f17bdec76..ab62e75a2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -145,8 +145,6 @@ stages: CI: true # This sets environment variable $env:CONFIGURATION. configuration: Integration - azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) - azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) pool: vmImage: 'windows-2019' steps: @@ -172,14 +170,14 @@ stages: # displayName: 'Set Environment Variables' - powershell: | - echo "##vso[task.setvariable variable=AzureDevOps.Integration.ApiUri;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_APIURI}" - echo "##vso[task.setvariable variable=AzureDevOps.Integration.Pat;isOutput=true]${env:AZUREDEVOPS_INTEGRATION_PAT}" - ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( 'tests/Integration/' ) name: test displayName: 'Run Integration Tests' + env: + azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) + azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) - task: PublishTestResults@2 displayName: 'Publish Test Results' diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 332545119..865597d38 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -15,11 +15,12 @@ # return #} -if ($null -in @($env:AZUREDEVOPS_INTEGRATION_APIURI, $env:AZUREDEVOPS_INTEGRATION_PAT)) +if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) { - throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPS_INTEGRATION_APIURI)', Pat(2)='$($($env:AZUREDEVOPS_INTEGRATION_PAT).Substring(0,2)).'` + throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests.'` Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` - IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." + IMPORTANT: Ensure these point to an integration organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects ` + and change other items/configuration etc." return } @@ -40,10 +41,8 @@ if ($null -in @($env:AZUREDEVOPS_INTEGRATION_APIURI, $env:AZUREDEVOPS_INTEGRATIO @{ NodeName = 'localhost' - #ApiUri = $env:AZUREDEVOPSINTEGRATIONAPIURI - #Pat = $env:AZUREDEVOPSINTEGRATIONPAT - ApiUri = $env:AZUREDEVOPS_INTEGRATION_APIURI - Pat = $env:AZUREDEVOPS_INTEGRATION_PAT + ApiUri = $env:AZUREDEVOPSINTEGRATIONAPIURI + Pat = $env:AZUREDEVOPSINTEGRATIONPAT #ProjectId = 'ac6c91cc-a07f-4b8d-b146-aa6929d2882c' From 04d6afcd384f056e3daa34500556265acc77cc3a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 01:23:09 +0000 Subject: [PATCH 474/611] Removed code coverage upload for 'Integration' tests in 'azure-pipelines.yml'. --- azure-pipelines.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ab62e75a2..169aefec8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -164,11 +164,6 @@ stages: script: 'winrm quickconfig -quiet' pwsh: false - #- powershell: | - # - # name: integrationBuildVariable - # displayName: 'Set Environment Variables' - - powershell: | ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( 'tests/Integration/' @@ -187,14 +182,6 @@ stages: testResultsFiles: 'output/testResults/NUnit*.xml' testRunTitle: 'Windows Server Core (PowerShell Core) - Integration' - - task: PublishCodeCoverageResults@1 - displayName: 'Publish Code Coverage' - condition: succeededOrFailed() - inputs: - codeCoverageTool: 'JaCoCo' - summaryFileLocation: 'output/testResults/CodeCov*.xml' - pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - - job: test_unit_windows_ps condition: failed() displayName: 'Windows (Windows PowerShell) - Unit Tests' From beaa7abdb3e793795428ebb55266f1b090f517e5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 01:25:07 +0000 Subject: [PATCH 475/611] Re-enabled build 'jobs' that had previously been disabled within 'azure-pipelines.yml'. --- azure-pipelines.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 169aefec8..46b85e7df 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -47,7 +47,7 @@ stages: dependsOn: Build jobs: - job: test_unit_linux - condition: failed() + condition: succeededOrFailed() displayName: 'Linux - Unit Tests' timeoutInMinutes: 0 pool: @@ -92,7 +92,7 @@ stages: pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_unit_windows_core - condition: failed() + condition: succeededOrFailed() displayName: 'Windows (PowerShell Core) - Unit Tests' timeoutInMinutes: 0 pool: @@ -182,8 +182,16 @@ stages: testResultsFiles: 'output/testResults/NUnit*.xml' testRunTitle: 'Windows Server Core (PowerShell Core) - Integration' + - task: PublishCodeCoverageResults@1 + displayName: 'Publish Code Coverage' + condition: succeededOrFailed() + inputs: + codeCoverageTool: 'JaCoCo' + summaryFileLocation: 'output/testResults/CodeCov*.xml' + pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' + - job: test_unit_windows_ps - condition: failed() + condition: succeededOrFailed() displayName: 'Windows (Windows PowerShell) - Unit Tests' timeoutInMinutes: 0 pool: @@ -229,7 +237,7 @@ stages: # pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_unit_macos - condition: failed() + condition: succeededOrFailed() displayName: 'macOS - Unit Tests' timeoutInMinutes: 0 pool: From 3284e469d79e7c5cc0d1c6529fce80cddf07dc0a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 10:55:49 +0000 Subject: [PATCH 476/611] Removed non-required comments from 'DSC_AzDevOpsProject.config.ps1' --- .../DSCClassResources/DSC_AzDevOpsProject.config.ps1 | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 index 865597d38..a016dc6d8 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 @@ -2,18 +2,6 @@ # Integration Test Config Template Version: 1.2.0 #endregion -# Attempt to obtain 'ApiUri' and 'PAT' from AzureDevOps build pipeline -# (NOTE: The Organisation/ApiUri used will be updated/changed as part of -# the tests and any projects, teams etc. are likely to be removed/lost) - -# Verify 'ApiUri' and 'Pat' were obtained -#if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) -#{ -# throw "Cannot obtain 'ApiUri' and 'Pat' for integration tests. ApiUri='$($env:AZUREDEVOPSINTEGRATIONAPIURI)', Pat(2)='$($($env:AZUREDEVOPSINTEGRATIONPAT).Substring(0,2)).'` -# Ensure 'AzureDevOps.Integration.ApiUri' and 'AzureDevOps.Integration.Pat' variables exist (and are populated) within the Azure DevOps, build/test pipeline. ` -# IMPORTANT: Ensure these point to an organisation/environment that can be torn down and rebuilt - The Integration tests may/will remove projects etc." -# return -#} if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPAT)) { From bbffe56a667793a418780b48f9a651393f440cbd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 10:59:28 +0000 Subject: [PATCH 477/611] Added comments to 'azure-pipelines.yml' about disabling Pester, 'CodeCoverage' analysis on 'test_unit_windows_ps' job --- azure-pipelines.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 46b85e7df..29293e7b9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -217,7 +217,7 @@ stages: displayName: 'Run Unit Tests' inputs: filePath: './build.ps1' - arguments: '-tasks test -CodeCoverageThreshold 0' + arguments: '-tasks test -CodeCoverageThreshold 0' # See note below regarding 'CoderCoverage' pwsh: false - task: PublishTestResults@2 @@ -228,6 +228,8 @@ stages: testResultsFiles: 'output/testResults/NUnit*.xml' testRunTitle: 'Windows Server Core (Windows PowerShell) - Unit' + # NOTE: CodeCoverage disabled on this, specific job due to poor performance. Still runs on other jobs within build. + # See: https://github.com/pester/Pester/issues/1318 #- task: PublishCodeCoverageResults@1 # displayName: 'Publish Code Coverage' # condition: succeededOrFailed() From b65fecf0db97b7bfd35fb66abcbce8c6e24f3290 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 11:30:04 +0000 Subject: [PATCH 478/611] Updated '.markdownlint.json' to update Markdown, 'MD013' configuration options. --- .markdownlint.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.markdownlint.json b/.markdownlint.json index 87b7da562..f163550af 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -3,7 +3,12 @@ "MD029": { "style": "one" }, - "MD013": true, + "MD013": { + "line_length": 80, + "headers": false, + "code_blocks":false, + "tables": false + }, "MD024": false, "MD034": false, "no-hard-tabs": true From 3723683143f9ba11f4af518204c49bb6e8f55565 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:14:42 +0000 Subject: [PATCH 479/611] Added 'Ensure', enum directory, module and readme. --- source/Enums/Ensure/Ensure.psm1 | 6 ++++++ source/Enums/Ensure/README.md | 0 2 files changed, 6 insertions(+) create mode 100644 source/Enums/Ensure/Ensure.psm1 create mode 100644 source/Enums/Ensure/README.md diff --git a/source/Enums/Ensure/Ensure.psm1 b/source/Enums/Ensure/Ensure.psm1 new file mode 100644 index 000000000..6f0d8857a --- /dev/null +++ b/source/Enums/Ensure/Ensure.psm1 @@ -0,0 +1,6 @@ + +enum Ensure +{ + Present + Absent +} diff --git a/source/Enums/Ensure/README.md b/source/Enums/Ensure/README.md new file mode 100644 index 000000000..e69de29bb From f71fccab27f625c0d5bf37ca1df5e4bcc40eada1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:14:53 +0000 Subject: [PATCH 480/611] Added 'RequiredAction', enum directory, module and readme. --- source/Enums/RequiredAction/README.md | 0 source/Enums/RequiredAction/RequiredAction.psm1 | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 source/Enums/RequiredAction/README.md create mode 100644 source/Enums/RequiredAction/RequiredAction.psm1 diff --git a/source/Enums/RequiredAction/README.md b/source/Enums/RequiredAction/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/source/Enums/RequiredAction/RequiredAction.psm1 b/source/Enums/RequiredAction/RequiredAction.psm1 new file mode 100644 index 000000000..4cad3d442 --- /dev/null +++ b/source/Enums/RequiredAction/RequiredAction.psm1 @@ -0,0 +1,11 @@ + +enum RequiredAction +{ + None + Get + New + Set + Remove + Test + Error +} From a871b565ebdd427af590f124f7086fbe1e9fec45 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:16:34 +0000 Subject: [PATCH 481/611] Added 'AzDevOpsDscResource', class directory, module and readme. --- .../AzDevOpsDscResource.psm1 | 87 +++++++++++++++++++ source/Classes/AzDevOpsDscResource/README.md | 0 2 files changed, 87 insertions(+) create mode 100644 source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 create mode 100644 source/Classes/AzDevOpsDscResource/README.md diff --git a/source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 b/source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 new file mode 100644 index 000000000..dafef7367 --- /dev/null +++ b/source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 @@ -0,0 +1,87 @@ +using module ..\..\Enums\Ensure\Ensure.psm1 +using module ..\..\Enums\RequiredAction\RequiredAction.psm1 + +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + + +class AzDevOpsDscResource +{ + hidden [System.String]GetDscResourceKey() + { + [System.String]$dscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() + + if ([System.String]::IsNullOrWhiteSpace($dscResourceKeyPropertyName)) + { + return $null + } + + return $this."$dscResourceKeyPropertyName" + } + + hidden [System.String]GetDscResourceKeyPropertyName() + { + [System.String[]]$dscResourceKeyPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + + [System.Reflection.PropertyInfo]$propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and + $_.Key -eq $true) + { + $dscResourceKeyPropertyNames += $PropertyName + } + } + } + + if ($null -eq $dscResourceKeyPropertyNames -or $dscResourceKeyPropertyNames.Count -eq 0) + { + throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + } + elseif ($dscResourceKeyPropertyNames.Count -gt 1) + { + throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + } + + return $dscResourceKeyPropertyNames[0] + } + + + hidden [System.String[]]GetDscResourcePropertyNames() + { + [System.String[]]$thisDscPropertyNames = @() + + [Type]$thisType = $this.GetType() + [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() + + $thisProperties | ForEach-Object { + $propertyInfo = $_ + $PropertyName = $_.Name + + $propertyInfo.GetCustomAttributes($true) | + ForEach-Object { + + if ($_.TypeId.Name -eq 'DscPropertyAttribute') + { + $thisDscPropertyNames += $PropertyName + } + } + } + + return $thisDscPropertyNames + } + + hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() + { + return @() + } + +} diff --git a/source/Classes/AzDevOpsDscResource/README.md b/source/Classes/AzDevOpsDscResource/README.md new file mode 100644 index 000000000..e69de29bb From 9b94f2837d531c8b5f9b68722ba3162e7bc452dd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:19:16 +0000 Subject: [PATCH 482/611] Removed 'Ensure' and 'RequiredAction' enums, and 'AzDevOpsDscResource' class from 'AzureDevOpsDsc.psm1' file (and added 'using' references). --- source/AzureDevOpsDsc.psm1 | 104 ++----------------------------------- 1 file changed, 5 insertions(+), 99 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 446a75db7..5aa861732 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,3 +1,8 @@ +using module .\Enums\Ensure\Ensure.psm1 +using module .\Enums\RequiredAction\RequiredAction.psm1 +using module .\Classes\AzDevOpsDscResource\AzDevOpsDscResource.psm1 + + $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' #$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' @@ -7,105 +12,6 @@ Import-Module -Name $script:azureDevOpsDscCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' -enum Ensure -{ - Present - Absent -} - -enum RequiredAction -{ - None - Get - New - Set - Remove - Test - Error -} - - - -class AzDevOpsDscResource -{ - hidden [System.String]GetDscResourceKey() - { - [System.String]$dscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - - if ([System.String]::IsNullOrWhiteSpace($dscResourceKeyPropertyName)) - { - return $null - } - - return $this."$dscResourceKeyPropertyName" - } - - hidden [System.String]GetDscResourceKeyPropertyName() - { - [System.String[]]$dscResourceKeyPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - - [System.Reflection.PropertyInfo]$propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute' -and - $_.Key -eq $true) - { - $dscResourceKeyPropertyNames += $PropertyName - } - } - } - - if ($null -eq $dscResourceKeyPropertyNames -or $dscResourceKeyPropertyNames.Count -eq 0) - { - throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." - } - elseif ($dscResourceKeyPropertyNames.Count -gt 1) - { - throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." - } - - return $dscResourceKeyPropertyNames[0] - } - - - hidden [System.String[]]GetDscResourcePropertyNames() - { - [System.String[]]$thisDscPropertyNames = @() - - [Type]$thisType = $this.GetType() - [System.Reflection.PropertyInfo[]]$thisProperties = $thisType.GetProperties() - - $thisProperties | ForEach-Object { - $propertyInfo = $_ - $PropertyName = $_.Name - - $propertyInfo.GetCustomAttributes($true) | - ForEach-Object { - - if ($_.TypeId.Name -eq 'DscPropertyAttribute') - { - $thisDscPropertyNames += $PropertyName - } - } - } - - return $thisDscPropertyNames - } - - hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() - { - return @() - } - -} class AzDevOpsApiDscResource : AzDevOpsDscResource { From 860ab8a15d7b6da30e67c9489057a93f353edc47 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:31:57 +0000 Subject: [PATCH 483/611] Updated 'README.md' for 'Ensure' and 'RequiredAction' enums --- source/Enums/Ensure/README.md | 14 ++++++++++++++ source/Enums/RequiredAction/README.md | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/source/Enums/Ensure/README.md b/source/Enums/Ensure/README.md index e69de29bb..67b98676d 100644 --- a/source/Enums/Ensure/README.md +++ b/source/Enums/Ensure/README.md @@ -0,0 +1,14 @@ +# Description + +The `Ensure` enumeration (enum) defines a number of constants used to define +a resource's, desired presence or absence as part of a DSC Resource +configuration. + +Current values for `Ensure` are: + +* `Present` +* `Absent` + +## Known issues + +All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+Ensure). diff --git a/source/Enums/RequiredAction/README.md b/source/Enums/RequiredAction/README.md index e69de29bb..600e797c9 100644 --- a/source/Enums/RequiredAction/README.md +++ b/source/Enums/RequiredAction/README.md @@ -0,0 +1,19 @@ +# Description + +The `RequiredAction` enumeration (enum) defines a number of constants used to +define the action required to ensure the desired state of a DSC Resource can be +actioned. + +Current values for `RequiredAction` are: + +* `None` +* `Get` +* `New` +* `Set` +* `Remove` +* `Test` +* `Error` + +## Known issues + +All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+RequiredAction). From 163b79082ac48ae15e7a3b88add0e38f680bb329 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:35:17 +0000 Subject: [PATCH 484/611] Updated casing of 'Resource' in 'DSC Resource' to be consistent/uppercase. --- README.md | 6 +++--- source/AzureDevOpsDsc.psd1 | 2 +- source/AzureDevOpsDsc.psm1 | 2 +- .../AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 | 2 +- source/en-US/about_AzureDevOpsDsc.help.txt | 4 ++-- .../DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 | 2 +- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 6 +++--- ...eDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 | 10 +++++----- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 2269046a2..faead657e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # AzureDevOpsDsc -The **AzureDevOpsDsc** module contains DSC resources for deployment and configuration -of Azure DevOps and Azure DevOps Server. +The **AzureDevOpsDsc** module contains DSC Resources for deployment and +configuration of Azure DevOps and Azure DevOps Server. [![Build Status](https://dev.azure.com/dsccommunity/AzureDevOpsDsc/_apis/build/status/dsccommunity.AzureDevOpsDsc?branchName=master)](https://dev.azure.com/dsccommunity/AzureDevOpsDsc/_build/latest?definitionId=41&branchName=master) ![Azure DevOps coverage (branch)](https://img.shields.io/azure-devops/coverage/dsccommunity/AzureDevOpsDsc/41/master) @@ -31,7 +31,7 @@ A full list of changes in each version can be found in the [change log](CHANGELO ## Documentation The documentation can be found in the [AzureDevOpsDsc Wiki](https://github.com/dsccommunity/AzureDevOpsDsc/wiki). -The DSC resources schema files is used to automatically update the +The DSC Resource`s schema files are used to automatically update the documentation on each PR merge. ### Examples diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index 4f260e201..a421174d5 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -17,7 +17,7 @@ Copyright = 'Copyright the DSC Community contributors. All rights reserved.' # Description of the functionality provided by this module - Description = 'Module with DSC resources for deployment and configuration of Azure DevOps Server/Services.' + Description = 'Module with DSC Resources for deployment and configuration of Azure DevOps Server/Services.' # Minimum version of the Windows PowerShell engine required by this module PowerShellVersion = '5.0' diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 5aa861732..9eee07c98 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -226,7 +226,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) { - throw "The '$($this.GetType().Name)', DSC resource does not support changes for/to the '$_' property." + throw "The '$($this.GetType().Name)', DSC Resource does not support changes for/to the '$_' property." break } } diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 index f7893cf19..f10821fd2 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psd1 @@ -17,7 +17,7 @@ Copyright = 'Copyright the DSC Community contributors. All rights reserved.' # Description of the functionality provided by this module - Description = 'Functions used by the DSC resources in AzureDevOpsDsc.' + Description = 'Functions used by the DSC Resources in AzureDevOpsDsc.' # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. FunctionsToExport = @( diff --git a/source/en-US/about_AzureDevOpsDsc.help.txt b/source/en-US/about_AzureDevOpsDsc.help.txt index aa53e04a1..c7ef9edf4 100644 --- a/source/en-US/about_AzureDevOpsDsc.help.txt +++ b/source/en-US/about_AzureDevOpsDsc.help.txt @@ -2,10 +2,10 @@ TOPIC about_AzureDevOpsDsc SHORT DESCRIPTION - DSC resources for deployment and configuration of Azure DevOps and Azure DevOps Server. + DSC Resources for deployment and configuration of Azure DevOps and Azure DevOps Server. LONG DESCRIPTION - This module contains DSC resources for deployment and configuration of Azure DevOps and Azure DevOps Server. + This module contains DSC Resources for deployment and configuration of Azure DevOps and Azure DevOps Server. EXAMPLES PS C:\> {{ add examples here }} diff --git a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 index c1ff0ef6e..e106e77c4 100644 --- a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 @@ -1,6 +1,6 @@ # <# # .SYNOPSIS -# Automated unit test for DSC_AzDevOpsProject DSC resource. +# Automated unit test for DSC_AzDevOpsProject DSC Resource. # #> # $script:dscModuleName = 'AzureDevOpsDsc' diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 0be5e73bc..724faf906 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -646,7 +646,7 @@ function Get-TestCaseValue # NonDscResourceName - # The 'ResourceName' values that are to be excluded from being used as part of a DSC resource (typically treated differently to 'DscResourceName' values) + # The 'ResourceName' values that are to be excluded from being used as part of a DSC Resource (typically treated differently to 'DscResourceName' values) $testCaseValues.NonDscResourceName = @{ Valid = @( @@ -743,7 +743,7 @@ function Get-TestCaseValue } # DscResourcePublicFunctionRequiredParameterName - # Parameter names that must be present on a public, function for a DSC resource (same as for an API resource) - Note: different to 'DscResourcePublicFunctionMandatoryParameterName' + # Parameter names that must be present on a public, function for a DSC Resource (same as for an API resource) - Note: different to 'DscResourcePublicFunctionMandatoryParameterName' $testCaseValues.DscResourcePublicFunctionRequiredParameterName = $testCaseValues.ApiResourcePublicFunctionRequiredParameterName @@ -753,7 +753,7 @@ function Get-TestCaseValue $testCaseValues.ApiResourcePublicFunctionMandatoryParameterName = $testCaseValues.ApiResourcePublicFunctionRequiredParameterName # DscResourcePublicFunctionMandatoryParameterName - # Parameter names that must be present AND set as 'Mandatory' on a public, function for a DSC resource (same as for an API resource) + # Parameter names that must be present AND set as 'Mandatory' on a public, function for a DSC Resource (same as for an API resource) $testCaseValues.DscResourcePublicFunctionMandatoryParameterName = $testCaseValues.ApiResourcePublicFunctionMandatoryParameterName diff --git a/tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 b/tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 index 3fce83328..5da51c672 100644 --- a/tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 +++ b/tests/Unit/Modules/_USEFUL.AzureDevOpsDsc.Common.Resources.Functions.Tests.Old.ps1 @@ -58,7 +58,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { # Get-Command "$ExportedFunctionName" | Should -Not -BeNullOrEmpty #} - It "When evaluating function parameter, aliases required for DSC resource functions" { + It "When evaluating function parameter, aliases required for DSC Resource functions" { # TODO } @@ -66,7 +66,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { - Context "When evaluating all public, functions required for DSC resources" { + Context "When evaluating all public, functions required for DSC Resources" { It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidDscResourcePublicFunctionNames { param ([string]$DscResourcePublicFunctionName) @@ -94,7 +94,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Test-Path $functionTestsScriptPath | Should -BeTrue } - Context "When evaluating function parameters required for DSC resource functions" { + Context "When evaluating function parameters required for DSC Resource functions" { It "Should have a '' function with required, '' parameter - '', ''" -TestCases $testCasesValidDscResourcePublicFunctionRequiredParameterNames { param ([string]$DscResourcePublicFunctionName, @@ -104,7 +104,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { Should -BeIn $((Get-CommandParameter -CommandName $DscResourcePublicFunctionName -ModuleName $moduleName).Name) } - Context "When evaluating function parameters required for DSC resource functions that must be 'Mandatory'" { + Context "When evaluating function parameters required for DSC Resource functions that must be 'Mandatory'" { It "Should have a '' function with required (and 'Mandatory'), '' parameter - '', ''" -TestCases $testCasesValidDscResourcePublicFunctionMandatoryParameterNames { param ([string]$DscResourcePublicFunctionName, @@ -117,7 +117,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { } } - Context "When evaluating all public, functions required for non-DSC resources" { + Context "When evaluating all public, functions required for non-DSC Resources" { It "Should contain an exported, '' function (specific to the 'ResourceName') - ''" -TestCases $testCasesValidResourcePublicFunctionNames { param ([string]$ResourcePublicFunctionName) From f5f623a348f51255bf02145b1e61443aadbc47fa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:46:36 +0000 Subject: [PATCH 485/611] Added 'README.txt' files for 'DSCResources' and 'DSCClassResources' directories. --- source/DSCClassResources/README.md | 7 +++++++ source/DSCClassResources/_README.md | 0 source/DSCResources/README.md | 6 ++++++ source/DSCResources/_README.md | 0 4 files changed, 13 insertions(+) create mode 100644 source/DSCClassResources/README.md delete mode 100644 source/DSCClassResources/_README.md create mode 100644 source/DSCResources/README.md delete mode 100644 source/DSCResources/_README.md diff --git a/source/DSCClassResources/README.md b/source/DSCClassResources/README.md new file mode 100644 index 000000000..441fb3231 --- /dev/null +++ b/source/DSCClassResources/README.md @@ -0,0 +1,7 @@ +# Description + +This directory (`DSCClassResources`) contains all the DSC Resources defined in +the `AzureDevOpsDsc` module. + +All DSC Resources within this module should be defined as class-based, DSC +Resources (and not MOF-based ones). diff --git a/source/DSCClassResources/_README.md b/source/DSCClassResources/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/DSCResources/README.md b/source/DSCResources/README.md new file mode 100644 index 000000000..1a0a2853c --- /dev/null +++ b/source/DSCResources/README.md @@ -0,0 +1,6 @@ +# Description + +This directory should contain no DSC Resources. All DSC Resources within the +`AzureDevOpsDsc` module should be defined as class-based, DSC Resources and be +present in the `DSCClassResources` subdirectory ([here](../DSCClassResources)) +within this module. diff --git a/source/DSCResources/_README.md b/source/DSCResources/_README.md deleted file mode 100644 index e69de29bb..000000000 From 2e66359e9fce627bdc2d577926697cf1df35e5b9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:47:23 +0000 Subject: [PATCH 486/611] Added 'Classes' and 'Enums' directories to 'build.yaml', 'CopyPaths' configuration. --- build.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.yaml b/build.yaml index cf62eb7a2..dd52756d9 100644 --- a/build.yaml +++ b/build.yaml @@ -3,9 +3,11 @@ # ModuleBuilder Configuration # #################################################### CopyPaths: + - Classes - DSCClassResources - DSCResources - en-US + - Enums - Examples - Modules Encoding: UTF8 From 8bdd505edfd34aa8b9f9fe667c3383abe118948e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:51:24 +0000 Subject: [PATCH 487/611] Added 'README.md'; in 'Enums' directory --- source/Enums/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 source/Enums/README.md diff --git a/source/Enums/README.md b/source/Enums/README.md new file mode 100644 index 000000000..612bf2007 --- /dev/null +++ b/source/Enums/README.md @@ -0,0 +1,4 @@ +# Description + +This directory (`Enums`) contains all the enumerations (enums) defined and used +in the `AzureDevOpsDsc` module (and it's classes and DSC Resources). From 1decab18ca2f4e799f5465ac14219078a3cae170 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 12:52:03 +0000 Subject: [PATCH 488/611] Updated 'DSCResources', 'README.txt' to add directory name. --- source/DSCResources/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/DSCResources/README.md b/source/DSCResources/README.md index 1a0a2853c..1e79e1c52 100644 --- a/source/DSCResources/README.md +++ b/source/DSCResources/README.md @@ -1,6 +1,6 @@ # Description -This directory should contain no DSC Resources. All DSC Resources within the -`AzureDevOpsDsc` module should be defined as class-based, DSC Resources and be -present in the `DSCClassResources` subdirectory ([here](../DSCClassResources)) +This directory (`DSCResources`) should contain no DSC Resources. All DSC +Resources within the `AzureDevOpsDsc` module should be defined as class-based, +DSC Resources and be present in the `DSCClassResources` subdirectory ([here](../DSCClassResources)) within this module. From dcee37fbdeb046f5c2a8a76d81cbafaa9adf223f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 13:09:36 +0000 Subject: [PATCH 489/611] Moved 'AzDevOpsApiDscResource' class from 'AzureDevOpsDsc.psm1' file into it's own 'AzDevOpsApiDscResource.psm1' module within the 'Classes' directory. --- source/AzureDevOpsDsc.psm1 | 85 +---------------- .../AzDevOpsApiDscResource.psm1 | 92 +++++++++++++++++++ .../Classes/AzDevOpsApiDscResource/README.md | 0 3 files changed, 93 insertions(+), 84 deletions(-) create mode 100644 source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 create mode 100644 source/Classes/AzDevOpsApiDscResource/README.md diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 9eee07c98..1ae5b3f92 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,6 +1,7 @@ using module .\Enums\Ensure\Ensure.psm1 using module .\Enums\RequiredAction\RequiredAction.psm1 using module .\Classes\AzDevOpsDscResource\AzDevOpsDscResource.psm1 +using module .\Classes\AzDevOpsApiDscResource\AzDevOpsApiDscResource.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' @@ -13,90 +14,6 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' -class AzDevOpsApiDscResource : AzDevOpsDscResource -{ - [System.String]$ResourceName = $this.GetResourceName() - - hidden [System.String]GetResourceName() - { - # Assumes a naming convention is followed between the DSC - # resource name and the name of the resource within the API - return $this.GetType().ToString().Replace('DSC_AzDevOps','') - } - - - - <# - .NOTES - When creating an object via the Azure DevOps API, the ID (if provided) is ignored - and Azure DevOps creates/generates the Id (a GUID) which can then be used for the - object. - - As a result, only existing resources from the API will have a ResourceId and new - resources to be created via the API do not need one providing. - #> - [System.String]$ResourceId = $this.GetResourceId() - [System.String]$ResourceIdPropertyName = $this.GetResourceIdPropertyName() - - hidden [System.String]GetResourceId() - { - return $this."$($this.ResourceIdPropertyName)" - } - - hidden [System.String]GetResourceIdPropertyName() - { - return "$($this.ResourceName)Id" - } - - - - <# - .NOTES - When creating an object via the Azure DevOps API, the 'Key' of the object will be - another, alternate, unique key/identifier to the 'ResourceId' but this will be - specific to the resource. - - This 'Key' can be used to determine an 'Id' of a new resource that has been added. - #> - [System.String]$ResourceKey = $this.GetResourceKey() - [System.String]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() - - hidden [System.String]GetResourceKey() - { - [System.String]$keyPropertyName = $this.ResourceKeyPropertyName - - if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) - { - return $null - } - - return $this."$keyPropertyName" - } - - hidden [System.String]GetResourceKeyPropertyName() - { - # Use same property as the DSC Resource 'Key' - return $this.GetDscResourceKeyPropertyName() - } - - - - hidden [System.String]GetResourceFunctionName([RequiredAction]$RequiredAction) - { - if ($RequiredAction -in @( - [RequiredAction]::Get, - [RequiredAction]::New, - [RequiredAction]::Set, - [RequiredAction]::Remove, - [RequiredAction]::Test)) - { - return "$($RequiredAction)-AzDevOps$($this.ResourceName)" - } - - return $null - } - -} diff --git a/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 b/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 new file mode 100644 index 000000000..7041830ff --- /dev/null +++ b/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 @@ -0,0 +1,92 @@ +using module ..\..\Enums\Ensure\Ensure.psm1 +using module ..\..\Enums\RequiredAction\RequiredAction.psm1 +using module ..\..\Classes\AzDevOpsDscResource\AzDevOpsDscResource.psm1 + +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + + +class AzDevOpsApiDscResource : AzDevOpsDscResource +{ + [System.String]$ResourceName = $this.GetResourceName() + + hidden [System.String]GetResourceName() + { + # Assumes a naming convention is followed between the DSC + # resource name and the name of the resource within the API + return $this.GetType().ToString().Replace('DSC_AzDevOps','') + } + + + + <# + .NOTES + When creating an object via the Azure DevOps API, the ID (if provided) is ignored + and Azure DevOps creates/generates the Id (a GUID) which can then be used for the + object. + + As a result, only existing resources from the API will have a ResourceId and new + resources to be created via the API do not need one providing. + #> + [System.String]$ResourceId = $this.GetResourceId() + [System.String]$ResourceIdPropertyName = $this.GetResourceIdPropertyName() + + hidden [System.String]GetResourceId() + { + return $this."$($this.ResourceIdPropertyName)" + } + + hidden [System.String]GetResourceIdPropertyName() + { + return "$($this.ResourceName)Id" + } + + + + <# + .NOTES + When creating an object via the Azure DevOps API, the 'Key' of the object will be + another, alternate, unique key/identifier to the 'ResourceId' but this will be + specific to the resource. + + This 'Key' can be used to determine an 'Id' of a new resource that has been added. + #> + [System.String]$ResourceKey = $this.GetResourceKey() + [System.String]$ResourceKeyPropertyName = $this.GetResourceKeyPropertyName() + + hidden [System.String]GetResourceKey() + { + [System.String]$keyPropertyName = $this.ResourceKeyPropertyName + + if ([System.String]::IsNullOrWhiteSpace($keyPropertyName)) + { + return $null + } + + return $this."$keyPropertyName" + } + + hidden [System.String]GetResourceKeyPropertyName() + { + # Use same property as the DSC Resource 'Key' + return $this.GetDscResourceKeyPropertyName() + } + + + + hidden [System.String]GetResourceFunctionName([RequiredAction]$RequiredAction) + { + if ($RequiredAction -in @( + [RequiredAction]::Get, + [RequiredAction]::New, + [RequiredAction]::Set, + [RequiredAction]::Remove, + [RequiredAction]::Test)) + { + return "$($RequiredAction)-AzDevOps$($this.ResourceName)" + } + + return $null + } + +} diff --git a/source/Classes/AzDevOpsApiDscResource/README.md b/source/Classes/AzDevOpsApiDscResource/README.md new file mode 100644 index 000000000..e69de29bb From 185aaadde7f4bb602793e71acaf3007a36ebf8d1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 13:29:20 +0000 Subject: [PATCH 490/611] Renamed 'AzDevOpsDscResource' class to 'DscResourceBase' class. --- source/AzureDevOpsDsc.psm1 | 2 +- .../AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 | 4 ++-- .../DscResourceBase.psm1} | 2 +- .../{AzDevOpsDscResource => DscResourceBase}/README.md | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename source/Classes/{AzDevOpsDscResource/AzDevOpsDscResource.psm1 => DscResourceBase/DscResourceBase.psm1} (99%) rename source/Classes/{AzDevOpsDscResource => DscResourceBase}/README.md (100%) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 1ae5b3f92..237e345df 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,6 +1,6 @@ using module .\Enums\Ensure\Ensure.psm1 using module .\Enums\RequiredAction\RequiredAction.psm1 -using module .\Classes\AzDevOpsDscResource\AzDevOpsDscResource.psm1 +using module .\Classes\DscResourceBase\DscResourceBase.psm1 using module .\Classes\AzDevOpsApiDscResource\AzDevOpsApiDscResource.psm1 diff --git a/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 b/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 index 7041830ff..ea8149951 100644 --- a/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 +++ b/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 @@ -1,12 +1,12 @@ using module ..\..\Enums\Ensure\Ensure.psm1 using module ..\..\Enums\RequiredAction\RequiredAction.psm1 -using module ..\..\Classes\AzDevOpsDscResource\AzDevOpsDscResource.psm1 +using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath -class AzDevOpsApiDscResource : AzDevOpsDscResource +class AzDevOpsApiDscResource : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() diff --git a/source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 similarity index 99% rename from source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 rename to source/Classes/DscResourceBase/DscResourceBase.psm1 index dafef7367..bd2564272 100644 --- a/source/Classes/AzDevOpsDscResource/AzDevOpsDscResource.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -5,7 +5,7 @@ $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPat Import-Module -Name $script:azureDevOpsDscCommonModulePath -class AzDevOpsDscResource +class DscResourceBase { hidden [System.String]GetDscResourceKey() { diff --git a/source/Classes/AzDevOpsDscResource/README.md b/source/Classes/DscResourceBase/README.md similarity index 100% rename from source/Classes/AzDevOpsDscResource/README.md rename to source/Classes/DscResourceBase/README.md From 404b5c99d97549b18d01c93bc1af44631f7458bf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 13:32:22 +0000 Subject: [PATCH 491/611] Renamed 'AzDevOpsApiDscResource' class to 'AzDevOpsApiDscResourceBase' class --- source/AzureDevOpsDsc.psm1 | 4 ++-- .../AzDevOpsApiDscResourceBase.psm1} | 2 +- .../README.md | 0 .../AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename source/Classes/{AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 => AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1} (98%) rename source/Classes/{AzDevOpsApiDscResource => AzDevOpsApiDscResourceBase}/README.md (100%) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 237e345df..17b3d8b15 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,7 +1,7 @@ using module .\Enums\Ensure\Ensure.psm1 using module .\Enums\RequiredAction\RequiredAction.psm1 using module .\Classes\DscResourceBase\DscResourceBase.psm1 -using module .\Classes\AzDevOpsApiDscResource\AzDevOpsApiDscResource.psm1 +using module .\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' @@ -17,7 +17,7 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' -class DSC_AzDevOpsApiResource : AzDevOpsApiDscResource +class DSC_AzDevOpsApiResource : AzDevOpsApiDscResourceBase { [DscProperty()] [Alias('Uri')] diff --git a/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 similarity index 98% rename from source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 rename to source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index ea8149951..a918729b7 100644 --- a/source/Classes/AzDevOpsApiDscResource/AzDevOpsApiDscResource.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -6,7 +6,7 @@ $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPat Import-Module -Name $script:azureDevOpsDscCommonModulePath -class AzDevOpsApiDscResource : DscResourceBase +class AzDevOpsApiDscResourceBase : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() diff --git a/source/Classes/AzDevOpsApiDscResource/README.md b/source/Classes/AzDevOpsApiDscResourceBase/README.md similarity index 100% rename from source/Classes/AzDevOpsApiDscResource/README.md rename to source/Classes/AzDevOpsApiDscResourceBase/README.md diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 index 9b4d48b64..d02bad7f2 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 @@ -5,7 +5,7 @@ InModuleScope 'AzureDevOpsDsc' { - Describe 'DSCClassResources\AzDevOpsApiDscResource' -Tag 'AzDevOpsApiDscResource' { + Describe 'DSCClassResources\AzDevOpsApiDscResourceBase' -Tag 'AzDevOpsApiDscResourceBase' { $dscModuleName = 'AzureDevOpsDsc' $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' From 3048becc9108f35c7a4c6d3ac35d87196c6a7cb9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 13:33:37 +0000 Subject: [PATCH 492/611] Renamed 'DSC_AzDevOpsApiResource' class to 'AzDevOpsDscResourceBase' --- source/AzureDevOpsDsc.psm1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 17b3d8b15..7ee4cd480 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -17,7 +17,7 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' -class DSC_AzDevOpsApiResource : AzDevOpsApiDscResourceBase +class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase { [DscProperty()] [Alias('Uri')] @@ -77,7 +77,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResourceBase { # Obtain the type of $this object. Throw an exception if this is being called from the base class method. $thisType = $this.GetType() - if ($thisType -eq [DSC_AzDevOpsApiResource]) + if ($thisType -eq [AzDevOpsDscResourceBase]) { throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden and called by an inheriting class." } @@ -298,7 +298,7 @@ class DSC_AzDevOpsApiResource : AzDevOpsApiDscResourceBase [DscResource()] -class DSC_AzDevOpsProject : DSC_AzDevOpsApiResource +class DSC_AzDevOpsProject : AzDevOpsDscResourceBase { [DscProperty()] [Alias('Id')] From b3391c8cff055189f95e2b4e4c27430935561b6e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 13:39:28 +0000 Subject: [PATCH 493/611] Moved 'AzDevOpsDscResourceBase' class out of 'AzureDevOpsDsc.psm1' file. --- source/AzureDevOpsDsc.psm1 | 279 +---------------- .../AzDevOpsDscResourceBase.psm1 | 287 ++++++++++++++++++ .../Classes/AzDevOpsDscResourceBase/README.md | 0 3 files changed, 288 insertions(+), 278 deletions(-) create mode 100644 source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 create mode 100644 source/Classes/AzDevOpsDscResourceBase/README.md diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 7ee4cd480..dbcdb4754 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -2,6 +2,7 @@ using module .\Enums\Ensure\Ensure.psm1 using module .\Enums\RequiredAction\RequiredAction.psm1 using module .\Classes\DscResourceBase\DscResourceBase.psm1 using module .\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module .\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' @@ -17,284 +18,6 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' -class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase -{ - [DscProperty()] - [Alias('Uri')] - [System.String] - $ApiUri - - [DscProperty()] - [Alias('PersonalAccessToken')] - [System.String] - $Pat - - [DscProperty()] - [Ensure] - $Ensure - - - - hidden [System.Management.Automation.PSObject]GetDscCurrentStateObject() - { - # Setup a default set of parameters to pass into the object's 'Get' method - $getParameters = @{ - ApiUri = $this.ApiUri - Pat = $this.Pat - "$($this.GetResourceKeyPropertyName())" = $this.GetResourceKey() - } - - # If there is an available 'ResourceId' value, add it to the parameters/hashtable - if (![System.String]::IsNullOrWhiteSpace($this.GetResourceId())) - { - $getParameters."$($this.GetResourceIdPropertyName())" = $this.GetResourceId() - } - - # Obtain the 'Get' function name for the object, then invoke it - $thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) - $dscCurrentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) - - # If no object was returned (i.e it does not exist), create a default/empty object - if ($null -eq $dscCurrentStateResourceObject) - { - return New-Object -TypeName 'System.Management.Automation.PSObject' -Property @{ - Ensure = [Ensure]::Absent - } - } - - return $dscCurrentStateResourceObject - } - - - hidden [Hashtable]GetDscCurrentStateProperties() - { - # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class - return $this.GetDscCurrentStateProperties($this.GetDscCurrentStateObject()) - } - - # This method must be overidden by inheriting class(es) - hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) - { - # Obtain the type of $this object. Throw an exception if this is being called from the base class method. - $thisType = $this.GetType() - if ($thisType -eq [AzDevOpsDscResourceBase]) - { - throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden and called by an inheriting class." - } - return $null - } - - - hidden [Hashtable]GetDscDesiredStateProperties() - { - [Hashtable]$dscDesiredStateProperties = @{} - - # Obtain all DSC-related properties, and add them and their values to the hashtable output - $this.GetDscResourcePropertyNames() | ForEach-Object { - $dscDesiredStateProperties."$_" = $this."$_" - } - - return $dscDesiredStateProperties - } - - - hidden [RequiredAction]GetDscRequiredAction() - { - [Hashtable]$currentProperties = $this.GetDscCurrentStateProperties() - [Hashtable]$desiredProperties = $this.GetDscDesiredStateProperties() - - [System.String[]]$dscPropertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() - [System.String[]]$dscPropertyNamesToCompare = $this.GetDscResourcePropertyNames() - - - # Update 'Id' property: - # Set $desiredProperties."$IdPropertyName" to $currentProperties."$IdPropertyName" if it's desired - # value is blank/null but it's current/existing value is known (and can be recovered from $currentProperties). - # - # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences - [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() - - if ([System.String]::IsNullOrWhiteSpace($desiredProperties[$IdPropertyName]) -and - ![System.String]::IsNullOrWhiteSpace($currentProperties[$IdPropertyName])) - { - $desiredProperties."$IdPropertyName" = $currentProperties."$IdPropertyName" - } - - - # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) - $dscRequiredAction = [RequiredAction]::None - - switch ($desiredProperties.Ensure) - { - ([Ensure]::Present) { - - # If not already present, or different to expected/desired - return [RequiredAction]::New (i.e. Resource needs creating) - if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) - { - $dscRequiredAction = [RequiredAction]::New - Write-Verbose "DscActionRequired='$dscRequiredAction'" - break - } - - # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) - if ($dscPropertyNamesWithNoSetSupport.Count -gt 0) - { - $dscPropertyNamesWithNoSetSupport | ForEach-Object { - - if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) - { - throw "The '$($this.GetType().Name)', DSC Resource does not support changes for/to the '$_' property." - break - } - } - } - - # Compare all properties ('Current' vs 'Desired') - if ($dscPropertyNamesToCompare.Count -gt 0) - { - $dscPropertyNamesToCompare | ForEach-Object { - - if ($($currentProperties."$_") -ne $($desiredProperties."$_")) - { - Write-Verbose "DscPropertyValueMismatch='$_'" - $dscRequiredAction = [RequiredAction]::Set - } - } - - if ($dscRequiredAction -eq [RequiredAction]::Set) - { - Write-Verbose "DscActionRequired='$dscRequiredAction'" - break - } - } - - # Otherwise, no changes to make (i.e. The desired state is already achieved) - return $dscRequiredAction - break - } - ([Ensure]::Absent) { - - # If currently/already present - return $false (i.e. state is incorrect) - if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) - { - $dscRequiredAction = [RequiredAction]::Remove - Write-Verbose "DscActionRequired='$dscRequiredAction'" - break - } - - # Otherwise, no changes to make (i.e. The desired state is already achieved) - Write-Verbose "DscActionRequired='$dscRequiredAction'" - return $dscRequiredAction - break - } - default { - throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." - return [RequiredAction]::Error - } - } - - return $dscRequiredAction - } - - - hidden [Hashtable]GetDesiredStateParameters([Hashtable]$CurrentStateProperties, [Hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) - { - [Hashtable]$desiredStateParameters = $DesiredStateProperties - [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() - - - # If actions required are 'None' or 'Error', return a $null value - if ($RequiredAction -in @([RequiredAction]::None, [RequiredAction]::Error)) - { - return $null - } - # If the desired state/action is to remove the resource, generate/return a minimal set of parameters required to remove the resource - elseif ($RequiredAction -eq [RequiredAction]::Remove) - { - return @{ - ApiUri = $DesiredStateProperties.ApiUri - Pat = $DesiredStateProperties.Pat - - # Set this from the 'Current' state as we would expect this to have an existing key/ID value to use - "$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" - } - } - # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable, and amend - elseif ($RequiredAction -in @([RequiredAction]::New, [RequiredAction]::Set)) - { - # Set $desiredParameters."$IdPropertyName" to $CurrentStateProperties."$IdPropertyName" if it's known and can be recovered from existing resource - if ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName") -and - ![System.String]::IsNullOrWhiteSpace($CurrentStateProperties."$IdPropertyName")) - { - $desiredStateParameters."$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" - } - # Alternatively, if $desiredParameters."$IdPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) - elseif ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName")) - { - $desiredStateParameters.Remove($IdPropertyName) - } - - - # Do not need/want this passing as a parameter (the action taken will determine the desired state) - $desiredStateParameters.Remove('Ensure') - - - # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) - [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() - - if ($RequiredAction -eq [RequiredAction]::Set -and - $unsupportedForSetPropertyNames.Count -gt 0) - { - $unsupportedForSetPropertyNames | ForEach-Object { - $desiredStateParameters.Remove($_) - } - } - - } - else - { - throw "A required action of '$RequiredAction' has not been catered for in GetDesiredStateParameters() method." - } - - - return $desiredStateParameters - } - - - hidden [System.Boolean]TestDesiredState() - { - return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) - } - - [System.Boolean] Test() - { - return $this.TestDesiredState() - } - - - [void] SetToDesiredState() - { - [RequiredAction]$dscRequiredAction = $this.GetDscRequiredAction() - - if ($dscRequiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) - { - $dscCurrentStateProperties = $this.GetDscCurrentStateProperties() - $dscDesiredStateProperties = $this.GetDscDesiredStateProperties() - - $dscRequiredActionFunctionName = $this.GetResourceFunctionName($dscRequiredAction) - $dscDesiredStateParameters = $this.GetDesiredStateParameters($dscCurrentStateProperties, $dscDesiredStateProperties, $dscRequiredAction) - - & $dscRequiredActionFunctionName @dscDesiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 - } - } - - [void] Set() - { - $this.SetToDesiredState() - } - -} [DscResource()] diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 new file mode 100644 index 000000000..e773cf8eb --- /dev/null +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -0,0 +1,287 @@ +using module ..\..\Enums\Ensure\Ensure.psm1 +using module ..\..\Enums\RequiredAction\RequiredAction.psm1 +using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + + +class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase +{ + [DscProperty()] + [Alias('Uri')] + [System.String] + $ApiUri + + [DscProperty()] + [Alias('PersonalAccessToken')] + [System.String] + $Pat + + [DscProperty()] + [Ensure] + $Ensure + + + + hidden [System.Management.Automation.PSObject]GetDscCurrentStateObject() + { + # Setup a default set of parameters to pass into the object's 'Get' method + $getParameters = @{ + ApiUri = $this.ApiUri + Pat = $this.Pat + "$($this.GetResourceKeyPropertyName())" = $this.GetResourceKey() + } + + # If there is an available 'ResourceId' value, add it to the parameters/hashtable + if (![System.String]::IsNullOrWhiteSpace($this.GetResourceId())) + { + $getParameters."$($this.GetResourceIdPropertyName())" = $this.GetResourceId() + } + + # Obtain the 'Get' function name for the object, then invoke it + $thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) + $dscCurrentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) + + # If no object was returned (i.e it does not exist), create a default/empty object + if ($null -eq $dscCurrentStateResourceObject) + { + return New-Object -TypeName 'System.Management.Automation.PSObject' -Property @{ + Ensure = [Ensure]::Absent + } + } + + return $dscCurrentStateResourceObject + } + + + hidden [Hashtable]GetDscCurrentStateProperties() + { + # Obtain 'CurrentStateResourceObject' and pass into overidden function of inheriting class + return $this.GetDscCurrentStateProperties($this.GetDscCurrentStateObject()) + } + + # This method must be overidden by inheriting class(es) + hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) + { + # Obtain the type of $this object. Throw an exception if this is being called from the base class method. + $thisType = $this.GetType() + if ($thisType -eq [AzDevOpsDscResourceBase]) + { + throw "Method 'GetCurrentState()' in '$($thisType.Name)' must be overidden and called by an inheriting class." + } + return $null + } + + + hidden [Hashtable]GetDscDesiredStateProperties() + { + [Hashtable]$dscDesiredStateProperties = @{} + + # Obtain all DSC-related properties, and add them and their values to the hashtable output + $this.GetDscResourcePropertyNames() | ForEach-Object { + $dscDesiredStateProperties."$_" = $this."$_" + } + + return $dscDesiredStateProperties + } + + + hidden [RequiredAction]GetDscRequiredAction() + { + [Hashtable]$currentProperties = $this.GetDscCurrentStateProperties() + [Hashtable]$desiredProperties = $this.GetDscDesiredStateProperties() + + [System.String[]]$dscPropertyNamesWithNoSetSupport = $this.GetDscResourcePropertyNamesWithNoSetSupport() + [System.String[]]$dscPropertyNamesToCompare = $this.GetDscResourcePropertyNames() + + + # Update 'Id' property: + # Set $desiredProperties."$IdPropertyName" to $currentProperties."$IdPropertyName" if it's desired + # value is blank/null but it's current/existing value is known (and can be recovered from $currentProperties). + # + # This ensures that alternate keys (typically ResourceIds) not provided in the DSC configuration do not flag differences + [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() + + if ([System.String]::IsNullOrWhiteSpace($desiredProperties[$IdPropertyName]) -and + ![System.String]::IsNullOrWhiteSpace($currentProperties[$IdPropertyName])) + { + $desiredProperties."$IdPropertyName" = $currentProperties."$IdPropertyName" + } + + + # Perform logic with 'Ensure' (to determine whether resource should be created or dropped (or updated, if already [Ensure]::Present but property values differ) + $dscRequiredAction = [RequiredAction]::None + + switch ($desiredProperties.Ensure) + { + ([Ensure]::Present) { + + # If not already present, or different to expected/desired - return [RequiredAction]::New (i.e. Resource needs creating) + if ($null -eq $currentProperties -or $($currentProperties.Ensure) -ne [Ensure]::Present) + { + $dscRequiredAction = [RequiredAction]::New + Write-Verbose "DscActionRequired='$dscRequiredAction'" + break + } + + # Changes made by DSC to the following properties are unsupported by the resource (other than when creating a [RequiredAction]::New resource) + if ($dscPropertyNamesWithNoSetSupport.Count -gt 0) + { + $dscPropertyNamesWithNoSetSupport | ForEach-Object { + + if ($($currentProperties[$_].ToString()) -ne $($desiredProperties[$_].ToString())) + { + throw "The '$($this.GetType().Name)', DSC Resource does not support changes for/to the '$_' property." + break + } + } + } + + # Compare all properties ('Current' vs 'Desired') + if ($dscPropertyNamesToCompare.Count -gt 0) + { + $dscPropertyNamesToCompare | ForEach-Object { + + if ($($currentProperties."$_") -ne $($desiredProperties."$_")) + { + Write-Verbose "DscPropertyValueMismatch='$_'" + $dscRequiredAction = [RequiredAction]::Set + } + } + + if ($dscRequiredAction -eq [RequiredAction]::Set) + { + Write-Verbose "DscActionRequired='$dscRequiredAction'" + break + } + } + + # Otherwise, no changes to make (i.e. The desired state is already achieved) + return $dscRequiredAction + break + } + ([Ensure]::Absent) { + + # If currently/already present - return $false (i.e. state is incorrect) + if ($null -ne $currentProperties -and $currentProperties.Ensure -ne [Ensure]::Absent) + { + $dscRequiredAction = [RequiredAction]::Remove + Write-Verbose "DscActionRequired='$dscRequiredAction'" + break + } + + # Otherwise, no changes to make (i.e. The desired state is already achieved) + Write-Verbose "DscActionRequired='$dscRequiredAction'" + return $dscRequiredAction + break + } + default { + throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." + return [RequiredAction]::Error + } + } + + return $dscRequiredAction + } + + + hidden [Hashtable]GetDesiredStateParameters([Hashtable]$CurrentStateProperties, [Hashtable]$DesiredStateProperties, [RequiredAction]$RequiredAction) + { + [Hashtable]$desiredStateParameters = $DesiredStateProperties + [System.String]$IdPropertyName = $this.GetResourceIdPropertyName() + + + # If actions required are 'None' or 'Error', return a $null value + if ($RequiredAction -in @([RequiredAction]::None, [RequiredAction]::Error)) + { + return $null + } + # If the desired state/action is to remove the resource, generate/return a minimal set of parameters required to remove the resource + elseif ($RequiredAction -eq [RequiredAction]::Remove) + { + return @{ + ApiUri = $DesiredStateProperties.ApiUri + Pat = $DesiredStateProperties.Pat + + # Set this from the 'Current' state as we would expect this to have an existing key/ID value to use + "$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" + } + } + # If the desired state/action is to add/new or update/set the resource, start with the values in the $DesiredStateProperties variable, and amend + elseif ($RequiredAction -in @([RequiredAction]::New, [RequiredAction]::Set)) + { + # Set $desiredParameters."$IdPropertyName" to $CurrentStateProperties."$IdPropertyName" if it's known and can be recovered from existing resource + if ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName") -and + ![System.String]::IsNullOrWhiteSpace($CurrentStateProperties."$IdPropertyName")) + { + $desiredStateParameters."$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" + } + # Alternatively, if $desiredParameters."$IdPropertyName" is null/empty, remove the key (as we don't want to pass an empty/null parameter) + elseif ([System.String]::IsNullOrWhiteSpace($desiredStateParameters."$IdPropertyName")) + { + $desiredStateParameters.Remove($IdPropertyName) + } + + + # Do not need/want this passing as a parameter (the action taken will determine the desired state) + $desiredStateParameters.Remove('Ensure') + + + # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) + [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() + + if ($RequiredAction -eq [RequiredAction]::Set -and + $unsupportedForSetPropertyNames.Count -gt 0) + { + $unsupportedForSetPropertyNames | ForEach-Object { + $desiredStateParameters.Remove($_) + } + } + + } + else + { + throw "A required action of '$RequiredAction' has not been catered for in GetDesiredStateParameters() method." + } + + + return $desiredStateParameters + } + + + hidden [System.Boolean]TestDesiredState() + { + return ($this.GetDscRequiredAction() -eq [RequiredAction]::None) + } + + [System.Boolean] Test() + { + return $this.TestDesiredState() + } + + + [void] SetToDesiredState() + { + [RequiredAction]$dscRequiredAction = $this.GetDscRequiredAction() + + if ($dscRequiredAction -in @([RequiredAction]::'New', [RequiredAction]::'Set', [RequiredAction]::'Remove')) + { + $dscCurrentStateProperties = $this.GetDscCurrentStateProperties() + $dscDesiredStateProperties = $this.GetDscDesiredStateProperties() + + $dscRequiredActionFunctionName = $this.GetResourceFunctionName($dscRequiredAction) + $dscDesiredStateParameters = $this.GetDesiredStateParameters($dscCurrentStateProperties, $dscDesiredStateProperties, $dscRequiredAction) + + & $dscRequiredActionFunctionName @dscDesiredStateParameters -Force | Out-Null + Start-Sleep -Seconds 5 + } + } + + [void] Set() + { + $this.SetToDesiredState() + } + +} diff --git a/source/Classes/AzDevOpsDscResourceBase/README.md b/source/Classes/AzDevOpsDscResourceBase/README.md new file mode 100644 index 000000000..e69de29bb From 9755fc0178a5e2ec5a890152307ac26bf3ba3f27 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:14:39 +0000 Subject: [PATCH 494/611] Removed 'using' statements for 'Ensure.psm1' and 'RequiredAction.psm1' from 'DscResourceBase.psm1' --- source/Classes/DscResourceBase/DscResourceBase.psm1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 index bd2564272..26f5cb7b9 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -1,6 +1,3 @@ -using module ..\..\Enums\Ensure\Ensure.psm1 -using module ..\..\Enums\RequiredAction\RequiredAction.psm1 - $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath From 122e79ad18358eac318f20adde24343bed874f6d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:15:31 +0000 Subject: [PATCH 495/611] Added 'RequiredAction' enum into 'AzDevOpsApiDscResourceBase.psm1' directory and removed 'Enums' from 'using' statements. --- .../AzDevOpsApiDscResourceBase.psm1 | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index a918729b7..a3ae93f3c 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -1,11 +1,21 @@ -using module ..\..\Enums\Ensure\Ensure.psm1 -using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath +enum RequiredAction +{ + None + Get + New + Set + Remove + Test + Error +} + + class AzDevOpsApiDscResourceBase : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() From 3d07dd902793b6f838f1264faa7595c848d18d9e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:16:34 +0000 Subject: [PATCH 496/611] Removed 'Enums' from 'using' statements in 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index dbcdb4754..2c731366a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,10 +1,7 @@ -using module .\Enums\Ensure\Ensure.psm1 -using module .\Enums\RequiredAction\RequiredAction.psm1 using module .\Classes\DscResourceBase\DscResourceBase.psm1 using module .\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 using module .\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 - $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' #$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' @@ -14,15 +11,10 @@ Import-Module -Name $script:azureDevOpsDscCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - - - - - - [DscResource()] class DSC_AzDevOpsProject : AzDevOpsDscResourceBase { + [DscProperty()] [Alias('Id')] [System.String]$ProjectId From f7c00f40f4274acd98a6124d468e2962e98d7999 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:17:21 +0000 Subject: [PATCH 497/611] Removed enums from 'using' statements and added in directly into 'AzDevOpsDscResourceBase.psm1' --- .../AzDevOpsDscResourceBase.psm1 | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index e773cf8eb..7c7a265f1 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -1,11 +1,26 @@ -using module ..\..\Enums\Ensure\Ensure.psm1 -using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath +enum Ensure +{ + Present + Absent +} + +enum RequiredAction +{ + None + Get + New + Set + Remove + Test + Error +} + class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase { From 8938dc092af75b62dc9a9402689d0b3c648ba4c3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:21:57 +0000 Subject: [PATCH 498/611] Updated 'AzDevOpsApiDscResourceBase' to obtain 'RequiredAction' enum from 'using' reference. --- .../AzDevOpsApiDscResourceBase.psm1 | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index a3ae93f3c..0f70387e6 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -1,21 +1,10 @@ +using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath -enum RequiredAction -{ - None - Get - New - Set - Remove - Test - Error -} - - class AzDevOpsApiDscResourceBase : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() From b2a5a91835642095dfc3c3f4cda4031e8672fee8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:25:18 +0000 Subject: [PATCH 499/611] Updated 'AzDevOpsDscResourceBase.psm1' file to obtain 'RequiredAction' enum from 'RequiredAction.psm1' as part of 'using' reference. --- .../AzDevOpsDscResourceBase.psm1 | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 7c7a265f1..5839847d8 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -1,3 +1,4 @@ +using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 @@ -10,18 +11,6 @@ enum Ensure Absent } -enum RequiredAction -{ - None - Get - New - Set - Remove - Test - Error -} - - class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase { [DscProperty()] From 281f31cc28dff6df9b23cb7002f0ee3470df167d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:37:44 +0000 Subject: [PATCH 500/611] Updated 'using' and comment for 'Ensure' enum within 'AzDevOpsDscResourceBase.psm1' --- .../AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 5839847d8..bcae219f5 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -1,3 +1,4 @@ +using module ..\..\Enums\Ensure\Ensure.psm1 using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 @@ -5,6 +6,8 @@ using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath + +# Re-defined here so it is recognised by 'Import-DscResource' (which won't post-parse the 'using' statements) enum Ensure { Present From dcc58de9d2f95ee0f1ff6c053bcddaeb6a392835 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 14:52:10 +0000 Subject: [PATCH 501/611] Removed Get() and Set() methods from 'DSC_AzDevOpsProject', DSC resource and added 'PSDSCStandardDSCFunctionsInResource' suppression message, attribute. --- source/AzureDevOpsDsc.psm1 | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 2c731366a..37d13450a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -2,6 +2,7 @@ using module .\Classes\DscResourceBase\DscResourceBase.psm1 using module .\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 using module .\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' #$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' @@ -12,9 +13,9 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' [DscResource()] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] class DSC_AzDevOpsProject : AzDevOpsDscResourceBase { - [DscProperty()] [Alias('Id')] [System.String]$ProjectId @@ -36,16 +37,6 @@ class DSC_AzDevOpsProject : AzDevOpsDscResourceBase return [DSC_AzDevOpsProject]$($this.GetDscCurrentStateProperties()) } - [System.Boolean] Test() # Note: Overides identical method in base class but removes linting errors - { - return $this.TestDesiredState() - } - - [void] Set() # Note: Overides identical method in base class but removes linting errors - { - $this.SetToDesiredState() - } - hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() { From d192b80f9c9d63f290090fd3839b781dcb5cbbc1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 15:09:01 +0000 Subject: [PATCH 502/611] Renamed 'DSC_AzDevOpsProject', DSC Resource to 'AzDevOpsProject' --- source/AzureDevOpsDsc.psd1 | 2 +- source/AzureDevOpsDsc.psm1 | 6 +- .../AzDevOpsDscResourceBase.psm1 | 2 +- .../DSC_AzDevOpsProject/1-AddProject.ps1 | 2 +- .../DSC_AzDevOpsProject/2-RenameProject.ps1 | 2 +- .../DSC_AzDevOpsProject/3-DeleteProject.ps1 | 4 +- ... => AzDevOpsProject.Integration.Tests.ps1} | 2 +- ....config.ps1 => AzDevOpsProject.config.ps1} | 72 +++++++++---------- 8 files changed, 46 insertions(+), 46 deletions(-) rename tests/Integration/DSCClassResources/{DSC_AzDevOpsProject.Integration.Tests.ps1 => AzDevOpsProject.Integration.Tests.ps1} (99%) rename tests/Integration/DSCClassResources/{DSC_AzDevOpsProject.config.ps1 => AzDevOpsProject.config.ps1} (77%) diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index a421174d5..9878dcf2a 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -37,7 +37,7 @@ # Aliases to export from this module AliasesToExport = @() - DscResourcesToExport = @('DSC_AzDevOpsProject') + DscResourcesToExport = @('AzDevOpsProject') RequiredAssemblies = @() diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 37d13450a..2aea26920 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -14,7 +14,7 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' [DscResource()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] -class DSC_AzDevOpsProject : AzDevOpsDscResourceBase +class AzDevOpsProject : AzDevOpsDscResourceBase { [DscProperty()] [Alias('Id')] @@ -32,9 +32,9 @@ class DSC_AzDevOpsProject : AzDevOpsDscResourceBase [System.String]$SourceControlType - [DSC_AzDevOpsProject] Get() + [AzDevOpsProject] Get() { - return [DSC_AzDevOpsProject]$($this.GetDscCurrentStateProperties()) + return [AzDevOpsProject]$($this.GetDscCurrentStateProperties()) } diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index bcae219f5..36936e5c3 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -185,7 +185,7 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase break } default { - throw "Could not obtain a valid 'Ensure' value within 'DSC_AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." + throw "Could not obtain a valid 'Ensure' value within 'AzDevOpsProject' Test() function. Value was '$($desiredProperties.Ensure)'." return [RequiredAction]::Error } } diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 index 0b08d74a9..190952760 100644 --- a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 +++ b/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 @@ -22,7 +22,7 @@ Configuration Example node localhost { - DSC_AzDevOpsProject 'AddProject' + AzDevOpsProject 'AddProject' { Ensure = 'Present' diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 index c353977fe..f0f98c6db 100644 --- a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 +++ b/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 @@ -23,7 +23,7 @@ Configuration Example node localhost { - DSC_AzDevOpsProject 'RenameProject' + AzDevOpsProject 'RenameProject' { Ensure = 'Present' diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 b/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 index 291de9de0..c4108bd2d 100644 --- a/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 +++ b/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 @@ -24,7 +24,7 @@ Configuration Example { # Example: A logical delete (rename) of a project - DSC_AzDevOpsProject 'DeleteProject_Logical' + AzDevOpsProject 'DeleteProject_Logical' { Ensure = 'Absent' @@ -41,7 +41,7 @@ Configuration Example # Example: An unequivocal delete of a project (i.e. a strong/pure/absolute delete) - DSC_AzDevOpsProject 'DeleteProject_Unequivocal' + AzDevOpsProject 'DeleteProject_Unequivocal' { Ensure = 'Absent' diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 similarity index 99% rename from tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 rename to tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 index f75d5f982..a6dfaa03d 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 @@ -6,7 +6,7 @@ if (-not (Test-BuildCategory -Type 'Integration')) } $script:dscModuleName = 'AzureDevOpsDsc' -$script:dscResourceFriendlyName = 'DSC_AzDevOpsProject' +$script:dscResourceFriendlyName = 'AzDevOpsProject' $script:dscResourceName = $script:dscResourceFriendlyName try diff --git a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 b/tests/Integration/DSCClassResources/AzDevOpsProject.config.ps1 similarity index 77% rename from tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 rename to tests/Integration/DSCClassResources/AzDevOpsProject.config.ps1 index a016dc6d8..c14af771c 100644 --- a/tests/Integration/DSCClassResources/DSC_AzDevOpsProject.config.ps1 +++ b/tests/Integration/DSCClassResources/AzDevOpsProject.config.ps1 @@ -55,13 +55,13 @@ if ($null -in @($env:AZUREDEVOPSINTEGRATIONAPIURI, $env:AZUREDEVOPSINTEGRATIONPA .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent1_Config +Configuration AzDevOpsProject_EnsureGitProjectAbsent1_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureGitProjectAbsent1 + AzDevOpsProject Integration_Test_EnsureGitProjectAbsent1 { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -86,13 +86,13 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent1_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureGitProjectPresent_Config +Configuration AzDevOpsProject_EnsureGitProjectPresent_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureGitProjectPresent + AzDevOpsProject Integration_Test_EnsureGitProjectPresent { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -119,13 +119,13 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectPresent_Config .NOTES #> -Configuration DSC_AzDevOpsProject_UpdateGitProjectToTfvc_Config +Configuration AzDevOpsProject_UpdateGitProjectToTfvc_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_UpdateGitProjectToTfvc + AzDevOpsProject Integration_Test_UpdateGitProjectToTfvc { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -149,13 +149,13 @@ Configuration DSC_AzDevOpsProject_UpdateGitProjectToTfvc_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent2_Config +Configuration AzDevOpsProject_EnsureGitProjectAbsent2_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureGitProjectAbsent2 + AzDevOpsProject Integration_Test_EnsureGitProjectAbsent2 { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -180,13 +180,13 @@ Configuration DSC_AzDevOpsProject_EnsureGitProjectAbsent2_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent1_Config +Configuration AzDevOpsProject_EnsureTfvcProjectAbsent1_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent1 + AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent1 { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -211,13 +211,13 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent1_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config +Configuration AzDevOpsProject_EnsureTfvcProjectPresent_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectPresent + AzDevOpsProject Integration_Test_EnsureTfvcProjectPresent { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -243,13 +243,13 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectPresent_Config .NOTES #> -Configuration DSC_AzDevOpsProject_UpdateTfvcProjectToGit_Config +Configuration AzDevOpsProject_UpdateTfvcProjectToGit_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_UpdateTfvcProjectToGit + AzDevOpsProject Integration_Test_UpdateTfvcProjectToGit { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -274,13 +274,13 @@ Configuration DSC_AzDevOpsProject_UpdateTfvcProjectToGit_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent2_Config +Configuration AzDevOpsProject_EnsureTfvcProjectAbsent2_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent2 + AzDevOpsProject Integration_Test_EnsureTfvcProjectAbsent2 { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -305,13 +305,13 @@ Configuration DSC_AzDevOpsProject_EnsureTfvcProjectAbsent2_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config +Configuration AzDevOpsProject_EnsureProjectPresent_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureProjectPresent + AzDevOpsProject Integration_Test_EnsureProjectPresent { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -336,13 +336,13 @@ Configuration DSC_AzDevOpsProject_EnsureProjectPresent_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureProjectIdentical_Config +Configuration AzDevOpsProject_EnsureProjectIdentical_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureProjectIdentical + AzDevOpsProject Integration_Test_EnsureProjectIdentical { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -366,13 +366,13 @@ Configuration DSC_AzDevOpsProject_EnsureProjectIdentical_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureProjectUpdated_Config +Configuration AzDevOpsProject_EnsureProjectUpdated_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureProjectUpdated + AzDevOpsProject Integration_Test_EnsureProjectUpdated { ApiUri = $Node.ApiUri Pat = $Node.Pat @@ -396,13 +396,13 @@ Configuration DSC_AzDevOpsProject_EnsureProjectUpdated_Config .NOTES #> -Configuration DSC_AzDevOpsProject_EnsureProjectRemoved_Config +Configuration AzDevOpsProject_EnsureProjectRemoved_Config { - Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'DSC_AzDevOpsProject' + Import-DscResource -ModuleName 'AzureDevOpsDsc' -Name 'AzDevOpsProject' node $AllNodes.NodeName { - DSC_AzDevOpsProject Integration_Test_EnsureProjectRemoved + AzDevOpsProject Integration_Test_EnsureProjectRemoved { ApiUri = $Node.ApiUri Pat = $Node.Pat From 7266092c2cd31372ef9d595e47de154d7013c2a7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 15:09:57 +0000 Subject: [PATCH 503/611] Updated to cater for removal of 'DSC_' prefix on DSCClassResources. --- .../AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 | 2 +- .../AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index 0f70387e6..fa7a56552 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -13,7 +13,7 @@ class AzDevOpsApiDscResourceBase : DscResourceBase { # Assumes a naming convention is followed between the DSC # resource name and the name of the resource within the API - return $this.GetType().ToString().Replace('DSC_AzDevOps','') + return $this.GetType().ToString().Replace('AzDevOps','') } diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 index d02bad7f2..32363b526 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 @@ -14,7 +14,7 @@ InModuleScope 'AzureDevOpsDsc' { Context "When evaluating '$dscModuleName' module" { BeforeAll { $dscModuleName = 'AzureDevOpsDsc' - $dscResourcePrefix = 'DSC_AzDevOps' + $dscResourcePrefix = 'AzDevOps' [string[]]$exportedDscResources = (Get-Module $dscModuleName).ExportedDscResources } From 9dcffddd42eafeb426edf06a64b0d1c8dfaaa40c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 15:55:39 +0000 Subject: [PATCH 504/611] Moved 'AzDevOpsProject', DSC Resource into it's own file/module and out of 'AzureDevOpsDsc.psm1' file. --- source/AzureDevOpsDsc.psm1 | 59 ------------------- .../AzDevOpsProject/AzDevOpsProject.psm1 | 59 +++++++++++++++++++ 2 files changed, 59 insertions(+), 59 deletions(-) create mode 100644 source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 2aea26920..67e9d4bf2 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,6 +1,3 @@ -using module .\Classes\DscResourceBase\DscResourceBase.psm1 -using module .\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -using module .\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' @@ -11,59 +8,3 @@ Import-Module -Name $script:azureDevOpsDscCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - -[DscResource()] -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] -class AzDevOpsProject : AzDevOpsDscResourceBase -{ - [DscProperty()] - [Alias('Id')] - [System.String]$ProjectId - - [DscProperty(Key, Mandatory)] - [Alias('Name')] - [System.String]$ProjectName - - [DscProperty()] - [Alias('Description')] - [System.String]$ProjectDescription - - [DscProperty()] - [System.String]$SourceControlType - - - [AzDevOpsProject] Get() - { - return [AzDevOpsProject]$($this.GetDscCurrentStateProperties()) - } - - - hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() - { - return @('SourceControlType') - } - - hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) - { - $properties = @{ - Pat = $this.Pat - ApiUri = $this.ApiUri - Ensure = [Ensure]::Absent - } - - if ($null -ne $CurrentResourceObject) - { - if (![System.String]::IsNullOrWhiteSpace($CurrentResourceObject.id)) - { - $properties.Ensure = [Ensure]::Present - } - $properties.ProjectId = $CurrentResourceObject.id - $properties.ProjectName = $CurrentResourceObject.name - $properties.ProjectDescription = $CurrentResourceObject.description - $properties.SourceControlType = $CurrentResourceObject.capabilities.versioncontrol.sourceControlType - } - - return $properties - } - -} diff --git a/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 b/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 new file mode 100644 index 000000000..37a6f8644 --- /dev/null +++ b/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 @@ -0,0 +1,59 @@ +using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +[DscResource()] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] +class AzDevOpsProject : AzDevOpsDscResourceBase +{ + [DscProperty()] + [Alias('Id')] + [System.String]$ProjectId + + [DscProperty(Key, Mandatory)] + [Alias('Name')] + [System.String]$ProjectName + + [DscProperty()] + [Alias('Description')] + [System.String]$ProjectDescription + + [DscProperty()] + [System.String]$SourceControlType + + + [AzDevOpsProject] Get() + { + return [AzDevOpsProject]$($this.GetDscCurrentStateProperties()) + } + + + hidden [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() + { + return @('SourceControlType') + } + + hidden [Hashtable]GetDscCurrentStateProperties([PSCustomObject]$CurrentResourceObject) + { + $properties = @{ + Pat = $this.Pat + ApiUri = $this.ApiUri + Ensure = [Ensure]::Absent + } + + if ($null -ne $CurrentResourceObject) + { + if (![System.String]::IsNullOrWhiteSpace($CurrentResourceObject.id)) + { + $properties.Ensure = [Ensure]::Present + } + $properties.ProjectId = $CurrentResourceObject.id + $properties.ProjectName = $CurrentResourceObject.name + $properties.ProjectDescription = $CurrentResourceObject.description + $properties.SourceControlType = $CurrentResourceObject.capabilities.versioncontrol.sourceControlType + } + + return $properties + } + +} From e29f008ecde4627a6e3bb4b466cc67da63913785 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 15:56:32 +0000 Subject: [PATCH 505/611] Added 'AzDevOpsProject.psm1' to 'NestedModules' property in 'AzureDevOpsDsc', module manifest. --- source/AzureDevOpsDsc.psd1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index 9878dcf2a..375c7f87e 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -37,6 +37,11 @@ # Aliases to export from this module AliasesToExport = @() + # Import all the 'DSCClassResource', modules as part of this module + NestedModules = @( + '.\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1' + ) + DscResourcesToExport = @('AzDevOpsProject') RequiredAssemblies = @() From 7e56c89829c0008d13921b84533acc3bfd7af930 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 15:57:18 +0000 Subject: [PATCH 506/611] Added 'README.md' for 'AzDevOpsProject', DSC resource. --- .../AzDevOpsProject/README.md | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 source/DSCClassResources/AzDevOpsProject/README.md diff --git a/source/DSCClassResources/AzDevOpsProject/README.md b/source/DSCClassResources/AzDevOpsProject/README.md new file mode 100644 index 000000000..24eb3cc2c --- /dev/null +++ b/source/DSCClassResources/AzDevOpsProject/README.md @@ -0,0 +1,64 @@ +# Description + +The `AzDevOpsProject`, DSC Resource sets `Project` resources within Azure DevOps +Server/Services. + +This DSC Resource uses both `ProjectId` and `ProjectName` as forms of unique +identification of a `Project` although the `ProjectName` must be unique across +all projects within the `Organization` (in Azure DevOps Services) or the +`Collection` (in Azure DevOps Server). + +Azure DevOps generates the `ProjectId` when creating the `Project` resource so, +typically, `ProjectId` will not be assigned a property value within a +configuration but this property can be referenced by other DSC Resources defined +in a configuration. + +>**Note:** This DSC Resource does *not* support the changes to the type of +> source control used by a `Project` (defined by the `SourceControlType` +> property) - The Azure DevOps REST API does not currently support this +> operation. +> +> Any attempt to update an existing `Project` created with one +> `SourceControlType` (e.g. `Git`) to another (e.g. `Tfvc`) will throw an +> exception. + +## Permissions + +* Any Personal Access Token (PAT) being used to manage this `AzDevOpsProject`, + DSC Resource must have the following permissions configured in Azure DevOps: + * **Project and Team** (Read, write and manage) + +* Information on creating a Personal Access Token (PAT) can be found [here](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate) +(as part of the [Azure DevOps documentation](https://docs.microsoft.com/en-us/azure/devops/?view=azure-devops) +maintained by Microsoft). + +## Requirements + +There are no specific requirements (in addition to the required permissions +within Azure DevOps) for this DSC Resource. + +## Examples + +Examples of usage of the `AzDevOpsProject`, DSC Resource within a DSC +configuration can be found [here](../../Examples/Resources/AzDevOpsProject). + +## Related Commands + +The embedded, `AzureDevOpsDsc.Common`, module exports the following commands +which relate to this DSC Resource: + +* `Get-AzDevOpsProject` +* `Set-AzDevOpsProject` +* `Remove-AzDevOpsProject` + +The DSC Resource uses these commands directly so they can be considered tested, +stable, maintained and supported as part of the `AzureDevOpsDsc` module. + +## Azure DevOps Services REST API + +The overview page (within the [Azure DevOps Services REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) dcoumentation maintained by Microsoft) for the Azure DevOps, `Project` +resource behind this DSC Resource is [here](https://docs.microsoft.com/en-us/rest/api/azure/devops/core/projects). + +## Known issues + +All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+AzDevOpsProject). From 2782238f0515999f4c9f01971d21edfaafbb3993 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 16:00:17 +0000 Subject: [PATCH 507/611] Renamed 'DSC_AzDevOpsProject', example directory to 'AzDevOpsProject'. --- .../{DSC_AzDevOpsProject => AzDevOpsProject}/1-AddProject.ps1 | 0 .../{DSC_AzDevOpsProject => AzDevOpsProject}/2-RenameProject.ps1 | 0 .../{DSC_AzDevOpsProject => AzDevOpsProject}/3-DeleteProject.ps1 | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename source/Examples/Resources/{DSC_AzDevOpsProject => AzDevOpsProject}/1-AddProject.ps1 (100%) rename source/Examples/Resources/{DSC_AzDevOpsProject => AzDevOpsProject}/2-RenameProject.ps1 (100%) rename source/Examples/Resources/{DSC_AzDevOpsProject => AzDevOpsProject}/3-DeleteProject.ps1 (100%) diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 b/source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 similarity index 100% rename from source/Examples/Resources/DSC_AzDevOpsProject/1-AddProject.ps1 rename to source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 b/source/Examples/Resources/AzDevOpsProject/2-RenameProject.ps1 similarity index 100% rename from source/Examples/Resources/DSC_AzDevOpsProject/2-RenameProject.ps1 rename to source/Examples/Resources/AzDevOpsProject/2-RenameProject.ps1 diff --git a/source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 b/source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 similarity index 100% rename from source/Examples/Resources/DSC_AzDevOpsProject/3-DeleteProject.ps1 rename to source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 From de24bedbfd51b90972396d3dd0c03135c3ac75b7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 17:05:26 +0000 Subject: [PATCH 508/611] Added 'DscResourceBase' class, 'GetDscResourceKey()' method, unit tests --- .../DscResourceBase/DscResourceBase.psm1 | 5 -- .../GetDscResourceKey.Tests.ps1 | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 index 26f5cb7b9..0d12294ed 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -8,11 +8,6 @@ class DscResourceBase { [System.String]$dscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() - if ([System.String]::IsNullOrWhiteSpace($dscResourceKeyPropertyName)) - { - return $null - } - return $this."$dscResourceKeyPropertyName" } diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 new file mode 100644 index 000000000..6cad8a7c5 --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -0,0 +1,49 @@ +using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 + + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + Import-Module $script:commandScriptPath -Force + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class without a DSC Resource key' { + + It 'Should throw' { + + $dscResourceBase = [DscResourceBase]::new() + {$dscResourceBase.GetDscResourceKey()} | Should -Throw + } + + } + + + Context 'When called from instance of class with a DSC key' { + + $dscResourceWithKey = [AzDevOpsProject]@{ + ProjectName = 'SomeProjectName' + } + + It 'Should not throw' { + + {$dscResourceWithKey.GetDscResourceKey()} | Should -Not -Throw + } + + It 'Should return the value of the DSC Resource key' { + + $dscResourceWithKey.GetDscResourceKey() | Should -Be 'SomeProjectName' + } + } + + } +} From 6485509c810f288fad40eb9980feb263322a5925 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 18:24:23 +0000 Subject: [PATCH 509/611] Added additional condition into 'GetDscResourceKey()' method in 'DscResourceBase' class --- source/Classes/DscResourceBase/DscResourceBase.psm1 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 index 0d12294ed..b344c1220 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -8,6 +8,11 @@ class DscResourceBase { [System.String]$dscResourceKeyPropertyName = $this.GetDscResourceKeyPropertyName() + if ([String]::IsNullOrWhiteSpace($dscResourceKeyPropertyName)) + { + throw "Cannot obtain a 'DscResourceKey' value for the '$($this.GetType().Name)' instance." + } + return $this."$dscResourceKeyPropertyName" } @@ -36,11 +41,14 @@ class DscResourceBase if ($null -eq $dscResourceKeyPropertyNames -or $dscResourceKeyPropertyNames.Count -eq 0) { - throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + Write-Error "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." + return [string]::Empty + } elseif ($dscResourceKeyPropertyNames.Count -gt 1) { - throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + Write-Error "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." + return [string]::Empty } return $dscResourceKeyPropertyNames[0] From 01e5f067359dd94fa20cba5365b4faf85fd779c0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 18:25:48 +0000 Subject: [PATCH 510/611] Updated 'DscResourceBase' class, unit tests to include test for multiple DSC Resource keys and test new condition added into 'DscResourceBase' resource. --- .../GetDscResourceKey.Tests.ps1 | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index 6cad8a7c5..f22391f58 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -21,13 +21,33 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - $dscResourceBase = [DscResourceBase]::new() + $dscResourceBase = [AzDevOpsApiDscResourceBase]::new() {$dscResourceBase.GetDscResourceKey()} | Should -Throw } } + Context 'When called from instance of a class with multiple DSC Resource keys' { + + It 'Should throw' { + + class AzDevOpsProject2 : AzDevOpsProject + { + [DscProperty(Key)] + [string]$ProjectName2 + } + + $dscResourceWith2Keys = [AzDevOpsProject2]@{ + ProjectName = 'SomeProjectName2' + } + + {$dscResourceWith2Keys.GetDscResourceKey()} | Should -Throw + } + + } + + Context 'When called from instance of class with a DSC key' { $dscResourceWithKey = [AzDevOpsProject]@{ From ecdea45727ce996d777363ead701fc9638167a19 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 18:26:47 +0000 Subject: [PATCH 511/611] Added unit tests for 'GetDscResourceKeyPropertyName()' method in 'DscResourceBase' class. --- .../GetDscResourceKeyPropertyName.Tests.ps1 | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 new file mode 100644 index 000000000..08828c0ea --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -0,0 +1,69 @@ +using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 + + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + Import-Module $script:commandScriptPath -Force + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class without a DSC Resource key' { + + It 'Should throw' { + + $dscResourceWithNoDscKey = [AzDevOpsApiDscResourceBase]::new() + + $dscResourceWithNoDscKey.GetDscResourceKeyPropertyName() | Should -Be '' + } + + } + + Context 'When called from instance of a class with multiple DSC Resource keys' { + + It 'Should throw' { + + class AzDevOpsProject2 : AzDevOpsProject + { + [DscProperty(Key)] + [string]$ProjectName2 + } + + $dscResourceWith2Keys = [AzDevOpsProject2]@{ + ProjectName = 'SomeProjectName2' + } + + $dscResourceWith2Keys.GetDscResourceKeyPropertyName() | Should -Be '' + } + + } + + + Context 'When called from instance of class with a DSC key' { + + $dscResourceWithKey = [AzDevOpsProject]@{ + ProjectName = 'SomeProjectName' + } + + It 'Should not throw' { + + {$dscResourceWithKey.GetDscResourceKeyPropertyName()} | Should -Not -Throw + } + + It 'Should return the value of the DSC Resource key' { + + $dscResourceWithKey.GetDscResourceKeyPropertyName() | Should -Be 'ProjectName' + } + } + + } +} From 9f0df6de3de899090959bcb91f283348bad6c8f8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 18:36:05 +0000 Subject: [PATCH 512/611] Added unit tests for 'DscResourceBase' class, 'GetDscResourcePropertyNames()' method --- .../GetDscResourcePropertyNames.Tests.ps1 | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 new file mode 100644 index 000000000..7bb2b5cf9 --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -0,0 +1,80 @@ +using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 + + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + Import-Module $script:commandScriptPath -Force + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class without any DSC properties' { + + It 'Should not throw' { + + $dscResourceWithNoDscProperties = [AzDevOpsApiDscResourceBase]::new() + + {$dscResourceWithNoDscProperties.GetDscResourcePropertyNames()} | Should -Not -Throw + } + + It 'Should return empty array' { + + $dscResourceWithNoDscProperties = [AzDevOpsApiDscResourceBase]::new() + + $dscResourceWithNoDscProperties.GetDscResourcePropertyNames().Count | Should -Be 0 + } + + } + + Context 'When called from instance of a class with multiple DSC Resource keys' { + + It 'Should not throw' { + + class AzDevOpsApiDscResourceBase2 : AzDevOpsApiDscResourceBase + { + [DscProperty()] + [string]$ADscProperty + + [DscProperty()] + [string]$AnotherDscProperty + } + + $dscResourceWith2DscProperties = [AzDevOpsApiDscResourceBase2]@{ + ADscProperty = 'ADscPropertyValue' + AnotherDscProperty = 'AnotherDscPropertyValue' + } + + { $dscResourceWith2DscProperties.GetDscResourcePropertyNames() } | Should -Not -Throw + } + + It 'Should not throw' { + + class AzDevOpsApiDscResourceBase2 : AzDevOpsApiDscResourceBase + { + [DscProperty()] + [string]$ADscProperty + + [DscProperty()] + [string]$AnotherDscProperty + } + + $dscResourceWith2DscProperties = [AzDevOpsApiDscResourceBase2]@{ + ADscProperty = 'ADscPropertyValue' + AnotherDscProperty = 'AnotherDscPropertyValue' + } + + $dscResourceWith2DscProperties.GetDscResourcePropertyNames().Count | Should -Be 2 + } + + } + } +} From b622fcd6ab2c20aaa7f5ab03d376251e9e658422 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 18:45:32 +0000 Subject: [PATCH 513/611] Added unit tests for 'DscResourceBase' class, 'GetDscResourcePropertyNamesWithNoSetSupport()' method. --- ...rcePropertyNamesWithNoSetSupport.Tests.ps1 | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 new file mode 100644 index 000000000..0a9adb620 --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -0,0 +1,69 @@ +using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 + + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + Import-Module $script:commandScriptPath -Force + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of a class without any DSC properties with no "Set" support' { + + It 'Should not throw' { + + $dscResourceWithNoSetSupportProperties = [AzDevOpsApiDscResourceBase]::new() + + {$dscResourceWithNoSetSupportProperties.GetDscResourcePropertyNamesWithNoSetSupport()} | Should -Not -Throw + } + + It 'Should return empty array' { + + $dscResourceWithNoSetSupportProperties = [AzDevOpsApiDscResourceBase]::new() + + $dscResourceWithNoSetSupportProperties.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be 0 + } + + } + + Context 'When called from instance of a class with a DSC property with no "Set" support' { + + It 'Should not throw' { + + $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ + ProjectName = 'SomeProjectName' + } + + { $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() } | Should -Not -Throw + } + + It 'Should return the correct number of DSC resource property names that do not support "SET"' { + + $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ + ProjectName = 'SomeProjectName' + } + + $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be 1 + } + + It 'Should return the correct DSC resource property names that do not support "SET"' { + + $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ + ProjectName = 'SomeProjectName' + } + + $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() | Should -Contain 'SourceControlType' + } + + } + } +} From 62eb34492dc64b31915fd59a963aa98485e34230 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 19:55:00 +0000 Subject: [PATCH 514/611] Removed comments in ''AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 67e9d4bf2..90c3d06a9 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,10 +1,6 @@ $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' -#$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' - Import-Module -Name $script:azureDevOpsDscCommonModulePath -#Import-Module -Name $script:dscResourceCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' - From 92e4133e6313c32448f983b3ae64ec027ad5c58d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 19:55:50 +0000 Subject: [PATCH 515/611] Removed 'AzureDevOps.Common' module import from 'AzDevOpsApiDscResourceBase.psm1' as not required. --- .../AzDevOpsApiDscResourceBase.psm1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index fa7a56552..8e7ba039f 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -1,10 +1,6 @@ using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath - - class AzDevOpsApiDscResourceBase : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() From 5ee5268c6c470d92c5b81de6225a44514d475ff6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 19:56:54 +0000 Subject: [PATCH 516/611] Removed import of 'AzureDevOps.Common' module from 'DscResourceBase.psm1' (as not required). --- source/Classes/DscResourceBase/DscResourceBase.psm1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 index b344c1220..331b56ca2 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -1,6 +1,3 @@ -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath - class DscResourceBase { From e95b1401bd7b54f6130de180121524d69f22dc78 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 19:57:35 +0000 Subject: [PATCH 517/611] Added import of 'AzureDevOpsDsc.Common' module into 'AzDevOpsProject.psm1' --- source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 b/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 index 37a6f8644..985831b5b 100644 --- a/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 +++ b/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 @@ -2,6 +2,9 @@ using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 using module ..\..\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + [DscResource()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] class AzDevOpsProject : AzDevOpsDscResourceBase From 88bb3c70ef2928972b29c60d755f9b259b1a3fa0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 19:58:35 +0000 Subject: [PATCH 518/611] Added 'Classes.TestInitialization.ps1' --- .../Unit/Classes/Classes.TestInitialization.ps1 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/Unit/Classes/Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/Classes.TestInitialization.ps1 b/tests/Unit/Classes/Classes.TestInitialization.ps1 new file mode 100644 index 000000000..2fe385b5e --- /dev/null +++ b/tests/Unit/Classes/Classes.TestInitialization.ps1 @@ -0,0 +1,17 @@ +<# + .SYNOPSIS + Automated unit test for classes in AzureDevOpsDsc. +#> + +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestHelper.psm1') + +if (-not (Test-BuildCategory -Type 'Unit')) +{ + return +} + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") +$script:subModuleName = 'AzureDevOpsDsc.Common' +Import-Module -Name $script:dscModuleFile -Force -Verbose From fef35210c070f4c58dd73487701f47fdc29b8546 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 20:00:30 +0000 Subject: [PATCH 519/611] Added 'using' reference to 'AzDevOpsProject.psm1' and call to 'Classes.TestInitialization.ps1' into 'DscResourceBase' class, function, unit tests. --- tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 | 3 +++ .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 3 +++ .../DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 | 3 +++ .../GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 | 3 +++ 4 files changed, 12 insertions(+) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index f22391f58..017c59c91 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -1,5 +1,8 @@ using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 InModuleScope 'AzureDevOpsDsc' { diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index 08828c0ea..d651b4c29 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,5 +1,8 @@ using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 InModuleScope 'AzureDevOpsDsc' { diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 index 7bb2b5cf9..155ff6928 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -1,5 +1,8 @@ using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 InModuleScope 'AzureDevOpsDsc' { diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 index 0a9adb620..ef6c233c1 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -1,5 +1,8 @@ using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 InModuleScope 'AzureDevOpsDsc' { From f36d4effac0db82c11644d55ce60e85b7bad6796 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 20:01:54 +0000 Subject: [PATCH 520/611] Updated functionality in 'AzureDevOpsDsc.Common.Tests.Initialization.ps1' --- ...eDevOpsDsc.Common.Tests.Initialization.ps1 | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 index 131f5dd13..3b130805a 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 @@ -1,34 +1,32 @@ # #region HEADER -# $ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path -# $ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { -# ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and -# $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } -# ).BaseName +$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path +$ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { + ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and + $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } + ).BaseName -# #Write-Warning "ProjectPath : $ProjectPath" -# #Write-Warning "ProjectName : $ProjectName" +#Write-Warning "ProjectPath : $ProjectPath" +#Write-Warning "ProjectName : $ProjectName" -# $script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 -# #Write-Warning "ParentModule : $script:ParentModule" -# $script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' -# #Write-Warning "SubModulesFolder : $script:SubModulesFolder" +$script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 +#Write-Warning "ParentModule : $script:ParentModule" +$script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' +#Write-Warning "SubModulesFolder : $script:SubModulesFolder" -# Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue +Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue -# $script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' -# #Write-Warning "SubModuleName : $script:SubModuleName" -# #Remove-Module $script:SubModuleName -force -ErrorAction SilentlyContinue -# #Write-Warning "SubmoduleFile : $script:SubmoduleFile" +$script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' +#Write-Warning "SubModuleName : $script:SubModuleName" +$script:SubmoduleFile = Join-Path $($script:SubModulesFolder) -ChildPath "$($script:SubModuleName)\$($script:SubModuleName).psd1" +#Write-Warning "SubmoduleFile : $script:SubmoduleFile" -# #endregion HEADER +Remove-Module $script:SubModuleName -Force -ErrorAction SilentlyContinue -# #Import-Module $script:SubmoduleFile -Force -ErrorAction Stop +# #endregion HEADER -# # Import helper modules containing helper functions and test values/cases -# Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestHelper.psm1') -Force -# Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers\CommonTestCases.psm1') -Force +Import-Module $script:SubmoduleFile -Force -ErrorAction Stop From de5fe661b1178f98fa91ac3937f24eb5d459dc85 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 20:02:48 +0000 Subject: [PATCH 521/611] Added import of 'AzureDevOpsDsc.Common' module into 'AzDevOpsProject', DSC Resource, integration tests. --- .../DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 b/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 index a6dfaa03d..230f5cd95 100644 --- a/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 +++ b/tests/Integration/DSCClassResources/AzDevOpsProject.Integration.Tests.ps1 @@ -9,6 +9,9 @@ $script:dscModuleName = 'AzureDevOpsDsc' $script:dscResourceFriendlyName = 'AzDevOpsProject' $script:dscResourceName = $script:dscResourceFriendlyName +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\..\Source\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + try { Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' From 4ee42cfdce55e84ed2ad0c3f7b5770ac2af20ca2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 20:03:35 +0000 Subject: [PATCH 522/611] Updated 'CodeCoverageOutputFile' file path in 'build.yaml' --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index dd52756d9..520b41f37 100644 --- a/build.yaml +++ b/build.yaml @@ -70,7 +70,7 @@ Pester: ExcludeTag: Tag: CodeCoverageThreshold: 85 - CodeCoverageOutputFile: JaCoCo_coverage.xml + CodeCoverageOutputFile: output/testResults/CodeCoverage.JaCoCo.xml CodeCoverageOutputFileEncoding: ascii DscTest: From 667d1b22ec8e264e1f6ab15513a7babe0099543b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:22:37 +0000 Subject: [PATCH 523/611] Updated test-initialization scripts to be identical --- .../Classes/Classes.TestInitialization.ps1 | 17 +++--- ...eDevOpsDsc.Common.Tests.Initialization.ps1 | 54 ++++++++----------- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/tests/Unit/Classes/Classes.TestInitialization.ps1 b/tests/Unit/Classes/Classes.TestInitialization.ps1 index 2fe385b5e..63256f5fa 100644 --- a/tests/Unit/Classes/Classes.TestInitialization.ps1 +++ b/tests/Unit/Classes/Classes.TestInitialization.ps1 @@ -4,14 +4,19 @@ #> Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestHelper.psm1') - -if (-not (Test-BuildCategory -Type 'Unit')) -{ - return -} +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestCases.psm1') $script:dscModuleName = 'AzureDevOpsDsc' $script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 $script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") +Get-Module -Name $script:dscModuleName -All | + Remove-Module $script:dscModuleName -Force -ErrorAction SilentlyContinue + $script:subModuleName = 'AzureDevOpsDsc.Common' -Import-Module -Name $script:dscModuleFile -Force -Verbose +Import-Module -Name $script:dscModuleFile -Force + +Get-Module -Name $script:subModuleName -All | + Remove-Module $script:subModuleName -Force -ErrorAction SilentlyContinue +$script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' +$script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" +#Import-Module -Name $script:subModuleFile -Force #-Verbose diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 index 3b130805a..63256f5fa 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 @@ -1,32 +1,22 @@ -# #region HEADER -$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path -$ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object { - ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and - $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) } - ).BaseName - -#Write-Warning "ProjectPath : $ProjectPath" -#Write-Warning "ProjectName : $ProjectName" - - -$script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1 -#Write-Warning "ParentModule : $script:ParentModule" -$script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules' -#Write-Warning "SubModulesFolder : $script:SubModulesFolder" - -Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue - - - -$script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1' -replace '\.Tests.Initialization.ps1' -#Write-Warning "SubModuleName : $script:SubModuleName" - -$script:SubmoduleFile = Join-Path $($script:SubModulesFolder) -ChildPath "$($script:SubModuleName)\$($script:SubModuleName).psd1" -#Write-Warning "SubmoduleFile : $script:SubmoduleFile" - -Remove-Module $script:SubModuleName -Force -ErrorAction SilentlyContinue - - -# #endregion HEADER - -Import-Module $script:SubmoduleFile -Force -ErrorAction Stop +<# + .SYNOPSIS + Automated unit test for classes in AzureDevOpsDsc. +#> + +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestHelper.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestCases.psm1') + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") +Get-Module -Name $script:dscModuleName -All | + Remove-Module $script:dscModuleName -Force -ErrorAction SilentlyContinue + +$script:subModuleName = 'AzureDevOpsDsc.Common' +Import-Module -Name $script:dscModuleFile -Force + +Get-Module -Name $script:subModuleName -All | + Remove-Module $script:subModuleName -Force -ErrorAction SilentlyContinue +$script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' +$script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" +#Import-Module -Name $script:subModuleFile -Force #-Verbose From d660a25234e34d943e4650883ff2604aaf32cf8d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:24:27 +0000 Subject: [PATCH 524/611] Deleted old, 'AzureDevOpsDsv.TestInitialization.ps1' script. --- .../AzureDevOpsDsc.TestInitialization.ps1 | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 deleted file mode 100644 index 89c2c4f1d..000000000 --- a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.TestInitialization.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -Force -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') -Force - - -if (-not (Test-BuildCategory -Type 'Unit')) -{ - return -} - - -$script:dscModuleName = 'AzureDevOpsDsc' -Remove-Module -Name $script:dscModuleName -Force -ErrorAction 'SilentlyContinue' -$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 -Import-Module -Name $script:dscModuleName -Force -ErrorAction 'Stop' From ac69ab1d6e34605d2a6798eaacfb58d4ebd48930 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:30:00 +0000 Subject: [PATCH 525/611] Updated test initialization scripts to invoke 'Remove-Module' without module name (gives different results) and added 'Import-Module' to import the sub-module again. --- tests/Unit/Classes/Classes.TestInitialization.ps1 | 4 ++-- .../Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Classes/Classes.TestInitialization.ps1 b/tests/Unit/Classes/Classes.TestInitialization.ps1 index 63256f5fa..aeea1dc63 100644 --- a/tests/Unit/Classes/Classes.TestInitialization.ps1 +++ b/tests/Unit/Classes/Classes.TestInitialization.ps1 @@ -16,7 +16,7 @@ $script:subModuleName = 'AzureDevOpsDsc.Common' Import-Module -Name $script:dscModuleFile -Force Get-Module -Name $script:subModuleName -All | - Remove-Module $script:subModuleName -Force -ErrorAction SilentlyContinue + Remove-Module -Force -ErrorAction SilentlyContinue $script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' $script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" -#Import-Module -Name $script:subModuleFile -Force #-Verbose +Import-Module -Name $script:subModuleFile -Force #-Verbose diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 index 63256f5fa..aeea1dc63 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Tests.Initialization.ps1 @@ -16,7 +16,7 @@ $script:subModuleName = 'AzureDevOpsDsc.Common' Import-Module -Name $script:dscModuleFile -Force Get-Module -Name $script:subModuleName -All | - Remove-Module $script:subModuleName -Force -ErrorAction SilentlyContinue + Remove-Module -Force -ErrorAction SilentlyContinue $script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' $script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" -#Import-Module -Name $script:subModuleFile -Force #-Verbose +Import-Module -Name $script:subModuleFile -Force #-Verbose From 03dc7bc2f0cee1fdbb888fb97ab4d2037b7ab36c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:48:06 +0000 Subject: [PATCH 526/611] Updated 'DscResourceBase' class, GetDscResourceKey() method unit tests to increase code coverage and remove 'Import-Module'. --- .../GetDscResourceKey.Tests.ps1 | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index 017c59c91..f74f285d9 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -15,7 +15,6 @@ InModuleScope 'AzureDevOpsDsc' { $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" $script:tag = @($($script:commandName -replace '-')) - Import-Module $script:commandScriptPath -Force Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { @@ -25,6 +24,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { $dscResourceBase = [AzDevOpsApiDscResourceBase]::new() + {$dscResourceBase.GetDscResourceKey()} | Should -Throw } @@ -35,15 +35,15 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - class AzDevOpsProject2 : AzDevOpsProject + class AzDevOpsApiDscResourceBase2DscKeys : AzDevOpsApiDscResourceBase { [DscProperty(Key)] - [string]$ProjectName2 - } + [string]$DscKey1 - $dscResourceWith2Keys = [AzDevOpsProject2]@{ - ProjectName = 'SomeProjectName2' + [DscProperty(Key)] + [string]$DscKey2 } + $dscResourceWith2Keys = [AzDevOpsApiDscResourceBase2DscKeys]@{} {$dscResourceWith2Keys.GetDscResourceKey()} | Should -Throw } @@ -53,20 +53,25 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of class with a DSC key' { - $dscResourceWithKey = [AzDevOpsProject]@{ - ProjectName = 'SomeProjectName' + class AzDevOpsApiDscResourceBase1DscKey : AzDevOpsApiDscResourceBase + { + [DscProperty(Key)] + [string]$DscKey1 + } + + $dscResourceWith1Key = [AzDevOpsApiDscResourceBase1DscKey]@{ + DscKey1='DscKey1Value' } It 'Should not throw' { - {$dscResourceWithKey.GetDscResourceKey()} | Should -Not -Throw + {$dscResourceWith1Key.GetDscResourceKey()} | Should -Not -Throw } It 'Should return the value of the DSC Resource key' { - $dscResourceWithKey.GetDscResourceKey() | Should -Be 'SomeProjectName' + $dscResourceWith1Key.GetDscResourceKey() | Should -Be 'DscKey1Value' } } - } } From c731204659f759f3b29e27c20147f8c927942218 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:49:39 +0000 Subject: [PATCH 527/611] Updated 'DscResourceBase' class, GetDscResourceKeyPropertyName() method unit tests to increase code coverage and remove 'Import-Module'. --- .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index d651b4c29..ea684fe35 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -15,7 +15,6 @@ InModuleScope 'AzureDevOpsDsc' { $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" $script:tag = @($($script:commandName -replace '-')) - Import-Module $script:commandScriptPath -Force Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { @@ -31,6 +30,7 @@ InModuleScope 'AzureDevOpsDsc' { } + Context 'When called from instance of a class with multiple DSC Resource keys' { It 'Should throw' { @@ -67,6 +67,5 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithKey.GetDscResourceKeyPropertyName() | Should -Be 'ProjectName' } } - } } From 522fc3621f7ae3ab45f122b760847745dad7ad05 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:50:28 +0000 Subject: [PATCH 528/611] Updated 'DscResourceBase' class, GetDscResourcePropertyNames() method unit tests to increase code coverage and remove 'Import-Module'. --- .../DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 index 155ff6928..865fd9c93 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -15,7 +15,6 @@ InModuleScope 'AzureDevOpsDsc' { $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" $script:tag = @($($script:commandName -replace '-')) - Import-Module $script:commandScriptPath -Force Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { From 8906d73fd9f9659392c7d49bb069c1146a9b785b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 21:51:07 +0000 Subject: [PATCH 529/611] Updated 'DscResourceBase' class, GetDscResourcePropertyNamesWithNoSetSupport() method unit tests to increase code coverage and remove 'Import-Module'. --- .../GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 index ef6c233c1..ecc33aa95 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -15,7 +15,6 @@ InModuleScope 'AzureDevOpsDsc' { $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" $script:tag = @($($script:commandName -replace '-')) - Import-Module $script:commandScriptPath -Force Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { @@ -38,6 +37,7 @@ InModuleScope 'AzureDevOpsDsc' { } + Context 'When called from instance of a class with a DSC property with no "Set" support' { It 'Should not throw' { @@ -66,7 +66,6 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() | Should -Contain 'SourceControlType' } - } } } From 12d670d10778c58e681ca4e4022634da5510eca1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 22:58:18 +0000 Subject: [PATCH 530/611] Updated test initialization script --- ...ureDevOpsDsc.Common.TestInitialization.ps1 | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 index f0960d985..aeea1dc63 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.TestInitialization.ps1 @@ -1,22 +1,22 @@ <# .SYNOPSIS - Automated unit test for helper functions in module AzureDevOpsDsc.Common. + Automated unit test for classes in AzureDevOpsDsc. #> -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestHelper.psm1') -Force -Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '..\TestHelpers\CommonTestCases.psm1') -Force - -if (-not (Test-BuildCategory -Type 'Unit')) -{ - return -} +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestHelper.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestCases.psm1') $script:dscModuleName = 'AzureDevOpsDsc' $script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 $script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") +Get-Module -Name $script:dscModuleName -All | + Remove-Module $script:dscModuleName -Force -ErrorAction SilentlyContinue + $script:subModuleName = 'AzureDevOpsDsc.Common' -Import-Module -Name $script:dscModuleFile -Force -Verbose +Import-Module -Name $script:dscModuleFile -Force +Get-Module -Name $script:subModuleName -All | + Remove-Module -Force -ErrorAction SilentlyContinue $script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' $script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" -Import-Module -Name $script:subModuleFile -Force -Verbose +Import-Module -Name $script:subModuleFile -Force #-Verbose From f67200c3e134dc9b3cf6fdf05c6896c0a21e3bb5 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sat, 14 Nov 2020 23:03:29 +0000 Subject: [PATCH 531/611] Added 'using' of AzDevOpsApiDscResourceBase.psm1 in 'GetDscResourceKey.Tests.ps1' --- tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index f74f285d9..ac6906c6c 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -1,4 +1,5 @@ using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\source\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 # Initialize tests for module function From 2f5364f40e485c5866d8d49ac4977600b12250a6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 09:33:37 +0000 Subject: [PATCH 532/611] Updated 'GetDscResourceKeyPropertyName.Tests.ps1' file to use 'AzDevOpsApiDscResourceBase' class rather than 'AzDevOpsProject'. --- .../GetDscResourceKeyPropertyName.Tests.ps1 | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index ea684fe35..f6457e525 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,6 +1,3 @@ -using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 - # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -35,14 +32,18 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - class AzDevOpsProject2 : AzDevOpsProject + class AzDevOpsApiDscResourceBase2Keys : AzDevOpsApiDscResourceBase { [DscProperty(Key)] - [string]$ProjectName2 + [string]$DscKey1 + + [DscProperty(Key)] + [string]$DscKey2 } - $dscResourceWith2Keys = [AzDevOpsProject2]@{ - ProjectName = 'SomeProjectName2' + $dscResourceWith2Keys = [AzDevOpsApiDscResourceBase2Keys]@{ + DscKey1 = 'DscKey1Value' + DscKey2 = 'DscKey2Value' } $dscResourceWith2Keys.GetDscResourceKeyPropertyName() | Should -Be '' @@ -53,18 +54,25 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of class with a DSC key' { - $dscResourceWithKey = [AzDevOpsProject]@{ - ProjectName = 'SomeProjectName' + class AzDevOpsApiDscResourceBase1Key : AzDevOpsApiDscResourceBase + { + [DscProperty(Key)] + [string]$DscKey1 } + $dscResourceWith1Key = [AzDevOpsApiDscResourceBase1Key]@{ + DscKey1 = 'DscKey1Value' + } + + It 'Should not throw' { - {$dscResourceWithKey.GetDscResourceKeyPropertyName()} | Should -Not -Throw + {$dscResourceWith1Key.GetDscResourceKeyPropertyName()} | Should -Not -Throw } It 'Should return the value of the DSC Resource key' { - $dscResourceWithKey.GetDscResourceKeyPropertyName() | Should -Be 'ProjectName' + $dscResourceWith1Key.GetDscResourceKeyPropertyName() | Should -Be 'DscKey1' } } } From f08a3f3114b047d10333458e12cc1ab848f9bab8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 09:37:51 +0000 Subject: [PATCH 533/611] Added 'using' statement to 'GetDscResourceKeyPropertyName.Tests.ps1' to remove linting/parsing errors --- .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index f6457e525..5582714c2 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\source\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From f42438513616e28dc9c88ec423ab6aec02c2c009 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 09:40:29 +0000 Subject: [PATCH 534/611] Updated 'DscResourceBase' class, GetDscResourceKeyPropertyName() method, unit tests to use 'DscResourceBase' class --- .../GetDscResourceKeyPropertyName.Tests.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index 5582714c2..4b1291fee 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\source\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -22,7 +22,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - $dscResourceWithNoDscKey = [AzDevOpsApiDscResourceBase]::new() + $dscResourceWithNoDscKey = [DscResourceBase]::new() $dscResourceWithNoDscKey.GetDscResourceKeyPropertyName() | Should -Be '' } @@ -34,7 +34,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - class AzDevOpsApiDscResourceBase2Keys : AzDevOpsApiDscResourceBase + class DscResourceBase2Keys : DscResourceBase { [DscProperty(Key)] [string]$DscKey1 @@ -43,7 +43,7 @@ InModuleScope 'AzureDevOpsDsc' { [string]$DscKey2 } - $dscResourceWith2Keys = [AzDevOpsApiDscResourceBase2Keys]@{ + $dscResourceWith2Keys = [DscResourceBase2Keys]@{ DscKey1 = 'DscKey1Value' DscKey2 = 'DscKey2Value' } @@ -56,13 +56,13 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of class with a DSC key' { - class AzDevOpsApiDscResourceBase1Key : AzDevOpsApiDscResourceBase + class DscResourceBase1Key : DscResourceBase { [DscProperty(Key)] [string]$DscKey1 } - $dscResourceWith1Key = [AzDevOpsApiDscResourceBase1Key]@{ + $dscResourceWith1Key = [DscResourceBase1Key]@{ DscKey1 = 'DscKey1Value' } From d906a36b774fb25baac28f4ddb2ea268d100857a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:19:07 +0000 Subject: [PATCH 535/611] Updated 'DscResourceBase' class, function, unit tests to use 'DscResourceBase' class. --- .../GetDscResourceKey.Tests.ps1 | 14 ++--- .../GetDscResourceKeyPropertyName.Tests.ps1 | 7 +-- .../GetDscResourcePropertyNames.Tests.ps1 | 56 ++++++++----------- ...rcePropertyNamesWithNoSetSupport.Tests.ps1 | 35 ++++++------ 4 files changed, 47 insertions(+), 65 deletions(-) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index ac6906c6c..62e7cffc8 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -1,7 +1,3 @@ -using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\..\..\source\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 - # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -24,7 +20,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - $dscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $dscResourceBase = [DscResourceBase]::new() {$dscResourceBase.GetDscResourceKey()} | Should -Throw } @@ -36,7 +32,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - class AzDevOpsApiDscResourceBase2DscKeys : AzDevOpsApiDscResourceBase + class DscResourceBase2DscKeys : DscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { [DscProperty(Key)] [string]$DscKey1 @@ -44,7 +40,7 @@ InModuleScope 'AzureDevOpsDsc' { [DscProperty(Key)] [string]$DscKey2 } - $dscResourceWith2Keys = [AzDevOpsApiDscResourceBase2DscKeys]@{} + $dscResourceWith2Keys = [DscResourceBase2DscKeys]@{} {$dscResourceWith2Keys.GetDscResourceKey()} | Should -Throw } @@ -54,13 +50,13 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of class with a DSC key' { - class AzDevOpsApiDscResourceBase1DscKey : AzDevOpsApiDscResourceBase + class DscResourceBase1DscKey : DscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { [DscProperty(Key)] [string]$DscKey1 } - $dscResourceWith1Key = [AzDevOpsApiDscResourceBase1DscKey]@{ + $dscResourceWith1Key = [DscResourceBase1DscKey]@{ DscKey1='DscKey1Value' } diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index 4b1291fee..f09a995ab 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,5 +1,3 @@ -using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 - # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -26,7 +24,6 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithNoDscKey.GetDscResourceKeyPropertyName() | Should -Be '' } - } @@ -34,7 +31,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should throw' { - class DscResourceBase2Keys : DscResourceBase + class DscResourceBase2Keys : DscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { [DscProperty(Key)] [string]$DscKey1 @@ -50,7 +47,6 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWith2Keys.GetDscResourceKeyPropertyName() | Should -Be '' } - } @@ -66,7 +62,6 @@ InModuleScope 'AzureDevOpsDsc' { DscKey1 = 'DscKey1Value' } - It 'Should not throw' { {$dscResourceWith1Key.GetDscResourceKeyPropertyName()} | Should -Not -Throw diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 index 865fd9c93..2920b0760 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -1,6 +1,3 @@ -using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 - # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -23,60 +20,53 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should not throw' { - $dscResourceWithNoDscProperties = [AzDevOpsApiDscResourceBase]::new() + $dscResourceWithNoDscProperties = [DscResourceBase]::new() {$dscResourceWithNoDscProperties.GetDscResourcePropertyNames()} | Should -Not -Throw } It 'Should return empty array' { - $dscResourceWithNoDscProperties = [AzDevOpsApiDscResourceBase]::new() + $dscResourceWithNoDscProperties = [DscResourceBase]::new() $dscResourceWithNoDscProperties.GetDscResourcePropertyNames().Count | Should -Be 0 } - } - Context 'When called from instance of a class with multiple DSC Resource keys' { - - It 'Should not throw' { - class AzDevOpsApiDscResourceBase2 : AzDevOpsApiDscResourceBase - { - [DscProperty()] - [string]$ADscProperty + Context 'When called from instance of a class with multiple DSC properties' { - [DscProperty()] - [string]$AnotherDscProperty - } + class DscResourceBase2Properties : DscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty()] + [string]$ADscProperty - $dscResourceWith2DscProperties = [AzDevOpsApiDscResourceBase2]@{ - ADscProperty = 'ADscPropertyValue' - AnotherDscProperty = 'AnotherDscPropertyValue' - } + [DscProperty()] + [string]$AnotherDscProperty + } - { $dscResourceWith2DscProperties.GetDscResourcePropertyNames() } | Should -Not -Throw + $dscResourceWith2DscProperties = [DscResourceBase2Properties]@{ + ADscProperty = 'ADscPropertyValue' + AnotherDscProperty = 'AnotherDscPropertyValue' } It 'Should not throw' { - class AzDevOpsApiDscResourceBase2 : AzDevOpsApiDscResourceBase - { - [DscProperty()] - [string]$ADscProperty - - [DscProperty()] - [string]$AnotherDscProperty - } + { $dscResourceWith2DscProperties.GetDscResourcePropertyNames() } | Should -Not -Throw + } - $dscResourceWith2DscProperties = [AzDevOpsApiDscResourceBase2]@{ - ADscProperty = 'ADscPropertyValue' - AnotherDscProperty = 'AnotherDscPropertyValue' - } + It 'Should return 2 property names' { $dscResourceWith2DscProperties.GetDscResourcePropertyNames().Count | Should -Be 2 } + It 'Should return the correct property names' { + + $propertyNames = $dscResourceWith2DscProperties.GetDscResourcePropertyNames() + + $propertyNames | Should -Contain 'ADscProperty' + $propertyNames | Should -Contain 'AnotherDscProperty' + } } } } diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 index ecc33aa95..e39cc2c66 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -1,6 +1,3 @@ -using module ..\..\..\..\source\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\..\..\source\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1 - # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -23,48 +20,52 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should not throw' { - $dscResourceWithNoSetSupportProperties = [AzDevOpsApiDscResourceBase]::new() + $dscResourceWithNoSetSupportProperties = [DscResourceBase]::new() {$dscResourceWithNoSetSupportProperties.GetDscResourcePropertyNamesWithNoSetSupport()} | Should -Not -Throw } It 'Should return empty array' { - $dscResourceWithNoSetSupportProperties = [AzDevOpsApiDscResourceBase]::new() + $dscResourceWithNoSetSupportProperties = [DscResourceBase]::new() $dscResourceWithNoSetSupportProperties.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be 0 } - } Context 'When called from instance of a class with a DSC property with no "Set" support' { + class DscResourceBaseWithNoSet : DscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [System.String[]]GetDscResourcePropertyNamesWithNoSetSupport() + { + return @('NoSetPropertyName1', 'NoSetPropertyName2') + } + } + It 'Should not throw' { - $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ - ProjectName = 'SomeProjectName' - } + $dscResourceWithANoSetSupportProperty = [DscResourceBaseWithNoSet]@{} { $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() } | Should -Not -Throw } It 'Should return the correct number of DSC resource property names that do not support "SET"' { - $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ - ProjectName = 'SomeProjectName' - } + $dscResourceWithANoSetSupportProperty = [DscResourceBaseWithNoSet]@{} - $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be 1 + $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be 2 } It 'Should return the correct DSC resource property names that do not support "SET"' { - $dscResourceWithANoSetSupportProperty = [AzDevOpsProject]@{ - ProjectName = 'SomeProjectName' - } + $dscResourceWithANoSetSupportProperty = [DscResourceBaseWithNoSet]@{} + + $propertyNames = $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() - $dscResourceWithANoSetSupportProperty.GetDscResourcePropertyNamesWithNoSetSupport() | Should -Contain 'SourceControlType' + $propertyNames | Should -Contain 'NoSetPropertyName1' + $propertyNames | Should -Contain 'NoSetPropertyName2' } } } From 1281f07fe6bf0fa37bfcfbe967d8e222a1b298af Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:19:51 +0000 Subject: [PATCH 536/611] Added 'DscResourceBase', unit test initialization script --- .../Aaa.DscResourceBase.Initialize.Tests.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 new file mode 100644 index 000000000..9af18c6c9 --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 @@ -0,0 +1,10 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + # Note: That is + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + +} From 25ad562c10db0f774023a9e3121fb828dd3a712c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:33:35 +0000 Subject: [PATCH 537/611] Added 'DscResourceBase.Initialization.Tests.ps1' (to replace 'Aaa.DscResourceBase.Initialize.Tests.ps1'). --- .../Aaa.DscResourceBase.Initialize.Tests.ps1 | 10 ---------- .../DscResourceBase.Initialization.Tests.ps1 | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 create mode 100644 tests/Unit/Classes/DscResourceBase/DscResourceBase.Initialization.Tests.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 deleted file mode 100644 index 9af18c6c9..000000000 --- a/tests/Unit/Classes/DscResourceBase/Aaa.DscResourceBase.Initialize.Tests.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -# Initialize tests for module function -. $PSScriptRoot\..\Classes.TestInitialization.ps1 - -InModuleScope 'AzureDevOpsDsc' { - - # Note: That is - $script:dscModuleName = 'AzureDevOpsDsc' - $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version - -} diff --git a/tests/Unit/Classes/DscResourceBase/DscResourceBase.Initialization.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/DscResourceBase.Initialization.Tests.ps1 new file mode 100644 index 000000000..b9e289e79 --- /dev/null +++ b/tests/Unit/Classes/DscResourceBase/DscResourceBase.Initialization.Tests.ps1 @@ -0,0 +1,12 @@ +# Initialize tests for module function 'Classes' +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +# Note: Use of this functionality seems to pre-load the module and classes which subsquent tests can use +# which works around difficulty of referencing classes in 'source' directory when code coverage is +# using the dynamically/build-defined, 'output' directory. +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + +} From 871ce37b9248d829e05d81406758355accf31fa0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:36:03 +0000 Subject: [PATCH 538/611] Renamed 'AzDevOpsProject.Tests.ps1' and content in line with 'DSC_AzDevOpsProject' changing to 'AzDevOpsProject' --- ..._AzDevOpsProject.Tests.ps1 => AzDevOpsProject.Tests.ps1} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename tests/Unit/DSCClassResources/{DSC_AzDevOpsProject.Tests.ps1 => AzDevOpsProject.Tests.ps1} (97%) diff --git a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 similarity index 97% rename from tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 rename to tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 index e106e77c4..4245f2de4 100644 --- a/tests/Unit/DSCClassResources/DSC_AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 @@ -1,10 +1,10 @@ # <# # .SYNOPSIS -# Automated unit test for DSC_AzDevOpsProject DSC Resource. +# Automated unit test for AzDevOpsProject DSC Resource. # #> # $script:dscModuleName = 'AzureDevOpsDsc' -# $script:dscResourceName = 'DSC_AzDevOpsProject' +# $script:dscResourceName = 'AzDevOpsProject' # function Invoke-TestSetup # { @@ -65,7 +65,7 @@ # description = $getProjectDescription # } -# $AzDevOpsProjectResource = [DSC_AzDevOpsProject]@{ +# $AzDevOpsProjectResource = [AzDevOpsProject]@{ # ApiUri = $getApiUri # Pat = $getPat # ProjectId = $getProjectId From dd477915bc2dd2928394667a917d7859e5cd74c9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:38:14 +0000 Subject: [PATCH 539/611] Removed/Suppressed module/generic, 'DscClassResource' tests --- ...AzureDevOpsDsc.DscClassResources.Tests.ps1 | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 index 32363b526..3a298f6de 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc/AzureDevOpsDsc.DscClassResources.Tests.ps1 @@ -1,30 +1,30 @@ -# Initialize tests -. $PSScriptRoot\AzureDevOpsDsc.TestInitialization.ps1 +# # Initialize tests +# . $PSScriptRoot\AzureDevOpsDsc.TestInitialization.ps1 -InModuleScope 'AzureDevOpsDsc' { +# InModuleScope 'AzureDevOpsDsc' { - Describe 'DSCClassResources\AzDevOpsApiDscResourceBase' -Tag 'AzDevOpsApiDscResourceBase' { +# Describe 'DSCClassResources\AzDevOpsApiDscResourceBase' -Tag 'AzDevOpsApiDscResourceBase' { - $dscModuleName = 'AzureDevOpsDsc' - $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' - $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} +# $dscModuleName = 'AzureDevOpsDsc' +# $testCasesValidResourceNames = Get-TestCase -ScopeName 'ResourceName' -TestCaseName 'Valid' +# $testCasesValidResourceNamesForDscResources = $testCasesValidResourceNames | Where-Object { $_.ResourceName -notin @('Operation')} - Context "When evaluating '$dscModuleName' module" { - BeforeAll { - $dscModuleName = 'AzureDevOpsDsc' - $dscResourcePrefix = 'AzDevOps' - [string[]]$exportedDscResources = (Get-Module $dscModuleName).ExportedDscResources - } +# Context "When evaluating '$dscModuleName' module" { +# BeforeAll { +# $dscModuleName = 'AzureDevOpsDsc' +# $dscResourcePrefix = 'AzDevOps' +# [string[]]$exportedDscResources = (Get-Module $dscModuleName).ExportedDscResources +# } - It "Should contain an exported, DSCResource specific to the 'ResourceName' - ''" -TestCases $testCasesValidResourceNamesForDscResources { - param ([string]$ResourceName) +# It "Should contain an exported, DSCResource specific to the 'ResourceName' - ''" -TestCases $testCasesValidResourceNamesForDscResources { +# param ([string]$ResourceName) - "$dscResourcePrefix$ResourceName" | Should -BeIn $exportedDscResources - } +# "$dscResourcePrefix$ResourceName" | Should -BeIn $exportedDscResources +# } - } +# } - } -} +# } +# } From 0abb54ab7859eeb51304f8f525ccb88d52ec56e2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:54:05 +0000 Subject: [PATCH 540/611] Added 'AzDevOpsApiDscResourceBase' class, unit tests, initialization script --- ...DevOpsApiDscResourceBase.Initialization.Tests.ps1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.Initialization.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.Initialization.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.Initialization.Tests.ps1 new file mode 100644 index 000000000..b9e289e79 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.Initialization.Tests.ps1 @@ -0,0 +1,12 @@ +# Initialize tests for module function 'Classes' +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +# Note: Use of this functionality seems to pre-load the module and classes which subsquent tests can use +# which works around difficulty of referencing classes in 'source' directory when code coverage is +# using the dynamically/build-defined, 'output' directory. +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + +} From d4196a15c8f2d96af3b37bb17680d9753ae38d0f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 10:54:26 +0000 Subject: [PATCH 541/611] Added 'AzDevOpsApiDscResourceBase' class, GetResourceName() method, unit tests --- .../GetResourceName.Tests.ps1 | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 new file mode 100644 index 000000000..1094c06ec --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -0,0 +1,61 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + $DscResourcePrefix = 'AzDevOps' + + Context 'When called from instance of the class without the correct/expected, DSC Resource prefix' { + + class DscResourceWithWrongPrefix : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + } + $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]@{} + + It 'Should not throw' { + + $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]::new() + + {$dscResourceWithWrongPrefix.GetResourceName()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class' { + + $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]::new() + + $dscResourceWithWrongPrefix.GetResourceName() | Should -Be $dscResourceWithWrongPrefix.GetType().ToString() + } + } + + + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + + It 'Should not throw' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + {$azDevOpsApiDscResourceBase.GetResourceName()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class without the expected prefix' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + $azDevOpsApiDscResourceBase.GetResourceName() | Should -Be $azDevOpsApiDscResourceBase.GetType().ToString().Replace('AzDevOps','') + } + } + } +} From 4478bbd5bacc8da78a473b6a28579d25be703f98 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 11:05:01 +0000 Subject: [PATCH 542/611] Added unit tests for GetResourceId() and GetResourceIdPropertyName() methods in 'AzDevOpsApiDscResourceBase' class. --- .../GetResourceId.Tests.ps1 | 38 +++++++++++++++++++ .../GetResourceIdPropertyName.Tests.ps1 | 38 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 new file mode 100644 index 000000000..09e63721e --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 @@ -0,0 +1,38 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + + It 'Should not throw' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + + {$azDevOpsApiDscResourceBase.GetResourceId()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class without the expected prefix' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + + $azDevOpsApiDscResourceBase.GetResourceId() | Should -Be 'SomeIdValue' + } + } + } +} diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 new file mode 100644 index 000000000..06fb6debc --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 @@ -0,0 +1,38 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + + It 'Should not throw' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + + {$azDevOpsApiDscResourceBase.GetResourceIdPropertyName()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class without the expected prefix' { + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + + $azDevOpsApiDscResourceBase.GetResourceIdPropertyName() | Should -Be 'ApiDscResourceBaseId' + } + } + } +} From 40fbef57c382a502a541329984b57945de30c3af Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 11:13:00 +0000 Subject: [PATCH 543/611] Added unit tests for GetResourceKey() and GetResourceKeyPropertyName() for 'AzDevOpsApiDscResourceBase' class --- .../GetResourceKey.Tests.ps1 | 50 +++++++++++++++++++ .../GetResourceKeyPropertyName.Tests.ps1 | 50 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 new file mode 100644 index 000000000..beabb52f2 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 @@ -0,0 +1,50 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + + class AzDevOpsApiDscResourceBaseWithKey : AzDevOpsApiDscResourceBase + { + [System.String]$ApiDscResourceBaseId + + [DscProperty(Key)] + [System.String]$ApiDscResourceBaseKey + } + + It 'Should not throw' { + + $azDevOpsApiDscResourceBaseWithKey = [AzDevOpsApiDscResourceBaseWithKey]@{ + ApiDscResourceBaseId = 'ApiDscResourceBaseIdValue' + ApiDscResourceBaseKey = 'ApiDscResourceBaseKeyValue' + } + + {$azDevOpsApiDscResourceBaseWithKey.GetResourceKey()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class without the expected prefix' { + + $azDevOpsApiDscResourceBaseWithKey = [AzDevOpsApiDscResourceBaseWithKey]@{ + ApiDscResourceBaseId = 'ApiDscResourceBaseIdValue' + ApiDscResourceBaseKey = 'ApiDscResourceBaseKeyValue' + } + + $azDevOpsApiDscResourceBaseWithKey.GetResourceKey() | Should -Be 'ApiDscResourceBaseKeyValue' + } + } + } +} diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 new file mode 100644 index 000000000..1edbedb58 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 @@ -0,0 +1,50 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + + class AzDevOpsApiDscResourceBaseWithKey : AzDevOpsApiDscResourceBase + { + [System.String]$ApiDscResourceBaseId + + [DscProperty(Key)] + [System.String]$ApiDscResourceBaseKey + } + + It 'Should not throw' { + + $azDevOpsApiDscResourceBaseWithKey = [AzDevOpsApiDscResourceBaseWithKey]@{ + ApiDscResourceBaseId = 'ApiDscResourceBaseIdValue' + ApiDscResourceBaseKey = 'ApiDscResourceBaseKeyValue' + } + + {$azDevOpsApiDscResourceBaseWithKey.GetResourceKeyPropertyName()} | Should -Not -Throw + } + + It 'Should return the same name as the DSC Resource/class without the expected prefix' { + + $azDevOpsApiDscResourceBaseWithKey = [AzDevOpsApiDscResourceBaseWithKey]@{ + ApiDscResourceBaseId = 'ApiDscResourceBaseIdValue' + ApiDscResourceBaseKey = 'ApiDscResourceBaseKeyValue' + } + + $azDevOpsApiDscResourceBaseWithKey.GetResourceKeyPropertyName() | Should -Be 'ApiDscResourceBaseKey' + } + } + } +} From 7c4a388faa0f4897a9557e7e27b9b94a7a1be264 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 11:27:20 +0000 Subject: [PATCH 544/611] Added unit tests for 'AzDevOpsApiDscResourceBase' class, GetResourceFunctionName() method --- .../GetResourceFunctionName.Tests.ps1 | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 new file mode 100644 index 000000000..bdcd88761 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 @@ -0,0 +1,113 @@ +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + $testCasesValidRequiredActionWithFunctions = @( + @{ + RequiredAction = 'Get' + }, + @{ + RequiredAction = 'New' + }, + @{ + RequiredAction = 'Set' + }, + @{ + RequiredAction = 'Remove' + }, + @{ + RequiredAction = 'Test' + } + ) + + $testCasesValidRequiredActionWithoutFunctions = @( + @{ + RequiredAction = 'Error' + }, + @{ + RequiredAction = 'None' + } + ) + + $testCasesInvalidRequiredActions = @( + @{ + RequiredAction = 'SomethingInvalid' + }, + @{ + RequiredAction = $null + }, + @{ + RequiredAction = '' + } + ) + + + Context 'When called with valid "RequiredAction" values' { + + + Context 'When "RequiredAction" value should have a related function' { + + It 'Should not throw - ' -TestCases $testCasesValidRequiredActionWithFunctions { + param ([System.String]$RequiredAction) + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Not -Throw + } + + It 'Should return the correct, function name - ""' -TestCases $testCasesValidRequiredActionWithFunctions { + param ([System.String]$RequiredAction) + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -Be "$($RequiredAction)-AzDevOpsApiDscResourceBase" + } + } + + + Context 'When "RequiredAction" value should not have a related function' { + + It 'Should not throw - ' -TestCases $testCasesValidRequiredActionWithoutFunctions { + param ([System.String]$RequiredAction) + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Not -Throw + } + + It 'Should return the correct, function name - ""' -TestCases $testCasesValidRequiredActionWithoutFunctions { + param ([System.String]$RequiredAction) + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -BeNullOrEmpty + } + } + } + + + Context 'When called with invalid "RequiredAction" values' { + + It 'Should not throw - ' -TestCases $testCasesInvalidRequiredActions { + param ([System.String]$RequiredAction) + + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + + {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Throw + } + } + } +} From 5e0cbabcb4bf0ea1376ce0e2e77a217b6f27122e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 12:05:59 +0000 Subject: [PATCH 545/611] Removed 'AzureDevOpsDsc.Common' module import from 'AzDevOpsDscResourceBase.psm1' --- .../AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 36936e5c3..d1fdf2792 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -3,10 +3,6 @@ using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath - - # Re-defined here so it is recognised by 'Import-DscResource' (which won't post-parse the 'using' statements) enum Ensure { From 020250711545e05323d37c0fa97d2e40d80bb9b8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 12:13:42 +0000 Subject: [PATCH 546/611] Added import of 'AzureDevOpsDsc.Common', nested module back into 'AzDevOpsDscResourceBase' class module --- .../AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index d1fdf2792..54c197bff 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -3,7 +3,11 @@ using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -# Re-defined here so it is recognised by 'Import-DscResource' (which won't post-parse the 'using' statements) +# This import is needed to allow this class to use the action functions (e.g. Get/New/Set/Remove/Test) for the inheriting classes +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + +# This enum is re-defined here so it is recognised by 'Import-DscResource' (which won't pre/post-parse the 'using' statements) enum Ensure { Present From 2072007ce00e59242822bc40a4f7f33bcf9b570b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 13:43:51 +0000 Subject: [PATCH 547/611] Added initial, 'AzDevOpsProject', unit tests for Get() method. --- .../AzDevOpsProject.Tests.ps1 | 42 +++ .../AzDevOpsProject/Get.Tests.ps1 | 262 ++++++++++++++++++ .../DSCClassResources.TestInitialization.ps1 | 22 ++ 3 files changed, 326 insertions(+) rename tests/Unit/DSCClassResources/{ => AzDevOpsProject}/AzDevOpsProject.Tests.ps1 (85%) create mode 100644 tests/Unit/DSCClassResources/AzDevOpsProject/Get.Tests.ps1 create mode 100644 tests/Unit/DSCClassResources/DSCClassResources.TestInitialization.ps1 diff --git a/tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 similarity index 85% rename from tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 rename to tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 index 4245f2de4..391efd0c8 100644 --- a/tests/Unit/DSCClassResources/AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 @@ -1,3 +1,45 @@ +# Initialize tests for module function +. $PSScriptRoot\..\DSCClassResources.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + Context 'When creating a new instance of the class' { + + It 'Should not throw' { + + {[AzDevOpsProject]::new()} | Should -Not -Throw + } + } + + Context 'When creating a new instance of the class' { + + It 'Should not throw' { + + {[AzDevOpsProject]::new()} | Should -Not -Throw + } + } + } +} + + + + + + + + # <# # .SYNOPSIS # Automated unit test for AzDevOpsProject DSC Resource. diff --git a/tests/Unit/DSCClassResources/AzDevOpsProject/Get.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject/Get.Tests.ps1 new file mode 100644 index 000000000..4a96d9ab0 --- /dev/null +++ b/tests/Unit/DSCClassResources/AzDevOpsProject/Get.Tests.ps1 @@ -0,0 +1,262 @@ +# Initialize tests for module function +. $PSScriptRoot\..\DSCClassResources.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + Context 'When calling Get() method' { + + $azDevOpsProjectProperties = @{ + Ensure = 'Present' + ApiUri = 'https://some.api.uri/_apis/' + Pat = '1234567890123456789012345678901234567890123456789012' + ProjectId = 'efb9c508-115d-4380-a038-51f970d7f918' # Random GUID + ProjectName = 'SomeProjectName' + ProjectDescription = 'SomeProjectDescription' + SourceControlType = 'Git' + } + + $azDevOpsProjectApiResource = [PSObject]@{ + id = 'efb9c508-115d-4380-a038-51f970d7f918' # Random GUID + name = 'SomeProjectName' + description = 'SomeProjectDescription' + capabilities = @{ + versioncontrol = @{ + sourceControlType = 'Git' + } + } + } + + $azDevOpsProject = [AzDevOpsProject]$azDevOpsProjectProperties + + # Override/mock the GetDscCurrentStateProperties() method in this class + [ScriptBlock]$GetDscCurrentStateProperties = {return [PSObject]$azDevOpsProjectProperties} + $azDevOpsProject | Add-Member -MemberType ScriptMethod -Name 'GetDscCurrentStateProperties' -Value $GetDscCurrentStateProperties -Force + + It 'Should not throw' { + + {$azDevOpsProject.Get()} | Should -Not -Throw + } + } + } +} + + + + + + + + +# <# +# .SYNOPSIS +# Automated unit test for AzDevOpsProject DSC Resource. +# #> + +# $script:dscModuleName = 'AzureDevOpsDsc' +# $script:dscResourceName = 'AzDevOpsProject' + +# function Invoke-TestSetup +# { +# try +# { +# Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' +# } +# catch [System.IO.FileNotFoundException] +# { +# throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' +# } + +# $script:testEnvironment = Initialize-TestEnvironment ` +# -DSCModuleName $script:dscModuleName ` +# -DSCResourceName $script:dscResourceName ` +# -ResourceType 'Class' ` +# -TestType 'Unit' +# } + +# function Invoke-TestCleanup +# { +# Restore-TestEnvironment -TestEnvironment $script:testEnvironment +# } + +# # Begin Testing + +# Invoke-TestSetup + +# try +# { +# InModuleScope $script:dscResourceName { +# Set-StrictMode -Version 1.0 + +# Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { +# BeforeAll { +# #$mockInstanceName = 'DSCTEST' + +# #Mock -CommandName Import-SQLPSModule +# } +# } + +# Describe 'AzDevOpsProject\Get' -Tag 'Get' { + + + +# BeforeAll { + +# $getApiUri = "https://www.someUri.api/_apis/" +# $getPat = "1234567890123456789012345678901234567890123456789012" + +# $getProjectId = [GUID]::NewGuid().ToString() +# $getProjectName = "ProjectName_$projectId" +# $getProjectDescription = "ProjectDescription_$projectId" + +# $getAzDevOpsResource = @{ +# id = $getProjectId +# name = $getProjectName +# description = $getProjectDescription +# } + +# $AzDevOpsProjectResource = [AzDevOpsProject]@{ +# ApiUri = $getApiUri +# Pat = $getPat +# ProjectId = $getProjectId +# ProjectName = $getProjectName +# ProjectDescription = $getProjectDescription +# } +# } + + +# Context 'When Azure DevOps is not in the desired state' { +# Context 'When the Azure DevOps "Project" does not exist' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $null +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult | Should -Be $null +# $getResult.ApiUri | Should -Be $null +# $getResult.Pat | Should -Be $null +# $getResult.ProjectId | Should -Be $null +# $getResult.ProjectName | Should -Be $null +# $getResult.ProjectDescription | Should -Be $null +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { +# BeforeAll { +# $differentProjectId = [GUID]::NewGuid().ToString() +# $getAzDevOpsResource.ProjectId = $differentProjectId + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectId" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Not -Be $differentProjectId # Different +# $getResult.ProjectName | Should -Be $getProjectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { +# BeforeAll { +# $differentProjectName = "z" + $getAzDevOpsResource.ProjectName +# $getAzDevOpsResource.ProjectName = $differentProjectName + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectName" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Not -Be $differentProjectName # Different +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + +# Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { +# BeforeAll { +# $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription +# $getAzDevOpsResource.ProjectDescription = $differentProjectDescription + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectDescription" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different +# } +# } +# } + +# Context 'When Azure DevOps is in the desired state' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } + +# } +# } + +# } +# } +# finally +# { +# Invoke-TestCleanup +# } diff --git a/tests/Unit/DSCClassResources/DSCClassResources.TestInitialization.ps1 b/tests/Unit/DSCClassResources/DSCClassResources.TestInitialization.ps1 new file mode 100644 index 000000000..aeea1dc63 --- /dev/null +++ b/tests/Unit/DSCClassResources/DSCClassResources.TestInitialization.ps1 @@ -0,0 +1,22 @@ +<# + .SYNOPSIS + Automated unit test for classes in AzureDevOpsDsc. +#> + +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestHelper.psm1') +Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath '\..\Modules\TestHelpers\CommonTestCases.psm1') + +$script:dscModuleName = 'AzureDevOpsDsc' +$script:dscModule = Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1 +$script:dscModuleFile = $($script:dscModule.ModuleBase +'\'+ $script:dscModuleName + ".psd1") +Get-Module -Name $script:dscModuleName -All | + Remove-Module $script:dscModuleName -Force -ErrorAction SilentlyContinue + +$script:subModuleName = 'AzureDevOpsDsc.Common' +Import-Module -Name $script:dscModuleFile -Force + +Get-Module -Name $script:subModuleName -All | + Remove-Module -Force -ErrorAction SilentlyContinue +$script:subModulesFolder = Join-Path -Path $script:dscModule.ModuleBase -ChildPath 'Modules' +$script:subModuleFile = Join-Path $script:subModulesFolder "$($script:subModuleName)/$($script:subModuleName).psd1" +Import-Module -Name $script:subModuleFile -Force #-Verbose From 9fb42f3b5f88f1a10ac05fdc3256a85a38f581a7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 13:47:33 +0000 Subject: [PATCH 548/611] Moved module import in 'AzDevOpsDscResourceBase' class into 'using' statement. --- .../AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 54c197bff..96933f56f 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -2,10 +2,7 @@ using module ..\..\Enums\Ensure\Ensure.psm1 using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 - -# This import is needed to allow this class to use the action functions (e.g. Get/New/Set/Remove/Test) for the inheriting classes -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath +using module ..\..\Modules\AzureDevOpsDsc.Common\AzureDevOpsDsc.Common.psd1 # This enum is re-defined here so it is recognised by 'Import-DscResource' (which won't pre/post-parse the 'using' statements) enum Ensure From d9280e3facc8d3d2709cf807c1cc191ea1a7177c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 13:48:15 +0000 Subject: [PATCH 549/611] Added initial scripts for 'AzDevOpsDscResourceBase' class, unit tests. --- ...psDscResourceBase.Initialization.Tests.ps1 | 12 ++++++ .../GetDscCurrentStateObject.Tests.ps1 | 38 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 new file mode 100644 index 000000000..b9e289e79 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 @@ -0,0 +1,12 @@ +# Initialize tests for module function 'Classes' +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +# Note: Use of this functionality seems to pre-load the module and classes which subsquent tests can use +# which works around difficulty of referencing classes in 'source' directory when code coverage is +# using the dynamically/build-defined, 'output' directory. +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + +} diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 new file mode 100644 index 000000000..2ac19e922 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 @@ -0,0 +1,38 @@ +# # Initialize tests for module function +# . $PSScriptRoot\..\Classes.TestInitialization.ps1 + +# InModuleScope 'AzureDevOpsDsc' { + +# $script:dscModuleName = 'AzureDevOpsDsc' +# $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version +# $script:subModuleName = 'AzureDevOpsDsc.Common' +# $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase +# $script:dscResourceName = Split-Path $PSScriptRoot -Leaf +# $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') +# $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" +# $script:tag = @($($script:commandName -replace '-')) + + +# Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + +# #Import-Module $script:subModuleBase -Force +# #Import-Module $script:commandScriptPath -Force + +# Context 'When called from instance of the class' { + +# Mock Get-AzDevOpsDscProject {} + +# It 'Should not throw' { + +# $azDevOpsDscResourceBase = [AzDevOpsDscResourceBase]::new() +# #[ScriptBlock]$GetResourceFunctionName = {return '{New-Object -TypeName PSObject -Property @{Egg="Face"}}'} +# #[ScriptBlock]$GetResourceFunctionName = {return 'New-Object -TypeName PSObject -Property'} +# #[ScriptBlock]$GetResourceFunctionName = {return 'Get-Module'} +# [ScriptBlock]$GetResourceFunctionName = {return 'Get-AzDevOpsDscProject'} +# $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name "GetResourceFunctionName" -Value $GetResourceFunctionName -Force + +# $azDevOpsDscResourceBase.GetDscCurrentStateObject() | Should -Not -Throw +# } +# } +# } +# } From 89cbb7810b69704ea54f48ef2bddab36bd435950 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 15:03:13 +0000 Subject: [PATCH 550/611] Added unit tests for 'AzDevOpsProject', DSC Resource, GetDscResourcePropertyNamesWithNoSetSupport() --- ...rcePropertyNamesWithNoSetSupport.Tests.ps1 | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 tests/Unit/DSCClassResources/AzDevOpsProject/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 diff --git a/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 new file mode 100644 index 000000000..b33c98d45 --- /dev/null +++ b/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -0,0 +1,259 @@ +# Initialize tests for module function +. $PSScriptRoot\..\DSCClassResources.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + $testCasesPropertyNamesWithNoSetSupport = @( + @{ + PropertyName = 'SourceControlType' + } + ) + + + Context 'When calling GetDscResourcePropertyNamesWithNoSetSupport() method' { + + It 'Should not throw' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + {$azDevOpsProject.GetDscResourcePropertyNamesWithNoSetSupport()} | Should -Not -Throw + } + + It 'Should output expected number of property names' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscResourcePropertyNamesWithNoSetSupport().Count | Should -Be $testCasesPropertyNamesWithNoSetSupport.Count + } + + It 'Should output expected "PropertyName" - ""' -TestCases $testCasesPropertyNamesWithNoSetSupport { + param ([System.String]$PropertyName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscResourcePropertyNamesWithNoSetSupport() | Should -Contain $PropertyName + } + } + } +} + + + + + + + + +# <# +# .SYNOPSIS +# Automated unit test for AzDevOpsProject DSC Resource. +# #> + +# $script:dscModuleName = 'AzureDevOpsDsc' +# $script:dscResourceName = 'AzDevOpsProject' + +# function Invoke-TestSetup +# { +# try +# { +# Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' +# } +# catch [System.IO.FileNotFoundException] +# { +# throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' +# } + +# $script:testEnvironment = Initialize-TestEnvironment ` +# -DSCModuleName $script:dscModuleName ` +# -DSCResourceName $script:dscResourceName ` +# -ResourceType 'Class' ` +# -TestType 'Unit' +# } + +# function Invoke-TestCleanup +# { +# Restore-TestEnvironment -TestEnvironment $script:testEnvironment +# } + +# # Begin Testing + +# Invoke-TestSetup + +# try +# { +# InModuleScope $script:dscResourceName { +# Set-StrictMode -Version 1.0 + +# Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { +# BeforeAll { +# #$mockInstanceName = 'DSCTEST' + +# #Mock -CommandName Import-SQLPSModule +# } +# } + +# Describe 'AzDevOpsProject\Get' -Tag 'Get' { + + + +# BeforeAll { + +# $getApiUri = "https://www.someUri.api/_apis/" +# $getPat = "1234567890123456789012345678901234567890123456789012" + +# $getProjectId = [GUID]::NewGuid().ToString() +# $getProjectName = "ProjectName_$projectId" +# $getProjectDescription = "ProjectDescription_$projectId" + +# $getAzDevOpsResource = @{ +# id = $getProjectId +# name = $getProjectName +# description = $getProjectDescription +# } + +# $AzDevOpsProjectResource = [AzDevOpsProject]@{ +# ApiUri = $getApiUri +# Pat = $getPat +# ProjectId = $getProjectId +# ProjectName = $getProjectName +# ProjectDescription = $getProjectDescription +# } +# } + + +# Context 'When Azure DevOps is not in the desired state' { +# Context 'When the Azure DevOps "Project" does not exist' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $null +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult | Should -Be $null +# $getResult.ApiUri | Should -Be $null +# $getResult.Pat | Should -Be $null +# $getResult.ProjectId | Should -Be $null +# $getResult.ProjectName | Should -Be $null +# $getResult.ProjectDescription | Should -Be $null +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { +# BeforeAll { +# $differentProjectId = [GUID]::NewGuid().ToString() +# $getAzDevOpsResource.ProjectId = $differentProjectId + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectId" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Not -Be $differentProjectId # Different +# $getResult.ProjectName | Should -Be $getProjectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { +# BeforeAll { +# $differentProjectName = "z" + $getAzDevOpsResource.ProjectName +# $getAzDevOpsResource.ProjectName = $differentProjectName + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectName" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Not -Be $differentProjectName # Different +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + +# Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { +# BeforeAll { +# $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription +# $getAzDevOpsResource.ProjectDescription = $differentProjectDescription + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectDescription" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different +# } +# } +# } + +# Context 'When Azure DevOps is in the desired state' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } + +# } +# } + +# } +# } +# finally +# { +# Invoke-TestCleanup +# } From effcd178ebfc4d5729a612d62e8ccb8be10502a1 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 15:39:34 +0000 Subject: [PATCH 551/611] Added unit tests for 'AzDevOpsProject' class, GetDscCurrentStateProperties() function. --- .../GetDscCurrentStateProperties.Tests.ps1 | 366 ++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 tests/Unit/DSCClassResources/AzDevOpsProject/GetDscCurrentStateProperties.Tests.ps1 diff --git a/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscCurrentStateProperties.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscCurrentStateProperties.Tests.ps1 new file mode 100644 index 000000000..103642a10 --- /dev/null +++ b/tests/Unit/DSCClassResources/AzDevOpsProject/GetDscCurrentStateProperties.Tests.ps1 @@ -0,0 +1,366 @@ +# Initialize tests for module function +. $PSScriptRoot\..\DSCClassResources.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + + + $azDevOpsProjectProperties = @{ + Ensure = 'Present' + ApiUri = 'https://some.api.uri/_apis/' + Pat = '1234567890123456789012345678901234567890123456789012' + ProjectId = 'efb9c508-115d-4380-a038-51f970d7f918' # Random GUID + ProjectName = 'SomeProjectName' + ProjectDescription = 'SomeProjectDescription' + SourceControlType = 'Git' + } + + $azDevOpsProjectApiResource = [PSObject]@{ + id = 'efb9c508-115d-4380-a038-51f970d7f918' # Random GUID + name = 'SomeProjectName' + description = 'SomeProjectDescription' + capabilities = @{ + versioncontrol = @{ + sourceControlType = 'Git' + } + } + } + + $currentResourceObjectThatExists = [PSObject]$azDevOpsProjectApiResource + $currentResourceObjectThatDoesNotExist = [PSObject]@{} + + + $testCasesValidAzDevOpsProjectProperties = $azDevOpsProjectProperties.Keys | ForEach-Object { + @{ + PropertyName = $_ + } + } + $testCasesValidAzDevOpsProjectPropertiesWhenNotExists = $testCasesValidAzDevOpsProjectProperties | + Where-Object { $_.PropertyName -in @('Ensure', 'ApiUri', 'Pat') } + + + Context 'When current resource already exists' { + + It 'Should not throw' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + {$azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatExists)} | Should -Not -Throw + } + + It 'Should return a hashtable with expected key/property - ""' -TestCases $testCasesValidAzDevOpsProjectProperties { + param ([System.String]$PropertyName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatExists).ContainsKey($PropertyName) | Should -Be $true + } + + It 'Should return a hashtable with an "Ensure" key value of "Present"' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatExists).Ensure | Should -Be "Present" + } + + It 'Should return a hashtable with output values matching corresponding, API resource values' { + + $azDevOpsProject = [AzDevOpsProject]@{ + ProjectId = $azDevOpsProjectProperties.ProjectId + } + + $dscCurrentStateProperties = $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatExists) + + $dscCurrentStateProperties.ProjectId | Should -Be $azDevOpsProjectApiResource.id + $dscCurrentStateProperties.ProjectName | Should -Be $azDevOpsProjectApiResource.name + $dscCurrentStateProperties.ProjectDescription | Should -Be $azDevOpsProjectApiResource.description + $dscCurrentStateProperties.SourceControlType | Should -Be $azDevOpsProjectApiResource.capabilities.versioncontrol.sourceControlType + } + + It 'Should return a hashtable with output values matching corresponding, non-API resource values' { + + $azDevOpsProject = [AzDevOpsProject]@{ + ApiUri = $azDevOpsProjectProperties.ApiUri + Pat = $azDevOpsProjectProperties.Pat + } + + $dscCurrentStateProperties = $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatExists) + + $dscCurrentStateProperties.ApiUri | Should -Be $azDevOpsProjectProperties.ApiUri + $dscCurrentStateProperties.Pat | Should -Be $azDevOpsProjectProperties.Pat + } + } + + + Context 'When current resource does not exist (not $null but with no "id" property)' { + + It 'Should not throw' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + {$azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatDoesNotExist)} | Should -Not -Throw + } + + It 'Should return a hashtable with expected key/property - ""' -TestCases $testCasesValidAzDevOpsProjectPropertiesWhenNotExists { + param ([System.String]$PropertyName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatDoesNotExist).ContainsKey($PropertyName) | Should -Be $true + } + + It 'Should return a hashtable with an "Ensure" key value of "Absent"' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($currentResourceObjectThatDoesNotExist).Ensure | Should -Be "Absent" + } + } + + + Context 'When current resource is null' { + + It 'Should not throw' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + {$azDevOpsProject.GetDscCurrentStateProperties($null)} | Should -Not -Throw + } + + It 'Should return a hashtable with expected key/property - ""' -TestCases $testCasesValidAzDevOpsProjectPropertiesWhenNotExists { + param ([System.String]$PropertyName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($null).ContainsKey($PropertyName) | Should -Be $true + } + + It 'Should return a hashtable with an "Ensure" key value of "Absent"' { + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.GetDscCurrentStateProperties($null).Ensure | Should -Be "Absent" + } + } + } +} + + + + + + + + +# <# +# .SYNOPSIS +# Automated unit test for AzDevOpsProject DSC Resource. +# #> + +# $script:dscModuleName = 'AzureDevOpsDsc' +# $script:dscResourceName = 'AzDevOpsProject' + +# function Invoke-TestSetup +# { +# try +# { +# Import-Module -Name DscResource.Test -Force -ErrorAction 'Stop' +# } +# catch [System.IO.FileNotFoundException] +# { +# throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -Tasks build" first.' +# } + +# $script:testEnvironment = Initialize-TestEnvironment ` +# -DSCModuleName $script:dscModuleName ` +# -DSCResourceName $script:dscResourceName ` +# -ResourceType 'Class' ` +# -TestType 'Unit' +# } + +# function Invoke-TestCleanup +# { +# Restore-TestEnvironment -TestEnvironment $script:testEnvironment +# } + +# # Begin Testing + +# Invoke-TestSetup + +# try +# { +# InModuleScope $script:dscResourceName { +# Set-StrictMode -Version 1.0 + +# Describe 'AzDevOpsProject\Parameters' -Tag 'Parameter' { +# BeforeAll { +# #$mockInstanceName = 'DSCTEST' + +# #Mock -CommandName Import-SQLPSModule +# } +# } + +# Describe 'AzDevOpsProject\Get' -Tag 'Get' { + + + +# BeforeAll { + +# $getApiUri = "https://www.someUri.api/_apis/" +# $getPat = "1234567890123456789012345678901234567890123456789012" + +# $getProjectId = [GUID]::NewGuid().ToString() +# $getProjectName = "ProjectName_$projectId" +# $getProjectDescription = "ProjectDescription_$projectId" + +# $getAzDevOpsResource = @{ +# id = $getProjectId +# name = $getProjectName +# description = $getProjectDescription +# } + +# $AzDevOpsProjectResource = [AzDevOpsProject]@{ +# ApiUri = $getApiUri +# Pat = $getPat +# ProjectId = $getProjectId +# ProjectName = $getProjectName +# ProjectDescription = $getProjectDescription +# } +# } + + +# Context 'When Azure DevOps is not in the desired state' { +# Context 'When the Azure DevOps "Project" does not exist' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $null +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult | Should -Be $null +# $getResult.ApiUri | Should -Be $null +# $getResult.Pat | Should -Be $null +# $getResult.ProjectId | Should -Be $null +# $getResult.ProjectName | Should -Be $null +# $getResult.ProjectDescription | Should -Be $null +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectId" parameter is different' { +# BeforeAll { +# $differentProjectId = [GUID]::NewGuid().ToString() +# $getAzDevOpsResource.ProjectId = $differentProjectId + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectId" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Not -Be $differentProjectId # Different +# $getResult.ProjectName | Should -Be $getProjectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + + +# Context 'When the Azure DevOps "Project" exists but "ProjectName" parameter is different' { +# BeforeAll { +# $differentProjectName = "z" + $getAzDevOpsResource.ProjectName +# $getAzDevOpsResource.ProjectName = $differentProjectName + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectName" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Not -Be $differentProjectName # Different +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } +# } + +# Context 'When the Azure DevOps "Project" exists but "ProjectDescription" parameter is different' { +# BeforeAll { +# $differentProjectDescription = "z" + $getAzDevOpsResource.ProjectDescription +# $getAzDevOpsResource.ProjectDescription = $differentProjectDescription + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values, with "ProjectDescription" values different' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Not -Be $differentProjectDescription # Different +# } +# } +# } + +# Context 'When Azure DevOps is in the desired state' { +# BeforeAll { + +# $AzDevOpsProjectResource = $AzDevOpsProjectResource | +# Add-Member -MemberType 'ScriptMethod' -Name 'GetAzDevOpsResource' -Value { +# return $getAzDevOpsResource +# } -Force -PassThru + +# } + +# It 'Should return the correct values' { +# $getResult = $AzDevOpsProjectResource.Get() + +# $getResult.ApiUri | Should -Be $getApiUri +# $getResult.Pat | Should -Be $getPat +# $getResult.ProjectId | Should -Be $getProjectId +# $getResult.ProjectName | Should -Be $getprojectName +# $getResult.ProjectDescription | Should -Be $getProjectDescription +# } + +# } +# } + +# } +# } +# finally +# { +# Invoke-TestCleanup +# } From 9a322d137838f5bd4d26739f051b4d5906f9a4cf Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 16:08:54 +0000 Subject: [PATCH 552/611] Updated 'AzureDevOpsProject.Tests.ps1' to add additional unit tests against properties and DSC methods. --- .../AzDevOpsProject/AzDevOpsProject.Tests.ps1 | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 b/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 index 391efd0c8..a818a34f6 100644 --- a/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 +++ b/tests/Unit/DSCClassResources/AzDevOpsProject/AzDevOpsProject.Tests.ps1 @@ -15,6 +15,32 @@ InModuleScope 'AzureDevOpsDsc' { Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + $validDscMethodNames = @( + 'Get', + 'Set', + 'Test' + ) + $testCasesValidDscMethodNames = $validDscMethodNames | ForEach-Object { + @{ + MethodName = $_ + } + } + + $validPropertyNames = @( + 'ApiUri', + 'Pat', + 'ProjectId', + 'ProjectName', + 'ProjectDescription', + 'SourceControlType' + ) + $testCasesValidPropertyNames = $validPropertyNames | ForEach-Object { + @{ + PropertyName = $_ + PropertyValue = $_ + "Value" + } + } + Context 'When creating a new instance of the class' { It 'Should not throw' { @@ -23,12 +49,40 @@ InModuleScope 'AzureDevOpsDsc' { } } - Context 'When creating a new instance of the class' { - It 'Should not throw' { + Context 'When evaluating properties of the class' { - {[AzDevOpsProject]::new()} | Should -Not -Throw + It 'Should contain expected property - ""' -TestCases $testCasesValidPropertyNames { + param ([System.String]$PropertyName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.PSobject.Properties.Name | Should -Contain $PropertyName + } + + It 'Should contain expected property value - ""' -TestCases $testCasesValidPropertyNames { + param ([System.String]$PropertyName, [System.String]$PropertyValue) + + $azDevOpsProject = [AzDevOpsProject]@{ + "$PropertyName" = $PropertyValue + } + + $azDevOpsProject."$PropertyName" | Should -Be $PropertyValue + } + } + + + Context 'When evaluating DSC methods of the class' { + + It 'Should contain expected method - ""' -TestCases $testCasesValidDscMethodNames { + param ([System.String]$MethodName) + + $azDevOpsProject = [AzDevOpsProject]::new() + + $azDevOpsProject.PSobject.Methods.Name | Should -Contain $MethodName } + + } } } From 297ba7cdab2f52764aedd865bc10a8a70d339c81 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 18:32:04 +0000 Subject: [PATCH 553/611] Added 'using' statements into a number of test scripts to import classes that are inherited from by test assertions. --- .../Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 | 2 ++ .../GetResourceKeyPropertyName.Tests.ps1 | 2 ++ .../AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 | 2 ++ tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 | 2 ++ 4 files changed, 8 insertions(+) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 index beabb52f2..af525cf0e 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 index 1edbedb58..a14b623e8 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index 1094c06ec..af21d7daf 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index 62e7cffc8..4a9189bf0 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From 01428ad844ca1e3610f5e0bf659698ff087bcd71 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 18:43:45 +0000 Subject: [PATCH 554/611] Renamed 'CodeCoverageOutputFile' configuration value to remove subdirectory paths. --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 520b41f37..48eaf0bab 100644 --- a/build.yaml +++ b/build.yaml @@ -70,7 +70,7 @@ Pester: ExcludeTag: Tag: CodeCoverageThreshold: 85 - CodeCoverageOutputFile: output/testResults/CodeCoverage.JaCoCo.xml + CodeCoverageOutputFile: CodeCoverage.JaCoCo.xml CodeCoverageOutputFileEncoding: ascii DscTest: From 6c28feff912c8bfadba76b26c54653611715ab7f Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 19:19:38 +0000 Subject: [PATCH 555/611] Updated 'GetResourceFunctionName.Tests.ps1' to add 'AzDevOpsApiDscResourceBaseExample' class to test against. --- .../GetResourceFunctionName.Tests.ps1 | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 index bdcd88761..96b1fd9d3 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -55,15 +57,21 @@ InModuleScope 'AzureDevOpsDsc' { ) - Context 'When called with valid "RequiredAction" values' { + class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty(Key)] + [string]$DscKey + } + Context 'When called with valid "RequiredAction" values' { + Context 'When "RequiredAction" value should have a related function' { It 'Should not throw - ' -TestCases $testCasesValidRequiredActionWithFunctions { param ([System.String]$RequiredAction) - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Not -Throw } @@ -71,7 +79,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should return the correct, function name - ""' -TestCases $testCasesValidRequiredActionWithFunctions { param ([System.String]$RequiredAction) - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -Be "$($RequiredAction)-AzDevOpsApiDscResourceBase" } @@ -83,7 +91,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should not throw - ' -TestCases $testCasesValidRequiredActionWithoutFunctions { param ([System.String]$RequiredAction) - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Not -Throw } @@ -91,7 +99,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should return the correct, function name - ""' -TestCases $testCasesValidRequiredActionWithoutFunctions { param ([System.String]$RequiredAction) - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -BeNullOrEmpty } @@ -104,7 +112,7 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should not throw - ' -TestCases $testCasesInvalidRequiredActions { param ([System.String]$RequiredAction) - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() {$azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction)} | Should -Throw } From ab6e56034466cfe0665f4b355f810ae1df2f6cff Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:00:32 +0000 Subject: [PATCH 556/611] Updated .gitignore to exclude 'CodeCoverage.JaCoCo.xml' --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 399209b3a..3239758a6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ markdownissues.txt node_modules package-lock.json -JaCoCo_coverage.xml +CodeCoverage.JaCoCo.xml From 03071f9702b944d93e65ff8b1ea1dee06c3bf00e Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:01:11 +0000 Subject: [PATCH 557/611] Added GetResourceName() function onto 'AzDevOpsApiDscResourceBaseExample' class defined in 'GetResourceFunctionName.Tests.ps1' --- .../GetResourceFunctionName.Tests.ps1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 index 96b1fd9d3..b4b30c5cb 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 @@ -61,6 +61,11 @@ InModuleScope 'AzureDevOpsDsc' { { [DscProperty(Key)] [string]$DscKey + + [string]GetResourceName() + { + return 'ApiDscResourceBaseExample' + } } @@ -81,7 +86,7 @@ InModuleScope 'AzureDevOpsDsc' { $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() - $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -Be "$($RequiredAction)-AzDevOpsApiDscResourceBase" + $azDevOpsApiDscResourceBase.GetResourceFunctionName($RequiredAction) | Should -Be "$($RequiredAction)-AzDevOpsApiDscResourceBaseExample" } } From 8727fea3727334c475c3c13cc6318a1bef6ae662 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:25:29 +0000 Subject: [PATCH 558/611] Added 'AzDevOpsApiDscResourceBaseExample' class to 'GetResourceId.Tests.ps1' --- .../GetResourceId.Tests.ps1 | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 index 09e63721e..5e0a45310 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 @@ -16,20 +18,31 @@ InModuleScope 'AzureDevOpsDsc' { Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty(Key)] + [string]$DscKey + + [string]GetResourceName() + { + return 'ApiDscResourceBaseExample' + } + } + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { It 'Should not throw' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() - $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseExampleId' -Value 'SomeIdValue' -MemberType NoteProperty {$azDevOpsApiDscResourceBase.GetResourceId()} | Should -Not -Throw } It 'Should return the same name as the DSC Resource/class without the expected prefix' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() - $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseExampleId' -Value 'SomeIdValue' -MemberType NoteProperty $azDevOpsApiDscResourceBase.GetResourceId() | Should -Be 'SomeIdValue' } From 300812b7d785f2ec1af86de36dd4e39f4b05bd21 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:41:10 +0000 Subject: [PATCH 559/611] Added 'DscKey' property into 'DscResourceWithWrongPrefix' class in 'GetResourceName.Tests.ps1' --- .../AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index af21d7daf..1462a02a7 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -22,8 +22,11 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of the class without the correct/expected, DSC Resource prefix' { + class DscResourceWithWrongPrefix : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { + [DscProperty(Key)] + [string]$DscKey } $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]@{} From 3fd75bd8658fa02a904d896a42f972d5ed0638a3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:41:49 +0000 Subject: [PATCH 560/611] Added 'AzDevOpsApiDscResourceBaseExample' class into 'GetResourceIdPropertyName.Tests.ps1' script --- .../GetResourceIdPropertyName.Tests.ps1 | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 index 06fb6debc..55af92734 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 @@ -15,23 +15,34 @@ InModuleScope 'AzureDevOpsDsc' { Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty(Key)] + [string]$DscKey + + [string]GetResourceName() + { + return 'ApiDscResourceBaseExample' + } + } + Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { It 'Should not throw' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() - $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseExampleId' -Value 'SomeIdValue' -MemberType NoteProperty {$azDevOpsApiDscResourceBase.GetResourceIdPropertyName()} | Should -Not -Throw } It 'Should return the same name as the DSC Resource/class without the expected prefix' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() - $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseId' -Value 'SomeIdValue' -MemberType NoteProperty + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() + $azDevOpsApiDscResourceBase | Add-Member -Name 'ApiDscResourceBaseExampleId' -Value 'SomeIdValue' -MemberType NoteProperty - $azDevOpsApiDscResourceBase.GetResourceIdPropertyName() | Should -Be 'ApiDscResourceBaseId' + $azDevOpsApiDscResourceBase.GetResourceIdPropertyName() | Should -Be 'ApiDscResourceBaseExampleId' } } } From 10b8d6463718387728eb0fa3d3403a69135a504c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 20:45:07 +0000 Subject: [PATCH 561/611] Added 'DscResourceBase.psm1', 'using' reference in 'GetDscResourceKeyPropertyName.Tests.ps1','GetDscResourcePropertyNames.Tests.ps1' and 'GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1'. --- .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 2 ++ .../DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 | 2 ++ .../GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 | 2 ++ 3 files changed, 6 insertions(+) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index f09a995ab..213ba329e 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 index 2920b0760..6bcf9d68f 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 index e39cc2c66..d1e4c2ed8 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From 3548626df95fc93270a8a3b4c0938fac07cec7ae Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 21:13:37 +0000 Subject: [PATCH 562/611] Updated 'Describe' block name in an number of 'AzDevOpsApiDscResourceBase' test scripts --- .../GetResourceFunctionName.Tests.ps1 | 2 +- .../Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 | 2 +- .../GetResourceIdPropertyName.Tests.ps1 | 2 +- .../Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 | 2 +- .../GetResourceKeyPropertyName.Tests.ps1 | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 index b4b30c5cb..c17bb8348 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 @@ -15,7 +15,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { $testCasesValidRequiredActionWithFunctions = @( @{ diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 index 5e0a45310..b55dbe082 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 @@ -15,7 +15,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 index 55af92734..7b49ccba4 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 @@ -13,7 +13,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 index af525cf0e..4262d09c9 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 @@ -15,7 +15,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 index a14b623e8..82f9014b4 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 @@ -15,7 +15,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { From cb29c556461d59f001a9bf1106b31346e56ab5eb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 21:14:09 +0000 Subject: [PATCH 563/611] Added 'AzDevOpsApiDscResourceBaseExample' class into 'GetResourceName.Tests.ps1' --- .../GetResourceName.Tests.ps1 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index 1462a02a7..cb0b37fec 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -15,7 +15,7 @@ InModuleScope 'AzureDevOpsDsc' { $script:tag = @($($script:commandName -replace '-')) - Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { + Describe "$script:subModuleName\Classes\AzDevOpsApiDscResourceBase\$script:commandName" -Tag $script:tag { $DscResourcePrefix = 'AzDevOps' @@ -23,6 +23,17 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of the class without the correct/expected, DSC Resource prefix' { + class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty(Key)] + [string]$DscKey + + [string]GetResourceName() + { + return 'ApiDscResourceBaseExample' + } + } + class DscResourceWithWrongPrefix : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { [DscProperty(Key)] @@ -50,14 +61,14 @@ InModuleScope 'AzureDevOpsDsc' { It 'Should not throw' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() {$azDevOpsApiDscResourceBase.GetResourceName()} | Should -Not -Throw } It 'Should return the same name as the DSC Resource/class without the expected prefix' { - $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBase]::new() + $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() $azDevOpsApiDscResourceBase.GetResourceName() | Should -Be $azDevOpsApiDscResourceBase.GetType().ToString().Replace('AzDevOps','') } From 2508434c88f8eebf059ba35a2e5abb49bb864ed2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 21:45:50 +0000 Subject: [PATCH 564/611] Moved 'AzDevOpsApiDscResourceBaseExample' class declaration in 'GetResourceName.Tests.ps1' --- .../GetResourceName.Tests.ps1 | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index cb0b37fec..e20093104 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -22,18 +22,6 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of the class without the correct/expected, DSC Resource prefix' { - - class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) - { - [DscProperty(Key)] - [string]$DscKey - - [string]GetResourceName() - { - return 'ApiDscResourceBaseExample' - } - } - class DscResourceWithWrongPrefix : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) { [DscProperty(Key)] @@ -59,6 +47,17 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When called from instance of the class with the correct/expected, DSC Resource prefix' { + class AzDevOpsApiDscResourceBaseExample : AzDevOpsApiDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [DscProperty(Key)] + [string]$DscKey + + [string]GetResourceName() + { + return 'ApiDscResourceBaseExample' + } + } + It 'Should not throw' { $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() From 7a3c11f6a1fa82efb3c4e6bc916755ff7501ebeb Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 21:46:25 +0000 Subject: [PATCH 565/611] Added 'using' reference to 'AzDevOpsApiDscResourceBase.psm1' in 'GetResourceIdPropertyName.Tests.ps1' --- .../GetResourceIdPropertyName.Tests.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 index 7b49ccba4..9bf4393db 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 + # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From 48c3637ce14ea9bf6d401826adb571eb9f6ad1c7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 21:49:36 +0000 Subject: [PATCH 566/611] Updated 'DscResourceBase' to throw exceptions within GetDscResourceKeyPropertyName() method (and updated tests to match). --- source/Classes/DscResourceBase/DscResourceBase.psm1 | 6 ++---- .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/DscResourceBase/DscResourceBase.psm1 index 331b56ca2..2a656c60f 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/DscResourceBase/DscResourceBase.psm1 @@ -38,14 +38,12 @@ class DscResourceBase if ($null -eq $dscResourceKeyPropertyNames -or $dscResourceKeyPropertyNames.Count -eq 0) { - Write-Error "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." - return [string]::Empty + throw "Could not obtain a 'DscResourceDscKey' property for type '$($this.GetType().Name)'." } elseif ($dscResourceKeyPropertyNames.Count -gt 1) { - Write-Error "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." - return [string]::Empty + throw "Obtained more than 1 property for type '$($this.GetType().Name)' that was marked as a 'Key'. There must only be 1 property on the class set as the 'Key' for DSC." } return $dscResourceKeyPropertyNames[0] diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index 213ba329e..aacb45679 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -24,7 +24,7 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithNoDscKey = [DscResourceBase]::new() - $dscResourceWithNoDscKey.GetDscResourceKeyPropertyName() | Should -Be '' + {$dscResourceWithNoDscKey.GetDscResourceKeyPropertyName()} | Should -Throw } } @@ -47,7 +47,7 @@ InModuleScope 'AzureDevOpsDsc' { DscKey2 = 'DscKey2Value' } - $dscResourceWith2Keys.GetDscResourceKeyPropertyName() | Should -Be '' + {$dscResourceWith2Keys.GetDscResourceKeyPropertyName()} | Should -Throw } } From 3f8b7448faad3f9aa3df77f386ee5a1e0aadbb15 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 22:19:55 +0000 Subject: [PATCH 567/611] Updated 'GetResourceName.Tests.ps1' to update/correct test assertions. --- .../AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index e20093104..ca7c13b6f 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -26,6 +26,11 @@ InModuleScope 'AzureDevOpsDsc' { { [DscProperty(Key)] [string]$DscKey + + [string]GetResourceName() + { + return 'DscResourceWithWrongPrefix' + } } $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]@{} @@ -40,7 +45,7 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]::new() - $dscResourceWithWrongPrefix.GetResourceName() | Should -Be $dscResourceWithWrongPrefix.GetType().ToString() + $dscResourceWithWrongPrefix.GetResourceName() | Should -Be 'DscResourceWithWrongPrefix'.GetType().ToString() } } @@ -69,7 +74,7 @@ InModuleScope 'AzureDevOpsDsc' { $azDevOpsApiDscResourceBase = [AzDevOpsApiDscResourceBaseExample]::new() - $azDevOpsApiDscResourceBase.GetResourceName() | Should -Be $azDevOpsApiDscResourceBase.GetType().ToString().Replace('AzDevOps','') + $azDevOpsApiDscResourceBase.GetResourceName() | Should -Be 'AzDevOpsApiDscResourceBaseExample'.Replace('AzDevOps','') } } } From f9bd296d61d7c9a1a98330daf127542d7959c23a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 22:28:20 +0000 Subject: [PATCH 568/611] Corrected GetResourceName() method assertion in 'GetResourceName.Tests.ps1' --- .../AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index ca7c13b6f..02e207067 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -45,7 +45,7 @@ InModuleScope 'AzureDevOpsDsc' { $dscResourceWithWrongPrefix = [DscResourceWithWrongPrefix]::new() - $dscResourceWithWrongPrefix.GetResourceName() | Should -Be 'DscResourceWithWrongPrefix'.GetType().ToString() + $dscResourceWithWrongPrefix.GetResourceName() | Should -Be 'DscResourceWithWrongPrefix' } } From e4c04baaeba65a875901e61ba7f08e95d4c34318 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 22:30:27 +0000 Subject: [PATCH 569/611] Added additional tests in 'GetDscResourceKey.Test.ps1' to cover additional code paths. --- .../GetDscResourceKey.Tests.ps1 | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index 4a9189bf0..98364edab 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -27,6 +27,32 @@ InModuleScope 'AzureDevOpsDsc' { {$dscResourceBase.GetDscResourceKey()} | Should -Throw } + + Context 'When "GetDscResourceKeyPropertyName" returns a $null value' { + + It 'Should throw' { + + $dscResourceBase = [DscResourceBase]::new() + $dscResourceBase | Add-Member -MemberType ScriptMethod 'GetDscResourceKeyPropertyName' -Value { return $null } -Force + + {$dscResourceBase.GetDscResourceKey()} | Should -Throw + } + } + + + Context 'When "GetDscResourceKeyPropertyName" returns a "" (empty string) value' { + + It 'Should throw' { + + $dscResourceBase = [DscResourceBase]::new() + $dscResourceBase | Add-Member -MemberType ScriptMethod 'GetDscResourceKeyPropertyName' -Value { return '' } -Force + + {$dscResourceBase.GetDscResourceKey()} | Should -Throw + } + } + + + } From bcd6568d80eb610f32e81c2050c9e4261577f238 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 15 Nov 2020 22:32:37 +0000 Subject: [PATCH 570/611] Removed content from 'GetDscCurrentSateObject.Tests.ps1' --- .../GetDscCurrentStateObject.Tests.ps1 | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 index 2ac19e922..e69de29bb 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 @@ -1,38 +0,0 @@ -# # Initialize tests for module function -# . $PSScriptRoot\..\Classes.TestInitialization.ps1 - -# InModuleScope 'AzureDevOpsDsc' { - -# $script:dscModuleName = 'AzureDevOpsDsc' -# $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version -# $script:subModuleName = 'AzureDevOpsDsc.Common' -# $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase -# $script:dscResourceName = Split-Path $PSScriptRoot -Leaf -# $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') -# $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" -# $script:tag = @($($script:commandName -replace '-')) - - -# Describe "$script:subModuleName\Classes\DscResourceBase\Method\$script:commandName" -Tag $script:tag { - -# #Import-Module $script:subModuleBase -Force -# #Import-Module $script:commandScriptPath -Force - -# Context 'When called from instance of the class' { - -# Mock Get-AzDevOpsDscProject {} - -# It 'Should not throw' { - -# $azDevOpsDscResourceBase = [AzDevOpsDscResourceBase]::new() -# #[ScriptBlock]$GetResourceFunctionName = {return '{New-Object -TypeName PSObject -Property @{Egg="Face"}}'} -# #[ScriptBlock]$GetResourceFunctionName = {return 'New-Object -TypeName PSObject -Property'} -# #[ScriptBlock]$GetResourceFunctionName = {return 'Get-Module'} -# [ScriptBlock]$GetResourceFunctionName = {return 'Get-AzDevOpsDscProject'} -# $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name "GetResourceFunctionName" -Value $GetResourceFunctionName -Force - -# $azDevOpsDscResourceBase.GetDscCurrentStateObject() | Should -Not -Throw -# } -# } -# } -# } From f6ff2978ea5424c5ad8f5451d656f2db490cc42c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 16 Nov 2020 19:59:21 +0000 Subject: [PATCH 571/611] Replaced use of 'Invoke-RestMethod' with 'Invoke-AzDevOpsApiRestMethod', wrapper method --- .../Api/Functions/Private/Get-AzDevOpsApiResource.ps1 | 4 ++-- .../Api/Functions/Private/New-AzDevOpsApiResource.ps1 | 2 +- .../Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 | 2 +- .../Api/Functions/Private/Set-AzDevOpsApiResource.ps1 | 2 +- .../Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 | 2 +- .../Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 index 3e4f09bb2..95f93cde1 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.ps1 @@ -85,7 +85,7 @@ function Get-AzDevOpsApiResource } - # Prepare 'Invoke-RestMethod' method parameters + # Prepare 'Invoke-AzDevOpsApiRestMethod' method parameters $invokeRestMethodParameters = @{ Uri = $(Get-AzDevOpsApiResourceUri @apiResourceUriParameters) Method = 'Get' @@ -93,7 +93,7 @@ function Get-AzDevOpsApiResource } - [System.Management.Automation.PSObject]$apiResources = Invoke-RestMethod @invokeRestMethodParameters + [System.Management.Automation.PSObject]$apiResources = Invoke-AzDevOpsApiRestMethod @invokeRestMethodParameters # If not a single, resource request, set from the resource(s) in the 'value' property within the response diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 index 20f821a8b..6a1a36308 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/New-AzDevOpsApiResource.ps1 @@ -97,7 +97,7 @@ function New-AzDevOpsApiResource [string]$apiHttpRequestBody = $Resource | ConvertTo-Json -Depth 10 -Compress [System.Object]$apiOperation = $null - [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Post' ` + [System.Object]$apiOperation = Invoke-AzDevOpsApiRestMethod -Uri $apiResourceUri -Method 'Post' ` -Headers $apiHttpRequestHeader -Body $apiHttpRequestBody ` -ContentType 'application/json' diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 index 9658016d3..b503e19ca 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Remove-AzDevOpsApiResource.ps1 @@ -105,7 +105,7 @@ function Remove-AzDevOpsApiResource [Hashtable]$apiHttpRequestHeader = Get-AzDevOpsApiHttpRequestHeader -Pat $Pat [System.Object]$apiOperation = $null - [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Delete' ` + [System.Object]$apiOperation = Invoke-AzDevOpsApiRestMethod -Uri $apiResourceUri -Method 'Delete' ` -Headers $apiHttpRequestHeader if ($Wait) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 index e53ff5ad8..0f748c403 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Set-AzDevOpsApiResource.ps1 @@ -103,7 +103,7 @@ function Set-AzDevOpsApiResource [string]$apiHttpRequestBody = $Resource | ConvertTo-Json -Depth 10 -Compress [System.Object]$apiOperation = $null - [System.Object]$apiOperation = Invoke-RestMethod -Uri $apiResourceUri -Method 'Patch' ` + [System.Object]$apiOperation = Invoke-AzDevOpsApiRestMethod -Uri $apiResourceUri -Method 'Patch' ` -Headers $apiHttpRequestHeader -Body $apiHttpRequestBody ` -ContentType 'application/json' diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 index bbb279170..51cae7660 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common.Functions.Tests.ps1 @@ -135,7 +135,7 @@ InModuleScope $script:subModuleName { BeforeEach { - Mock Invoke-RestMethod { + Mock Invoke-AzDevOpsApiRestMethod { return @{ id = '14c15b78-b85d-401f-8095-504c57bbd79e' } diff --git a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 index 92267ee27..922fb886c 100644 --- a/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 +++ b/tests/Unit/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Get-AzDevOpsApiResource.Tests.ps1 @@ -57,7 +57,7 @@ InModuleScope 'AzureDevOpsDsc.Common' { $resourceIdThatIsInvalid = Get-TestCaseValue -ScopeName 'ResourceId' -TestCaseName 'Invalid' # Mock functions called in function - Mock Invoke-RestMethod { + Mock Invoke-AzDevOpsApiRestMethod { #$resourceIdThatExists = '8d4bff8d-6169-45cf-b085-fe12ad67e76b' [PSObject]$resources = Get-MockResourceJson | ConvertFrom-Json @@ -149,14 +149,14 @@ InModuleScope 'AzureDevOpsDsc.Common' { Assert-MockCalled 'Get-AzDevOpsApiHttpRequestHeader' -Times 1 -Exactly -Scope 'It' } - It 'Should invoke "Invoke-RestMethod" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { + It 'Should invoke "Invoke-AzDevOpsApiRestMethod" only once - "", "", ""' -TestCases $testCasesValidApiUriPatResourceNames3 { param ([System.String]$ApiUri, [System.String]$Pat, [System.String]$ResourceName) - Mock Invoke-RestMethod {} -Verifiable + Mock Invoke-AzDevOpsApiRestMethod {} -Verifiable $resources = Get-AzDevOpsApiResource -ApiUri $ApiUri -Pat $Pat -ResourceName $ResourceName - Assert-MockCalled 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' + Assert-MockCalled 'Invoke-AzDevOpsApiRestMethod' -Times 1 -Exactly -Scope 'It' } } From 8ab8d98abf9648bf489d98c8050c6e7022ad96b8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 16 Nov 2020 20:10:04 +0000 Subject: [PATCH 572/611] Updated 'Invoke-AzDevOpsApiRestMethod' to remove 'ApiUri' validation, remove default 'HttpBody' and remove 'Body' and 'ContentType' if a 'Get' or 'Delete' request. --- .../Private/Invoke-AzDevOpsApiRestMethod.ps1 | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 index 944a3e2d0..d2b147534 100644 --- a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 +++ b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/Invoke-AzDevOpsApiRestMethod.ps1 @@ -50,7 +50,6 @@ function Invoke-AzDevOpsApiRestMethod param ( [Parameter(Mandatory=$true)] - [ValidateScript( { Test-AzDevOpsApiUri -ApiUri $_ -IsValid })] [Alias('Uri')] [System.String] $ApiUri, @@ -70,7 +69,7 @@ function Invoke-AzDevOpsApiRestMethod [Parameter()] [System.String] [Alias('Body')] - $HttpBody = '', + $HttpBody, [Parameter()] [System.String] @@ -89,21 +88,28 @@ function Invoke-AzDevOpsApiRestMethod $RetryIntervalMs = 250 ) - # Intially set this value to -1, as the first attempt does not want to be classes as a "RetryAttempt" + $invokeRestMethodParameters = @{ + Uri = $ApiUri + Method = $HttpMethod + Headers = $HttpHeaders + Body = $HttpBody + ContentType = $HttpContentType + } + + # Remove the 'Body' and 'ContentType' if not relevant to request + if ($HttpMethod -in $('Get','Delete')) + { + $invokeRestMethodParameters.Remove('Body') + $invokeRestMethodParameters.Remove('ContentType') + } + + # Intially set this value to -1, as the first attempt does not want to be classed as a "RetryAttempt" $CurrentNoOfRetryAttempts = -1 while ($CurrentNoOfRetryAttempts -lt $RetryAttempts) { try { - $invokeRestMethodParameters = @{ - Uri = $ApiUri - Method = $HttpMethod - Headers = $HttpHeaders - Body = $HttpBody - ContentType = $HttpContentType - } - return Invoke-RestMethod @invokeRestMethodParameters } catch From 43f9a9c74f47339b13826c83cc3116fc4cf806da Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 16 Nov 2020 21:42:12 +0000 Subject: [PATCH 573/611] Added GetDscCurrentStateObjectGetParameters() method and GetDscCurrentStateResourceObject() methods in 'AzDevOpsDscResourceBase' class. --- .../AzDevOpsDscResourceBase.psm1 | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 96933f56f..693975c00 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -28,10 +28,9 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase $Ensure - - hidden [System.Management.Automation.PSObject]GetDscCurrentStateObject() + hidden [Hashtable]GetDscCurrentStateObjectGetParameters() { - # Setup a default set of parameters to pass into the object's 'Get' method + # Setup a default set of parameters to pass into the resource/object's 'Get' method $getParameters = @{ ApiUri = $this.ApiUri Pat = $this.Pat @@ -44,9 +43,22 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase $getParameters."$($this.GetResourceIdPropertyName())" = $this.GetResourceId() } + return $getParameters + } + + + hidden [PsObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { # Obtain the 'Get' function name for the object, then invoke it $thisResourceGetFunctionName = $this.GetResourceFunctionName(([RequiredAction]::Get)) - $dscCurrentStateResourceObject = $(& $thisResourceGetFunctionName @getParameters) + return $(& $thisResourceGetFunctionName @GetParameters) + } + + + hidden [System.Management.Automation.PSObject]GetDscCurrentStateObject() + { + $getParameters = $this.GetDscCurrentStateObjectGetParameters() + $dscCurrentStateResourceObject = $this.GetDscCurrentStateResourceObject($getParameters) # If no object was returned (i.e it does not exist), create a default/empty object if ($null -eq $dscCurrentStateResourceObject) From 71f46b024c1b9167bbdaa9de05d66a7ff9a0e31c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Mon, 16 Nov 2020 21:42:59 +0000 Subject: [PATCH 574/611] Added unit tests for GetDscCurrentStateObject() and GetDscCurrentStateObjectGetParameters() methods in 'AzDevOpsDscResourceBase' class. --- .../GetDscCurrentStateObject.Tests.ps1 | 109 ++++++++++ ...cCurrentStateObjectGetParameters.Tests.ps1 | 193 ++++++++++++++++++ 2 files changed, 302 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 index e69de29bb..0dd8a9f69 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 @@ -0,0 +1,109 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + + Context 'When no "DscCurrentStateResourceObject" object returned'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateObject()} | Should -Not -Throw + } + + It 'Should return an object with "Ensure" property value of "Absent"' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObject().Ensure | Should -Be 'Absent' + } + + } + + + Context 'When no "DscCurrentStateResourceObject" object returned'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return [PSObject]@{ + Ensure = 'Present' + } + } + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateObject()} | Should -Not -Throw + } + + It 'Should return an object with "Ensure" property value of "Present"' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObject().Ensure | Should -Be 'Present' + } + + } + + } +} diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 new file mode 100644 index 000000000..aae50bd0a --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 @@ -0,0 +1,193 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + + Context 'When a "ResourceId" property value is present'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleKey = 'AzDevOpsDscResourceBaseExampleKeyValue' + + [string]GetResourceKeyPropertyName() + { + return 'AzDevOpsDscResourceBaseExampleKey' + } + + [string]GetResourceKey() + { + return 'AzDevOpsDscResourceBaseExampleKeyValue' + } + + + [DscProperty()] + [string]$AzDevOpsDscResourceBaseExampleId = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceIdPropertyName() + { + return 'AzDevOpsDscResourceBaseExampleId' + } + + [string]GetResourceId() + { + return '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + } + + + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()} | Should -Not -Throw + } + + It 'Should return an object with "ApiUri" property value equal to object instance "ApiUri" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters().ApiUri | Should -Be $azDevOpsDscResourceBaseExample.ApiUri + } + + It 'Should return an object with "Pat" property value equal to object instance "Pat" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters().Pat | Should -Be $azDevOpsDscResourceBaseExample.Pat + } + + It 'Should return an object with "ResourceKey" property value equal to object instance "ResourceKey" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceKeyPropertyName())" | + Should -Be $azDevOpsDscResourceBaseExample."$($azDevOpsDscResourceBaseExample.GetResourceKeyPropertyName())" + } + + It 'Should return an object with "ResourceId" property value equal to object instance "ResourceId" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" | + Should -Be $azDevOpsDscResourceBaseExample."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" + } + + It 'Should return an object with "ResourceId" property value that is not $null' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" | + Should -Not -BeNullOrEmpty + } + + } + + + Context 'When a "ResourceId" property value is not present'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleKey = 'AzDevOpsDscResourceBaseExampleKeyValue' + + [string]GetResourceKeyPropertyName() + { + return 'AzDevOpsDscResourceBaseExampleKey' + } + + [string]GetResourceKey() + { + return 'AzDevOpsDscResourceBaseExampleKeyValue' + } + + + [DscProperty()] + [string]$AzDevOpsDscResourceBaseExampleId + + [string]GetResourceIdPropertyName() + { + return 'AzDevOpsDscResourceBaseExampleId' + } + + [string]GetResourceId() + { + return $null + } + + + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()} | Should -Not -Throw + } + + It 'Should return an object with "ApiUri" property value equal to object instance "ApiUri" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters().ApiUri | Should -Be $azDevOpsDscResourceBaseExample.ApiUri + } + + It 'Should return an object with "Pat" property value equal to object instance "Pat" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters().Pat | Should -Be $azDevOpsDscResourceBaseExample.Pat + } + + It 'Should return an object with "ResourceKey" property value equal to object instance "ResourceKey" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceKeyPropertyName())" | + Should -Be $azDevOpsDscResourceBaseExample."$($azDevOpsDscResourceBaseExample.GetResourceKeyPropertyName())" + } + + It 'Should return an object with "ResourceId" property value equal to object instance "ResourceId" value' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" | + Should -Be $azDevOpsDscResourceBaseExample."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" + } + + It 'Should return an object with "ResourceId" property value that is $null' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBaseExample.GetDscCurrentStateObjectGetParameters()."$($azDevOpsDscResourceBaseExample.GetResourceIdPropertyName())" | + Should -BeNullOrEmpty + } + + } + + } +} From 42c178ac75be760052cb82cc49e451c4f19774d7 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 19:47:00 +0000 Subject: [PATCH 575/611] Added unit tests for Set(), Test() and TestDesiredState() methods in 'AzDevOpsDscResourceBase' class. --- .../AzDevOpsDscResourceBase/Set.Tests.ps1 | 69 +++++++++++ .../AzDevOpsDscResourceBase/Test.Tests.ps1 | 92 ++++++++++++++ .../TestDesiredState.Tests.ps1 | 115 ++++++++++++++++++ 3 files changed, 276 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 new file mode 100644 index 000000000..12d3f1a8f --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 @@ -0,0 +1,69 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + } + + Context 'When no "Set()" method is invoked'{ + + It 'Should not throw' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$setToDesiredState = {} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name SetToDesiredState -Value $setToDesiredState -Force + + { $azDevOpsDscResourceBase.Set() } | Should -Not -Throw + } + + It 'Should return $null' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$setToDesiredState = {} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name SetToDesiredState -Value $setToDesiredState -Force + + $azDevOpsDscResourceBase.Set() | Should -BeNullOrEmpty + } + + } + + } +} diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 new file mode 100644 index 000000000..9287b6bf8 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 @@ -0,0 +1,92 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + } + + Context 'When no "TestDesiredState()" returns $true'{ + + It 'Should not throw' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$testDesiredState = {return $true} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name TestDesiredState -Value $testDesiredState -Force + + { $azDevOpsDscResourceBase.Test() } | Should -BeTrue + } + + It 'Should return $true' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$testDesiredState = {return $true} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name TestDesiredState -Value $testDesiredState -Force + + $azDevOpsDscResourceBase.Test() | Should -BeTrue + } + + } + + + Context 'When no "TestDesiredState()" returns $false'{ + + It 'Should not throw' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$testDesiredState = {return $false} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name TestDesiredState -Value $testDesiredState -Force + + { $azDevOpsDscResourceBase.Test() } | Should -Not -Throw + } + + It 'Should return $false' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$testDesiredState = {return $false} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name TestDesiredState -Value $testDesiredState -Force + + $azDevOpsDscResourceBase.Test() | Should -BeFalse + } + + } + + } +} diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 new file mode 100644 index 000000000..0c6af5715 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 @@ -0,0 +1,115 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + } + + $testCasesValidButNotNone = @( + @{ + RequiredAction = [RequiredAction]::Get + }, + @{ + RequiredAction = [RequiredAction]::New + }, + @{ + RequiredAction = [RequiredAction]::Set + }, + @{ + RequiredAction = [RequiredAction]::Remove + }, + @{ + RequiredAction = [RequiredAction]::Test + }, + @{ + RequiredAction = [RequiredAction]::Error + } + ) + + Context 'When no "GetDscRequiredAction()" returns "None"'{ + + It 'Should not throw' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return [RequiredAction]::None} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + {$azDevOpsDscResourceBase.TestDesiredState()} | Should -Not -Throw + } + + It 'Should return $true' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return [RequiredAction]::None} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + $azDevOpsDscResourceBase.TestDesiredState() | Should -BeTrue + } + + } + + + Context 'When no "GetDscRequiredAction()" does not return "None"'{ + + It 'Should return $false - "<$RequiredAction>"' -TestCases $testCasesValidButNotNone { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + {$azDevOpsDscResourceBase.TestDesiredState()} | Should -Not -Throw + } + + It 'Should return $false - "<$RequiredAction>"' -TestCases $testCasesValidButNotNone { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + $azDevOpsDscResourceBase.TestDesiredState() | Should -BeFalse + } + + } + + } +} From f549ca3086a8206db40e9bf08c56f81a401fcfe6 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 20:25:03 +0000 Subject: [PATCH 576/611] Added unit tests for SetToDesiredState() and GetPostSetWaitTimeMs() methods. --- .../GetPostSetWaitTimeSeconds.Tests.ps1 | 65 +++++++++ .../SetToDesiredState.Tests.ps1 | 138 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 new file mode 100644 index 000000000..dc52ecbb4 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 @@ -0,0 +1,65 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + } + + Context 'When no "Set()" method is invoked'{ + + It 'Should not throw' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + + { $azDevOpsDscResourceBase.GetPostSetWaitTimeMs() } | Should -Not -Throw + } + + It 'Should return $null' { + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + + $azDevOpsDscResourceBase.GetPostSetWaitTimeMs() | Should -Be 2000 + } + + } + + } +} diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 new file mode 100644 index 000000000..b55ebaa64 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 @@ -0,0 +1,138 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + + [string]GetResourceFunctionName([RequiredAction]$RequiredAction) + { + return 'Get-Module' + } + [Hashtable]GetDesiredStateParameters([Hashtable]$Current, [Hashtable]$Desired, [RequiredAction]$RequiredAction) + { + return @{ + Name = 'SomeModuleThatWillNotExist' + } + } + + [Int32]GetPostSetWaitTimeMs() + { + return 0 + } + } + + $testCasesValidRequiredActionThatDoNotRequireAction = @( + @{ + RequiredAction = [RequiredAction]::Get + }, + @{ + RequiredAction = [RequiredAction]::Test + }, + @{ + RequiredAction = [RequiredAction]::Error + } + ) + + $testCasesValidRequiredActionThatRequireAction = @( + @{ + RequiredAction = [RequiredAction]::New + }, + @{ + RequiredAction = [RequiredAction]::Set + }, + @{ + RequiredAction = [RequiredAction]::Remove + } + ) + + + Context 'When no "GetDscRequiredAction()" method returns a "RequiredAction" that requires an action'{ + + It 'Should not throw - ""' -TestCases $testCasesValidRequiredActionThatRequireAction { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + { $azDevOpsDscResourceBase.SetToDesiredState() } | Should -Not -Throw + } + + It 'Should return $null - ""' -TestCases $testCasesValidRequiredActionThatDoNotRequireAction { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + $azDevOpsDscResourceBase.SetToDesiredState() | Should -BeNullOrEmpty + } + + } + + + Context 'When no "GetDscRequiredAction()" method returns a "RequiredAction" that requires no action'{ + + It 'Should not throw - ""' -TestCases $testCasesValidRequiredActionThatDoNotRequireAction { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + { $azDevOpsDscResourceBase.SetToDesiredState() } | Should -Not -Throw + } + + It 'Should return $null - ""' -TestCases $testCasesValidRequiredActionThatDoNotRequireAction { + param ([RequiredAction]$RequiredAction) + + $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() + [ScriptBlock]$getDscRequiredAction = {return $RequiredAction} + $azDevOpsDscResourceBase | Add-Member -MemberType ScriptMethod -Name GetDscRequiredAction -Value $getDscRequiredAction -Force + + $azDevOpsDscResourceBase.SetToDesiredState() | Should -BeNullOrEmpty + } + + } + + } +} From 82f689fc6b79c8313e5dd8d14992557fb4668ac3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 20:27:02 +0000 Subject: [PATCH 577/611] Added GetPostSetWaitTimeMs() method to 'AzDevOpsDscResourceBase' class --- .../AzDevOpsDscResourceBase.psm1 | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index 693975c00..f36660585 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -221,6 +221,8 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase ApiUri = $DesiredStateProperties.ApiUri Pat = $DesiredStateProperties.Pat + Force = $true + # Set this from the 'Current' state as we would expect this to have an existing key/ID value to use "$IdPropertyName" = $CurrentStateProperties."$IdPropertyName" } @@ -244,6 +246,9 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase # Do not need/want this passing as a parameter (the action taken will determine the desired state) $desiredStateParameters.Remove('Ensure') + # Add this to 'Force' subsequent function call + $desiredStateParameters.Force = $true + # Some DSC properties are only supported for 'New' and 'Remove' actions, but not 'Set' ones (these need to be removed) [System.String[]]$unsupportedForSetPropertyNames = $this.GetDscResourcePropertyNamesWithNoSetSupport() @@ -278,6 +283,11 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase } + [Int32]GetPostSetWaitTimeMs() + { + return 2000 + } + [void] SetToDesiredState() { [RequiredAction]$dscRequiredAction = $this.GetDscRequiredAction() @@ -290,8 +300,8 @@ class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase $dscRequiredActionFunctionName = $this.GetResourceFunctionName($dscRequiredAction) $dscDesiredStateParameters = $this.GetDesiredStateParameters($dscCurrentStateProperties, $dscDesiredStateProperties, $dscRequiredAction) - & $dscRequiredActionFunctionName @dscDesiredStateParameters -Force | Out-Null - Start-Sleep -Seconds 5 + & $dscRequiredActionFunctionName @dscDesiredStateParameters | Out-Null + Start-Sleep -Milliseconds $($this.GetPostSetWaitTimeMs()) } } From aa8b405ac84d9636d2cb3cf8fe7eb5c62de86314 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 20:29:05 +0000 Subject: [PATCH 578/611] Corrected test names in 'TestDesiredState.Tests.ps1' --- .../AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 index 0c6af5715..edb6990d5 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 @@ -89,7 +89,7 @@ InModuleScope 'AzureDevOpsDsc' { Context 'When no "GetDscRequiredAction()" does not return "None"'{ - It 'Should return $false - "<$RequiredAction>"' -TestCases $testCasesValidButNotNone { + It 'Should not throw - ""' -TestCases $testCasesValidButNotNone { param ([RequiredAction]$RequiredAction) $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() @@ -99,7 +99,7 @@ InModuleScope 'AzureDevOpsDsc' { {$azDevOpsDscResourceBase.TestDesiredState()} | Should -Not -Throw } - It 'Should return $false - "<$RequiredAction>"' -TestCases $testCasesValidButNotNone { + It 'Should return $false - ""' -TestCases $testCasesValidButNotNone { param ([RequiredAction]$RequiredAction) $azDevOpsDscResourceBase = [AzDevOpsDscResourceBaseExample]::new() From bf263408cb215c96fdab35e4f2a55e1cb14cb050 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 20:38:13 +0000 Subject: [PATCH 579/611] Added 'GetDscCurrentStateResourceObject()' tests for 'AzDevOpsDscResourceBase' class --- ...GetDscCurrentStateResourceObject.Tests.ps1 | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 new file mode 100644 index 000000000..058510cd8 --- /dev/null +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 @@ -0,0 +1,118 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 + +# Initialize tests for module function +. $PSScriptRoot\..\Classes.TestInitialization.ps1 + +InModuleScope 'AzureDevOpsDsc' { + + $script:dscModuleName = 'AzureDevOpsDsc' + $script:moduleVersion = $(Get-Module -Name $script:dscModuleName -ListAvailable | Select-Object -First 1).Version + $script:subModuleName = 'AzureDevOpsDsc.Common' + $script:subModuleBase = $(Get-Module $script:subModuleName).ModuleBase + $script:dscResourceName = Split-Path $PSScriptRoot -Leaf + $script:commandName = $(Get-Item $PSCommandPath).BaseName.Replace('.Tests','') + $script:commandScriptPath = Join-Path "$PSScriptRoot\..\..\..\..\" -ChildPath "output\$($script:dscModuleName)\$($script:moduleVersion)\Classes\$script:dscResourceName\$script:dscResourceName.psm1" + $script:tag = @($($script:commandName -replace '-')) + + + Describe "$script:subModuleName\Classes\AzDevOpsDscResourceBase\$script:commandName" -Tag $script:tag { + + + Context 'When no "DscCurrentStateResourceObject" object returned'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return $null + } + + [string]GetResourceFunctionName([RequiredAction]$RequiredAction) + { + return 'Get-Module' + } + [Hashtable]GetDesiredStateParameters([Hashtable]$Current, [Hashtable]$Desired, [RequiredAction]$RequiredAction) + { + return @{ + Name = 'SomeModuleThatWillNotExist' + } + } + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateResourceObject(@{})} | Should -Not -Throw + } + } + + + Context 'When no "DscCurrentStateResourceObject" object returned'{ + + class AzDevOpsDscResourceBaseExample : AzDevOpsDscResourceBase # Note: Ignore 'TypeNotFound' warning (it is available at runtime) + { + [string]$ApiUri = 'https://some.api/_apis/' + [string]$Pat = '1234567890123456789012345678901234567890123456789012' + + [DscProperty(Key)] + [string]$AzDevOpsDscResourceBaseExampleName = 'AzDevOpsDscResourceBaseExampleNameValue' + + [string]$AzDevOpsDscResourceBaseExampleId # = '31e71307-09b3-4d8a-b65c-5c714f64205f' # Random GUID + + [string]GetResourceName() + { + return 'AzDevOpsDscResourceBaseExample' + } + + [Hashtable]GetDscCurrentStateObjectGetParameters() + { + return @{} + } + + [PSObject]GetDscCurrentStateResourceObject([Hashtable]$GetParameters) + { + return [PSObject]@{ + Ensure = 'Present' + } + } + + [string]GetResourceFunctionName([RequiredAction]$RequiredAction) + { + return 'Get-Module' + } + [Hashtable]GetDesiredStateParameters([Hashtable]$Current, [Hashtable]$Desired, [RequiredAction]$RequiredAction) + { + return @{ + Name = 'SomeModuleThatWillNotExist' + } + } + } + + It 'Should not throw' { + $azDevOpsDscResourceBaseExample = [AzDevOpsDscResourceBaseExample]::new() + + {$azDevOpsDscResourceBaseExample.GetDscCurrentStateResourceObject(@{})} | Should -Not -Throw + } + + } + + } +} From fdb4515497ffaf1d936ac36af11416c20e83517d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 20:45:23 +0000 Subject: [PATCH 580/611] Added 'hqrmtest' back into 'build.yaml' --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 48eaf0bab..4f388aae4 100644 --- a/build.yaml +++ b/build.yaml @@ -49,7 +49,7 @@ BuildWorkflow: test: - Pester_Tests_Stop_On_Fail - Pester_if_Code_Coverage_Under_Threshold - #- hqrmtest # Can't current get these working (empty parameters being passed in) + - hqrmtest publish: - Publish_release_to_GitHub From aece9fcaba1de2ee09565ef7d8318f44ba308148 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 21:27:30 +0000 Subject: [PATCH 581/611] Updated 'CONTRIBUTING.md' with 'Understanding the Module' information --- CONTRIBUTING.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3544bccb8..b101ce036 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,40 @@ Please check out common DSC Community [contributing guidelines](https://dsccommunity.org/guidelines/contributing). +## Understanding the Module + +The `AzureDevOpsDsc` module consists of a few key components: + +* The Desired State Configuration (DSC) resources (to be used within DSC configurations). + +* The nested, `AzureDevOpsDsc.Common` module, which itself, consists of the following + sets of functions/commands: + + * `Api` - These are used as generic wrappers around the + Azure DevOps REST API), aimed to minimise duplication of functionality and + code across all `Resources`. + + * `Connection` - These support connection to the Azure DevOps REST API. + + * `Resources` - These invoke the `Api` functions/commands to + manage specific, Azure DevOps REST API resources (e.g. `Projects`). + + * `Server` - These are specific to Azure DevOps + **Server** - the self-hosted, typically on-premise, edition of Azure DevOps. + + * `Services` - These are specific to Azure DevOps + **Services** - the Microsoft, cloud-hosted, 'Software-as-a-Service' (SaaS) + solution. + +The layout of the module is designed to: + +* Rely on the consistency of the Azure DevOps REST API +* Clearly scope and separate, distinct functionality and components +* Allow heavy re-use of generic, Azure DevOps REST API wrapper functionality +* Minimise the complexity of the DSC Resources themselves, in turn, aiming to: + * Reduce the amount of new functionality and effort required to add new, DSC Resources + * Increase the reliability and robustness of the DSC Resources + ## Running the Tests If want to know how to run this module's tests you can look at the [Testing Guidelines](https://dsccommunity.org/guidelines/testing-guidelines/#running-tests) From e432c829a52726c1ea4583c15646a42e8e672aad Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 22:24:30 +0000 Subject: [PATCH 582/611] Made further updates to 'CONTRIBUTING.md to include information on Integration setup. --- CONTRIBUTING.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b101ce036..d74729ce5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,11 @@ # Contributing +## Getting Started + Please check out common DSC Community [contributing guidelines](https://dsccommunity.org/guidelines/contributing). +--- + ## Understanding the Module The `AzureDevOpsDsc` module consists of a few key components: @@ -27,15 +31,70 @@ The `AzureDevOpsDsc` module consists of a few key components: **Services** - the Microsoft, cloud-hosted, 'Software-as-a-Service' (SaaS) solution. -The layout of the module is designed to: +The layout/structure of the module and it's resources/components is designed to: -* Rely on the consistency of the Azure DevOps REST API +* Rely on the consistency and structure of the Azure DevOps REST API * Clearly scope and separate, distinct functionality and components * Allow heavy re-use of generic, Azure DevOps REST API wrapper functionality * Minimise the complexity of the DSC Resources themselves, in turn, aiming to: * Reduce the amount of new functionality and effort required to add new, DSC Resources * Increase the reliability and robustness of the DSC Resources +* Allow all the DSC Resources to be able to use independent, Personal Access Tokens + (PATs) to allow distinct PATs, with distinct privileges, to perform distinct + operations (as opposed to requiring a single PAT with excess privileges). + +--- ## Running the Tests If want to know how to run this module's tests you can look at the [Testing Guidelines](https://dsccommunity.org/guidelines/testing-guidelines/#running-tests) + +### Setup of **Remote**, Integration Tests + +The Integration tests for this module, run as part of this build, require a +disposable instance of Azure DevOps Services that can be used for creating, +updating and deleting `Projects`, `Teams` and other resources within Azure DevOps. + +>**IMPORTANT**: The build pipeline itself can run in a non-disposable Azure +>DevOps organization/collection, but ensure you **DO NOT** setup the following +>variables to point at that non-disposable organization/collection. Doing this +>could result in **loss of code/data/service** because the Integration Tests are +>creating and dropping resources within the organization/collection. + +Two variables will need setting up in your Azure DevOps, pipeline: + +* **`AzureDevOps.Integration.ApiUri`** - Which needs to contain the URI of your disposable, +AzureDevOps, organization API. For example, `https://dev.azure.com/yourDisposableOrganizationNameHere/_apis/` + +* **`AzureDevOps.Integration.Pat`** - Which needs to contain the Personal Access +Token (PAT) to be used to connect to the disposable, Azure DevOps instance. + +>**IMPORTANT**: Do not use a live/production/working, Azure DevOps Services/Server +>organization/collection in these variables - **This will likely result in data loss.** + +### Setup of **Local**, Integration Tests + +If you want to run the Integration Tests locally (i.e. on a workstation used for +development), the following actions need to be performed: + +* Access/Use of the Local Configuration Manager (LCM) on the local workstation + requires Administrator permissions on the workstation. As a result, the session/ + tool executing the Integration tests must be running with Administrator + privileges. Failure to do this will result in an error when the tests are + initiated. + +* You need to set the following environment variables so the build will determine + it needs to execute the Integration tests, and it has the Personal Access Token + (PAT) and API URI + + ```Powershell + $env:CI = $true + $env:AZUREDEVOPSINTEGRATIONAPIURI = 'YourApiUriHere' + $env:AZUREDEVOPSINTEGRATIONPAT = 'YourPatHere' + ``` + +>**Important**: It is not recommended to store any Personal Access Token (PAT) +>in plain text within a text file or script. Ensure no PAT token is added to +source control commmits as part of changes made. These PATs would likely be +available within the public, commit history and could/would pose a security risk +to your Azure DevOps instance. From 9f2908a81e7abae5f9d9f99f0b83d4a2907dba56 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 22:33:59 +0000 Subject: [PATCH 583/611] Corrected typo in 'Contributing.md' --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d74729ce5..c4e371f08 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -95,6 +95,6 @@ development), the following actions need to be performed: >**Important**: It is not recommended to store any Personal Access Token (PAT) >in plain text within a text file or script. Ensure no PAT token is added to -source control commmits as part of changes made. These PATs would likely be +source control commits as part of changes made. These PATs would likely be available within the public, commit history and could/would pose a security risk to your Azure DevOps instance. From a4c3d2ec562f8f3ec5a8ee75c113f1d45802520a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Tue, 17 Nov 2020 22:36:04 +0000 Subject: [PATCH 584/611] Added link to CONTRIBUTING.md in README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index faead657e..772a0e9f2 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ full release to [PowerShell Gallery](https://www.powershellgallery.com/). Please check out common DSC Community [contributing guidelines](https://dsccommunity.org/guidelines/contributing). +Additionally, please [`AzureDevOpsDsc` contribution guidelines](CONTRIBUTING.md) +for more information about contributing to this module (including an overview of +module structure, design and setup of Integration tests). + ## Change log A full list of changes in each version can be found in the [change log](CHANGELOG.md). From 8069f70bcaf88b2003511e770ac54116638056f9 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 18 Nov 2020 18:26:00 +0000 Subject: [PATCH 585/611] Updated/Corrected examples to reflect current functionality. --- .../AzDevOpsProject/1-AddProject.ps1 | 4 +-- ...-RenameProject.ps1 => 2-UpdateProject.ps1} | 16 +++++---- .../AzDevOpsProject/3-DeleteProject.ps1 | 34 +++---------------- 3 files changed, 16 insertions(+), 38 deletions(-) rename source/Examples/Resources/AzDevOpsProject/{2-RenameProject.ps1 => 2-UpdateProject.ps1} (54%) diff --git a/source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 b/source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 index 190952760..2e7bc7eba 100644 --- a/source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 +++ b/source/Examples/Resources/AzDevOpsProject/1-AddProject.ps1 @@ -11,7 +11,7 @@ Configuration Example ( [Parameter(Mandatory = $true)] [string] - $Url, + $ApiUri, [Parameter(Mandatory = $true)] [string] @@ -32,7 +32,7 @@ Configuration Example ProjectName = 'Test Project' ProjectDescription = 'A Test Project' - #ProjectId = 'TestProject' + SourceControlType = 'Git' } } diff --git a/source/Examples/Resources/AzDevOpsProject/2-RenameProject.ps1 b/source/Examples/Resources/AzDevOpsProject/2-UpdateProject.ps1 similarity index 54% rename from source/Examples/Resources/AzDevOpsProject/2-RenameProject.ps1 rename to source/Examples/Resources/AzDevOpsProject/2-UpdateProject.ps1 index f0f98c6db..41b201032 100644 --- a/source/Examples/Resources/AzDevOpsProject/2-RenameProject.ps1 +++ b/source/Examples/Resources/AzDevOpsProject/2-UpdateProject.ps1 @@ -2,8 +2,8 @@ <# .DESCRIPTION This example shows how to ensure that an Azure DevOps project - with a ProjectId of '1aeda1ef-a16d-4118-8817-d2f85d4f05d1' can be - renamed to 'A New Test Project Name'. + with a ProjectName of 'Test Project' can have it's description + updated to 'A Test Project with a new description'. #> Configuration Example @@ -12,7 +12,7 @@ Configuration Example ( [Parameter(Mandatory = $true)] [string] - $Url, + $ApiUri, [Parameter(Mandatory = $true)] [string] @@ -23,16 +23,18 @@ Configuration Example node localhost { - AzDevOpsProject 'RenameProject' + AzDevOpsProject 'UpdateProject' { Ensure = 'Present' ApiUri = $ApiUri Pat = $Pat - ProjectId = '1aeda1ef-a16d-4118-8817-d2f85d4f05d1' # Example ProjectId (NOTE: This is mandatory for renaming a project) - ProjectName = 'A New Test Project Name' - ProjectDescription = 'A test project' + ProjectName = 'Test Project' + ProjectDescription = 'A Test Project with a new description' # Updated property + + + #SourceControlType = 'Git' # Note: Update of this property is not supported } diff --git a/source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 b/source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 index c4108bd2d..890bbdc2c 100644 --- a/source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 +++ b/source/Examples/Resources/AzDevOpsProject/3-DeleteProject.ps1 @@ -1,8 +1,7 @@ <# .DESCRIPTION - This example shows both how to ensure that an Azure DevOps project - can be logically deleted or be unequivocally/hard deleted. + This example shows how to delete a project called 'Test Project'. #> Configuration Example @@ -11,7 +10,7 @@ Configuration Example ( [Parameter(Mandatory = $true)] [string] - $Url, + $ApiUri, [Parameter(Mandatory = $true)] [string] @@ -23,37 +22,14 @@ Configuration Example node localhost { - # Example: A logical delete (rename) of a project - AzDevOpsProject 'DeleteProject_Logical' + AzDevOpsProject 'DeleteProject' { - Ensure = 'Absent' + Ensure = 'Absent' # 'Absent' ensures this will be removed/deleted ApiUri = $ApiUri Pat = $Pat - ProjectName = 'Test Logical Delete Project' - ProjectDescription = 'A test project to be logically deleted' - - # An optional, prefix for logically deleted Projects (default is 'zzDel_') - DeletedPrefix = 'zzDel_' - - } - - - # Example: An unequivocal delete of a project (i.e. a strong/pure/absolute delete) - AzDevOpsProject 'DeleteProject_Unequivocal' - { - Ensure = 'Absent' - - ApiUri = $ApiUri - Pat = $Pat - - ProjectName = 'Test Unequivocal Delete Project' - ProjectDescription = 'A test project to be unequivocally deleted' - - # NOTE: By specifying the Force parameter, this will perform an actual delete of the project (as opposed to a logical delete) - Force = $true - + ProjectName = 'Test Project' # Identifies the name of the project to be deleted } } From 7bb906016d3be923bc66c75b7d5ab085133aa422 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 18 Nov 2020 18:26:19 +0000 Subject: [PATCH 586/611] Updated 'CHANGELOG.md' to include recent changes. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee504fec3..6b83fa0dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - AzureDevOpsDsc - Added GitHub issue templates and pull request template ([issue #1](https://github.com/dsccommunity/AzureDevOpsDsc/issues/1)) + - Added 'wrapper' functionality around the [Azure DevOps REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) + - Added the `AzDevOpsProject`, DSC Resource From 0ef1d3fe808ecd1b2ec1baa0f50b0f53663d0965 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 18 Nov 2020 18:26:58 +0000 Subject: [PATCH 587/611] Added 'RequiredAction' module reference to a few 'AzDevOpsDscResourceBase', unit test scripts --- .../GetDscCurrentStateResourceObject.Tests.ps1 | 1 + .../Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 | 1 + .../Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 | 1 + 3 files changed, 3 insertions(+) diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 index 058510cd8..5d3b048f0 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 @@ -1,4 +1,5 @@ using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 index b55ebaa64..91b8e1003 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 @@ -1,4 +1,5 @@ using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 index edb6990d5..418594cdc 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 @@ -1,4 +1,5 @@ using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From abcf13db1b79974179c9f4d46da78e4078ce37a3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 17:36:53 +0000 Subject: [PATCH 588/611] Added 'prefix.ps1' and 'suffix.ps1' --- build.yaml | 4 ++++ source/prefix.ps1 | 1 + source/suffix.ps1 | 1 + 3 files changed, 6 insertions(+) create mode 100644 source/prefix.ps1 create mode 100644 source/suffix.ps1 diff --git a/build.yaml b/build.yaml index 4f388aae4..3cbcc4f83 100644 --- a/build.yaml +++ b/build.yaml @@ -13,6 +13,10 @@ CopyPaths: Encoding: UTF8 VersionedOutputDirectory: true +# '.psm1' Prefix and Suffixes +Prefix: prefix.ps1 +Suffix: suffix.ps1 + #################################################### # Dependent Modules Configuration (Sampler) # #################################################### diff --git a/source/prefix.ps1 b/source/prefix.ps1 new file mode 100644 index 000000000..bc021de35 --- /dev/null +++ b/source/prefix.ps1 @@ -0,0 +1 @@ +# '.psm1' Prefix diff --git a/source/suffix.ps1 b/source/suffix.ps1 new file mode 100644 index 000000000..0e00df19b --- /dev/null +++ b/source/suffix.ps1 @@ -0,0 +1 @@ +# '.psm1' Suffix From cde80b8c96e66c23215872777a669f90d279c8e4 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 17:39:10 +0000 Subject: [PATCH 589/611] Moved 'AzureDevOpsDsc.psm1' contents into 'prefix.ps1' --- source/AzureDevOpsDsc.psm1 | 4 ---- source/prefix.ps1 | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 90c3d06a9..139597f9c 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,6 +1,2 @@ -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath - -$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' diff --git a/source/prefix.ps1 b/source/prefix.ps1 index bc021de35..43a0bf92d 100644 --- a/source/prefix.ps1 +++ b/source/prefix.ps1 @@ -1 +1,7 @@ # '.psm1' Prefix + +$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' +Import-Module -Name $script:azureDevOpsDscCommonModulePath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + From 30cde60c5de53b2ec889fb6279226a21fd1123b8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 17:45:11 +0000 Subject: [PATCH 590/611] Moved declaration of 'Ensure' and 'RequiredAction' enums into 'prefix.ps1' ((re)moving existing 'enums' directory). --- .../AzDevOpsApiDscResourceBase.psm1 | 1 - .../AzDevOpsDscResourceBase.psm1 | 2 -- source/Enums/Ensure/Ensure.psm1 | 6 ------ .../Enums/RequiredAction/RequiredAction.psm1 | 11 ---------- source/{ => Other}/Enums/Ensure/README.md | 0 source/{ => Other}/Enums/README.md | 0 .../Enums/RequiredAction/README.md | 0 source/prefix.ps1 | 20 +++++++++++++++++++ 8 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 source/Enums/Ensure/Ensure.psm1 delete mode 100644 source/Enums/RequiredAction/RequiredAction.psm1 rename source/{ => Other}/Enums/Ensure/README.md (100%) rename source/{ => Other}/Enums/README.md (100%) rename source/{ => Other}/Enums/RequiredAction/README.md (100%) diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 index 8e7ba039f..1b2e9e48a 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 @@ -1,4 +1,3 @@ -using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 class AzDevOpsApiDscResourceBase : DscResourceBase diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 index f36660585..bf8473014 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 @@ -1,5 +1,3 @@ -using module ..\..\Enums\Ensure\Ensure.psm1 -using module ..\..\Enums\RequiredAction\RequiredAction.psm1 using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 using module ..\..\Modules\AzureDevOpsDsc.Common\AzureDevOpsDsc.Common.psd1 diff --git a/source/Enums/Ensure/Ensure.psm1 b/source/Enums/Ensure/Ensure.psm1 deleted file mode 100644 index 6f0d8857a..000000000 --- a/source/Enums/Ensure/Ensure.psm1 +++ /dev/null @@ -1,6 +0,0 @@ - -enum Ensure -{ - Present - Absent -} diff --git a/source/Enums/RequiredAction/RequiredAction.psm1 b/source/Enums/RequiredAction/RequiredAction.psm1 deleted file mode 100644 index 4cad3d442..000000000 --- a/source/Enums/RequiredAction/RequiredAction.psm1 +++ /dev/null @@ -1,11 +0,0 @@ - -enum RequiredAction -{ - None - Get - New - Set - Remove - Test - Error -} diff --git a/source/Enums/Ensure/README.md b/source/Other/Enums/Ensure/README.md similarity index 100% rename from source/Enums/Ensure/README.md rename to source/Other/Enums/Ensure/README.md diff --git a/source/Enums/README.md b/source/Other/Enums/README.md similarity index 100% rename from source/Enums/README.md rename to source/Other/Enums/README.md diff --git a/source/Enums/RequiredAction/README.md b/source/Other/Enums/RequiredAction/README.md similarity index 100% rename from source/Enums/RequiredAction/README.md rename to source/Other/Enums/RequiredAction/README.md diff --git a/source/prefix.ps1 b/source/prefix.ps1 index 43a0bf92d..83b8a8f90 100644 --- a/source/prefix.ps1 +++ b/source/prefix.ps1 @@ -5,3 +5,23 @@ Import-Module -Name $script:azureDevOpsDscCommonModulePath $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +enum Ensure +{ + Present + Absent +} + + + +enum RequiredAction +{ + None + Get + New + Set + Remove + Test + Error +} From afd9b72ec1894c60288bc1feef67e3eb3cf513e8 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 18:20:04 +0000 Subject: [PATCH 591/611] Removed 'DSCResources' and 'DSCClassResources' directories and amended class '.psm1' files to '.ps1' within 'Classes' directory. --- build.yaml | 3 --- source/AzureDevOpsDsc.psd1 | 4 +--- ...scResourceBase.psm1 => 001.DscResourceBase.ps1} | 1 - ...ase.psm1 => 002.AzDevOpsApiDscResourceBase.ps1} | 2 -- ...ceBase.psm1 => 003.AzDevOpsDscResourceBase.ps1} | 14 +++++--------- .../010.AzDevOpsProject.ps1} | 7 ------- .../Classes/AzDevOpsApiDscResourceBase/README.md | 0 .../Classes/AzDevOpsDscResourceBase/README.md | 0 .../{ => Other}/Classes/DscResourceBase/README.md | 0 .../DSCClassResources/AzDevOpsProject/README.md | 0 source/{ => Other}/DSCClassResources/README.md | 0 source/{ => Other}/DSCResources/README.md | 0 12 files changed, 6 insertions(+), 25 deletions(-) rename source/Classes/{DscResourceBase/DscResourceBase.psm1 => 001.DscResourceBase.ps1} (99%) rename source/Classes/{AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 => 002.AzDevOpsApiDscResourceBase.ps1} (97%) rename source/Classes/{AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 => 003.AzDevOpsDscResourceBase.ps1} (97%) rename source/{DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 => Classes/010.AzDevOpsProject.ps1} (79%) rename source/{ => Other}/Classes/AzDevOpsApiDscResourceBase/README.md (100%) rename source/{ => Other}/Classes/AzDevOpsDscResourceBase/README.md (100%) rename source/{ => Other}/Classes/DscResourceBase/README.md (100%) rename source/{ => Other}/DSCClassResources/AzDevOpsProject/README.md (100%) rename source/{ => Other}/DSCClassResources/README.md (100%) rename source/{ => Other}/DSCResources/README.md (100%) diff --git a/build.yaml b/build.yaml index 3cbcc4f83..1ceae2221 100644 --- a/build.yaml +++ b/build.yaml @@ -4,10 +4,7 @@ #################################################### CopyPaths: - Classes - - DSCClassResources - - DSCResources - en-US - - Enums - Examples - Modules Encoding: UTF8 diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index 375c7f87e..388ddc87e 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -38,9 +38,7 @@ AliasesToExport = @() # Import all the 'DSCClassResource', modules as part of this module - NestedModules = @( - '.\DSCClassResources\AzDevOpsProject\AzDevOpsProject.psm1' - ) + NestedModules = @() DscResourcesToExport = @('AzDevOpsProject') diff --git a/source/Classes/DscResourceBase/DscResourceBase.psm1 b/source/Classes/001.DscResourceBase.ps1 similarity index 99% rename from source/Classes/DscResourceBase/DscResourceBase.psm1 rename to source/Classes/001.DscResourceBase.ps1 index 2a656c60f..d0a0c029e 100644 --- a/source/Classes/DscResourceBase/DscResourceBase.psm1 +++ b/source/Classes/001.DscResourceBase.ps1 @@ -1,4 +1,3 @@ - class DscResourceBase { hidden [System.String]GetDscResourceKey() diff --git a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 b/source/Classes/002.AzDevOpsApiDscResourceBase.ps1 similarity index 97% rename from source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 rename to source/Classes/002.AzDevOpsApiDscResourceBase.ps1 index 1b2e9e48a..e39dd5e3c 100644 --- a/source/Classes/AzDevOpsApiDscResourceBase/AzDevOpsApiDscResourceBase.psm1 +++ b/source/Classes/002.AzDevOpsApiDscResourceBase.ps1 @@ -1,5 +1,3 @@ -using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 - class AzDevOpsApiDscResourceBase : DscResourceBase { [System.String]$ResourceName = $this.GetResourceName() diff --git a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 b/source/Classes/003.AzDevOpsDscResourceBase.ps1 similarity index 97% rename from source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 rename to source/Classes/003.AzDevOpsDscResourceBase.ps1 index bf8473014..fa1505986 100644 --- a/source/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.psm1 +++ b/source/Classes/003.AzDevOpsDscResourceBase.ps1 @@ -1,13 +1,9 @@ -using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -using module ..\..\Modules\AzureDevOpsDsc.Common\AzureDevOpsDsc.Common.psd1 - # This enum is re-defined here so it is recognised by 'Import-DscResource' (which won't pre/post-parse the 'using' statements) -enum Ensure -{ - Present - Absent -} +#enum Ensure +#{ +# Present +# Absent +#} class AzDevOpsDscResourceBase : AzDevOpsApiDscResourceBase { diff --git a/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 b/source/Classes/010.AzDevOpsProject.ps1 similarity index 79% rename from source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 rename to source/Classes/010.AzDevOpsProject.ps1 index 985831b5b..79f493079 100644 --- a/source/DSCClassResources/AzDevOpsProject/AzDevOpsProject.psm1 +++ b/source/Classes/010.AzDevOpsProject.ps1 @@ -1,10 +1,3 @@ -using module ..\..\Classes\DscResourceBase\DscResourceBase.psm1 -using module ..\..\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 -using module ..\..\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 - -$script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\AzureDevOpsDsc.Common' -Import-Module -Name $script:azureDevOpsDscCommonModulePath - [DscResource()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCStandardDSCFunctionsInResource', '', Justification='Test() and Set() method are inherited from base, "AzDevOpsDscResourceBase" class')] class AzDevOpsProject : AzDevOpsDscResourceBase diff --git a/source/Classes/AzDevOpsApiDscResourceBase/README.md b/source/Other/Classes/AzDevOpsApiDscResourceBase/README.md similarity index 100% rename from source/Classes/AzDevOpsApiDscResourceBase/README.md rename to source/Other/Classes/AzDevOpsApiDscResourceBase/README.md diff --git a/source/Classes/AzDevOpsDscResourceBase/README.md b/source/Other/Classes/AzDevOpsDscResourceBase/README.md similarity index 100% rename from source/Classes/AzDevOpsDscResourceBase/README.md rename to source/Other/Classes/AzDevOpsDscResourceBase/README.md diff --git a/source/Classes/DscResourceBase/README.md b/source/Other/Classes/DscResourceBase/README.md similarity index 100% rename from source/Classes/DscResourceBase/README.md rename to source/Other/Classes/DscResourceBase/README.md diff --git a/source/DSCClassResources/AzDevOpsProject/README.md b/source/Other/DSCClassResources/AzDevOpsProject/README.md similarity index 100% rename from source/DSCClassResources/AzDevOpsProject/README.md rename to source/Other/DSCClassResources/AzDevOpsProject/README.md diff --git a/source/DSCClassResources/README.md b/source/Other/DSCClassResources/README.md similarity index 100% rename from source/DSCClassResources/README.md rename to source/Other/DSCClassResources/README.md diff --git a/source/DSCResources/README.md b/source/Other/DSCResources/README.md similarity index 100% rename from source/DSCResources/README.md rename to source/Other/DSCResources/README.md From 1d242b5e01e94154e6db6fca0cb4800fce01e98a Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 18:20:48 +0000 Subject: [PATCH 592/611] Updated all test scripts for classes within the module to use the 'AzureDevOpsDsc.psm1' module. --- .../GetResourceFunctionName.Tests.ps1 | 2 +- .../Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 | 2 +- .../GetResourceIdPropertyName.Tests.ps1 | 2 +- .../AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 | 2 +- .../GetResourceKeyPropertyName.Tests.ps1 | 2 +- .../AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 | 2 +- .../AzDevOpsDscResourceBase.Initialization.Tests.ps1 | 2 ++ .../AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 | 2 +- .../GetDscCurrentStateObjectGetParameters.Tests.ps1 | 2 +- .../GetDscCurrentStateResourceObject.Tests.ps1 | 3 +-- .../GetPostSetWaitTimeSeconds.Tests.ps1 | 2 +- tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 | 2 +- .../AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 | 3 +-- tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 | 2 +- .../Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 | 3 +-- tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 | 2 +- .../DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 | 2 +- .../DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 | 2 +- .../GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 | 2 +- 19 files changed, 20 insertions(+), 21 deletions(-) diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 index c17bb8348..3c7ea0e61 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceFunctionName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 index b55dbe082..0abb19f63 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceId.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 index 9bf4393db..320b3a6e7 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceIdPropertyName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 index 4262d09c9..e6b883b98 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKey.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 index 82f9014b4..06117a6be 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceKeyPropertyName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 index 02e207067..e8d4e87ee 100644 --- a/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsApiDscResourceBase/GetResourceName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsApiDscResourceBase\AzDevOpsApiDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 index b9e289e79..e9f0ef435 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/AzDevOpsDscResourceBase.Initialization.Tests.ps1 @@ -1,3 +1,5 @@ +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 + # Initialize tests for module function 'Classes' . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 index 0dd8a9f69..9b20b1196 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObject.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 index aae50bd0a..05aae6bc0 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateObjectGetParameters.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 index 5d3b048f0..a4d9ffe62 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetDscCurrentStateResourceObject.Tests.ps1 @@ -1,5 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 index dc52ecbb4..31f4b584b 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/GetPostSetWaitTimeSeconds.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 index 12d3f1a8f..12a0eda99 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/Set.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 index 91b8e1003..5038ec86e 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/SetToDesiredState.Tests.ps1 @@ -1,5 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 index 9287b6bf8..42f4a46d6 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/Test.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 index 418594cdc..a88015039 100644 --- a/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 +++ b/tests/Unit/Classes/AzDevOpsDscResourceBase/TestDesiredState.Tests.ps1 @@ -1,5 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\AzDevOpsDscResourceBase\AzDevOpsDscResourceBase.psm1 -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Enums\RequiredAction\RequiredAction.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 index 98364edab..7a6ddb6d3 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKey.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 index aacb45679..e7a6085bc 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourceKeyPropertyName.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 index 6bcf9d68f..47472fba2 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNames.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 diff --git a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 index d1e4c2ed8..70df3c168 100644 --- a/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 +++ b/tests/Unit/Classes/DscResourceBase/GetDscResourcePropertyNamesWithNoSetSupport.Tests.ps1 @@ -1,4 +1,4 @@ -using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\Classes\DscResourceBase\DscResourceBase.psm1 +using module ..\..\..\..\output\AzureDevOpsDsc\0.2.0\AzureDevOpsDsc.psm1 # Initialize tests for module function . $PSScriptRoot\..\Classes.TestInitialization.ps1 From 3ed89dc80ef04925ad260d5eb936a2ae5e699bfa Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 18:26:10 +0000 Subject: [PATCH 593/611] Minor reformatting of 'prefix.ps1' and 'suffix.ps1' --- source/prefix.ps1 | 10 ++++++---- source/suffix.ps1 | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/prefix.ps1 b/source/prefix.ps1 index 83b8a8f90..6e3108d3d 100644 --- a/source/prefix.ps1 +++ b/source/prefix.ps1 @@ -1,20 +1,21 @@ -# '.psm1' Prefix + +# Import nested, 'AzureDevOpsDsc.Common' module $script:azureDevOpsDscCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\AzureDevOpsDsc.Common' Import-Module -Name $script:azureDevOpsDscCommonModulePath -$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +# Define localization data +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +# Define 'enums' for module enum Ensure { Present Absent } - - enum RequiredAction { None @@ -25,3 +26,4 @@ enum RequiredAction Test Error } + diff --git a/source/suffix.ps1 b/source/suffix.ps1 index 0e00df19b..b28b04f64 100644 --- a/source/suffix.ps1 +++ b/source/suffix.ps1 @@ -1 +1,3 @@ -# '.psm1' Suffix + + + From a0fcbbf6f3a4854c5c317e9a28f0e9d976197265 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:08:03 +0000 Subject: [PATCH 594/611] Repointed broken link in 'AzDevOpsProject', 'README.md' file --- source/Other/DSCClassResources/AzDevOpsProject/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Other/DSCClassResources/AzDevOpsProject/README.md b/source/Other/DSCClassResources/AzDevOpsProject/README.md index 24eb3cc2c..32a304779 100644 --- a/source/Other/DSCClassResources/AzDevOpsProject/README.md +++ b/source/Other/DSCClassResources/AzDevOpsProject/README.md @@ -40,7 +40,7 @@ within Azure DevOps) for this DSC Resource. ## Examples Examples of usage of the `AzDevOpsProject`, DSC Resource within a DSC -configuration can be found [here](../../Examples/Resources/AzDevOpsProject). +configuration can be found [here](../../../Examples/Resources/AzDevOpsProject). ## Related Commands From e987de17a5f3e7e40cbe59338f5c318e84165fa3 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:08:17 +0000 Subject: [PATCH 595/611] Removed 'suffix.ps1' --- build.yaml | 2 +- source/suffix.ps1 | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 source/suffix.ps1 diff --git a/build.yaml b/build.yaml index 1ceae2221..856074f06 100644 --- a/build.yaml +++ b/build.yaml @@ -12,7 +12,7 @@ VersionedOutputDirectory: true # '.psm1' Prefix and Suffixes Prefix: prefix.ps1 -Suffix: suffix.ps1 +#Suffix: suffix.ps1 #################################################### # Dependent Modules Configuration (Sampler) # diff --git a/source/suffix.ps1 b/source/suffix.ps1 deleted file mode 100644 index b28b04f64..000000000 --- a/source/suffix.ps1 +++ /dev/null @@ -1,3 +0,0 @@ - - - From 64780910ce25fa6f378156c0e1d6f1890627d27d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:11:42 +0000 Subject: [PATCH 596/611] Updated casing in 'ForEach' and 'ForEach-Object' statements --- .../Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 2 +- tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index f2cdf2a04..3ca401387 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -33,7 +33,7 @@ $functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "* # Loop through all PSModule functions and import/dot-source them (and export them if 'Public') -ForEach ($function in $functions) +foreach ($function in $functions) { Write-Verbose "Dot-sourcing '$($function.FullName)'..." . ( diff --git a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 index 724faf906..f6d77b21d 100644 --- a/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 +++ b/tests/Unit/Modules/TestHelpers/CommonTestCases.psm1 @@ -3293,8 +3293,8 @@ function Join-Hashtable $Hashtable2 ) - $keys = $Hashtable1.getenumerator() | foreach-object {$_.key} - $keys | foreach-object { + $keys = $Hashtable1.getenumerator() | ForEach-Object {$_.key} + $keys | ForEach-Object { $key = $_ if ($Hashtable2.containskey($key)) { From d70562edbcbc93cb4c27001f000f02b5b42a928c Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:18:44 +0000 Subject: [PATCH 597/611] Added 'AzureDevOpsDsc.strings.psd1' --- .../AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 new file mode 100644 index 000000000..5fd75cb92 --- /dev/null +++ b/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 @@ -0,0 +1,5 @@ +# Localized resources for module AzureDevOpsDsc. + +ConvertFrom-StringData @' + +'@ From c41309983302d682fda066484429053676422372 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:19:25 +0000 Subject: [PATCH 598/611] Removed non-required, '_README.md' file --- .../AzureDevOpsDsc.Common/Api/Functions/Private/_README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Private/_README.md deleted file mode 100644 index e69de29bb..000000000 From c224eadd5c4af4e8f2a6d759bbc556cd9678b615 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Thu, 19 Nov 2020 19:23:44 +0000 Subject: [PATCH 599/611] Deleted more non-required, '(_)README.md' files. --- .../Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Server/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Server/Functions/Public/_README.md | 0 .../AzureDevOpsDsc.Common/Services/Functions/Private/_README.md | 0 .../AzureDevOpsDsc.Common/Services/Functions/Public/_README.md | 0 source/Other/Classes/AzDevOpsApiDscResourceBase/README.md | 0 source/Other/Classes/AzDevOpsDscResourceBase/README.md | 0 source/Other/Classes/DscResourceBase/README.md | 0 12 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md delete mode 100644 source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md delete mode 100644 source/Other/Classes/AzDevOpsApiDscResourceBase/README.md delete mode 100644 source/Other/Classes/AzDevOpsDscResourceBase/README.md delete mode 100644 source/Other/Classes/DscResourceBase/README.md diff --git a/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Api/Functions/Public/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Private/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Connection/Functions/Public/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Private/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Private/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Server/Functions/Public/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Private/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md b/source/Modules/AzureDevOpsDsc.Common/Services/Functions/Public/_README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Other/Classes/AzDevOpsApiDscResourceBase/README.md b/source/Other/Classes/AzDevOpsApiDscResourceBase/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Other/Classes/AzDevOpsDscResourceBase/README.md b/source/Other/Classes/AzDevOpsDscResourceBase/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/source/Other/Classes/DscResourceBase/README.md b/source/Other/Classes/DscResourceBase/README.md deleted file mode 100644 index e69de29bb..000000000 From c9319e83fd8242095348d3fb8d4db3bff339e1bd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 20 Nov 2020 19:16:23 +0000 Subject: [PATCH 600/611] Removed import/export of 'AzureDevOpsDsc.Common', module functions from directories that have no functions/files. --- .../AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 index 3ca401387..f47986a47 100644 --- a/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 +++ b/source/Modules/AzureDevOpsDsc.Common/AzureDevOpsDsc.Common.psm1 @@ -10,11 +10,9 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' $functionSubDirectoryPaths = @( # Api - "$PSScriptRoot\Api\Functions\Public", "$PSScriptRoot\Api\Functions\Private", # Connection - "$PSScriptRoot\Connection\Functions\Public", "$PSScriptRoot\Connection\Functions\Private", # Resources @@ -22,12 +20,9 @@ $functionSubDirectoryPaths = @( "$PSScriptRoot\Resources\Functions\Private", # Server - "$PSScriptRoot\Server\Functions\Public", - "$PSScriptRoot\Server\Functions\Private", # Services - "$PSScriptRoot\Services\Functions\Public", - "$PSScriptRoot\Services\Functions\Private" + "$PSScriptRoot\Services\Functions\Public" ) $functions = Get-ChildItem -Path $functionSubDirectoryPaths -Recurse -Include "*.ps1" From cd52edaea2f23a2e4d38561ef27107902ef846d2 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 20 Nov 2020 19:27:01 +0000 Subject: [PATCH 601/611] Moved 'AzureDevOpsDsc.strings.psd1' --- .../AzureDevOpsDsc.Common => }/en-US/AzureDevOpsDsc.strings.psd1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename source/{Modules/AzureDevOpsDsc.Common => }/en-US/AzureDevOpsDsc.strings.psd1 (100%) diff --git a/source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 b/source/en-US/AzureDevOpsDsc.strings.psd1 similarity index 100% rename from source/Modules/AzureDevOpsDsc.Common/en-US/AzureDevOpsDsc.strings.psd1 rename to source/en-US/AzureDevOpsDsc.strings.psd1 From de1a56ef0ce0b8222a8b3f1748acca714df4ed06 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 20 Nov 2020 19:35:03 +0000 Subject: [PATCH 602/611] Added comment into 'AzureDevOpsDsc.psm1' --- source/AzureDevOpsDsc.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/AzureDevOpsDsc.psm1 b/source/AzureDevOpsDsc.psm1 index 139597f9c..94f810e7a 100644 --- a/source/AzureDevOpsDsc.psm1 +++ b/source/AzureDevOpsDsc.psm1 @@ -1,2 +1,2 @@ - +# Note: This content will get replaced as part of the module build. Do not add to this file. From 68ad0606c317bf90c3136cc0cf9d6ce2248591fd Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 20 Nov 2020 19:37:32 +0000 Subject: [PATCH 603/611] Updated 'moduleVersion' to '0.0.0' --- source/AzureDevOpsDsc.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/AzureDevOpsDsc.psd1 b/source/AzureDevOpsDsc.psd1 index 388ddc87e..8ca41f87d 100644 --- a/source/AzureDevOpsDsc.psd1 +++ b/source/AzureDevOpsDsc.psd1 @@ -2,7 +2,7 @@ RootModule = 'AzureDevOpsDsc.psm1' # Version number of this module. - moduleVersion = '0.0.3' + moduleVersion = '0.0.0' # ID used to uniquely identify this module GUID = '3f8bbada-0fa9-4d80-b3d8-f019c3c60230' From a7f5e2756ff62582c0f1be301941a84a77cda66b Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Fri, 20 Nov 2020 19:44:49 +0000 Subject: [PATCH 604/611] Updated 'CHANGELOG.md' to update 'Unreleased' section --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b83fa0dc..c5aeff742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- AzureDevOpsDsc + - Added the `AzDevOpsProject`, DSC Resource + +- AzureDevOpsDsc.Common + - Added 'wrapper' functionality around the [Azure DevOps REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) + ### Added - AzureDevOpsDsc - Added GitHub issue templates and pull request template ([issue #1](https://github.com/dsccommunity/AzureDevOpsDsc/issues/1)) - - Added 'wrapper' functionality around the [Azure DevOps REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) - - Added the `AzDevOpsProject`, DSC Resource From 713ff6c825c0707302f5ba70b425b69b5da7264d Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Wed, 25 Nov 2020 18:48:10 +0000 Subject: [PATCH 605/611] Deleted 'Other' directory contents/readmes --- .../AzDevOpsProject/README.md | 64 ------------------- source/Other/DSCClassResources/README.md | 7 -- source/Other/DSCResources/README.md | 6 -- source/Other/Enums/Ensure/README.md | 14 ---- source/Other/Enums/README.md | 4 -- source/Other/Enums/RequiredAction/README.md | 19 ------ 6 files changed, 114 deletions(-) delete mode 100644 source/Other/DSCClassResources/AzDevOpsProject/README.md delete mode 100644 source/Other/DSCClassResources/README.md delete mode 100644 source/Other/DSCResources/README.md delete mode 100644 source/Other/Enums/Ensure/README.md delete mode 100644 source/Other/Enums/README.md delete mode 100644 source/Other/Enums/RequiredAction/README.md diff --git a/source/Other/DSCClassResources/AzDevOpsProject/README.md b/source/Other/DSCClassResources/AzDevOpsProject/README.md deleted file mode 100644 index 32a304779..000000000 --- a/source/Other/DSCClassResources/AzDevOpsProject/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Description - -The `AzDevOpsProject`, DSC Resource sets `Project` resources within Azure DevOps -Server/Services. - -This DSC Resource uses both `ProjectId` and `ProjectName` as forms of unique -identification of a `Project` although the `ProjectName` must be unique across -all projects within the `Organization` (in Azure DevOps Services) or the -`Collection` (in Azure DevOps Server). - -Azure DevOps generates the `ProjectId` when creating the `Project` resource so, -typically, `ProjectId` will not be assigned a property value within a -configuration but this property can be referenced by other DSC Resources defined -in a configuration. - ->**Note:** This DSC Resource does *not* support the changes to the type of -> source control used by a `Project` (defined by the `SourceControlType` -> property) - The Azure DevOps REST API does not currently support this -> operation. -> -> Any attempt to update an existing `Project` created with one -> `SourceControlType` (e.g. `Git`) to another (e.g. `Tfvc`) will throw an -> exception. - -## Permissions - -* Any Personal Access Token (PAT) being used to manage this `AzDevOpsProject`, - DSC Resource must have the following permissions configured in Azure DevOps: - * **Project and Team** (Read, write and manage) - -* Information on creating a Personal Access Token (PAT) can be found [here](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate) -(as part of the [Azure DevOps documentation](https://docs.microsoft.com/en-us/azure/devops/?view=azure-devops) -maintained by Microsoft). - -## Requirements - -There are no specific requirements (in addition to the required permissions -within Azure DevOps) for this DSC Resource. - -## Examples - -Examples of usage of the `AzDevOpsProject`, DSC Resource within a DSC -configuration can be found [here](../../../Examples/Resources/AzDevOpsProject). - -## Related Commands - -The embedded, `AzureDevOpsDsc.Common`, module exports the following commands -which relate to this DSC Resource: - -* `Get-AzDevOpsProject` -* `Set-AzDevOpsProject` -* `Remove-AzDevOpsProject` - -The DSC Resource uses these commands directly so they can be considered tested, -stable, maintained and supported as part of the `AzureDevOpsDsc` module. - -## Azure DevOps Services REST API - -The overview page (within the [Azure DevOps Services REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) dcoumentation maintained by Microsoft) for the Azure DevOps, `Project` -resource behind this DSC Resource is [here](https://docs.microsoft.com/en-us/rest/api/azure/devops/core/projects). - -## Known issues - -All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+AzDevOpsProject). diff --git a/source/Other/DSCClassResources/README.md b/source/Other/DSCClassResources/README.md deleted file mode 100644 index 441fb3231..000000000 --- a/source/Other/DSCClassResources/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Description - -This directory (`DSCClassResources`) contains all the DSC Resources defined in -the `AzureDevOpsDsc` module. - -All DSC Resources within this module should be defined as class-based, DSC -Resources (and not MOF-based ones). diff --git a/source/Other/DSCResources/README.md b/source/Other/DSCResources/README.md deleted file mode 100644 index 1e79e1c52..000000000 --- a/source/Other/DSCResources/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Description - -This directory (`DSCResources`) should contain no DSC Resources. All DSC -Resources within the `AzureDevOpsDsc` module should be defined as class-based, -DSC Resources and be present in the `DSCClassResources` subdirectory ([here](../DSCClassResources)) -within this module. diff --git a/source/Other/Enums/Ensure/README.md b/source/Other/Enums/Ensure/README.md deleted file mode 100644 index 67b98676d..000000000 --- a/source/Other/Enums/Ensure/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Description - -The `Ensure` enumeration (enum) defines a number of constants used to define -a resource's, desired presence or absence as part of a DSC Resource -configuration. - -Current values for `Ensure` are: - -* `Present` -* `Absent` - -## Known issues - -All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+Ensure). diff --git a/source/Other/Enums/README.md b/source/Other/Enums/README.md deleted file mode 100644 index 612bf2007..000000000 --- a/source/Other/Enums/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Description - -This directory (`Enums`) contains all the enumerations (enums) defined and used -in the `AzureDevOpsDsc` module (and it's classes and DSC Resources). diff --git a/source/Other/Enums/RequiredAction/README.md b/source/Other/Enums/RequiredAction/README.md deleted file mode 100644 index 600e797c9..000000000 --- a/source/Other/Enums/RequiredAction/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Description - -The `RequiredAction` enumeration (enum) defines a number of constants used to -define the action required to ensure the desired state of a DSC Resource can be -actioned. - -Current values for `RequiredAction` are: - -* `None` -* `Get` -* `New` -* `Set` -* `Remove` -* `Test` -* `Error` - -## Known issues - -All issues are not listed here, see [here for all open issues](https://github.com/dsccommunity/AzureDevOpsDsc/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+RequiredAction). From 6f57b466058175c51f4745cfef269e5f9abe588b Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sun, 24 Jan 2021 12:22:04 +0100 Subject: [PATCH 606/611] Fix coverage threshold --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index c9f31cd68..aa23ce37f 100644 --- a/build.yaml +++ b/build.yaml @@ -70,7 +70,7 @@ Pester: - tests/Unit ExcludeTag: Tag: - CodeCoverageThreshold: 85 + CodeCoverageThreshold: 40 CodeCoverageOutputFile: CodeCoverage.JaCoCo.xml CodeCoverageOutputFileEncoding: ascii From 470676c38291b4cf599dfa51f29635a3b4bfbbe0 Mon Sep 17 00:00:00 2001 From: Paul Wilcox Date: Sun, 24 Jan 2021 11:27:23 +0000 Subject: [PATCH 607/611] Updated 'CodeCoverageThreshold' to 40 in 'build.yml' --- build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.yaml b/build.yaml index 856074f06..9d08bb867 100644 --- a/build.yaml +++ b/build.yaml @@ -70,7 +70,7 @@ Pester: - tests/Unit ExcludeTag: Tag: - CodeCoverageThreshold: 85 + CodeCoverageThreshold: 40 CodeCoverageOutputFile: CodeCoverage.JaCoCo.xml CodeCoverageOutputFileEncoding: ascii From 30a6a6a61b6dccf5e480018c48627b4de387920a Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sun, 24 Jan 2021 12:50:51 +0100 Subject: [PATCH 608/611] Fix typo in build.ps1 --- build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.ps1 b/build.ps1 index a9921759f..4630cb82d 100644 --- a/build.ps1 +++ b/build.ps1 @@ -228,7 +228,7 @@ Begin if (-not $config -or ($config -is [array] -and $config.Length -le 0)) { throw "No build configuration found. Specify path via -BuildConfig" } - elseIf ($config -is [array]) { + elseif ($config -is [array]) { if ($config.Length -gt 1) { throw "More than one build configuration found. Specify which one to use via -BuildConfig" } From 5774a4171ad46a057076235fb1c9612d0c5b2e6d Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sun, 24 Jan 2021 12:51:09 +0100 Subject: [PATCH 609/611] Update CHANGELOG.md --- CHANGELOG.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f196bfa4d..1d40af3d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,14 +5,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- AzureDevOpsDsc - - Added the `AzDevOpsProject`, DSC Resource - -- AzureDevOpsDsc.Common - - Added 'wrapper' functionality around the [Azure DevOps REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) - ### Added - AzureDevOpsDsc - Updated pipeline files to support change of default branch to main. - Added GitHub issue templates and pull request template ([issue #1](https://github.com/dsccommunity/AzureDevOpsDsc/issues/1)) + - Added the `AzDevOpsProject`, DSC Resource +- AzureDevOpsDsc.Common + - Added 'wrapper' functionality around the [Azure DevOps REST API](https://docs.microsoft.com/en-us/rest/api/azure/devops/) From 37d4d1d718a5b83fa38ebb05708f3467fcc496d2 Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sun, 24 Jan 2021 12:51:24 +0100 Subject: [PATCH 610/611] Disable integraiton test --- azure-pipelines.yml | 49 ++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b038278dd..d2c939476 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -164,31 +164,34 @@ stages: script: 'winrm quickconfig -quiet' pwsh: false - - powershell: | - ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( - 'tests/Integration/' - ) - name: test - displayName: 'Run Integration Tests' - env: - azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) - azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) + # TODO: Current disabled due to integration tests throws the exception: + # "Cannot validate argument on parameter 'Pat'. The " Test-AzDevOpsPat -Pat $_ -IsValid " validation script for the argument with value "$(AzureDevOps.Integration.Pat)" did not return a result of True. Determine why the validation script failed, and then try the command again." - - task: PublishTestResults@2 - displayName: 'Publish Test Results' - condition: succeededOrFailed() - inputs: - testResultsFormat: 'NUnit' - testResultsFiles: 'output/testResults/NUnit*.xml' - testRunTitle: 'Windows Server Core (PowerShell Core) - Integration' + # - powershell: | + # ./build.ps1 -Tasks test -CodeCoverageThreshold 0 -PesterScript @( + # 'tests/Integration/' + # ) + # name: test + # displayName: 'Run Integration Tests' + # env: + # azureDevOpsIntegrationApiUri: $(AzureDevOps.Integration.ApiUri) + # azureDevOpsIntegrationPat: $(AzureDevOps.Integration.Pat) - - task: PublishCodeCoverageResults@1 - displayName: 'Publish Code Coverage' - condition: succeededOrFailed() - inputs: - codeCoverageTool: 'JaCoCo' - summaryFileLocation: 'output/testResults/CodeCov*.xml' - pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' + # - task: PublishTestResults@2 + # displayName: 'Publish Test Results' + # condition: succeededOrFailed() + # inputs: + # testResultsFormat: 'NUnit' + # testResultsFiles: 'output/testResults/NUnit*.xml' + # testRunTitle: 'Windows Server Core (PowerShell Core) - Integration' + + # - task: PublishCodeCoverageResults@1 + # displayName: 'Publish Code Coverage' + # condition: succeededOrFailed() + # inputs: + # codeCoverageTool: 'JaCoCo' + # summaryFileLocation: 'output/testResults/CodeCov*.xml' + # pathToSources: '$(Build.SourcesDirectory)/output/$(dscBuildVariable.RepositoryName)' - job: test_unit_windows_ps condition: succeededOrFailed() From c54137b934e829518dbbe7f75e6cb97a6377de4f Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sun, 24 Jan 2021 12:51:40 +0100 Subject: [PATCH 611/611] Add separate job for HQRM test --- azure-pipelines.yml | 27 +++++++++++++++++++++++++++ build.yaml | 1 - 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d2c939476..ddd2d4ca2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -46,6 +46,33 @@ stages: - stage: Test dependsOn: Build jobs: + - job: Test_HQRM + displayName: 'HQRM' + pool: + vmImage: 'windows-2019' + timeoutInMinutes: 0 + steps: + - task: DownloadBuildArtifacts@0 + displayName: 'Download Build Artifact' + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'output' + downloadPath: '$(Build.SourcesDirectory)' + - task: PowerShell@2 + name: test + displayName: 'Run HQRM Test' + inputs: + filePath: './build.ps1' + arguments: '-Tasks hqrmtest' + pwsh: false + - task: PublishTestResults@2 + displayName: 'Publish Test Results' + condition: succeededOrFailed() + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: 'output/testResults/NUnit*.xml' + testRunTitle: 'HQRM' - job: test_unit_linux condition: succeededOrFailed() displayName: 'Linux - Unit Tests' diff --git a/build.yaml b/build.yaml index aa23ce37f..ceb932b0f 100644 --- a/build.yaml +++ b/build.yaml @@ -50,7 +50,6 @@ BuildWorkflow: test: - Pester_Tests_Stop_On_Fail - Pester_if_Code_Coverage_Under_Threshold - - hqrmtest publish: - Publish_release_to_GitHub