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;