Skip to content

Commit dad404d

Browse files
authored
feat(schema-validation): add confirmation modal when applying rules, add explicit editing state COMPASS-8861 (#6766)
1 parent e8e0f6e commit dad404d

File tree

13 files changed

+232
-122
lines changed

13 files changed

+232
-122
lines changed

packages/compass-e2e-tests/helpers/commands/set-validation.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ export async function setValidation(
1515

1616
await browser.clickVisible(Selectors.UpdateValidationButton);
1717

18+
// Confirm in the confirmation modal.
19+
await browser.clickVisible(Selectors.confirmationModalConfirmButton());
20+
1821
// both buttons should become hidden if it succeeds
1922
await validationActionMessageElement.waitForDisplayed({
2023
reverse: true,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,8 @@ export const UnhideIndexButton = '[data-testid="index-actions-unhide-action"]';
11441144

11451145
// Validation tab
11461146
export const AddRuleButton = '[data-testid="add-rule-button"]';
1147+
export const EnableEditValidationButton =
1148+
'[data-testid="enable-edit-validation-button"]';
11471149
export const ValidationEditor = '[data-testid="validation-editor"]';
11481150
export const ValidationActionMessage =
11491151
'[data-testid="validation-action-message"]';

packages/compass-e2e-tests/tests/collection-validation-tab.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,14 @@ describe('Collection validation tab', function () {
9696
);
9797
});
9898

99-
// Reset the validation again to make everything valid for future tests
99+
const enableUpdateValidationButtonElement = browser.$(
100+
Selectors.EnableEditValidationButton
101+
);
102+
// Enable the editing mode and wait for it to be enabled.
103+
await browser.clickVisible(enableUpdateValidationButtonElement);
104+
await enableUpdateValidationButtonElement.waitForDisplayed({
105+
reverse: true,
106+
});
100107

101108
// the automatic indentation and brackets makes multi-line values very fiddly here
102109
await browser.setValidation(PASSING_VALIDATOR);

packages/compass-editor/src/editor.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ const disabledContainerDarkModeStyles = css({
9595
boxShadow: `0 0 0 1px ${palette.gray.dark2}`,
9696
});
9797

98+
const readOnlyStyle = css({
99+
// We hide the blinking cursor in read only mode
100+
// as it can appear to users like the editor is editable.
101+
'& .cm-cursor': {
102+
display: 'none !important',
103+
},
104+
});
105+
98106
const hiddenScrollStyle = css({
99107
'& .cm-scroller': {
100108
overflow: '-moz-scrollbars-none',
@@ -1204,6 +1212,7 @@ const BaseEditor = React.forwardRef<EditorRef, EditorProps>(function BaseEditor(
12041212
className={cx(
12051213
disabled && disabledContainerStyles,
12061214
disabled && darkMode && disabledContainerDarkModeStyles,
1215+
readOnly && readOnlyStyle,
12071216
className
12081217
)}
12091218
style={{
Lines changed: 70 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,94 @@
11
import React from 'react';
2-
import { render, screen } from '@mongodb-js/testing-library-compass';
2+
import { render, screen, userEvent } from '@mongodb-js/testing-library-compass';
33
import { expect } from 'chai';
44
import sinon from 'sinon';
55
import { ValidationEditor } from './validation-editor';
66

7+
function renderValidationEditor(
8+
props: Partial<React.ComponentProps<typeof ValidationEditor>>
9+
) {
10+
const validation = {
11+
validator: '',
12+
validationAction: 'warn',
13+
validationLevel: 'moderate',
14+
isChanged: false,
15+
syntaxError: null,
16+
error: null,
17+
} as const;
18+
19+
return render(
20+
<ValidationEditor
21+
namespace="test.test"
22+
validatorChanged={() => {}}
23+
validationActionChanged={() => {}}
24+
validationLevelChanged={() => {}}
25+
cancelValidation={() => {}}
26+
saveValidation={() => {}}
27+
clearSampleDocuments={() => {}}
28+
serverVersion="8.0.5"
29+
onClickEnableEditRules={() => {}}
30+
validation={validation}
31+
isEditable
32+
isEditingEnabled
33+
{...props}
34+
/>
35+
);
36+
}
37+
738
describe('ValidationEditor [Component]', function () {
8-
context('when it is an editable mode', function () {
9-
const setValidatorChangedSpy = sinon.spy();
10-
const setValidationActionChangedSpy = sinon.spy();
11-
const setValidationLevelChangedSpy = sinon.spy();
12-
const setCancelValidationSpy = sinon.spy();
13-
const saveValidationSpy = sinon.spy();
14-
const clearSampleDocumentsSpy = sinon.spy();
15-
const serverVersion = '3.6.0';
16-
const validation = {
17-
validator: '',
18-
validationAction: 'warn',
19-
validationLevel: 'moderate',
20-
isChanged: false,
21-
syntaxError: null,
22-
error: null,
23-
} as const;
24-
const isEditable = true;
39+
context(
40+
'when it is an editable mode but editing is not yet enabled',
41+
function () {
42+
let onClickEnableEditRulesSpy: sinon.SinonSpy;
43+
beforeEach(function () {
44+
onClickEnableEditRulesSpy = sinon.spy();
45+
renderValidationEditor({
46+
onClickEnableEditRules: onClickEnableEditRulesSpy,
47+
isEditingEnabled: false,
48+
isEditable: true,
49+
});
50+
});
2551

52+
it('does not allow to edit the editor', function () {
53+
expect(screen.getByTestId('validation-editor')).to.exist;
54+
expect(screen.getByRole('textbox').ariaReadOnly).to.eq('true');
55+
expect(screen.getByTestId('enable-edit-validation-button')).to.be
56+
.visible;
57+
expect(onClickEnableEditRulesSpy).to.not.have.been.called;
58+
userEvent.click(screen.getByTestId('enable-edit-validation-button'));
59+
expect(onClickEnableEditRulesSpy).to.have.been.calledOnce;
60+
});
61+
}
62+
);
63+
64+
context('when it is an editable mode and editing is enabled', function () {
2665
beforeEach(function () {
27-
render(
28-
<ValidationEditor
29-
namespace="test.test"
30-
validatorChanged={setValidatorChangedSpy}
31-
validationActionChanged={setValidationActionChangedSpy}
32-
validationLevelChanged={setValidationLevelChangedSpy}
33-
cancelValidation={setCancelValidationSpy}
34-
saveValidation={saveValidationSpy}
35-
clearSampleDocuments={clearSampleDocumentsSpy}
36-
serverVersion={serverVersion}
37-
validation={validation}
38-
isEditable={isEditable}
39-
/>
40-
);
66+
renderValidationEditor({
67+
isEditable: true,
68+
isEditingEnabled: true,
69+
});
4170
});
4271

4372
it('allows to edit the editor', function () {
44-
expect(screen.getByTestId('validation-editor')).to.exist;
4573
expect(screen.getByRole('textbox').ariaReadOnly).to.eq(null);
74+
expect(
75+
screen.queryByTestId('enable-edit-validation-button')
76+
).to.not.exist;
4677
});
4778
});
4879

4980
context('when it is a not editable mode', function () {
50-
const setValidatorChangedSpy = sinon.spy();
51-
const setValidationActionChangedSpy = sinon.spy();
52-
const setValidationLevelChangedSpy = sinon.spy();
53-
const setCancelValidationSpy = sinon.spy();
54-
const saveValidationSpy = sinon.spy();
55-
const clearSampleDocumentsSpy = sinon.spy();
56-
const serverVersion = '3.6.0';
57-
const validation = {
58-
validator: '',
59-
validationAction: 'warn',
60-
validationLevel: 'moderate',
61-
isChanged: false,
62-
syntaxError: null,
63-
error: null,
64-
} as const;
65-
const isEditable = false;
66-
6781
beforeEach(function () {
68-
render(
69-
<ValidationEditor
70-
namespace="test.test"
71-
validatorChanged={setValidatorChangedSpy}
72-
validationActionChanged={setValidationActionChangedSpy}
73-
validationLevelChanged={setValidationLevelChangedSpy}
74-
cancelValidation={setCancelValidationSpy}
75-
saveValidation={saveValidationSpy}
76-
clearSampleDocuments={clearSampleDocumentsSpy}
77-
serverVersion={serverVersion}
78-
validation={validation}
79-
isEditable={isEditable}
80-
/>
81-
);
82+
renderValidationEditor({
83+
isEditable: false,
84+
});
8285
});
8386

8487
it('sets editor into readonly mode', function () {
8588
expect(screen.getByRole('textbox').ariaReadOnly).to.eq('true');
89+
expect(
90+
screen.queryByTestId('enable-edit-validation-button')
91+
).to.not.exist;
8692
});
8793
});
8894
});

0 commit comments

Comments
 (0)