diff options
Diffstat (limited to 'spec/javascripts/ide/lib')
-rw-r--r-- | spec/javascripts/ide/lib/common/model_manager_spec.js | 126 | ||||
-rw-r--r-- | spec/javascripts/ide/lib/common/model_spec.js | 137 | ||||
-rw-r--r-- | spec/javascripts/ide/lib/decorations/controller_spec.js | 143 | ||||
-rw-r--r-- | spec/javascripts/ide/lib/diff/controller_spec.js | 215 | ||||
-rw-r--r-- | spec/javascripts/ide/lib/editor_spec.js | 287 |
5 files changed, 0 insertions, 908 deletions
diff --git a/spec/javascripts/ide/lib/common/model_manager_spec.js b/spec/javascripts/ide/lib/common/model_manager_spec.js deleted file mode 100644 index 38ffa317e8e..00000000000 --- a/spec/javascripts/ide/lib/common/model_manager_spec.js +++ /dev/null @@ -1,126 +0,0 @@ -import eventHub from '~/ide/eventhub'; -import ModelManager from '~/ide/lib/common/model_manager'; -import { file } from '../../helpers'; - -describe('Multi-file editor library model manager', () => { - let instance; - - beforeEach(() => { - instance = new ModelManager(); - }); - - afterEach(() => { - instance.dispose(); - }); - - describe('addModel', () => { - it('caches model', () => { - instance.addModel(file()); - - expect(instance.models.size).toBe(1); - }); - - it('caches model by file path', () => { - const f = file('path-name'); - instance.addModel(f); - - expect(instance.models.keys().next().value).toBe(f.key); - }); - - it('adds model into disposable', () => { - spyOn(instance.disposable, 'add').and.callThrough(); - - instance.addModel(file()); - - expect(instance.disposable.add).toHaveBeenCalled(); - }); - - it('returns cached model', () => { - spyOn(instance.models, 'get').and.callThrough(); - - instance.addModel(file()); - instance.addModel(file()); - - expect(instance.models.get).toHaveBeenCalled(); - }); - - it('adds eventHub listener', () => { - const f = file(); - spyOn(eventHub, '$on').and.callThrough(); - - instance.addModel(f); - - expect(eventHub.$on).toHaveBeenCalledWith( - `editor.update.model.dispose.${f.key}`, - jasmine.anything(), - ); - }); - }); - - describe('hasCachedModel', () => { - it('returns false when no models exist', () => { - expect(instance.hasCachedModel('path')).toBeFalsy(); - }); - - it('returns true when model exists', () => { - const f = file('path-name'); - - instance.addModel(f); - - expect(instance.hasCachedModel(f.key)).toBeTruthy(); - }); - }); - - describe('getModel', () => { - it('returns cached model', () => { - instance.addModel(file('path-name')); - - expect(instance.getModel('path-name')).not.toBeNull(); - }); - }); - - describe('removeCachedModel', () => { - let f; - - beforeEach(() => { - f = file(); - - instance.addModel(f); - }); - - it('clears cached model', () => { - instance.removeCachedModel(f); - - expect(instance.models.size).toBe(0); - }); - - it('removes eventHub listener', () => { - spyOn(eventHub, '$off').and.callThrough(); - - instance.removeCachedModel(f); - - expect(eventHub.$off).toHaveBeenCalledWith( - `editor.update.model.dispose.${f.key}`, - jasmine.anything(), - ); - }); - }); - - describe('dispose', () => { - it('clears cached models', () => { - instance.addModel(file()); - - instance.dispose(); - - expect(instance.models.size).toBe(0); - }); - - it('calls disposable dispose', () => { - spyOn(instance.disposable, 'dispose').and.callThrough(); - - instance.dispose(); - - expect(instance.disposable.dispose).toHaveBeenCalled(); - }); - }); -}); diff --git a/spec/javascripts/ide/lib/common/model_spec.js b/spec/javascripts/ide/lib/common/model_spec.js deleted file mode 100644 index f096e06f43c..00000000000 --- a/spec/javascripts/ide/lib/common/model_spec.js +++ /dev/null @@ -1,137 +0,0 @@ -import eventHub from '~/ide/eventhub'; -import Model from '~/ide/lib/common/model'; -import { file } from '../../helpers'; - -describe('Multi-file editor library model', () => { - let model; - - beforeEach(() => { - spyOn(eventHub, '$on').and.callThrough(); - - const f = file('path'); - f.mrChange = { diff: 'ABC' }; - f.baseRaw = 'test'; - model = new Model(f); - }); - - afterEach(() => { - model.dispose(); - }); - - it('creates original model & base model & new model', () => { - expect(model.originalModel).not.toBeNull(); - expect(model.model).not.toBeNull(); - expect(model.baseModel).not.toBeNull(); - - expect(model.originalModel.uri.path).toBe('original/path--path'); - expect(model.model.uri.path).toBe('path--path'); - expect(model.baseModel.uri.path).toBe('target/path--path'); - }); - - it('creates model with head file to compare against', () => { - const f = file('path'); - model.dispose(); - - model = new Model(f, { - ...f, - content: '123 testing', - }); - - expect(model.head).not.toBeNull(); - expect(model.getOriginalModel().getValue()).toBe('123 testing'); - }); - - it('adds eventHub listener', () => { - expect(eventHub.$on).toHaveBeenCalledWith( - `editor.update.model.dispose.${model.file.key}`, - jasmine.anything(), - ); - }); - - describe('path', () => { - it('returns file path', () => { - expect(model.path).toBe(model.file.key); - }); - }); - - describe('getModel', () => { - it('returns model', () => { - expect(model.getModel()).toBe(model.model); - }); - }); - - describe('getOriginalModel', () => { - it('returns original model', () => { - expect(model.getOriginalModel()).toBe(model.originalModel); - }); - }); - - describe('getBaseModel', () => { - it('returns base model', () => { - expect(model.getBaseModel()).toBe(model.baseModel); - }); - }); - - describe('setValue', () => { - it('updates models value', () => { - model.setValue('testing 123'); - - expect(model.getModel().getValue()).toBe('testing 123'); - }); - }); - - describe('onChange', () => { - it('calls callback on change', done => { - const spy = jasmine.createSpy(); - model.onChange(spy); - - model.getModel().setValue('123'); - - setTimeout(() => { - expect(spy).toHaveBeenCalledWith(model, jasmine.anything()); - done(); - }); - }); - }); - - describe('dispose', () => { - it('calls disposable dispose', () => { - spyOn(model.disposable, 'dispose').and.callThrough(); - - model.dispose(); - - expect(model.disposable.dispose).toHaveBeenCalled(); - }); - - it('clears events', () => { - model.onChange(() => {}); - - expect(model.events.size).toBe(1); - - model.dispose(); - - expect(model.events.size).toBe(0); - }); - - it('removes eventHub listener', () => { - spyOn(eventHub, '$off').and.callThrough(); - - model.dispose(); - - expect(eventHub.$off).toHaveBeenCalledWith( - `editor.update.model.dispose.${model.file.key}`, - jasmine.anything(), - ); - }); - - it('calls onDispose callback', () => { - const disposeSpy = jasmine.createSpy(); - - model.onDispose(disposeSpy); - - model.dispose(); - - expect(disposeSpy).toHaveBeenCalled(); - }); - }); -}); diff --git a/spec/javascripts/ide/lib/decorations/controller_spec.js b/spec/javascripts/ide/lib/decorations/controller_spec.js deleted file mode 100644 index 4118774cca3..00000000000 --- a/spec/javascripts/ide/lib/decorations/controller_spec.js +++ /dev/null @@ -1,143 +0,0 @@ -import Editor from '~/ide/lib/editor'; -import DecorationsController from '~/ide/lib/decorations/controller'; -import Model from '~/ide/lib/common/model'; -import { file } from '../../helpers'; - -describe('Multi-file editor library decorations controller', () => { - let editorInstance; - let controller; - let model; - - beforeEach(() => { - editorInstance = Editor.create(); - editorInstance.createInstance(document.createElement('div')); - - controller = new DecorationsController(editorInstance); - model = new Model(file('path')); - }); - - afterEach(() => { - model.dispose(); - editorInstance.dispose(); - controller.dispose(); - }); - - describe('getAllDecorationsForModel', () => { - it('returns empty array when no decorations exist for model', () => { - const decorations = controller.getAllDecorationsForModel(model); - - expect(decorations).toEqual([]); - }); - - it('returns decorations by model URL', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - const decorations = controller.getAllDecorationsForModel(model); - - expect(decorations[0]).toEqual({ decoration: 'decorationValue' }); - }); - }); - - describe('addDecorations', () => { - it('caches decorations in a new map', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - expect(controller.decorations.size).toBe(1); - }); - - it('does not create new cache model', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue2' }]); - - expect(controller.decorations.size).toBe(1); - }); - - it('caches decorations by model URL', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - expect(controller.decorations.size).toBe(1); - expect(controller.decorations.keys().next().value).toBe('gitlab:path--path'); - }); - - it('calls decorate method', () => { - spyOn(controller, 'decorate'); - - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - expect(controller.decorate).toHaveBeenCalled(); - }); - }); - - describe('decorate', () => { - it('sets decorations on editor instance', () => { - spyOn(controller.editor.instance, 'deltaDecorations'); - - controller.decorate(model); - - expect(controller.editor.instance.deltaDecorations).toHaveBeenCalledWith([], []); - }); - - it('caches decorations', () => { - spyOn(controller.editor.instance, 'deltaDecorations').and.returnValue([]); - - controller.decorate(model); - - expect(controller.editorDecorations.size).toBe(1); - }); - - it('caches decorations by model URL', () => { - spyOn(controller.editor.instance, 'deltaDecorations').and.returnValue([]); - - controller.decorate(model); - - expect(controller.editorDecorations.keys().next().value).toBe('gitlab:path--path'); - }); - }); - - describe('dispose', () => { - it('clears cached decorations', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - controller.dispose(); - - expect(controller.decorations.size).toBe(0); - }); - - it('clears cached editorDecorations', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - controller.dispose(); - - expect(controller.editorDecorations.size).toBe(0); - }); - }); - - describe('hasDecorations', () => { - it('returns true when decorations are cached', () => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - - expect(controller.hasDecorations(model)).toBe(true); - }); - - it('returns false when no model decorations exist', () => { - expect(controller.hasDecorations(model)).toBe(false); - }); - }); - - describe('removeDecorations', () => { - beforeEach(() => { - controller.addDecorations(model, 'key', [{ decoration: 'decorationValue' }]); - controller.decorate(model); - }); - - it('removes cached decorations', () => { - expect(controller.decorations.size).not.toBe(0); - expect(controller.editorDecorations.size).not.toBe(0); - - controller.removeDecorations(model); - - expect(controller.decorations.size).toBe(0); - expect(controller.editorDecorations.size).toBe(0); - }); - }); -}); diff --git a/spec/javascripts/ide/lib/diff/controller_spec.js b/spec/javascripts/ide/lib/diff/controller_spec.js deleted file mode 100644 index 90ebb95b687..00000000000 --- a/spec/javascripts/ide/lib/diff/controller_spec.js +++ /dev/null @@ -1,215 +0,0 @@ -import { Range } from 'monaco-editor'; -import Editor from '~/ide/lib/editor'; -import ModelManager from '~/ide/lib/common/model_manager'; -import DecorationsController from '~/ide/lib/decorations/controller'; -import DirtyDiffController, { getDiffChangeType, getDecorator } from '~/ide/lib/diff/controller'; -import { computeDiff } from '~/ide/lib/diff/diff'; -import { file } from '../../helpers'; - -describe('Multi-file editor library dirty diff controller', () => { - let editorInstance; - let controller; - let modelManager; - let decorationsController; - let model; - - beforeEach(() => { - editorInstance = Editor.create(); - editorInstance.createInstance(document.createElement('div')); - - modelManager = new ModelManager(); - decorationsController = new DecorationsController(editorInstance); - - model = modelManager.addModel(file('path')); - - controller = new DirtyDiffController(modelManager, decorationsController); - }); - - afterEach(() => { - controller.dispose(); - model.dispose(); - decorationsController.dispose(); - editorInstance.dispose(); - }); - - describe('getDiffChangeType', () => { - ['added', 'removed', 'modified'].forEach(type => { - it(`returns ${type}`, () => { - const change = { - [type]: true, - }; - - expect(getDiffChangeType(change)).toBe(type); - }); - }); - }); - - describe('getDecorator', () => { - ['added', 'removed', 'modified'].forEach(type => { - it(`returns with linesDecorationsClassName for ${type}`, () => { - const change = { - [type]: true, - }; - - expect(getDecorator(change).options.linesDecorationsClassName).toBe( - `dirty-diff dirty-diff-${type}`, - ); - }); - - it('returns with line numbers', () => { - const change = { - lineNumber: 1, - endLineNumber: 2, - [type]: true, - }; - - const { range } = getDecorator(change); - - expect(range.startLineNumber).toBe(1); - expect(range.endLineNumber).toBe(2); - expect(range.startColumn).toBe(1); - expect(range.endColumn).toBe(1); - }); - }); - }); - - describe('attachModel', () => { - it('adds change event callback', () => { - spyOn(model, 'onChange'); - - controller.attachModel(model); - - expect(model.onChange).toHaveBeenCalled(); - }); - - it('adds dispose event callback', () => { - spyOn(model, 'onDispose'); - - controller.attachModel(model); - - expect(model.onDispose).toHaveBeenCalled(); - }); - - it('calls throttledComputeDiff on change', () => { - spyOn(controller, 'throttledComputeDiff'); - - controller.attachModel(model); - - model.getModel().setValue('123'); - - expect(controller.throttledComputeDiff).toHaveBeenCalled(); - }); - - it('caches model', () => { - controller.attachModel(model); - - expect(controller.models.has(model.url)).toBe(true); - }); - }); - - describe('computeDiff', () => { - it('posts to worker', () => { - spyOn(controller.dirtyDiffWorker, 'postMessage'); - - controller.computeDiff(model); - - expect(controller.dirtyDiffWorker.postMessage).toHaveBeenCalledWith({ - path: model.path, - originalContent: '', - newContent: '', - }); - }); - }); - - describe('reDecorate', () => { - it('calls computeDiff when no decorations are cached', () => { - spyOn(controller, 'computeDiff'); - - controller.reDecorate(model); - - expect(controller.computeDiff).toHaveBeenCalledWith(model); - }); - - it('calls decorate when decorations are cached', () => { - spyOn(controller.decorationsController, 'decorate'); - - controller.decorationsController.decorations.set(model.url, 'test'); - - controller.reDecorate(model); - - expect(controller.decorationsController.decorate).toHaveBeenCalledWith(model); - }); - }); - - describe('decorate', () => { - it('adds decorations into decorations controller', () => { - spyOn(controller.decorationsController, 'addDecorations'); - - controller.decorate({ data: { changes: [], path: model.path } }); - - expect(controller.decorationsController.addDecorations).toHaveBeenCalledWith( - model, - 'dirtyDiff', - jasmine.anything(), - ); - }); - - it('adds decorations into editor', () => { - const spy = spyOn(controller.decorationsController.editor.instance, 'deltaDecorations'); - - controller.decorate({ - data: { changes: computeDiff('123', '1234'), path: model.path }, - }); - - expect(spy).toHaveBeenCalledWith( - [], - [ - { - range: new Range(1, 1, 1, 1), - options: { - isWholeLine: true, - linesDecorationsClassName: 'dirty-diff dirty-diff-modified', - }, - }, - ], - ); - }); - }); - - describe('dispose', () => { - it('calls disposable dispose', () => { - spyOn(controller.disposable, 'dispose').and.callThrough(); - - controller.dispose(); - - expect(controller.disposable.dispose).toHaveBeenCalled(); - }); - - it('terminates worker', () => { - spyOn(controller.dirtyDiffWorker, 'terminate').and.callThrough(); - - controller.dispose(); - - expect(controller.dirtyDiffWorker.terminate).toHaveBeenCalled(); - }); - - it('removes worker event listener', () => { - spyOn(controller.dirtyDiffWorker, 'removeEventListener').and.callThrough(); - - controller.dispose(); - - expect(controller.dirtyDiffWorker.removeEventListener).toHaveBeenCalledWith( - 'message', - jasmine.anything(), - ); - }); - - it('clears cached models', () => { - controller.attachModel(model); - - model.dispose(); - - expect(controller.models.size).toBe(0); - }); - }); -}); diff --git a/spec/javascripts/ide/lib/editor_spec.js b/spec/javascripts/ide/lib/editor_spec.js deleted file mode 100644 index 556bd45d3a5..00000000000 --- a/spec/javascripts/ide/lib/editor_spec.js +++ /dev/null @@ -1,287 +0,0 @@ -import { editor as monacoEditor } from 'monaco-editor'; -import Editor from '~/ide/lib/editor'; -import { file } from '../helpers'; - -describe('Multi-file editor library', () => { - let instance; - let el; - let holder; - - beforeEach(() => { - el = document.createElement('div'); - holder = document.createElement('div'); - el.appendChild(holder); - - document.body.appendChild(el); - - instance = Editor.create(); - }); - - afterEach(() => { - instance.dispose(); - - el.remove(); - }); - - it('creates instance of editor', () => { - expect(Editor.editorInstance).not.toBeNull(); - }); - - it('creates instance returns cached instance', () => { - expect(Editor.create()).toEqual(instance); - }); - - describe('createInstance', () => { - it('creates editor instance', () => { - spyOn(monacoEditor, 'create').and.callThrough(); - - instance.createInstance(holder); - - expect(monacoEditor.create).toHaveBeenCalled(); - }); - - it('creates dirty diff controller', () => { - instance.createInstance(holder); - - expect(instance.dirtyDiffController).not.toBeNull(); - }); - - it('creates model manager', () => { - instance.createInstance(holder); - - expect(instance.modelManager).not.toBeNull(); - }); - }); - - describe('createDiffInstance', () => { - it('creates editor instance', () => { - spyOn(monacoEditor, 'createDiffEditor').and.callThrough(); - - instance.createDiffInstance(holder); - - expect(monacoEditor.createDiffEditor).toHaveBeenCalledWith(holder, { - model: null, - contextmenu: true, - minimap: { - enabled: false, - }, - readOnly: true, - scrollBeyondLastLine: false, - renderWhitespace: 'none', - quickSuggestions: false, - occurrencesHighlight: false, - wordWrap: 'on', - renderSideBySide: true, - renderLineHighlight: 'all', - hideCursorInOverviewRuler: false, - theme: 'vs white', - }); - }); - }); - - describe('createModel', () => { - it('calls model manager addModel', () => { - spyOn(instance.modelManager, 'addModel'); - - instance.createModel('FILE'); - - expect(instance.modelManager.addModel).toHaveBeenCalledWith('FILE', null); - }); - }); - - describe('attachModel', () => { - let model; - - beforeEach(() => { - instance.createInstance(document.createElement('div')); - - model = instance.createModel(file()); - }); - - it('sets the current model on the instance', () => { - instance.attachModel(model); - - expect(instance.currentModel).toBe(model); - }); - - it('attaches the model to the current instance', () => { - spyOn(instance.instance, 'setModel'); - - instance.attachModel(model); - - expect(instance.instance.setModel).toHaveBeenCalledWith(model.getModel()); - }); - - it('sets original & modified when diff editor', () => { - spyOn(instance.instance, 'getEditorType').and.returnValue('vs.editor.IDiffEditor'); - spyOn(instance.instance, 'setModel'); - - instance.attachModel(model); - - expect(instance.instance.setModel).toHaveBeenCalledWith({ - original: model.getOriginalModel(), - modified: model.getModel(), - }); - }); - - it('attaches the model to the dirty diff controller', () => { - spyOn(instance.dirtyDiffController, 'attachModel'); - - instance.attachModel(model); - - expect(instance.dirtyDiffController.attachModel).toHaveBeenCalledWith(model); - }); - - it('re-decorates with the dirty diff controller', () => { - spyOn(instance.dirtyDiffController, 'reDecorate'); - - instance.attachModel(model); - - expect(instance.dirtyDiffController.reDecorate).toHaveBeenCalledWith(model); - }); - }); - - describe('attachMergeRequestModel', () => { - let model; - - beforeEach(() => { - instance.createDiffInstance(document.createElement('div')); - - const f = file(); - f.mrChanges = { diff: 'ABC' }; - f.baseRaw = 'testing'; - - model = instance.createModel(f); - }); - - it('sets original & modified', () => { - spyOn(instance.instance, 'setModel'); - - instance.attachMergeRequestModel(model); - - expect(instance.instance.setModel).toHaveBeenCalledWith({ - original: model.getBaseModel(), - modified: model.getModel(), - }); - }); - }); - - describe('clearEditor', () => { - it('resets the editor model', () => { - instance.createInstance(document.createElement('div')); - - spyOn(instance.instance, 'setModel'); - - instance.clearEditor(); - - expect(instance.instance.setModel).toHaveBeenCalledWith(null); - }); - }); - - describe('dispose', () => { - it('calls disposble dispose method', () => { - spyOn(instance.disposable, 'dispose').and.callThrough(); - - instance.dispose(); - - expect(instance.disposable.dispose).toHaveBeenCalled(); - }); - - it('resets instance', () => { - instance.createInstance(document.createElement('div')); - - expect(instance.instance).not.toBeNull(); - - instance.dispose(); - - expect(instance.instance).toBeNull(); - }); - - it('does not dispose modelManager', () => { - spyOn(instance.modelManager, 'dispose'); - - instance.dispose(); - - expect(instance.modelManager.dispose).not.toHaveBeenCalled(); - }); - - it('does not dispose decorationsController', () => { - spyOn(instance.decorationsController, 'dispose'); - - instance.dispose(); - - expect(instance.decorationsController.dispose).not.toHaveBeenCalled(); - }); - }); - - describe('updateDiffView', () => { - describe('edit mode', () => { - it('does not update options', () => { - instance.createInstance(holder); - - spyOn(instance.instance, 'updateOptions'); - - instance.updateDiffView(); - - expect(instance.instance.updateOptions).not.toHaveBeenCalled(); - }); - }); - - describe('diff mode', () => { - beforeEach(() => { - instance.createDiffInstance(holder); - - spyOn(instance.instance, 'updateOptions').and.callThrough(); - }); - - it('sets renderSideBySide to false if el is less than 700 pixels', () => { - spyOnProperty(instance.instance.getDomNode(), 'offsetWidth').and.returnValue(600); - - expect(instance.instance.updateOptions).not.toHaveBeenCalledWith({ - renderSideBySide: false, - }); - }); - - it('sets renderSideBySide to false if el is more than 700 pixels', () => { - spyOnProperty(instance.instance.getDomNode(), 'offsetWidth').and.returnValue(800); - - expect(instance.instance.updateOptions).not.toHaveBeenCalledWith({ - renderSideBySide: true, - }); - }); - }); - }); - - describe('isDiffEditorType', () => { - it('returns true when diff editor', () => { - instance.createDiffInstance(holder); - - expect(instance.isDiffEditorType).toBe(true); - }); - - it('returns false when not diff editor', () => { - instance.createInstance(holder); - - expect(instance.isDiffEditorType).toBe(false); - }); - }); - - it('sets quickSuggestions to false when language is markdown', () => { - instance.createInstance(holder); - - spyOn(instance.instance, 'updateOptions').and.callThrough(); - - const model = instance.createModel({ - ...file(), - key: 'index.md', - path: 'index.md', - }); - - instance.attachModel(model); - - expect(instance.instance.updateOptions).toHaveBeenCalledWith({ - readOnly: false, - quickSuggestions: false, - }); - }); -}); |