Files
MyGoNavi/frontend/src/utils/jvmConnectionConfig.test.ts
Syngnat 6f14e827ab feat(jvm): 完成资源治理与诊断增强
- 新增 JMX/Endpoint/Agent 三种 JVM 连接模式与配置归一化链路
- 支持资源浏览、变更预览、写入应用、审计记录与只读约束
- 接入 AI 结构化写入计划与诊断计划回填能力
- 新增 Agent Bridge、Arthas Tunnel、JMX Helper 诊断传输实现
- 增加诊断控制台、命令模板、输出历史与自动补全交互
- 补齐前后端契约、运行夹具与 JVM 相关回归测试
2026-04-24 16:45:34 +08:00

184 lines
6.1 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
buildDefaultJVMConnectionValues,
buildJVMConnectionConfig,
hasUnsupportedJVMDiagnosticTransport,
hasUnsupportedJVMEditableModes,
normalizeEditableJVMModes,
resolveEditableJVMModeSelection,
} from "./jvmConnectionConfig";
describe("jvmConnectionConfig", () => {
it("defaults to readonly jmx mode", () => {
const values = buildDefaultJVMConnectionValues();
expect(values.type).toBe("jvm");
expect(values.jvmReadOnly).toBe(true);
expect(values.jvmAllowedModes).toEqual(["jmx"]);
expect(values.jvmPreferredMode).toBe("jmx");
expect(values.jvmDiagnosticEnabled).toBe(false);
expect(values.jvmDiagnosticTransport).toBe("agent-bridge");
expect(values.jvmDiagnosticAllowObserveCommands).toBe(true);
expect(values.jvmDiagnosticAllowTraceCommands).toBe(false);
expect(values.jvmDiagnosticAllowMutatingCommands).toBe(false);
expect(values.jvmDiagnosticTimeoutSeconds).toBe(15);
});
it("builds nested jvm config payload", () => {
const config = buildJVMConnectionConfig({
name: "Orders JVM",
type: "jvm",
host: "orders.internal",
port: 9010,
jvmReadOnly: true,
jvmAllowedModes: ["jmx", "endpoint", "agent"],
jvmPreferredMode: "agent",
jvmEnvironment: "prod",
jvmEndpointEnabled: true,
jvmEndpointBaseUrl: "https://orders.internal/manage/jvm",
jvmEndpointApiKey: "token-1",
jvmAgentEnabled: true,
jvmAgentBaseUrl: "http://127.0.0.1:19090/gonavi/agent/jvm",
jvmAgentApiKey: "agent-token",
timeout: 45,
jvmDiagnosticEnabled: true,
jvmDiagnosticTransport: "arthas-tunnel",
jvmDiagnosticBaseUrl: "https://orders.internal/diag",
jvmDiagnosticTargetId: "orders-01",
jvmDiagnosticApiKey: "diag-token",
jvmDiagnosticAllowObserveCommands: true,
jvmDiagnosticAllowTraceCommands: true,
jvmDiagnosticAllowMutatingCommands: false,
jvmDiagnosticTimeoutSeconds: 18,
});
expect(config.jvm?.preferredMode).toBe("agent");
expect(config.jvm?.endpoint?.baseUrl).toBe(
"https://orders.internal/manage/jvm",
);
expect(config.jvm?.agent?.baseUrl).toBe(
"http://127.0.0.1:19090/gonavi/agent/jvm",
);
expect(config.jvm?.diagnostic).toEqual({
enabled: true,
transport: "arthas-tunnel",
baseUrl: "https://orders.internal/diag",
targetId: "orders-01",
apiKey: "diag-token",
allowObserveCommands: true,
allowTraceCommands: true,
allowMutatingCommands: false,
timeoutSeconds: 18,
});
});
it("normalizes allowed modes and falls back preferred mode to first allowed mode", () => {
const config = buildJVMConnectionConfig({
host: "cache.internal",
port: 9010,
jvmAllowedModes: [" Endpoint ", "invalid", "JMX", "endpoint"],
jvmPreferredMode: "AGENT",
});
expect(config.jvm?.allowedModes).toEqual(["endpoint", "jmx"]);
expect(config.jvm?.preferredMode).toBe("endpoint");
expect(config.jvm?.jmx?.enabled).toBe(true);
});
it("normalizes environment and port defaults when input is invalid", () => {
const config = buildJVMConnectionConfig({
host: "orders.internal",
port: 0,
jvmJmxPort: "",
jvmEnvironment: " PROD ",
jvmReadOnly: false,
jvmAllowedModes: ["JMX"],
jvmPreferredMode: "jmx",
});
expect(config.port).toBe(9010);
expect(config.jvm?.jmx?.port).toBe(9010);
expect(config.jvm?.environment).toBe("prod");
expect(config.jvm?.readOnly).toBe(false);
});
it("keeps endpoint timeout aligned to the visible connection timeout", () => {
const config = buildJVMConnectionConfig({
host: "orders.internal",
port: 9010,
timeout: 45,
jvmEndpointTimeoutSeconds: 30,
jvmAllowedModes: ["endpoint"],
jvmPreferredMode: "endpoint",
jvmEndpointEnabled: true,
jvmEndpointBaseUrl: "https://orders.internal/manage/jvm",
jvmDiagnosticEnabled: true,
jvmDiagnosticTransport: "arthas-tunnel",
jvmDiagnosticBaseUrl: "https://orders.internal/diag",
jvmDiagnosticTargetId: "orders-01",
jvmDiagnosticApiKey: "diag-token",
jvmDiagnosticAllowObserveCommands: true,
jvmDiagnosticAllowTraceCommands: true,
jvmDiagnosticAllowMutatingCommands: false,
jvmDiagnosticTimeoutSeconds: 18,
});
expect(config.timeout).toBe(45);
expect(config.jvm?.endpoint?.timeoutSeconds).toBe(45);
expect(config.jvm?.diagnostic?.timeoutSeconds).toBe(18);
});
it("detects unsupported diagnostic transport without silently accepting it", () => {
expect(hasUnsupportedJVMDiagnosticTransport("legacy-bridge")).toBe(true);
expect(hasUnsupportedJVMDiagnosticTransport("agent-bridge")).toBe(false);
expect(hasUnsupportedJVMDiagnosticTransport("")).toBe(false);
});
it("normalizes editable JVM modes to the supported form subset", () => {
expect(
normalizeEditableJVMModes([" endpoint ", "agent", "JMX", "endpoint"]),
).toEqual(["endpoint", "agent", "jmx"]);
});
it("detects unsupported editable JVM modes without downgrading them silently", () => {
expect(
hasUnsupportedJVMEditableModes({
allowedModes: ["agent", "jmx"],
preferredMode: "agent",
}),
).toBe(false);
expect(
hasUnsupportedJVMEditableModes({
allowedModes: ["endpoint", "jmx"],
preferredMode: "otel",
}),
).toBe(true);
expect(
hasUnsupportedJVMEditableModes({
allowedModes: ["endpoint", "jmx"],
preferredMode: "endpoint",
}),
).toBe(false);
});
it("preserves preferred mode when rebuilding editable mode selection from stored config", () => {
expect(
resolveEditableJVMModeSelection({
allowedModes: [],
preferredMode: "agent",
}),
).toEqual({
allowedModes: ["agent"],
preferredMode: "agent",
});
expect(
resolveEditableJVMModeSelection({
allowedModes: ["endpoint", "jmx"],
preferredMode: "agent",
}),
).toEqual({
allowedModes: ["endpoint", "jmx"],
preferredMode: "agent",
});
});
});