fix #557: guide permission-driven VPD flow

This commit is contained in:
devmrko
2026-06-29 12:11:25 +09:00
parent fbe3d4682b
commit 908ac9a386
57 changed files with 1952 additions and 312 deletions

View File

@@ -25,7 +25,10 @@ class GuidedFlowTemplateTest {
String probe = template("probe.html");
String result = template("fragments/probe-result.html");
assertThat(probe).contains("name=\"bearerToken\"").doesNotContain("name=\"tokenKeyId\"");
assertThat(probe)
.contains("name=\"bearerToken\"")
.contains("임시 토큰 사용자")
.doesNotContain("name=\"tokenKeyId\"");
assertThat(result)
.contains("적용된 사용자와 권한")
.contains("다음에 할 일")
@@ -49,6 +52,63 @@ class GuidedFlowTemplateTest {
.contains("CB_AGENT_DOC_VPD_FILTER");
}
@Test
void ordsObjectPageSeparatesAccessFromColumnDisplayProtection() throws IOException {
String html = template("objects.html");
assertThat(html)
.contains("누가 어떤 행을 볼 수 있는지는 권한 규칙과 VPD에서 결정")
.contains("벡터 지식자료 검색 흐름")
.contains("VPD context 설정과 기본 SELECT")
.contains("전용 벡터 Handler 사용")
.contains("원문 표시 허용 컬럼")
.doesNotContain("표시 보호 등급", "마스킹 방식");
}
@Test
void permissionWizardExplainsTagRulesAndOrSemantics() throws IOException {
String html = template("permissions.html");
assertThat(html)
.contains("value=\"TAG\">특정 기술 태그")
.contains("TECH_TAG")
.contains("태그를 여러 개 추가하면");
}
@Test
void roleTokenAndVpdPagesExplainTheirBoundaries() throws IOException {
String roles = template("roles.html");
String tokens = template("tokens.html");
String policies = template("vpd-policies.html");
String filters = template("vpd-filter-policies.html");
assertThat(roles)
.contains("표시 보호 등급 상한")
.contains("행 접근 권한은 권한 규칙과 VPD에서 결정합니다");
assertThat(tokens)
.contains("회수·만료 포함")
.contains("현재 사용 가능한 토큰만");
assertThat(policies)
.contains("어느 객체의 어떤 SQL에 어떤 Filter function을 붙일지")
.contains("이 policy가 하는 일");
assertThat(filters)
.contains("이 Filter가 보호하는 내용")
.contains("기술 태그 비교 예시");
}
@Test
void mcpPagesDescribeReasoningAndProtocolBoundaries() throws IOException {
String chatbot = template("mcp-chatbot.html");
String reasoning = template("mcp-reasoning.html");
String client = template("mcp-client-demo.html");
String sse = template("mcp-sse.html");
assertThat(chatbot).contains("임시 토큰 사용자").contains("태그 벡터 검색");
assertThat(reasoning).contains("MCP tool을 고르고").contains("임시 토큰 사용자").contains("MCP Tool");
assertThat(client).contains("tool 선택과 호출은 reasoning 결과").doesNotContain("Context Path");
assertThat(sse).contains("Instruction / parameter mapping").contains("bearerToken");
}
private String template(String relativePath) throws IOException {
return Files.readString(Path.of("src/main/resources/templates").resolve(relativePath));
}