From 1a8b52410f10eab5193762869cd7895e0096a92e Mon Sep 17 00:00:00 2001 From: "Moe." Date: Wed, 1 Jul 2026 01:23:51 +0800 Subject: [PATCH] fix(navicat): prefer ConnType when importing connections --- .../desktop/src/lib/__tests__/navicatImport.spec.ts | 13 +++++++++++++ apps/desktop/src/lib/navicatImport.ts | 4 ++-- .../app-tests/connectionStoreErrorState.test.ts | 10 +++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/lib/__tests__/navicatImport.spec.ts b/apps/desktop/src/lib/__tests__/navicatImport.spec.ts index b99b54c556..950003c70e 100644 --- a/apps/desktop/src/lib/__tests__/navicatImport.spec.ts +++ b/apps/desktop/src/lib/__tests__/navicatImport.spec.ts @@ -84,4 +84,17 @@ describe("parseNavicatConnections", () => { expect(connection?.database).toBe("appdb"); expect(connection?.port).toBe(15432); }); + + it("prefers Navicat ConnType over Redis deployment Type", async () => { + const [connection] = await parseNavicatConnections(` + +`); + + expect(connection?.db_type).toBe("redis"); + expect(connection?.driver_profile).toBe("redis"); + expect(connection?.name).toBe("redis-standalone"); + expect(connection?.host).toBe("redis.example.test"); + expect(connection?.port).toBe(16379); + expect(connection?.username).toBe("default"); + }); }); diff --git a/apps/desktop/src/lib/navicatImport.ts b/apps/desktop/src/lib/navicatImport.ts index 5ebfb221ee..0773f1bf33 100644 --- a/apps/desktop/src/lib/navicatImport.ts +++ b/apps/desktop/src/lib/navicatImport.ts @@ -146,7 +146,7 @@ function valuesFromElement(element: Element) { } function isConnectionCandidate(node: ParsedNode) { - const type = getAny(node.values, ["type", "connType", "connectionType", "databaseType", "driver"]); + const type = getAny(node.values, ["connType", "databaseType", "driver", "connectionType", "type"]); const name = getAny(node.values, ["name", "connectionName", "connName", "caption", "title"]); const host = getAny(node.values, ["host", "server", "hostname", "serverHost", "address"]); const file = getSqlitePath(node.values); @@ -154,7 +154,7 @@ function isConnectionCandidate(node: ParsedNode) { } async function parseConnection(node: ParsedNode): Promise { - const rawType = getAny(node.values, ["type", "connType", "connectionType", "databaseType", "driver", "dbType"]); + const rawType = getAny(node.values, ["connType", "databaseType", "driver", "dbType", "connectionType", "type"]); const portValue = Number(getAny(node.values, ["port", "serverPort"])); const port = Number.isFinite(portValue) && portValue > 0 ? portValue : undefined; const profile = inferProfile(rawType, node.tag, port); diff --git a/packages/app-tests/connectionStoreErrorState.test.ts b/packages/app-tests/connectionStoreErrorState.test.ts index 350c9bae78..88b28ce12a 100644 --- a/packages/app-tests/connectionStoreErrorState.test.ts +++ b/packages/app-tests/connectionStoreErrorState.test.ts @@ -500,9 +500,9 @@ test("empty root metadata does not replace existing databases with only user adm test.each([ ["redis", "loadRedisDatabases", "/api/redis/list-databases", "Redis databases"], ["mq", "loadMqTenants", "/api/mq/tenants/list", "message queue tenants"], - ["mongodb", "loadMongoDatabases", "/api/mongo/list-databases", "MongoDB databases"], - ["elasticsearch", "loadElasticsearchIndices", "/api/mongo/list-collections", "Elasticsearch indices"], - ["qdrant", "loadVectorCollections", "/api/mongo/list-collections", "vector collections"], + ["mongodb", "loadMongoDatabases", "/api/document-store/list-databases", "MongoDB databases"], + ["elasticsearch", "loadElasticsearchIndices", "/api/document-store/list-collections", "Elasticsearch indices"], + ["qdrant", "loadVectorCollections", "/api/document-store/list-collections", "vector collections"], ] as const)("hanging %s root metadata load times out and clears loading state", async (dbType, loader, endpoint, label) => { vi.useFakeTimers(); const restoreStorage = installMemoryStorage(); @@ -511,6 +511,10 @@ test.each([ if (String(input) === endpoint) { return new Promise(() => {}); } + // Marking a connection lost also cleans up any query client sessions. + if (String(input) === "/api/query/close-client-session") { + return jsonResponse(true); + } return new Response("unexpected request", { status: 500 }); }) as typeof fetch;