From 6b2abbdc46e9c4c37f515e838a7f820a4f2bb91a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Mon, 23 Jan 2023 23:20:08 +0100 Subject: [PATCH] Build: Migrate middleware-mockserver to modern JS The `test/middleware-mockserver.js` file used to have the same ESLint settings applied as other test files that are directly run in tested browsers. Now it shares settings of other Node.js files. The file is now also written using modern JS, leveraging ES2018. Closes gh-5196 (cherry picked from commit ce90a48450ba40586a6567235abb8fd2df84da97) --- test/.eslintrc.json | 8 +++ test/middleware-mockserver.js | 106 ++++++++++++++++++---------------- 2 files changed, 65 insertions(+), 49 deletions(-) diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 659adeac6..3eed9c9b6 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -57,6 +57,14 @@ }, "overrides": [ + { + "files": [ + "middleware-mockserver.js" + ], + + "extends": "../.eslintrc-node.json" + }, + { "files": [ "data/core/jquery-iterability-transpiled-es6.js", diff --git a/test/middleware-mockserver.js b/test/middleware-mockserver.js index da041c25e..b6c7a5210 100644 --- a/test/middleware-mockserver.js +++ b/test/middleware-mockserver.js @@ -1,9 +1,11 @@ -/* eslint-env node */ -var url = require( "url" ); -var fs = require( "fs" ); -var getRawBody = require( "raw-body" ); +"use strict"; + +const url = require( "url" ); +const fs = require( "fs" ); +const getRawBody = require( "raw-body" ); + +let cspLog = ""; -var cspLog = ""; /** * Keep in sync with /test/mock.php */ @@ -11,7 +13,7 @@ function cleanCallback( callback ) { return callback.replace( /[^a-z0-9_]/gi, "" ); } -var mocks = { +const mocks = { contentType: function( req, resp ) { resp.writeHead( 200, { "content-type": req.query.contentType @@ -19,7 +21,7 @@ var mocks = { resp.end( req.query.response ); }, wait: function( req, resp ) { - var wait = Number( req.query.wait ) * 1000; + const wait = Number( req.query.wait ) * 1000; setTimeout( function() { if ( req.query.script ) { resp.writeHead( 200, { "content-type": "text/javascript" } ); @@ -44,7 +46,7 @@ var mocks = { }, next ); }, xml: function( req, resp, next ) { - var content = "5-23"; + const content = "5-23"; resp.writeHead( 200, { "content-type": "text/xml" } ); if ( req.query.cal === "5-2" ) { @@ -59,7 +61,7 @@ var mocks = { } }, next ); }, - atom: function( req, resp, next ) { + atom: function( _req, resp ) { resp.writeHead( 200, { "content-type": "atom+xml" } ); resp.end( "" ); }, @@ -73,7 +75,7 @@ var mocks = { } resp.end( "QUnit.assert.ok( true, \"mock executed\" );" ); }, - testbar: function( req, resp ) { + testbar: function( _req, resp ) { resp.writeHead( 200 ); resp.end( "this.testBar = 'bar'; " + @@ -96,7 +98,7 @@ var mocks = { } }, jsonp: function( req, resp, next ) { - var callback; + let callback; if ( Array.isArray( req.query.callback ) ) { callback = Promise.resolve( req.query.callback[ req.query.callback.length - 1 ] ); } else if ( req.query.callback ) { @@ -108,7 +110,7 @@ var mocks = { return body.trim().replace( "callback=", "" ); } ); } - var json = req.query.array ? + const json = req.query.array ? JSON.stringify( [ { name: "John", age: 21 }, { name: "Peter", age: 25 } ] ) : @@ -116,14 +118,14 @@ var mocks = { { data: { lang: "en", length: 25 } } ); callback.then( function( cb ) { - resp.end( cleanCallback( cb ) + "(" + json + ")" ); + resp.end( `${ cleanCallback( cb ) }(${ json })` ); }, next ); }, xmlOverJsonp: function( req, resp ) { - var callback = req.query.callback; - var body = fs.readFileSync( __dirname + "/data/with_fries.xml" ).toString(); + const callback = req.query.callback; + const body = fs.readFileSync( `${ __dirname }/data/with_fries.xml` ).toString(); resp.writeHead( 200 ); - resp.end( cleanCallback( callback ) + "(" + JSON.stringify( body ) + ")\n" ); + resp.end( `${ cleanCallback( callback ) }(${ JSON.stringify( body ) })\n` ); }, error: function( req, resp ) { if ( req.query.json ) { @@ -144,8 +146,8 @@ var mocks = { "constructor": "prototype collision (constructor)" } ); req.query.keys.split( "|" ).forEach( function( key ) { - if ( req.headers[ key.toLowerCase() ] ) { - resp.write( key + ": " + req.headers[ key.toLowerCase() ] + "\n" ); + if ( key.toLowerCase() in req.headers ) { + resp.write( `${ key }: ${ req.headers[ key.toLowerCase() ] }\n` ); } } ); resp.end(); @@ -163,16 +165,16 @@ var mocks = { }, echoHtml: function( req, resp, next ) { resp.writeHead( 200, { "Content-Type": "text/html" } ); - resp.write( "
" + req.method + "
" ); - resp.write( "
" + req.parsed.search.slice( 1 ) + "
" ); + resp.write( `
${ req.method }
` ); + resp.write( `
${ req.parsed.search.slice( 1 ) }
` ); getBody( req ).then( function( body ) { - resp.write( "
" + body + "
" ); + resp.write( `
${ body }
` ); resp.end( body ); }, next ); }, etag: function( req, resp ) { - var hash = Number( req.query.ts ).toString( 36 ); - var etag = "W/\"" + hash + "\""; + const hash = Number( req.query.ts ).toString( 36 ); + const etag = `W/"${ hash }"`; if ( req.headers[ "if-none-match" ] === etag ) { resp.writeHead( 304 ); resp.end(); @@ -183,8 +185,8 @@ var mocks = { } ); resp.end(); }, - ims: function( req, resp, next ) { - var ts = req.query.ts; + ims: function( req, resp ) { + const ts = req.query.ts; if ( req.headers[ "if-modified-since" ] === ts ) { resp.writeHead( 304 ); resp.end(); @@ -195,40 +197,44 @@ var mocks = { } ); resp.end(); }, - status: function( req, resp, next ) { + status: function( req, resp ) { resp.writeHead( Number( req.query.code ) ); resp.end(); }, testHTML: function( req, resp ) { resp.writeHead( 200, { "Content-Type": "text/html" } ); - var body = fs.readFileSync( __dirname + "/data/test.include.html" ).toString(); - body = body.replace( /{{baseURL}}/g, req.query.baseURL ); + const body = fs + .readFileSync( `${ __dirname }/data/test.include.html` ) + .toString() + .replace( /{{baseURL}}/g, req.query.baseURL ); resp.end( body ); }, - cspFrame: function( req, resp ) { + cspFrame: function( _req, resp ) { resp.writeHead( 200, { "Content-Type": "text/html", - "Content-Security-Policy": "default-src 'self'; report-uri /base/test/data/mock.php?action=cspLog" + "Content-Security-Policy": "default-src 'self'; " + + "report-uri /base/test/data/mock.php?action=cspLog" } ); - var body = fs.readFileSync( __dirname + "/data/csp.include.html" ).toString(); + const body = fs.readFileSync( `${ __dirname }/data/csp.include.html` ).toString(); resp.end( body ); }, cspNonce: function( req, resp ) { - var testParam = req.query.test ? "-" + req.query.test : ""; + const testParam = req.query.test ? `-${ req.query.test }` : ""; resp.writeHead( 200, { "Content-Type": "text/html", - "Content-Security-Policy": "script-src 'nonce-jquery+hardcoded+nonce'; report-uri /base/test/data/mock.php?action=cspLog" + "Content-Security-Policy": "script-src 'nonce-jquery+hardcoded+nonce'; " + + "report-uri /base/test/data/mock.php?action=cspLog" } ); - var body = fs.readFileSync( - __dirname + "/data/csp-nonce" + testParam + ".html" ).toString(); + const body = fs.readFileSync( + `${ __dirname }/data/csp-nonce${ testParam }.html` ).toString(); resp.end( body ); }, - cspLog: function( req, resp ) { + cspLog: function( _req, resp ) { cspLog = "error"; resp.writeHead( 200 ); resp.end(); }, - cspClean: function( req, resp ) { + cspClean: function( _req, resp ) { cspLog = ""; resp.writeHead( 200 ); resp.end(); @@ -240,14 +246,14 @@ var mocks = { resp.writeHead( 404, { "Content-Type": "text/html; charset=UTF-8" } ); } if ( req.query.callback ) { - resp.end( cleanCallback( req.query.callback ) + - "( {\"status\": 404, \"msg\": \"Not Found\"} )" ); + resp.end( `${ cleanCallback( req.query.callback ) + }( {"status": 404, "msg": "Not Found"} )` ); } else { resp.end( "QUnit.assert.ok( false, \"Mock return erroneously executed\" );" ); } } }; -var handlers = { +const handlers = { "test/data/mock.php": function( req, resp, next ) { if ( !mocks[ req.query.action ] ) { resp.writeHead( 400 ); @@ -257,11 +263,11 @@ var handlers = { } mocks[ req.query.action ]( req, resp, next ); }, - "test/data/support/csp.log": function( req, resp ) { + "test/data/support/csp.log": function( _req, resp ) { resp.writeHead( 200 ); resp.end( cspLog ); }, - "test/data/404.txt": function( req, resp ) { + "test/data/404.txt": function( _req, resp ) { resp.writeHead( 404 ); resp.end( "" ); } @@ -276,21 +282,23 @@ var handlers = { * Express versions of these (e.g. no req.path, req.query, resp.set). */ function MockserverMiddlewareFactory() { + /** * @param {http.IncomingMessage} req * @param {http.ServerResponse} resp * @param {Function} next Continue request handling */ return function( req, resp, next ) { - var parsed = url.parse( req.url, /* parseQuery */ true ), - path = parsed.pathname.replace( /^\/base\//, "" ), - query = parsed.query, - subReq = Object.assign( Object.create( req ), { - query: query, - parsed: parsed - } ); + const parsed = url.parse( req.url, /* parseQuery */ true ); + let path = parsed.pathname.replace( /^\/base\//, "" ); + const query = parsed.query; + const subReq = Object.assign( Object.create( req ), { + query: query, + parsed: parsed + } ); if ( /^test\/data\/mock.php\//.test( path ) ) { + // Support REST-like Apache PathInfo path = "test\/data\/mock.php"; }