Skip to content

Commit 8e9c13f

Browse files
authored
fix(test): deflake diagram-editor tests COMPASS-9462 (#7030)
* fix test flakes * nullable * wait for container animations
1 parent 1e4eeed commit 8e9c13f

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

packages/compass-data-modeling/src/components/diagram-editor.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useState } from 'react';
1+
import React, { useCallback, useMemo, useRef, useState } from 'react';
22
import { connect } from 'react-redux';
33
import type { DataModelingState } from '../store/reducer';
44
import {
@@ -27,6 +27,7 @@ import {
2727
Diagram,
2828
type NodeProps,
2929
type EdgeProps,
30+
useDiagram,
3031
} from '@mongodb-js/diagramming';
3132
import type { Edit, StaticModel } from '../services/data-model-storage';
3233
import { UUID } from 'bson';
@@ -132,6 +133,20 @@ const DiagramEditor: React.FunctionComponent<{
132133
onApplyClick,
133134
}) => {
134135
const isDarkMode = useDarkMode();
136+
const diagramContainerRef = useRef<HTMLDivElement | null>(null);
137+
const diagram = useDiagram();
138+
139+
const setDiagramContainerRef = useCallback(
140+
(ref: HTMLDivElement | null) => {
141+
if (ref) {
142+
// For debugging purposes, we attach the diagram to the ref.
143+
(ref as any)._diagram = diagram;
144+
}
145+
diagramContainerRef.current = ref;
146+
},
147+
[diagram]
148+
);
149+
135150
const [applyInput, setApplyInput] = useState('{}');
136151

137152
const isEditValid = useMemo(() => {
@@ -265,6 +280,7 @@ const DiagramEditor: React.FunctionComponent<{
265280
if (step === 'EDITING') {
266281
content = (
267282
<div
283+
ref={setDiagramContainerRef}
268284
className={modelPreviewContainerStyles}
269285
data-testid="diagram-editor-container"
270286
>

packages/compass-e2e-tests/helpers/selectors.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,5 +1451,3 @@ export const DataModelsListItem = (diagramName: string) =>
14511451
export const DataModelsListItemActions = (diagramName: string) =>
14521452
`${DataModelsListItem(diagramName)} [aria-label="Show actions"]`;
14531453
export const DataModelsListItemDeleteButton = `[data-action="delete"]`;
1454-
export const DataModelingDiagram = '.react-flow';
1455-
export const DataModelingDiagramNode = '.react-flow__node > div';

packages/compass-e2e-tests/tests/data-modeling-tab.test.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,23 @@ import {
1414
createNumbersCollection,
1515
} from '../helpers/insert-data';
1616

17+
type DiagramInstance = {
18+
getNodes: () => Array<{
19+
id: string;
20+
}>;
21+
};
22+
1723
async function getDiagramNodes(browser: CompassBrowser): Promise<string[]> {
18-
await browser.waitForAnimations(Selectors.DataModelingDiagram);
19-
return await browser
20-
.$$(Selectors.DataModelingDiagramNode)
21-
.map((element) => element.getAttribute('title'));
24+
const nodes = await browser.execute(function (selector) {
25+
const node = document.querySelector(selector);
26+
if (!node) {
27+
throw new Error(`Element with selector ${selector} not found`);
28+
}
29+
return (
30+
node as Element & { _diagram: DiagramInstance }
31+
)._diagram.getNodes();
32+
}, Selectors.DataModelEditor);
33+
return nodes.map((x) => x.id);
2234
}
2335

2436
describe('Data Modeling tab', function () {
@@ -107,13 +119,15 @@ describe('Data Modeling tab', function () {
107119
JSON.stringify(newModel)
108120
);
109121
await browser.clickVisible(Selectors.DataModelEditorApplyButton);
122+
await browser.waitForAnimations(dataModelEditor);
110123

111124
// Verify that the model is updated
112125
nodes = await getDiagramNodes(browser);
113126
expect(nodes).to.have.lengthOf(0);
114127

115128
// Undo the change
116129
await browser.clickVisible(Selectors.DataModelUndoButton);
130+
await browser.waitForAnimations(dataModelEditor);
117131
nodes = await getDiagramNodes(browser);
118132
expect(nodes).to.have.lengthOf(2);
119133
expect(nodes).to.deep.equal([
@@ -124,6 +138,7 @@ describe('Data Modeling tab', function () {
124138
// Redo the change
125139
await browser.waitForAriaDisabled(Selectors.DataModelRedoButton, false);
126140
await browser.clickVisible(Selectors.DataModelRedoButton);
141+
await browser.waitForAnimations(dataModelEditor);
127142
nodes = await getDiagramNodes(browser);
128143
expect(nodes).to.have.lengthOf(0);
129144

0 commit comments

Comments
 (0)