using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Client.Shared; namespace ZB.MOM.WW.OtOpcUa.Client.Shared.Tests; [Trait("Category", "Unit")] public sealed class ClientStoragePathsTests { [Fact] public void GetRoot_ReturnsCanonicalFolderName_UnderLocalAppData() { var root = ClientStoragePaths.GetRoot(); root.ShouldEndWith(ClientStoragePaths.CanonicalFolderName); root.ShouldContain(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)); } [Fact] public void GetPkiPath_NestsPkiUnderRoot() { var pki = ClientStoragePaths.GetPkiPath(); pki.ShouldEndWith(Path.Combine(ClientStoragePaths.CanonicalFolderName, "pki")); } [Fact] public void CanonicalFolderName_IsOtOpcUaClient() { ClientStoragePaths.CanonicalFolderName.ShouldBe("OtOpcUaClient"); } [Fact] public void LegacyFolderName_IsLmxOpcUaClient() { // The shim depends on this specific spelling — a typo here would leak the legacy // folder past the migration + break every dev-box upgrade. ClientStoragePaths.LegacyFolderName.ShouldBe("LmxOpcUaClient"); } [Fact] public void TryRunLegacyMigration_Returns_False_On_Repeat_Invocation() { // Once the guard in-process has fired, subsequent calls short-circuit to false // regardless of filesystem state. This is the behaviour that keeps the migration // cheap on hot paths (CertificateStorePath property getter is called frequently). _ = ClientStoragePaths.GetRoot(); // arms the guard ClientStoragePaths.TryRunLegacyMigration().ShouldBeFalse(); } }