test(oceanbase): 脱敏 Oracle 租户连接测试数据

- 将测试中的内网地址、账号和服务名替换为虚构 fixture
- 统一 OceanBase Oracle 与 SSH 跳板机测试常量
- 保留连接预探测与 SSH 诊断断言语义
This commit is contained in:
Syngnat
2026-06-16 08:37:18 +08:00
parent 23f95d7dc8
commit c70eb7157f
3 changed files with 78 additions and 31 deletions

View File

@@ -604,6 +604,12 @@ describe('DataGrid layout', () => {
expect(source).toContain("const useVirtualCellContentContain = false;");
expect(source).toContain("const useVirtualEditableVisibilityHints = !isMacLike && !isV2Ui;");
expect(source).toContain("contain: ${useVirtualRowCellContain ? 'layout paint style' : 'none'};");
expect(source).toContain('.${gridId} .data-grid-toolbar-scroll::-webkit-scrollbar-thumb:hover');
expect(source).toContain('.${gridId} .ant-table-body::-webkit-scrollbar-thumb:hover');
expect(source).toContain('.${gridId} .rc-virtual-list-holder::-webkit-scrollbar-thumb:hover');
expect(source).toContain('.${gridId} .data-grid-external-horizontal-scroll::-webkit-scrollbar-thumb:hover');
expect(source).toContain('background-clip: border-box;');
expect(source).toContain('horizontalScrollbarThumbHoverBg');
expect(source).toContain('const handleSharedCellContextMenu = useCallback');
expect(source).toContain('const shouldUsePlainVirtualContent = isV2Ui && !modifiedStyle;');
expect(source).toContain('if (shouldUsePlainVirtualContent) {');

View File

@@ -1767,10 +1767,12 @@ const DataGrid: React.FC<DataGridProps> = ({
columnMetaTooltipColor: darkMode ? 'rgba(255, 236, 179, 0.98)' : '#262626',
panelFrameColor: darkMode ? 'rgba(0, 0, 0, 0.42)' : 'rgba(0, 0, 0, 0.18)',
floatingScrollbarThumbBg: darkMode ? 'rgba(255,255,255,0.68)' : 'rgba(0,0,0,0.44)',
floatingScrollbarThumbHoverBg: darkMode ? 'rgba(255,255,255,0.78)' : 'rgba(0,0,0,0.54)',
floatingScrollbarThumbBorderColor: darkMode ? 'rgba(255,255,255,0.26)' : 'rgba(255,255,255,0.52)',
floatingScrollbarThumbShadow: (isMacLike || isV2Ui) ? 'none' : (darkMode ? '0 4px 14px rgba(0,0,0,0.42)' : '0 4px 10px rgba(0,0,0,0.20)'),
verticalScrollbarTrackBg: darkMode ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.08)',
horizontalScrollbarThumbBg: darkMode ? 'rgba(255,255,255,0.20)' : 'rgba(0,0,0,0.14)',
horizontalScrollbarThumbHoverBg: darkMode ? 'rgba(255,255,255,0.30)' : 'rgba(0,0,0,0.24)',
toolbarDividerColor: darkMode ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.10)',
paginationShellBg: darkMode
? `linear-gradient(135deg, rgba(17,22,34,${_glassMode ? Math.max(0.22, opacity * 0.38) : 0.82}) 0%, rgba(10,14,24,${_glassMode ? Math.max(0.28, opacity * 0.46) : 0.9}) 100%)`
@@ -1809,8 +1811,8 @@ const DataGrid: React.FC<DataGridProps> = ({
selectionAccentHex, selectionAccentRgb,
columnMetaHintColor, columnMetaTooltipColor,
panelFrameColor,
floatingScrollbarThumbBg, floatingScrollbarThumbBorderColor, floatingScrollbarThumbShadow,
verticalScrollbarTrackBg, horizontalScrollbarThumbBg,
floatingScrollbarThumbBg, floatingScrollbarThumbHoverBg, floatingScrollbarThumbBorderColor, floatingScrollbarThumbShadow,
verticalScrollbarTrackBg, horizontalScrollbarThumbBg, horizontalScrollbarThumbHoverBg,
toolbarDividerColor,
paginationShellBg, paginationShellBorderColor, paginationShellShadow,
paginationChipBg, paginationChipBorderColor, paginationHoverBg,
@@ -2446,8 +2448,15 @@ const DataGrid: React.FC<DataGridProps> = ({
}
.${gridId} .data-grid-toolbar-scroll::-webkit-scrollbar-thumb {
background: ${darkMode ? 'rgba(255,255,255,0.28)' : 'rgba(0,0,0,0.22)'};
border: 0;
background-clip: border-box;
border-radius: 999px;
}
.${gridId} .data-grid-toolbar-scroll::-webkit-scrollbar-thumb:hover {
background: ${darkMode ? 'rgba(255,255,255,0.38)' : 'rgba(0,0,0,0.32)'};
border: 0;
background-clip: border-box;
}
.${gridId} .data-grid-toolbar-scroll::-webkit-scrollbar-track {
background: transparent;
}
@@ -2683,9 +2692,16 @@ const DataGrid: React.FC<DataGridProps> = ({
.${gridId} .ant-table-body::-webkit-scrollbar-thumb {
background: ${floatingScrollbarThumbBg};
border: 1px solid ${floatingScrollbarThumbBorderColor};
background-clip: border-box;
border-radius: 999px;
box-shadow: ${floatingScrollbarThumbShadow};
}
.${gridId} .ant-table-body::-webkit-scrollbar-thumb:hover {
background: ${floatingScrollbarThumbHoverBg};
border: 1px solid ${floatingScrollbarThumbBorderColor};
background-clip: border-box;
box-shadow: ${floatingScrollbarThumbShadow};
}
.${gridId} .rc-virtual-list-holder {
scrollbar-width: thin;
scrollbar-color: ${floatingScrollbarThumbBg} transparent;
@@ -2702,9 +2718,16 @@ const DataGrid: React.FC<DataGridProps> = ({
.${gridId} .rc-virtual-list-holder::-webkit-scrollbar-thumb {
background: ${floatingScrollbarThumbBg};
border: 1px solid ${floatingScrollbarThumbBorderColor};
background-clip: border-box;
border-radius: 999px;
box-shadow: ${floatingScrollbarThumbShadow};
}
.${gridId} .rc-virtual-list-holder::-webkit-scrollbar-thumb:hover {
background: ${floatingScrollbarThumbHoverBg};
border: 1px solid ${floatingScrollbarThumbBorderColor};
background-clip: border-box;
box-shadow: ${floatingScrollbarThumbShadow};
}
.${gridId} .data-grid-external-horizontal-scroll {
position: absolute;
left: ${floatingScrollbarInset}px;
@@ -2728,9 +2751,16 @@ const DataGrid: React.FC<DataGridProps> = ({
.${gridId} .data-grid-external-horizontal-scroll::-webkit-scrollbar-thumb {
background: ${horizontalScrollbarThumbBg};
border: 1px solid ${horizontalScrollbarThumbBorderColor};
background-clip: border-box;
border-radius: 999px;
box-shadow: ${horizontalScrollbarThumbShadow};
}
.${gridId} .data-grid-external-horizontal-scroll::-webkit-scrollbar-thumb:hover {
background: ${horizontalScrollbarThumbHoverBg};
border: 1px solid ${horizontalScrollbarThumbBorderColor};
background-clip: border-box;
box-shadow: ${horizontalScrollbarThumbShadow};
}
.${gridId} .data-grid-external-horizontal-scroll-inner {
height: 1px;
}

View File

@@ -17,6 +17,17 @@ import (
mysqlDriver "github.com/go-sql-driver/mysql"
)
const (
testOceanBaseOracleHost = "ob-oracle.internal.example"
testOceanBaseOraclePort = 2881
testOceanBaseOracleUser = "APP_USER@SERVICE:test_service"
testOceanBaseOraclePassword = "test-password"
testOceanBaseOracleDatabase = "test_service"
testSSHJumpHost = "ssh-gateway.example.test"
testSSHJumpUser = "test-ops"
testSSHJumpPassword = "test-ssh-password"
)
func TestResolveOceanBaseProtocol(t *testing.T) {
t.Parallel()
@@ -412,9 +423,9 @@ func TestOceanBaseOracleConnectStopsOnProbeDialFailure(t *testing.T) {
Type: "oceanbase",
Host: host,
Port: port,
User: "SBDEV@SERVICE:srv_yhcs",
Password: "secret",
Database: "sbdev",
User: testOceanBaseOracleUser,
Password: testOceanBaseOraclePassword,
Database: testOceanBaseOracleDatabase,
OceanBaseProtocol: oceanBaseProtocolOracle,
Timeout: 1,
})
@@ -448,19 +459,19 @@ func TestOceanBaseOracleConnectProbeDialFailureMentionsSSHWhenEnabled(t *testing
ob := &OceanBaseDB{}
err := ob.Connect(connection.ConnectionConfig{
Type: "oceanbase",
Host: "172.22.39.20",
Port: 12883,
User: "SBDEV@SERVICE:srv_yhcs",
Password: "secret",
Database: "sbdev",
Host: testOceanBaseOracleHost,
Port: testOceanBaseOraclePort,
User: testOceanBaseOracleUser,
Password: testOceanBaseOraclePassword,
Database: testOceanBaseOracleDatabase,
OceanBaseProtocol: oceanBaseProtocolOracle,
Timeout: 1,
UseSSH: true,
SSH: connection.SSHConfig{
Host: "jump.example.com",
Host: testSSHJumpHost,
Port: 22,
User: "ops",
Password: "jump-secret",
User: testSSHJumpUser,
Password: testSSHJumpPassword,
},
})
if err == nil {
@@ -470,10 +481,10 @@ func TestOceanBaseOracleConnectProbeDialFailureMentionsSSHWhenEnabled(t *testing
if !seenConfig.UseSSH {
t.Fatalf("expected probe dialer to receive UseSSH=true, got %+v", seenConfig)
}
if seenAddress != "172.22.39.20:12883" {
if seenAddress != "ob-oracle.internal.example:2881" {
t.Fatalf("expected probe target to remain remote inner address, got %q", seenAddress)
}
if !strings.Contains(got, "通过 SSH 跳板机访问目标地址 172.22.39.20:12883 失败") {
if !strings.Contains(got, "通过 SSH 跳板机访问目标地址 ob-oracle.internal.example:2881 失败") {
t.Fatalf("expected SSH-specific network diagnosis, got %q", got)
}
if strings.Contains(got, "VPN/内网路由") {
@@ -499,13 +510,13 @@ func TestProbeOceanBaseMySQLWireHandshakeUsesSSHConfiguredDialer(t *testing.T) {
}
result := probeOceanBaseMySQLWireHandshakeDetail(connection.ConnectionConfig{
Host: "172.22.39.20",
Port: 12883,
Host: testOceanBaseOracleHost,
Port: testOceanBaseOraclePort,
UseSSH: true,
SSH: connection.SSHConfig{
Host: "jump.example.com",
Host: testSSHJumpHost,
Port: 22,
User: "ops",
User: testSSHJumpUser,
},
}, time.Second)
@@ -515,7 +526,7 @@ func TestProbeOceanBaseMySQLWireHandshakeUsesSSHConfiguredDialer(t *testing.T) {
if !seenConfig.UseSSH {
t.Fatalf("expected probe dialer to receive SSH config, got %+v", seenConfig)
}
if seenAddress != "172.22.39.20:12883" {
if seenAddress != "ob-oracle.internal.example:2881" {
t.Fatalf("expected remote target address through SSH, got %q", seenAddress)
}
}
@@ -535,18 +546,18 @@ func TestOceanBaseOracleConnectUsesFullSSHTimeoutForProbeDial(t *testing.T) {
ob := &OceanBaseDB{}
err := ob.Connect(connection.ConnectionConfig{
Type: "oceanbase",
Host: "172.22.39.20",
Port: 12883,
User: "SBDEV@SERVICE:srv_yhcs",
Password: "secret",
Database: "srv_yhcs",
Host: testOceanBaseOracleHost,
Port: testOceanBaseOraclePort,
User: testOceanBaseOracleUser,
Password: testOceanBaseOraclePassword,
Database: testOceanBaseOracleDatabase,
OceanBaseProtocol: oceanBaseProtocolOracle,
Timeout: 12,
UseSSH: true,
SSH: connection.SSHConfig{
Host: "jump.example.com",
Host: testSSHJumpHost,
Port: 22,
User: "ops",
User: testSSHJumpUser,
},
})
if err == nil {
@@ -579,13 +590,13 @@ func TestProbeOceanBaseMySQLWireHandshakeSplitsDialAndReadTimeout(t *testing.T)
started := time.Now()
result := probeOceanBaseMySQLWireHandshakeDetailWithTimeouts(connection.ConnectionConfig{
Host: "172.22.39.20",
Port: 12883,
Host: testOceanBaseOracleHost,
Port: testOceanBaseOraclePort,
UseSSH: true,
SSH: connection.SSHConfig{
Host: "jump.example.com",
Host: testSSHJumpHost,
Port: 22,
User: "ops",
User: testSSHJumpUser,
},
}, 12*time.Second, 50*time.Millisecond)
elapsed := time.Since(started)