8
0
فهرست منبع

Merge pull request #301 from ckeditor/t/300

Added expect( fn ).to.throwCKEditorError() extension to ChaiJS.
Piotrek Koszuliński 9 سال پیش
والد
کامیت
6cb7afbbc5
1فایلهای تغییر یافته به همراه127 افزوده شده و 0 حذف شده
  1. 127 0
      dev/bender/plugins/ckeditor5/static/extensions.js

+ 127 - 0
dev/bender/plugins/ckeditor5/static/extensions.js

@@ -21,6 +21,39 @@
 		return load( context, moduleId, url );
 	};
 
+	// Extend ChaiJS with custom exception check `expect().to.throwCKEditorError( [ msg ] )`.
+	require( [ '/ckeditor5/utils/ckeditorerror.js', 'chai' ], function( CKEditorError, chai ) {
+		CKEditorError = CKEditorError.default;
+
+		// Load extension and bind class used to check for inheritance.
+		chai.use( addThrowsCKEditorError.bind( null, CKEditorError ) );
+
+		// Self-test of the extension. Function names will help find those tests in case of regression.
+		chai.expect( function throwCKEditorErrorSelfTest1() {
+			throw new CKEditorError();
+		} ).to.throwCKEditorError();
+
+		chai.expect( function throwCKEditorErrorSelfTest2() {
+			throw new Error();
+		} ).to.not.throwCKEditorError();
+
+		chai.expect( function throwCKEditorErrorSelfTest3() {
+			throw new CKEditorError( 'custom message' );
+		} ).to.throwCKEditorError( 'message' );
+
+		chai.expect( function throwCKEditorErrorSelfTest4() {
+			throw new CKEditorError( 'another msg' );
+		} ).to.throwCKEditorError( /msg/ );
+
+		chai.expect( function throwCKEditorErrorSelfTest5() {
+			throw new CKEditorError( 'another msg' );
+		} ).to.throwCKEditorError( /^another/ );
+
+		chai.expect( function throwCKEditorErrorSelfTest6() {
+			throw new CKEditorError( 'another msg' );
+		} ).to.throwCKEditorError( /msg$/ );
+	} );
+
 	// Reported: https://github.com/benderjs/benderjs/issues/248
 	// Ugh... make some paths cleanup, because we need to combine these fragments and we don't want to
 	// duplicate '/'. BTW. if you want to touch this make sure you haven't broken Bender jobs which
@@ -46,4 +79,98 @@
 	function nonEmpty( str ) {
 		return !!str.length;
 	}
+
+	// Add `throwCKEditorError` chainable method to ChaiJS.
+	//
+	// @param {Object} CKEditorError Constructor of class checking for CKEditorError membership.
+	// @param {Object} _chai Chai instance.
+	// @param {Object} utils Chai extension utils.
+	// @returns {Object} Assertion
+	function addThrowsCKEditorError( CKEditorError, _chai, utils ) {
+		var Assertion = _chai.Assertion;
+
+		Assertion.addMethod( 'throwCKEditorError', assertThrowCKEditorError );
+
+		function assertThrowCKEditorError( errMsg ) {
+			// jshint validthis: true
+			// jscs:disable disallowMultipleVarDecl
+
+			var obj = utils.flag( this, 'object' ),
+				actuallyGot = '',
+				thrown = false,
+				thrownError = null,
+				message;
+
+			if ( arguments.length === 0 ) {
+				errMsg = null;
+			}
+
+			try {
+				obj();
+			} catch ( err ) {
+				this.assert(
+					CKEditorError.isCKEditorError( err ),
+					'expected #{this} to throw #{exp} but #{act} was thrown',
+					'expected #{this} to not throw #{exp} but #{act} was thrown',
+					'CKEditorError',
+					( err instanceof Error ? err.toString() : err )
+				);
+
+				// Set subject of assertion.
+				if ( !errMsg ) {
+					utils.flag( this, 'object', err );
+
+					return this;
+				}
+
+				// Check message of error.
+				message = utils.type( err ) === 'object' && 'message' in err ? err.message : err.toString();
+
+				if ( ( message !== null && message !== undefined ) && errMsg && errMsg instanceof RegExp ) {
+					this.assert(
+						errMsg.exec( message ),
+						'expected #{this} to throw CKEditorError matching #{exp} but got #{act}',
+						'expected #{this} to throw CKEditorError not matching #{exp}',
+						errMsg,
+						message
+					);
+
+					utils.flag( this, 'object', err );
+
+					return this;
+				} else if ( ( message !== null && message !== undefined ) && errMsg && typeof errMsg == 'string' ) {
+					this.assert(
+						message.indexOf( errMsg ) !== -1,
+						'expected #{this} to throw CKEditorError including #{exp} but got #{act}',
+						'expected #{this} to throw CKEditorError not including #{act}',
+						errMsg,
+						message
+					);
+
+					utils.flag( this, 'object', err );
+
+					return this;
+				} else {
+					thrown = true;
+					thrownError = err;
+				}
+			}
+
+			if ( thrown ) {
+				actuallyGot = ' but #{act} was thrown';
+			}
+
+			this.assert(
+				thrown === true,
+					'expected #{this} to throw an CKEditorError' + actuallyGot,
+					'expected #{this} to not throw an CKEditorError' + actuallyGot,
+					'CKEditorError',
+					( thrownError instanceof Error ? thrownError.toString() : thrownError )
+			);
+
+			utils.flag( this, 'object', thrownError );
+
+			return this;
+		}
+	}
 } )();