Skip to content

Commit e89cb5e

Browse files
feat(migration): Convert Get-DbaComputerCertificate to C# binary cmdlet
- All parameters preserved (ComputerName, Credential, Store, Folder, Path, Type, Thumbprint) - All code paths implemented including Store/Folder "All" expansion - Fixed $Type not being passed to remote scriptblock (PS1 bug) - Build passes on both net472 and net8.0 - C# unit tests written and passing (12 tests) - Pester integration tests pass (1/1, 3 skipped on pwsh 7+) - Feature parity verified at 100% - PS1 retired, cmdlet exported from dbatools.library Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0667d98 commit e89cb5e

4 files changed

Lines changed: 530 additions & 1 deletion

File tree

dbatools.library.psd1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
'Get-DbaClientProtocol',
8080
'Get-DbaCmConnection',
8181
'Get-DbaCmObject',
82+
'Get-DbaComputerCertificate',
8283
'Get-DbaCpuRingBuffer',
8384
'Get-DbaCpuUsage',
8485
'Get-DbaDeprecatedFeature',

docs/plan/TRACKER-MIGRATE-COMPUTER.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
| 2 | Get-DbaClientProtocol | DONE | GetDbaClientProtocolCommand.cs | OK | 100% | 1/1 (1 skipped) | Read-only, no deps |
1212
| 3 | Get-DbaCmConnection | DONE | GetDbaCmConnectionCommand.cs | OK | 100% | 3/3 | Read-only, no deps |
1313
| 4 | Get-DbaCmObject | DONE | GetDbaCmObjectCommand.cs | OK | 100% | 2/2 (2 test-adapt) | Read-only, no deps |
14-
| 5 | Get-DbaComputerCertificate | PENDING | | | | | Read-only, no deps |
14+
| 5 | Get-DbaComputerCertificate | DONE | GetDbaComputerCertificateCommand.cs | OK | 100% | 1/1 (3 skipped) | Read-only, no deps |
1515
| 6 | Get-DbaComputerSystem | PENDING | | | | | Read-only, no deps |
1616
| 7 | Get-DbaDiskSpace | PENDING | | | | | Read-only, no deps |
1717
| 8 | Get-DbaLocaleSetting | PENDING | | | | | Read-only, no deps |
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
using System;
2+
using System.Collections.ObjectModel;
3+
using System.Management.Automation;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using Dataplat.Dbatools.Commands;
6+
7+
namespace Dataplat.Dbatools.Tests.Commands
8+
{
9+
[TestClass]
10+
public class GetDbaComputerCertificateCommandTests
11+
{
12+
#region ConvertPSObjectsToStringArray
13+
[TestMethod]
14+
public void ConvertPSObjectsToStringArray_NullInput_ReturnsNull()
15+
{
16+
var result = GetDbaComputerCertificateCommand.ConvertPSObjectsToStringArray(null);
17+
Assert.IsNull(result);
18+
}
19+
20+
[TestMethod]
21+
public void ConvertPSObjectsToStringArray_EmptyCollection_ReturnsNull()
22+
{
23+
var collection = new Collection<PSObject>();
24+
var result = GetDbaComputerCertificateCommand.ConvertPSObjectsToStringArray(collection);
25+
Assert.IsNull(result);
26+
}
27+
28+
[TestMethod]
29+
public void ConvertPSObjectsToStringArray_SingleItem_ReturnsSingleElementArray()
30+
{
31+
var collection = new Collection<PSObject>();
32+
collection.Add(new PSObject("LocalMachine"));
33+
var result = GetDbaComputerCertificateCommand.ConvertPSObjectsToStringArray(collection);
34+
Assert.IsNotNull(result);
35+
Assert.AreEqual(1, result.Length);
36+
Assert.AreEqual("LocalMachine", result[0]);
37+
}
38+
39+
[TestMethod]
40+
public void ConvertPSObjectsToStringArray_MultipleItems_ReturnsAllElements()
41+
{
42+
var collection = new Collection<PSObject>();
43+
collection.Add(new PSObject("LocalMachine"));
44+
collection.Add(new PSObject("CurrentUser"));
45+
var result = GetDbaComputerCertificateCommand.ConvertPSObjectsToStringArray(collection);
46+
Assert.IsNotNull(result);
47+
Assert.AreEqual(2, result.Length);
48+
Assert.AreEqual("LocalMachine", result[0]);
49+
Assert.AreEqual("CurrentUser", result[1]);
50+
}
51+
52+
[TestMethod]
53+
public void ConvertPSObjectsToStringArray_NullElement_ReturnsNullInArray()
54+
{
55+
var collection = new Collection<PSObject>();
56+
collection.Add(new PSObject("My"));
57+
collection.Add(null);
58+
collection.Add(new PSObject("Root"));
59+
var result = GetDbaComputerCertificateCommand.ConvertPSObjectsToStringArray(collection);
60+
Assert.IsNotNull(result);
61+
Assert.AreEqual(3, result.Length);
62+
Assert.AreEqual("My", result[0]);
63+
Assert.IsNull(result[1]);
64+
Assert.AreEqual("Root", result[2]);
65+
}
66+
#endregion
67+
68+
#region GetCertRetrievalScript
69+
[TestMethod]
70+
public void GetCertRetrievalScript_ReturnsNonEmptyScript()
71+
{
72+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
73+
Assert.IsFalse(String.IsNullOrWhiteSpace(script));
74+
}
75+
76+
[TestMethod]
77+
public void GetCertRetrievalScript_ContainsPathHandling()
78+
{
79+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
80+
Assert.IsTrue(script.Contains("if ($Path)"));
81+
Assert.IsTrue(script.Contains("ReadAllBytes"));
82+
}
83+
84+
[TestMethod]
85+
public void GetCertRetrievalScript_ContainsThumbprintFiltering()
86+
{
87+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
88+
Assert.IsTrue(script.Contains("if ($Thumbprint)"));
89+
Assert.IsTrue(script.Contains("Where-Object Thumbprint -in $Thumbprint"));
90+
}
91+
92+
[TestMethod]
93+
public void GetCertRetrievalScript_ContainsServiceTypeFiltering()
94+
{
95+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
96+
// Server Authentication OID (escaped regex pattern in the script)
97+
Assert.IsTrue(script.Contains(@"1\.3\.6\.1\.5\.5\.7\.3\.1"));
98+
Assert.IsTrue(script.Contains("$Type -eq 'Service'"));
99+
}
100+
101+
[TestMethod]
102+
public void GetCertRetrievalScript_ContainsNotePropertyAdditions()
103+
{
104+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
105+
Assert.IsTrue(script.Contains("NotePropertyName Algorithm"));
106+
Assert.IsTrue(script.Contains("NotePropertyName ComputerName"));
107+
Assert.IsTrue(script.Contains("NotePropertyName Name"));
108+
Assert.IsTrue(script.Contains("NotePropertyName Store"));
109+
Assert.IsTrue(script.Contains("NotePropertyName Folder"));
110+
}
111+
112+
[TestMethod]
113+
public void GetCertRetrievalScript_ContainsCoreCertificateFunctions()
114+
{
115+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
116+
Assert.IsTrue(script.Contains("function Get-CoreCertStore"));
117+
Assert.IsTrue(script.Contains("function Get-CoreCertificate"));
118+
}
119+
120+
[TestMethod]
121+
public void GetCertRetrievalScript_IsParsableAsScriptBlock()
122+
{
123+
var script = GetDbaComputerCertificateCommand.GetCertRetrievalScript();
124+
// This will throw if the script is not valid PowerShell
125+
var sb = ScriptBlock.Create(script);
126+
Assert.IsNotNull(sb);
127+
}
128+
#endregion
129+
}
130+
}

0 commit comments

Comments
 (0)