using SheetMe.Core.Catalog; namespace SheetMe.Core.Tests; /// /// 환자 미리보기 접근 규칙 고정. /// /// 이 표가 느슨해지면 서식을 만드는 사람 누구나 운영 환자 기록을 열 수 있다. /// 레거시가 그 상태였다 — 인가코드가 소스에 평문이고, 검색 범위 무제한이고, 감사 0건이다. /// 검색 범위는 레거시와 같게 두기로 했으므로 감사와 권한이 유일한 장치다. /// [TestClass] public sealed class PatientPreviewPolicyTests { #region Methods [TestMethod] public void 미인증이면_볼_수_없다() { // 주체가 없으면 감사 로그에 남길 것이 없다 — 남길 수 없는 조회는 하지 않는다. Assert.IsFalse(PatientPreviewPolicy.CanPreviewPatient("ABC", "EDPS", string.Empty, string.Empty)); StringAssert.Contains( PatientPreviewPolicy.DenyReason("ABC", string.Empty, string.Empty), "HIS 사용자"); } [TestMethod] public void 수정_권한과_같은_축을_쓴다() { // 환자 기록을 보는 일은 지금 쓰이는 서식을 제자리에서 고치는 일과 무게가 다르지 않다. Assert.IsTrue(PatientPreviewPolicy.CanPreviewPatient("ABC", "EDPS", "011825", string.Empty)); Assert.IsFalse(PatientPreviewPolicy.CanPreviewPatient("ABC", "NURS", "011825", string.Empty)); Assert.IsTrue(PatientPreviewPolicy.CanPreviewPatient("HANKOOK", "SALO", "011825", string.Empty)); Assert.IsFalse(PatientPreviewPolicy.CanPreviewPatient("XYZ", "EDPS", "011825", "20250501")); } [TestMethod] public void 감사_한_줄에_주체와_내원이_들어간다() { var line = PatientPreviewPolicy.AuditLine("011825", "C12345"); StringAssert.Contains(line, "011825"); StringAssert.Contains(line, "C12345"); StringAssert.Contains(line, "환자 미리보기"); } [TestMethod] public void 감사_한_줄에_환자_이름은_넣지_않는다() { // 내원번호로 되짚을 수 있다. 로그 파일에 이름을 흘릴 이유가 없다 — // 로그는 오래 남고 접근 통제가 DB 보다 느슨하다. var line = PatientPreviewPolicy.AuditLine("011825", "C12345"); Assert.IsFalse(line.Contains("이름", StringComparison.Ordinal)); Assert.AreEqual(2, line.Split('=').Length - 1, $"항목이 둘(사용자·내원)이어야 한다: {line}"); } #endregion }