mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-21 14:04:01 +08:00
✅ test(oceanbase): 脱敏 Oracle 租户连接测试数据
- 将测试中的内网地址、账号和服务名替换为虚构 fixture - 统一 OceanBase Oracle 与 SSH 跳板机测试常量 - 保留连接预探测与 SSH 诊断断言语义
This commit is contained in:
@@ -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) {');
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user