@@ -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