浏览代码

Tests: Introduced test suite for widget resize class.

Marek Lewandowski 6 年之前
父节点
当前提交
6b86a5bbb5
共有 2 个文件被更改,包括 136 次插入0 次删除
  1. 110 0
      packages/ckeditor5-widget/tests/widgetresize.js
  2. 26 0
      packages/ckeditor5-widget/tests/widgetresize/resizer.js

+ 110 - 0
packages/ckeditor5-widget/tests/widgetresize.js

@@ -0,0 +1,110 @@
+/**
+ * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+/* globals window, document */
+
+import WidgetResize from '../src/widgetresize';
+
+import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
+import ArticlePluginSet from '@ckeditor/ckeditor5-core/tests/_utils/articlepluginset';
+
+describe( 'WidgetResize', () => {
+	let editor, editorElement;
+
+	before( async () => {
+		editorElement = createEditorElement();
+		editor = await createEditor( editorElement );
+	} );
+
+	after( () => {
+		editorElement.remove();
+		return editor.destroy();
+	} );
+
+	describe( 'plugin', () => {
+		it( 'is loaded', () => {
+			expect( editor.plugins.get( WidgetResize ) ).to.be.instanceOf( WidgetResize );
+		} );
+	} );
+
+	describe( 'mouse listeners', () => {
+		it( 'doesnt break when called with unexpected element', () => {
+			const unrelatedElement = document.createElement( 'div' );
+
+			editor.plugins.get( WidgetResize )._mouseDownListener( {}, {
+				target: unrelatedElement
+			} );
+		} );
+	} );
+
+	describe( 'mouse listeners (stubbed)', () => {
+		let mouseListenerStubs, localEditor, localElement;
+
+		beforeEach( async () => {
+			mouseListenerStubs = {
+				down: sinon.stub( WidgetResize.prototype, '_mouseDownListener' ),
+				move: sinon.stub( WidgetResize.prototype, '_mouseMoveListener' ),
+				up: sinon.stub( WidgetResize.prototype, '_mouseUpListener' )
+			};
+
+			localElement = createEditorElement();
+			localEditor = await createEditor( localElement );
+		} );
+
+		afterEach( () => {
+			for ( const stub of Object.values( mouseListenerStubs ) ) {
+				stub.restore();
+			}
+
+			localElement.remove();
+
+			return localEditor.destroy();
+		} );
+
+		it( 'are detached when plugin is destroyed', async () => {
+			await localEditor.destroy();
+
+			// Trigger mouse event.
+			fireMouseEvent( document.body, 'mousedown', {} );
+			// Ensure nothing got called.
+			expect( mouseListenerStubs.down.callCount ).to.be.equal( 0 );
+		} );
+	} );
+
+	function createEditor( element ) {
+		return new Promise( ( resolve, reject ) => {
+			ClassicTestEditor
+				.create( element, {
+					plugins: [
+						ArticlePluginSet, WidgetResize
+					]
+				} )
+				.then( newEditor => {
+					resolve( newEditor );
+				} )
+				.catch( reject );
+		} );
+	}
+
+	function createEditorElement() {
+		const element = document.createElement( 'div' );
+		document.body.appendChild( element );
+		return element;
+	}
+
+	function fireMouseEvent( target, eventType, eventData ) {
+		// Id of the left mouse button.
+		const MOUSE_BUTTON_MAIN = 0;
+
+		// Using initMouseEvent instead of MouseEvent constructor, as MouseEvent constructor doesn't support passing pageX
+		// and pageY. See https://stackoverflow.com/questions/45843458/setting-click-events-pagex-and-pagey-always-reverts-to-0
+		// However there's still a problem, that events created with `initMouseEvent` have **floored** pageX, pageY numbers.
+		const event = document.createEvent( 'MouseEvent' );
+		event.initMouseEvent( eventType, true, true, window, null, 0, 0, eventData.pageX, eventData.pageY, false, false, false, false,
+			MOUSE_BUTTON_MAIN, null );
+
+		target.dispatchEvent( event );
+	}
+} );

+ 26 - 0
packages/ckeditor5-widget/tests/widgetresize/resizer.js

@@ -82,6 +82,32 @@ describe( 'Resizer', () => {
 		} );
 	} );
 
+	describe( 'mouse listeners', () => {
+		/**
+		 * @todo: move to aseparate suite (it's widgetresize not resizer)
+		 */
+		let resizerInstance, renderedElement;
+
+		beforeEach( () => {
+			resizerInstance = createResizer();
+			resizerInstance.attach();
+
+			renderedElement = resizerInstance._viewResizerWrapper.render( document );
+		} );
+
+		afterEach( () => {
+			renderedElement.remove();
+		} );
+
+		describe( 'mousedown', () => {
+			it( 'doesnt break if called with element other than a handle', () => {
+				resizerInstance._mouseDownListener( null, {
+					target: document.createElement( 'a' )
+				} );
+			} );
+		} );
+	} );
+
 	function createResizer() {
 		const model = new Element( 'resizable' );
 		const viewElement = new ContainerElement( 'div' );