using SheetMe.Core.Catalog; namespace SheetMe.Core.Tests; /// /// 싸인 이미지 경로 판정 — 파일서버 전송(ActiveX)을 옮기지 않았으므로 /// "받지 않고 찾는" 규칙이 값의 유무를 가른다. DB·파일 없이 검증한다. /// [TestClass] public sealed class SignatureImagePathTests { #region Methods private const string Install = @"C:\MsystechHIS_Ver.2"; private const string Remote = @"C:\Sign\Server\hong.tif"; private static readonly string Cached = @"C:\MsystechHIS_Ver.2\Tmp\DownLoadedFiles\Signature\hong.tif"; [TestMethod] public void 레거시가_받아둔_캐시가_있으면_그것을_쓴다() { var result = SignatureImagePath.Resolve(Remote, Install, p => p == Cached); Assert.AreEqual(SignatureImageOrigin.LegacyCache, result.Origin); Assert.AreEqual(Cached, result.LocalPath); Assert.AreEqual("hong.tif", result.FileName); } [TestMethod] public void 캐시가_없으면_DB_경로_자체를_본다() { var result = SignatureImagePath.Resolve(Remote, Install, p => p == Remote); Assert.AreEqual(SignatureImageOrigin.DirectPath, result.Origin); Assert.AreEqual(Remote, result.LocalPath); } [TestMethod] public void 캐시가_원격보다_먼저다() { // 둘 다 있으면 캐시 — 레거시가 그 폴더에 받아 두고 그 경로를 돌려준다 var result = SignatureImagePath.Resolve(Remote, Install, _ => true); Assert.AreEqual(SignatureImageOrigin.LegacyCache, result.Origin); } [TestMethod] public void 둘_다_없으면_없음이고_파일명은_남는다() { // 파일명은 사유 문구에 쓴다 — "무엇을 못 찾았는지" 를 말할 수 있어야 한다 var result = SignatureImagePath.Resolve(Remote, Install, _ => false); Assert.AreEqual(SignatureImageOrigin.None, result.Origin); Assert.AreEqual(string.Empty, result.LocalPath); Assert.AreEqual("hong.tif", result.FileName); } [TestMethod] public void 경로가_비면_아무것도_찾지_않는다() { var result = SignatureImagePath.Resolve(" ", Install, _ => true); Assert.AreEqual(SignatureImageOrigin.None, result.Origin); Assert.AreEqual(string.Empty, result.FileName); } [TestMethod] public void 설치경로가_없으면_캐시를_보지_않는다() { // 레거시는 설치 경로가 없으면 "\Tmp\..." 라는 루트 상대경로를 만든다 — 그 결함은 안 옮긴다 Assert.AreEqual(string.Empty, SignatureImagePath.CacheFolder(null)); var result = SignatureImagePath.Resolve(Remote, null, p => p == Remote); Assert.AreEqual(SignatureImageOrigin.DirectPath, result.Origin); } [TestMethod] public void 공유_매핑이_서버경로를_UNC_로_바꾼다() { var map = new[] { @"D:\MsystechHIS=\\fs\MsystechHIS" }; Assert.AreEqual(@"\\fs\MsystechHIS\002\a.tif", SignatureImagePath.MapToShare(@"D:\MsystechHIS\002\a.tif", map)); // 대소문자 무시 — 병원 데이터의 표기가 제각각이다 Assert.AreEqual(@"\\fs\MsystechHIS\002\a.tif", SignatureImagePath.MapToShare(@"d:\msystechhis\002\a.tif", map)); // 대응 없는 접두는 빈 문자열(엉뚱한 경로를 만들지 않는다) Assert.AreEqual(string.Empty, SignatureImagePath.MapToShare(@"E:\other\a.tif", map)); } [TestMethod] public void 접두가_겹치면_긴_쪽이_이긴다() { // 짧은 접두가 먼저 걸리면 더 정확한 대응이 묻힌다 var map = new[] { @"D:\HIS=\\fs\all", @"D:\HIS\Sign=\\fs\sign" }; Assert.AreEqual(@"\\fs\sign\a.tif", SignatureImagePath.MapToShare(@"D:\HIS\Sign\a.tif", map)); Assert.AreEqual(@"\\fs\all\Etc\b.tif", SignatureImagePath.MapToShare(@"D:\HIS\Etc\b.tif", map)); } [TestMethod] public void 설정_오타는_값으로_바꾸지_않는다() { // '=' 가 없거나 한쪽이 비면 그 항목은 무시한다 — 반쪽 경로를 만들면 조용히 틀린다 var map = new[] { "그냥문자열", @"D:\HIS=", @"=\\fs\x" }; Assert.AreEqual(string.Empty, SignatureImagePath.MapToShare(@"D:\HIS\a.tif", map)); } [TestMethod] public void 캐시가_없으면_공유를_먼저_보고_직접경로는_그_다음이다() { var map = new[] { @"D:\MsystechHIS=\\fs\MsystechHIS" }; var remote = @"D:\MsystechHIS\002\a.tif"; var shared = @"\\fs\MsystechHIS\002\a.tif"; // 공유에 있으면 공유 var viaShare = SignatureImagePath.Resolve(remote, Install, p => p == shared, map); Assert.AreEqual(SignatureImageOrigin.Share, viaShare.Origin); Assert.AreEqual(shared, viaShare.LocalPath); // 공유에 없고 원격 경로가 열리면 직접 var viaDirect = SignatureImagePath.Resolve(remote, Install, p => p == remote, map); Assert.AreEqual(SignatureImageOrigin.DirectPath, viaDirect.Origin); } [TestMethod] public void UNC_공유_경로도_파일명을_뗀다() { var unc = @"\\fileserver\sign\kim.jpg"; var result = SignatureImagePath.Resolve(unc, Install, p => p == unc); Assert.AreEqual(SignatureImageOrigin.DirectPath, result.Origin); Assert.AreEqual("kim.jpg", result.FileName); } #endregion }