사용자 결정(②SMB 직접 접근)에 따라 구현. 실측 확인:
- 파일서버 = DB 서버와 같은 호스트, 전송 데몬 포트 2002 는 열림
- <b>SMB 445·139 는 닫힘</b>, UNC·관리공유 접근 모두 실패 → 서버측 조치 필요
- 서명 경로는 서버측 절대경로 D:\MsystechHIS\{사이트}\... (설정 루트 E:\msys\ 와 다름)
그래서 공유가 열리는 즉시 동작하도록 매핑을 넣었다:
Images:SignatureShareMap 에 "서버접두=UNC접두" 를 두면 해석 순서가
①레거시 캐시 ②공유(UNC) ③직접 경로가 된다. 접두는 대소문자 무시로
<b>긴 것부터</b> 맞추고(짧은 접두가 정확한 대응을 묻지 않게), '=' 없는
설정 오타는 무시한다(반쪽 경로를 만들면 조용히 틀린다). 자격증명은
설정에 담지 않는다 — 공유 접근은 단말 로그인 계정으로 붙는다.
진단 --db-filecfg 확장: 접속 <b>대상</b>(Type·IP·Port·FileDirectory)과
경로 접두 분포를 찍고(자격증명은 길이만), 공유 매핑별 접근 가능 여부와
파일서버 SMB(445) 개방 여부를 판정해 무엇을 열어야 하는지 알려 준다.
- dotnet test 358/358 (매핑 4건 추가: 치환·긴 접두 우선·오타 무시·해석 순서)
- --edit-smoke 실패 0 · --db-patient ①~㊲ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
124 lines
5.4 KiB
C#
124 lines
5.4 KiB
C#
using SheetMe.Core.Catalog;
|
|
|
|
namespace SheetMe.Core.Tests;
|
|
|
|
/// <summary>
|
|
/// 싸인 이미지 경로 판정 — 파일서버 전송(ActiveX)을 옮기지 않았으므로
|
|
/// "받지 않고 찾는" 규칙이 값의 유무를 가른다. DB·파일 없이 검증한다.
|
|
/// </summary>
|
|
[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
|
|
}
|