Skip to content

Commit c7ddd5f

Browse files
merillCopilot
andauthored
refactor: rename Azure DevOps connection cache (#1864)
* refactor: rename Azure DevOps connection cache * test: scope Azure DevOps connection stubs to module --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent 01999e9 commit c7ddd5f

5 files changed

Lines changed: 82 additions & 12 deletions

File tree

build/Build-MaesterModule.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ $__MtSession = @{
476476
ExoCache = @{}
477477
OrcaCache = @{}
478478
AIAgentInfo = $null
479-
AzureDevOpsConnection = $null
479+
AzureDevOpsConnectionCache = $null
480480
DataverseApiBase = $null # Resolved Dataverse OData API base URL (e.g. https://org123.api.crm.dynamics.com/api/data/v9.2)
481481
DataverseResourceUrl = $null # Dataverse resource URL for token acquisition (e.g. https://org123.crm.dynamics.com)
482482
DataverseEnvironmentId = $null # Environment identifier for display (e.g. org123.crm.dynamics.com)

powershell/Maester.psm1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ $__MtSession = @{
2222
ExoCache = @{}
2323
OrcaCache = @{}
2424
AIAgentInfo = $null
25+
AzureDevOpsConnectionCache = $null
2526
DataverseApiBase = $null # Resolved Dataverse OData API base URL (e.g. https://org123.api.crm.dynamics.com/api/data/v9.2)
2627
DataverseResourceUrl = $null # Dataverse resource URL for token acquisition (e.g. https://org123.crm.dynamics.com)
2728
DataverseEnvironmentId = $null # Environment identifier for display (e.g. org123.crm.dynamics.com)

powershell/internal/Clear-ModuleVariable.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
Clear-MtDnsCache
2121
Clear-MtExoCache
2222
$__MtSession.AIAgentInfo = $null
23-
$__MtSession.AzureDevOpsConnection = $null
23+
$__MtSession.AzureDevOpsConnectionCache = $null
2424
# Invoke-Maester resets the per-run cache but preserves the existing GitHub session.
2525
# Disconnect-MtGitHub, including through Disconnect-Maester, owns clearing GitHubConnection and GitHubAuthHeader.
2626
$__MtSession.GitHubCache = @{}

powershell/public/core/Test-MtConnection.ps1

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,12 @@
174174
#region AzureDevOps
175175
if ($Service -contains 'AzureDevOps' -or $Service -contains 'All') {
176176
$IsConnected = $false
177-
if ($null -ne $__MtSession.AzureDevOpsConnection) {
177+
if ($null -ne $__MtSession.AzureDevOpsConnectionCache) {
178178
# Use cached probe result to avoid re-running the connection check on every test.
179-
if ($__MtSession.AzureDevOpsConnection -is [string] -and $__MtSession.AzureDevOpsConnection -eq 'NotConnected') {
179+
if ($__MtSession.AzureDevOpsConnectionCache -is [string] -and $__MtSession.AzureDevOpsConnectionCache -eq 'NotConnected') {
180180
$IsConnected = $false
181181
} else {
182-
$MtConnections.AzureDevOps = $__MtSession.AzureDevOpsConnection
182+
$MtConnections.AzureDevOps = $__MtSession.AzureDevOpsConnectionCache
183183
$IsConnected = $true
184184
}
185185
} else {
@@ -188,7 +188,7 @@
188188
$connection = Get-ADOPSConnection
189189
if ($null -ne $connection -and $null -ne $connection['Organization']) {
190190
$MtConnections.AzureDevOps = $connection
191-
$__MtSession.AzureDevOpsConnection = $connection
191+
$__MtSession.AzureDevOpsConnectionCache = $connection
192192
$IsConnected = $true
193193
}
194194
}
@@ -197,7 +197,7 @@
197197
}
198198
if (-not $IsConnected) {
199199
# Cache negative result so subsequent calls skip the probe.
200-
$__MtSession.AzureDevOpsConnection = 'NotConnected'
200+
$__MtSession.AzureDevOpsConnectionCache = 'NotConnected'
201201
}
202202
}
203203
Write-Verbose "AzureDevOps: $IsConnected"

powershell/tests/functions/Test-MtConnection.Tests.ps1

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ Describe 'Test-MtConnection — GitHub service' {
2323
BeforeEach {
2424
InModuleScope Maester {
2525
$__MtSession.GitHubConnection = $null
26-
$__MtSession.AzureDevOpsConnection = $null
26+
$__MtSession.AzureDevOpsConnectionCache = $null
2727
}
2828
}
2929

3030
AfterEach {
3131
InModuleScope Maester {
3232
$__MtSession.GitHubConnection = $null
33-
$__MtSession.AzureDevOpsConnection = $null
33+
$__MtSession.AzureDevOpsConnectionCache = $null
3434
}
3535
}
3636

@@ -112,7 +112,7 @@ Describe 'Test-MtConnection — GitHub service' {
112112
It 'Returns AllConnected $true when all included services are connected and GitHub session is absent' {
113113
InModuleScope Maester {
114114
$__MtSession.GitHubConnection = $null
115-
$__MtSession.AzureDevOpsConnection = [PSCustomObject]@{ Organization = 'ado-org' }
115+
$__MtSession.AzureDevOpsConnectionCache = [PSCustomObject]@{ Organization = 'ado-org' }
116116
}
117117
Mock Get-AzContext { [PSCustomObject]@{ Account = 'test@contoso.com' } } -ModuleName Maester
118118
Mock Invoke-AzRestMethod { [PSCustomObject]@{} } -ModuleName Maester
@@ -138,7 +138,7 @@ Describe 'Test-MtConnection — GitHub service' {
138138
It 'does not set the GitHub details property' {
139139
InModuleScope Maester {
140140
$__MtSession.GitHubConnection = [PSCustomObject]@{ Connected = $false; FailureReason = 'NotCalled' }
141-
$__MtSession.AzureDevOpsConnection = 'NotConnected'
141+
$__MtSession.AzureDevOpsConnectionCache = 'NotConnected'
142142
}
143143
Mock Get-AzContext { $null } -ModuleName Maester
144144
Mock Get-MgContext { $null } -ModuleName Maester
@@ -183,7 +183,7 @@ Describe 'Test-MtConnection — GitHub service' {
183183
It 'Does not populate the GitHub property' {
184184
InModuleScope Maester {
185185
$__MtSession.GitHubConnection = [PSCustomObject]@{ Connected = $true; Organization = 'myorg' }
186-
$__MtSession.AzureDevOpsConnection = 'NotConnected'
186+
$__MtSession.AzureDevOpsConnectionCache = 'NotConnected'
187187
}
188188
Mock Get-AzContext { $null } -ModuleName Maester
189189
Mock Get-MgContext { $null } -ModuleName Maester
@@ -194,3 +194,72 @@ Describe 'Test-MtConnection — GitHub service' {
194194
}
195195
}
196196
}
197+
198+
Describe 'Test-MtConnection AzureDevOps cache' {
199+
BeforeEach {
200+
InModuleScope Maester {
201+
$__MtSession.AzureDevOpsConnectionCache = $null
202+
$__MtSession.Remove('AzureDevOpsConnection')
203+
}
204+
}
205+
206+
AfterEach {
207+
InModuleScope Maester {
208+
Remove-Item -Path function:Get-ADOPSConnection -ErrorAction SilentlyContinue
209+
$__MtSession.AzureDevOpsConnectionCache = $null
210+
$__MtSession.Remove('AzureDevOpsConnection')
211+
}
212+
}
213+
214+
It 'caches a successful Azure DevOps probe under a cache-specific key' {
215+
$result = InModuleScope Maester {
216+
New-Item -Path function:Get-ADOPSConnection -Value { @{ Organization = 'ado-org' } } -Force | Out-Null
217+
Test-MtConnection -Service AzureDevOps -Details
218+
}
219+
220+
$result.AllConnected | Should -BeTrue
221+
$result.AzureDevOps['Organization'] | Should -Be 'ado-org'
222+
InModuleScope Maester {
223+
$__MtSession.AzureDevOpsConnectionCache['Organization'] | Should -Be 'ado-org'
224+
$__MtSession.ContainsKey('AzureDevOpsConnection') | Should -BeFalse
225+
}
226+
}
227+
228+
It 'caches a failed Azure DevOps probe as NotConnected' {
229+
$result = InModuleScope Maester {
230+
New-Item -Path function:Get-ADOPSConnection -Value { $null } -Force | Out-Null
231+
Test-MtConnection -Service AzureDevOps -Details
232+
}
233+
234+
$result.AllConnected | Should -BeFalse
235+
$result.AzureDevOps | Should -BeNullOrEmpty
236+
InModuleScope Maester {
237+
$__MtSession.AzureDevOpsConnectionCache | Should -Be 'NotConnected'
238+
$__MtSession.ContainsKey('AzureDevOpsConnection') | Should -BeFalse
239+
}
240+
}
241+
242+
It 'uses the cached Azure DevOps probe result without re-querying the external command' {
243+
InModuleScope Maester {
244+
$__MtSession.AzureDevOpsConnectionCache = @{ Organization = 'cached-org' }
245+
}
246+
$result = InModuleScope Maester {
247+
New-Item -Path function:Get-ADOPSConnection -Value { throw 'Get-ADOPSConnection should not be called when cache exists.' } -Force | Out-Null
248+
Test-MtConnection -Service AzureDevOps -Details
249+
}
250+
251+
$result.AllConnected | Should -BeTrue
252+
$result.AzureDevOps['Organization'] | Should -Be 'cached-org'
253+
}
254+
255+
It 'clears the Azure DevOps probe cache during module-variable reset' {
256+
InModuleScope Maester {
257+
$__MtSession.AzureDevOpsConnectionCache = @{ Organization = 'cached-org' }
258+
259+
Clear-ModuleVariable
260+
261+
$__MtSession.AzureDevOpsConnectionCache | Should -BeNullOrEmpty
262+
$__MtSession.ContainsKey('AzureDevOpsConnection') | Should -BeFalse
263+
}
264+
}
265+
}

0 commit comments

Comments
 (0)