|
@@ -1,7 +1,6 @@
|
|
|
// Copyright (c) Jupyter Development Team.
|
|
|
-// Distributed under the terms of the Modified BSD License.
|
|
|
|
|
|
-import { expect } from 'chai';
|
|
|
+import 'jest';
|
|
|
|
|
|
import { CodeMirrorEditorFactory } from '@jupyterlab/codemirror';
|
|
|
|
|
@@ -65,105 +64,107 @@ describe('codeeditor', () => {
|
|
|
describe('#constructor', () => {
|
|
|
it('should create a new metadata editor', () => {
|
|
|
const newEditor = new JSONEditor({ editorFactory });
|
|
|
- expect(newEditor).to.be.an.instanceof(JSONEditor);
|
|
|
+ expect(newEditor).toBeInstanceOf(JSONEditor);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#headerNode', () => {
|
|
|
it('should be the header node used by the editor', () => {
|
|
|
- expect(Array.from(editor.headerNode.classList)).to.contain(
|
|
|
- 'jp-JSONEditor-header'
|
|
|
+ expect(Array.from(editor.headerNode.classList)).toEqual(
|
|
|
+ expect.arrayContaining(['jp-JSONEditor-header'])
|
|
|
);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#editorHostNode', () => {
|
|
|
it('should be the editor host node used by the editor', () => {
|
|
|
- expect(Array.from(editor.editorHostNode.classList)).to.contain(
|
|
|
- 'jp-JSONEditor-host'
|
|
|
+ expect(Array.from(editor.editorHostNode.classList)).toEqual(
|
|
|
+ expect.arrayContaining(['jp-JSONEditor-host'])
|
|
|
);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#revertButtonNode', () => {
|
|
|
it('should be the revert button node used by the editor', () => {
|
|
|
- expect(editor.revertButtonNode.querySelector("[data-icon$='undo']")).to
|
|
|
- .exist;
|
|
|
+ expect(
|
|
|
+ editor.revertButtonNode.querySelector("[data-icon$='undo']")
|
|
|
+ ).toBeDefined();
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#commitButtonNode', () => {
|
|
|
it('should be the commit button node used by the editor', () => {
|
|
|
- expect(editor.commitButtonNode.querySelector("[data-icon$='check']")).to
|
|
|
- .exist;
|
|
|
+ expect(
|
|
|
+ editor.commitButtonNode.querySelector("[data-icon$='check']")
|
|
|
+ ).toBeDefined();
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#source', () => {
|
|
|
it('should be the source of the metadata', () => {
|
|
|
- expect(editor.source).to.equal(null);
|
|
|
+ expect(editor.source).toBe(null);
|
|
|
});
|
|
|
|
|
|
it('should be settable', () => {
|
|
|
const source = new ObservableJSON();
|
|
|
editor.source = source;
|
|
|
- expect(editor.source).to.equal(source);
|
|
|
+ expect(editor.source).toBe(source);
|
|
|
});
|
|
|
|
|
|
it('should update the text area value', () => {
|
|
|
const model = editor.model;
|
|
|
- expect(model.value.text).to.equal('No data!');
|
|
|
+ expect(model.value.text).toBe('No data!');
|
|
|
editor.source = new ObservableJSON();
|
|
|
- expect(model.value.text).to.equal('{}');
|
|
|
+ expect(model.value.text).toBe('{}');
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('#isDirty', () => {
|
|
|
it('should test whether the editor value is dirty', () => {
|
|
|
- expect(editor.isDirty).to.be.false;
|
|
|
+ expect(editor.isDirty).toBe(false);
|
|
|
Widget.attach(editor, document.body);
|
|
|
editor.model.value.text = 'a';
|
|
|
- expect(editor.isDirty).to.be.true;
|
|
|
+ expect(editor.isDirty).toBe(true);
|
|
|
});
|
|
|
|
|
|
it('should be dirty if the value changes while focused', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
Widget.attach(editor, document.body);
|
|
|
editor.editor.focus();
|
|
|
- expect(editor.isDirty).to.be.false;
|
|
|
+ expect(editor.isDirty).toBe(false);
|
|
|
editor.source.set('foo', 1);
|
|
|
- expect(editor.isDirty).to.be.true;
|
|
|
+ expect(editor.isDirty).toBe(true);
|
|
|
});
|
|
|
|
|
|
it('should not be set if not focused', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
Widget.attach(editor, document.body);
|
|
|
- expect(editor.isDirty).to.be.false;
|
|
|
+ expect(editor.isDirty).toBe(false);
|
|
|
editor.source.set('foo', 1);
|
|
|
- expect(editor.isDirty).to.be.false;
|
|
|
+ expect(editor.isDirty).toBe(false);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('model.value.changed', () => {
|
|
|
it('should add the error flag if invalid JSON', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
- expect(editor.hasClass('jp-mod-error')).to.be.true;
|
|
|
+ expect(editor.hasClass('jp-mod-error')).toBe(true);
|
|
|
});
|
|
|
|
|
|
it('should show the commit button if the value has changed', () => {
|
|
|
editor.model.value.text = '{"foo": 2}';
|
|
|
editor.model.value.text = '{"foo": 1}';
|
|
|
- expect(editor.commitButtonNode.hidden).to.be.false;
|
|
|
+ expect(editor.commitButtonNode.hidden).toBe(false);
|
|
|
});
|
|
|
|
|
|
it('should not show the commit button if the value is invalid', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
- expect(editor.commitButtonNode.hidden).to.be.true;
|
|
|
+ expect(editor.commitButtonNode.hidden).toBe(true);
|
|
|
});
|
|
|
|
|
|
it('should show the revert button if the value has changed', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
- expect(editor.revertButtonNode.hidden).to.be.false;
|
|
|
+ expect(editor.revertButtonNode.hidden).toBe(false);
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -176,7 +177,7 @@ describe('codeeditor', () => {
|
|
|
it('should handle blur events on the host node', () => {
|
|
|
editor.editor.focus();
|
|
|
simulate(editor.editorHostNode, 'blur');
|
|
|
- expect(editor.events).to.contain('blur');
|
|
|
+ expect(editor.events).toEqual(expect.arrayContaining(['blur']));
|
|
|
});
|
|
|
|
|
|
it('should revert to current data if there was no change', () => {
|
|
@@ -184,9 +185,9 @@ describe('codeeditor', () => {
|
|
|
editor.editor.focus();
|
|
|
editor.source.set('foo', 1);
|
|
|
const model = editor.model;
|
|
|
- expect(model.value.text).to.equal('{}');
|
|
|
+ expect(model.value.text).toBe('{}');
|
|
|
simulate(editor.editorHostNode, 'blur');
|
|
|
- expect(model.value.text).to.equal('{\n "foo": 1\n}');
|
|
|
+ expect(model.value.text).toBe('{\n "foo": 1\n}');
|
|
|
});
|
|
|
|
|
|
it('should not revert to current data if there was a change', () => {
|
|
@@ -194,25 +195,25 @@ describe('codeeditor', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
editor.source.set('foo', 1);
|
|
|
const model = editor.model;
|
|
|
- expect(model.value.text).to.equal('foo');
|
|
|
+ expect(model.value.text).toBe('foo');
|
|
|
simulate(editor.editorHostNode, 'blur');
|
|
|
- expect(model.value.text).to.equal('foo');
|
|
|
- expect(editor.commitButtonNode.hidden).to.be.true;
|
|
|
- expect(editor.revertButtonNode.hidden).to.be.false;
|
|
|
+ expect(model.value.text).toBe('foo');
|
|
|
+ expect(editor.commitButtonNode.hidden).toBe(true);
|
|
|
+ expect(editor.revertButtonNode.hidden).toBe(false);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe('click', () => {
|
|
|
it('should handle click events on the revert button', () => {
|
|
|
simulate(editor.revertButtonNode, 'click');
|
|
|
- expect(editor.events).to.contain('click');
|
|
|
+ expect(editor.events).toEqual(expect.arrayContaining(['click']));
|
|
|
});
|
|
|
|
|
|
it('should revert the current data', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
editor.model.value.text = 'foo';
|
|
|
simulate(editor.revertButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('{}');
|
|
|
+ expect(editor.model.value.text).toBe('{}');
|
|
|
});
|
|
|
|
|
|
it('should handle programmatic changes', () => {
|
|
@@ -220,12 +221,12 @@ describe('codeeditor', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
editor.source.set('foo', 1);
|
|
|
simulate(editor.revertButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('{\n "foo": 1\n}');
|
|
|
+ expect(editor.model.value.text).toBe('{\n "foo": 1\n}');
|
|
|
});
|
|
|
|
|
|
it('should handle click events on the commit button', () => {
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.events).to.contain('click');
|
|
|
+ expect(editor.events).toEqual(expect.arrayContaining(['click']));
|
|
|
});
|
|
|
|
|
|
it('should bail if it is not valid JSON', () => {
|
|
@@ -233,7 +234,7 @@ describe('codeeditor', () => {
|
|
|
editor.model.value.text = 'foo';
|
|
|
editor.source.set('foo', 1);
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('foo');
|
|
|
+ expect(editor.model.value.text).toBe('foo');
|
|
|
});
|
|
|
|
|
|
it('should override a key that was set programmatically', () => {
|
|
@@ -241,7 +242,7 @@ describe('codeeditor', () => {
|
|
|
editor.model.value.text = '{"foo": 2}';
|
|
|
editor.source.set('foo', 1);
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('{\n "foo": 2\n}');
|
|
|
+ expect(editor.model.value.text).toBe('{\n "foo": 2\n}');
|
|
|
});
|
|
|
|
|
|
it('should allow a programmatic key to update', () => {
|
|
@@ -252,7 +253,7 @@ describe('codeeditor', () => {
|
|
|
editor.source.set('foo', 2);
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
const expected = '{\n "foo": 2,\n "bar": 2\n}';
|
|
|
- expect(editor.model.value.text).to.equal(expected);
|
|
|
+ expect(editor.model.value.text).toBe(expected);
|
|
|
});
|
|
|
|
|
|
it('should allow a key to be added by the user', () => {
|
|
@@ -263,7 +264,7 @@ describe('codeeditor', () => {
|
|
|
editor.source.set('foo', 2);
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
const value = '{\n "foo": 2,\n "bar": 2,\n "baz": 3\n}';
|
|
|
- expect(editor.model.value.text).to.equal(value);
|
|
|
+ expect(editor.model.value.text).toBe(value);
|
|
|
});
|
|
|
|
|
|
it('should allow a key to be removed by the user', () => {
|
|
@@ -272,7 +273,7 @@ describe('codeeditor', () => {
|
|
|
editor.source.set('bar', 1);
|
|
|
editor.model.value.text = '{"foo": 1}';
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('{\n "foo": 1\n}');
|
|
|
+ expect(editor.model.value.text).toBe('{\n "foo": 1\n}');
|
|
|
});
|
|
|
|
|
|
it('should allow a key to be removed programmatically that was not set by the user', () => {
|
|
@@ -282,7 +283,7 @@ describe('codeeditor', () => {
|
|
|
editor.model.value.text = '{"foo": 1, "bar": 3}';
|
|
|
editor.source.delete('foo');
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.model.value.text).to.equal('{\n "bar": 3\n}');
|
|
|
+ expect(editor.model.value.text).toBe('{\n "bar": 3\n}');
|
|
|
});
|
|
|
|
|
|
it('should keep a key that was removed programmatically that was changed by the user', () => {
|
|
@@ -293,7 +294,7 @@ describe('codeeditor', () => {
|
|
|
editor.source.set('foo', null);
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
const expected = '{\n "foo": 2,\n "bar": 3\n}';
|
|
|
- expect(editor.model.value.text).to.equal(expected);
|
|
|
+ expect(editor.model.value.text).toBe(expected);
|
|
|
});
|
|
|
});
|
|
|
});
|
|
@@ -301,12 +302,14 @@ describe('codeeditor', () => {
|
|
|
describe('#onAfterAttach()', () => {
|
|
|
it('should add event listeners', () => {
|
|
|
Widget.attach(editor, document.body);
|
|
|
- expect(editor.methods).to.contain('onAfterAttach');
|
|
|
+ expect(editor.methods).toEqual(
|
|
|
+ expect.arrayContaining(['onAfterAttach'])
|
|
|
+ );
|
|
|
editor.editor.focus();
|
|
|
simulate(editor.editorHostNode, 'blur');
|
|
|
simulate(editor.revertButtonNode, 'click');
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.events).to.eql(['blur', 'click', 'click']);
|
|
|
+ expect(editor.events).toEqual(['blur', 'click', 'click']);
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -316,7 +319,9 @@ describe('codeeditor', () => {
|
|
|
Widget.attach(editor, document.body);
|
|
|
editor.show();
|
|
|
await framePromise();
|
|
|
- expect(editor.methods).to.contain('onUpdateRequest');
|
|
|
+ expect(editor.methods).toEqual(
|
|
|
+ expect.arrayContaining(['onUpdateRequest'])
|
|
|
+ );
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -324,12 +329,14 @@ describe('codeeditor', () => {
|
|
|
it('should remove event listeners', () => {
|
|
|
Widget.attach(editor, document.body);
|
|
|
Widget.detach(editor);
|
|
|
- expect(editor.methods).to.contain('onBeforeDetach');
|
|
|
+ expect(editor.methods).toEqual(
|
|
|
+ expect.arrayContaining(['onBeforeDetach'])
|
|
|
+ );
|
|
|
editor.editor.focus();
|
|
|
simulate(editor.editorHostNode, 'blur');
|
|
|
simulate(editor.revertButtonNode, 'click');
|
|
|
simulate(editor.commitButtonNode, 'click');
|
|
|
- expect(editor.events).to.eql([]);
|
|
|
+ expect(editor.events).toEqual([]);
|
|
|
});
|
|
|
});
|
|
|
|
|
@@ -337,7 +344,7 @@ describe('codeeditor', () => {
|
|
|
it('should update the value', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
editor.source.set('foo', 1);
|
|
|
- expect(editor.model.value.text).to.equal('{\n "foo": 1\n}');
|
|
|
+ expect(editor.model.value.text).toBe('{\n "foo": 1\n}');
|
|
|
});
|
|
|
|
|
|
it('should bail if the input is dirty', () => {
|
|
@@ -345,7 +352,7 @@ describe('codeeditor', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
editor.model.value.text = 'ha';
|
|
|
editor.source.set('foo', 2);
|
|
|
- expect(editor.model.value.text).to.equal('ha');
|
|
|
+ expect(editor.model.value.text).toBe('ha');
|
|
|
});
|
|
|
|
|
|
it('should bail if the input is focused', () => {
|
|
@@ -354,7 +361,7 @@ describe('codeeditor', () => {
|
|
|
editor.source = new ObservableJSON();
|
|
|
editor.editor.focus();
|
|
|
editor.source.set('foo', 2);
|
|
|
- expect(editor.model.value.text).to.equal('{}');
|
|
|
+ expect(editor.model.value.text).toBe('{}');
|
|
|
});
|
|
|
});
|
|
|
});
|