Skip to content

Commit 2dbe83b

Browse files
authored
chore(data-service): use identifyServerName from mongodb-build-info COMPASS-9930 (#7507)
* Bumped mongodb-build-info dependency * Rename dbType to serverName * Use identifyServerName instead of getGenuineMongoDB * Handle "unknown" server names as genuine * Implement reusable useHasNonGenuineConnections hook * Use useHasNonGenuineConnections hook in assistant drawer * Use useHasNonGenuineConnections hook in assistant drawer * Call into mongodb-build-info when mocking the MockDataService
1 parent 0ccb3c6 commit 2dbe83b

File tree

22 files changed

+190
-76
lines changed

22 files changed

+190
-76
lines changed

configs/testing-library-compass/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"@testing-library/react": "^12.1.5",
6363
"@testing-library/react-hooks": "^7.0.2",
6464
"@testing-library/user-event": "^13.5.0",
65+
"mongodb-build-info": "^1.8.1",
6566
"mongodb-connection-string-url": "^3.0.1",
6667
"react": "^17.0.2",
6768
"react-redux": "^8.1.3",

configs/testing-library-compass/src/index.tsx

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import type {
3434
DataService,
3535
InstanceDetails,
3636
} from 'mongodb-data-service';
37+
import { identifyServerName } from 'mongodb-build-info';
3738
import Sinon from 'sinon';
3839
import React from 'react';
3940
import type {
@@ -175,8 +176,22 @@ export class MockDataService
175176
disconnect(): Promise<void> {
176177
return Promise.resolve();
177178
}
178-
instance(): Promise<InstanceDetails> {
179-
return Promise.resolve({
179+
async instance(): Promise<InstanceDetails> {
180+
const { connectionString } = this.connectionOptions;
181+
const serverName = await identifyServerName({
182+
connectionString,
183+
adminCommand: () =>
184+
Promise.reject(
185+
new Error(
186+
'MockDataService adminCommand: this is a mocked environment; no server commands available.'
187+
)
188+
),
189+
});
190+
const genuineMongoDB = {
191+
serverName,
192+
isGenuine: serverName === 'mongodb' || serverName === 'unknown',
193+
};
194+
return {
180195
auth: {
181196
user: null,
182197
roles: [],
@@ -188,10 +203,7 @@ export class MockDataService
188203
version: '100.0.0',
189204
},
190205
host: {},
191-
genuineMongoDB: {
192-
isGenuine: true,
193-
dbType: 'mongodb',
194-
},
206+
genuineMongoDB,
195207
dataLake: {
196208
isDataLake: false,
197209
version: null,
@@ -200,7 +212,7 @@ export class MockDataService
200212
isAtlas: false,
201213
isLocalAtlas: false,
202214
csfleMode: 'unavailable',
203-
});
215+
};
204216
}
205217
}
206218

package-lock.json

Lines changed: 74 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compass-app-stores/src/provider.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { MongoDBInstanceProps } from 'mongodb-instance-model';
1010
import { MongoDBInstance } from 'mongodb-instance-model';
1111
import React, {
1212
createContext,
13+
useCallback,
1314
useContext,
1415
useEffect,
1516
useMemo,
@@ -93,6 +94,46 @@ export const mongoDBInstanceLocator = createServiceLocator(
9394
'mongoDBInstanceLocator'
9495
);
9596

97+
/**
98+
* Hook to check if there are any connected non-genuine MongoDB connections.
99+
* @return true if any connected connection is to a non-genuine MongoDB server.
100+
*/
101+
export function useHasNonGenuineConnections(): boolean {
102+
const instancesManager = useContext(MongoDBInstancesManagerContext);
103+
104+
const hasNonGenuineConnections = useCallback(
105+
function () {
106+
if (!instancesManager) {
107+
return false;
108+
}
109+
return Array.from(instancesManager.listMongoDBInstances().values()).some(
110+
(instance) => {
111+
return !instance.genuineMongoDB.isGenuine;
112+
}
113+
);
114+
},
115+
[instancesManager]
116+
);
117+
118+
const [result, setResult] = useState(hasNonGenuineConnections);
119+
120+
useEffect(() => {
121+
if (instancesManager) {
122+
const updateResult = () => {
123+
setResult(hasNonGenuineConnections);
124+
};
125+
instancesManager.on('instance-started', updateResult);
126+
instancesManager.on('instance-removed', updateResult);
127+
return () => {
128+
instancesManager.off('instance-started', updateResult);
129+
instancesManager.off('instance-removed', updateResult);
130+
};
131+
}
132+
}, [instancesManager, setResult, hasNonGenuineConnections]);
133+
134+
return result;
135+
}
136+
96137
const NamespaceModelContext = React.createContext<Database | Collection | null>(
97138
null
98139
);

packages/compass-connections-navigation/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"@mongodb-js/connection-form": "^1.72.1",
5656
"@mongodb-js/connection-info": "^0.22.0",
5757
"compass-preferences-model": "^2.64.0",
58-
"mongodb-build-info": "^1.7.2",
58+
"mongodb-build-info": "^1.8.1",
5959
"react": "^17.0.2",
6060
"react-virtualized-auto-sizer": "^1.0.6",
6161
"react-window": "^1.8.6"

packages/compass-connections/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"compass-preferences-model": "^2.64.0",
6464
"lodash": "^4.17.21",
6565
"mongodb": "^6.19.0",
66-
"mongodb-build-info": "^1.7.2",
66+
"mongodb-build-info": "^1.8.1",
6767
"mongodb-connection-string-url": "^3.0.1",
6868
"mongodb-data-service": "^22.34.6",
6969
"react": "^17.0.2",

0 commit comments

Comments
 (0)