VimUnDo KE?WLT~5nuB04y headers: { Xt['_6")#+ V#XA579" const res = {}5_7)#+ V#XA67 };5_6)#+ V#XA689 6885_7 )#+ V#XA 689! expect(notFoundHandler(res));5_6!)#+ V#XA589# const res = {};5_6)#+ V#XA!68; 68:5_ )#+ V#XA<;5_*#, V#XA"<import 5_6*#, V#XB#68= 68<5_9*#, V#XB%8:= writeHead:5_8!*#, V#XB479=! const res = {5_8"*#, V#XB58:> 8:=5_:*#, V#XB;9: writeHead: cb,5_:*#, V#XB;&9: };5_9*#, V#XBW9;<9:<5_7 *#, V#XBY68= const cb = sinon.spy();5_7*#, V#XB\79=78=5_8 *#, V#XB]79>" const writeHead = sinon.spy();5_9*#, V#XBd89# const res = {};5_6*#, V#XBe68=67=5_:*#, V#XBf9;> res.writeHead = cb;5_;*#, V#XBi:<> res.writeHead = cb;5_;*#, V#XBk;=>5_<*#, V#XBl;<5_<*#, V#XBr;=>, expect(notFoundHandler(res)).to.be.true;5_<*#, V#XBr;=>+ xpect(notFoundHandler(res)).to.be.true;5_<*#, V#XBr;=>* pect(notFoundHandler(res)).to.be.true;5_<*#, V#XBr;=>) ect(notFoundHandler(res)).to.be.true;5_<*#, V#XBr;=>( ct(notFoundHandler(res)).to.be.true;5_<*#, V#XBr;=>' t(notFoundHandler(res)).to.be.true;5_<*#, V#XBu;=>& (notFoundHandler(res)).to.be.true;5_;*#, V#XBv;=>5_=*#, V#XBx<>?% notFoundHandler(res)).to.be.true;5_=*#, V#XBx<>? notFoundHandler(res)5_<*#, V#XBz;<5_<*#, V#XBz<>? <>>5_=3*#, V#XB'<>?3 expect(writeHead).to.have.been.called.with(404)5_=*#, V#XB<>?4 expect(writeHead).to.have.been.called.with(404);5_= *#, V#XB(<>?; expect(writeHead.called).to.have.been.called.with(404);5_;*#, V#XB):<? res.writeHead = end;5_6 *#, V#XB68@ 68?5_6*#, V#XC68A 68@5_7*#, V#XC67 const5_7*#, V#XC69@ it('5_8*#, V#XC8:A5_::@VXC 9:# const res = {};" const writeHead = sinon.spy(); const end = sinon.spy(); res.writeHead = writeHead; res.end = end; notFoundHandler(res);( expect(writeHead.called).to.be.true;5_7::VXC 7?;78;5_88>XC"8?B" const writeHead = sinon.spy(); const end = sinon.spy(); res.writeHead = writeHead; res.end = end; notFoundHandler(res);( expect(writeHead.called).to.be.true;79B# const res = {};5_@8>XC$?@5_88>XC&8:B 8:A5_98?XC)89 res.write5_;8>XC*:<A res.writeHead = writeHead;5_98>XC-89$ const writeHead = sinon.spy();5_98=XC.89 const end = sinon.spy();5_:8<XC09;? res.end = end;5_< 8<XC5<>@ <>?5_=8<XC;*<= expect(writeHead5_<8<XC?<>@ <>?5_< 8<XCG;=@* expect(writeHead.called).to.be.true;5_<8<XCI<>@<=@5_=8<XCJ<>A. expect(res.writeHead.called).to.be.true;5_>8<XCN+=?A# console.log('hi', writeHead);5_88<XCp8:B 8:A5_:8=XCu9:" res.writeHead = sinon.spy();5_< 8<XC|;=A. expect(res.writeHead.called).to.be.true;5_< 8<XC|;=A- expect(es.writeHead.called).to.be.true;5_< 8<XC|;=A, expect(s.writeHead.called).to.be.true;5_< 8<XC|,;=A+ expect(.writeHead.called).to.be.true;5_9 8<XC9;B 9;A5_:8=XC9: res.5_;8<XC;=B ;=A5_<8=XC-;< expect(5_98<XC9;A9:A5_: 8=XC9;B$ const writeHead = sinon.spy();5_;8=XC:; res.end = sinon.spy();5_= 8<XC<>A( expect(res.end.called).to.be.true;5_= 8<XC<>A' expect(es.end.called).to.be.true;5_= 8<XC<>A& expect(s.end.called).to.be.true;5_= 8<XC.<>A% expect(.end.called).to.be.true;5_>8<XC=?A' console.log('hi', res.writeHead);5_>8<XC=?A& console.log('hi', es.writeHead);5_>8<XC=?A% console.log('hi', s.writeHead);5_>8<XC1=?A$ console.log('hi', .writeHead);5_: 8<XC:<B :<A5_;8=XC;=B;<B5_;;<VXC:; res.writeHead = writeHead; res.writeHead = writeHead;5_9;;VXC8:A$ const writeHead = sinon.spy();5_:;;VXC29;A const end = sinon.spy();5_>;;VXD =?A# console.log('hi', writeHead);5_>";;VXD3=?A) console.log('hi', writeHead.calls);5_>*;;VXD4=?A, console.log('hi', writeHead.getCalls);5_>);;VXD"5=?A4 console.log('hi', writeHead.getCalls(0).args);5_>;;VXD1=?A3 console.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A2 onsole.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A1 nsole.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A0 sole.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A/ ole.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A. le.log('hi', writeHead.getCall(0).args);5_>;;VXD1=?A- e.log('hi', writeHead.getCall(0).args);5_>;;VXD2=?A, .log('hi', writeHead.getCall(0).args);5_>;;VXD2=?A+ log('hi', writeHead.getCall(0).args);5_>;;VXD2=?A* og('hi', writeHead.getCall(0).args);5_>;;VXD2=?A) g('hi', writeHead.getCall(0).args);5_>;;VXD2=?A( ('hi', writeHead.getCall(0).args);5_ >;;VXD2=?A' 'hi', writeHead.getCall(0).args);5_  >;;VXD2=?A& hi', writeHead.getCall(0).args);5_   >;;VXD2=?A% i', writeHead.getCall(0).args);5_   >;;VXD3=?A$ ', writeHead.getCall(0).args);5_   >;;VXD3=?A# , writeHead.getCall(0).args);5_  >;;VXD3=?A" writeHead.getCall(0).args);5_ >;;VXD4=?A! writeHead.getCall(0).args);5_>(;;VXD6=@A( expect(writeHead.getCall(0).args);5_>;;VXD@>@C >@B5_8 ;;VXDH8:D 8:C5_@ <<VXDO6?AD 404, 5_?&<<VXDc7>@D5 expect(writeHead.getCall(0).args)).to.deep.eq([5_?&<<VXDi>@D4 expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers,5_?4<<VXDi>@CB expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers, ]);5_?A<<VXDj>@BF expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers, ]);5_?B<<VXDl>@BE expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers ]);5_?A<<VXDl>@BD expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers );5_?A<<VXDm>@BC expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers);5_?4<<VXDn8>@BD expect(writeHead.getCall(0).args).to.deep.eq([ 404, headers]);5_?4<<VXDt?AB?@B5_@ <<VXDu?ACC expect(writeHead.getCall(0).args).to.deep.eq([404, headers]);5_ @.<<VXD9?AC= expect(end.getCall(0).args).to.deep.eq([404, headers]);5_! <<VXD D  C5_ "! ==VXD: E  D5_!#"D8DVXDDREDEE5_"$#D8DVXDDFR5_#%$F 8DVXDEGS% describe('notFoundHandler', () => {5_$&%O48DVXDNPSC expect(writeHead.getCall(0).args).to.deep.eq([404, headers]);5_%'&P/8DVXDOQSG expect(end.getCall(0).args).to.deep.eq(['404 - File not found']);5_&('P58DVXD;OQSG expect(end.getCall(0).args).to.deep.eq(['500 - File not found']);5_')(B:8DVXDACSG expect(end.getCall(0).args).to.deep.eq(['404 - File not found']);5_(*)B>8DVXD=ACSG expect(end.getCall(0).args).to.deep.eq(['404 - File Not found']);5_)+*L8DVXE'>KMS notFoundHandler(res);5_*,+68DVXE;7:UP const generateHandlerTests = (label, name, statusCode, headers, response) => {69T 68S5_+-,8;GVXEk8:V5_,.-8<HVXEo8FW89W5_-/.99EXEr9Fd 7 it('should serve the appropriate response', () => {% const res = {};& const headers = createHeaders();4 const writeHead = res.writeHead = sinon.spy();( const end = res.end = sinon.spy(); notFoundHandler(res);* expect(writeHead.called).to.be.true;$ expect(end.called).to.be.true;C expect(writeHead.getCall(0).args).to.deep.eq([404, headers]);G expect(end.getCall(0).args).to.deep.eq(['404 - File Not Found']); }); });8:d% describe('notFoundHandler', () => {5_.0/9 9EXEu8:d' describe('notFoundHandler', () => {5_/10> 9EXE>@e >@d5_021@9FXE?@ notFoundHandler(res);5_132B69EXEACdE expect(writeHead.getCall(0).args).to.deep.eq([404, headers]);5_243<9EXE;<( const headers = createHeaders();5_354B09DXF ACcI expect(end.getCall(0).args).to.deep.eq(['404 - File Not Found']);5_465B"9DXFACc; expect(end.getCall(0).args).to.deep.eq([response]);5_576B)9DXFACc> expect(end.getCall(0).args[0]).to.deep.eq([response]);5_687B-9DXFACc9 expect(end.getCall(0).args[0]).to.eq([response]);5_798B59DXFACc8 expect(end.getCall(0).args[0]).to.eq(response]);5_8:9E9DXF"DE5_9;:F9DXF$FHb5_:<;F9DXF&FHd FHc5_;=<G9DXFJFIdi generateHandlerTests('notFoundHandler', notFoundHandler, 404, createHeaders(), '404 - File Not Found');5_<>=H9DXFLGJeV 'notFoundHandler', notFoundHandler, 404, createHeaders(), '404 - File Not Found');5_=?>I9DXFNHKfC notFoundHandler, 404, createHeaders(), '404 - File Not Found');5_>@?J 9DXFPILg2 404, createHeaders(), '404 - File Not Found');5_?A@K9DXFWJMh- createHeaders(), '404 - File Not Found');5_@BAL9DXFZKNi '404 - File Not Found');5_ACBG9DXF]FHj generateHandlerTests(5_BDCM9DXF_LNj );5_CEDM9DXF`LNj \);5_DFEM9DXFaLNj \);5_EGFH9DXFcGIj 'notFoundHandler',5_FHGI9DXFeHJj notFoundHandler,5_GIHJ9DXFhIKj 404,5_HJIK9DXFlJLj createHeaders(),5_IKJL9DXFnKMj '404 - File Not Found'5_JLKL$9DXFrKMj$ response: '404 - File Not Found'5_KML8 9DXFu79jP const generateHandlerTests = (label, name, statusCode, headers, response) => {5_LNM8 9DXF{79j- const generateHandlerTests = (options) => {5_MON>9DXF=?j name(res);5_NQO9 9DXF8:j describe(label, () => {5_ORPQA69DXF@BjL expect(writeHead.getCall(0).args).to.deep.eq([statusCode, headers]);5_QSRAG9DXF@BjQ expect(writeHead.getCall(0).args).to.deep.eq([opts.statusCode, headers]);5_RTSB-9DXFACj7 expect(end.getCall(0).args[0]).to.eq(response);5_SUTMMGV1XFMUjMNj5_TVUMMGV1XFMOq5_UWVP MGV1XFOQr label: 'notFoundHandler',5_VXWRMGV1XFQSr statusCode: 404,5_WYXTMGV1XFSUr% response: '404 - File Not Found',5_XZYTMGV1XFSUr% response: '500 - File Not Found',5_Y[ZWW$cV)XFVW % describe('notFoundHandler', () => {7 it('should serve the appropriate response', () => {% const res = {};& const headers = createHeaders();4 const writeHead = res.writeHead = sinon.spy();( const end = res.end = sinon.spy(); notFoundHandler(res);* expect(writeHead.called).to.be.true;$ expect(end.called).to.be.true;C expect(writeHead.getCall(0).args).to.deep.eq([404, headers]);G expect(end.getCall(0).args).to.deep.eq(['404 - File Not Found']); }); });5_Z\[WW$WV)XFVW5_[]\WWcVXFVW * describe('internalErrorHandler', () => {7 it('should serve the appropriate response', () => {% const res = {};& const headers = createHeaders();4 const writeHead = res.writeHead = sinon.spy();( const end = res.end = sinon.spy(); internalErrorHandler(res);* expect(writeHead.called).to.be.true;$ expect(end.called).to.be.true;C expect(writeHead.getCall(0).args).to.deep.eq([500, headers]);N expect(end.getCall(0).args).to.deep.eq(['500 - Internal Server Error']); }); });5_\^]VWWVXFAUV5_]_^EVVVXFBDFV });5_^`_8$VVVXF79V* const generateHandlerTests = (opts) => {5__a`7VVVXF7:W 79V5_`ba8XXVXG8:Y 8:X5_acb9YYVXG 9;Z 9;Y5_bdc:ZZVXG:<[ :<Z5_ced;[[VXG;=\ ;=[5_dfe<\\VXGC<>] <>\5_egfX ]]VXG)DWY] name: notFoundHandler,5_fhg@]]VXG;?A] describe(opts.label, () => {5_gihO]]VXGKNO label: 'notFoundHandler',5_hjiV\\VXGMEUV" label: 'internalErrorHandler',5_ikj>[[VXGU>@[5_jlk7>7VXGW67 interface HandlerTestOpts { label: string; name: Function; statusCode: number; headers: Object; response: string; }5_kml 77VXGY T T5_lnmVXG[F\ interface HandlerTestOpts { label: string; name: Function; statusCode: number; headers: Object; response: string; }5_monVXGmG label: string;5_npoZVXGwZ^\ Z\[5_oqp\VXG~\__ \^^5_prq^VXG]_` statusCode: 3025_qsr^VXG^`a ^``5_rts_VXG_ab _aa5_sut`VXG_` 5_tvu_VXG^`a headers: { Location: 5_uwv_ VXG_ab _aa5_vxw`VXGH_ab response: null5_wyx]VXGI\^b redirectHandler,5_xzy?5VXG>@b; const generateHandlerTests = (opts: HandlerTestOpts) => {5_y{zEVXGKDFb opts.name(res);5_z|{?7VXH>@bD const generateHandlerTests = (opts: HandlerTestOpts, ...rest) => {5_{}|?7VXH>@bC const generateHandlerTests = (opts: HandlerTestOpts, ..rest) => {5_|~}?7VXH>@bB const generateHandlerTests = (opts: HandlerTestOpts, .rest) => {5_}~?7VXH>@bA const generateHandlerTests = (opts: HandlerTestOpts, rest) => {5_~?7VXH>@b@ const generateHandlerTests = (opts: HandlerTestOpts, est) => {5_?7VXH>@b? const generateHandlerTests = (opts: HandlerTestOpts, st) => {5_?7VXH>@b> const generateHandlerTests = (opts: HandlerTestOpts, t) => {5_?7VXH >@b= const generateHandlerTests = (opts: HandlerTestOpts, ) => {5_EVXHDFb opts.name(res, ...rest);5_EVXHDFb opts.name(res, ..rest);5_EVXHDFb opts.name(res, .rest);5_EVXHDFb opts.name(res, rest);5_aVXH`bb });5__VXH L^`b! headers: { Location: 'foo' },5_`VXH0M_ab response: null,5_ VXH c  b5_bVXHbfd bdc5_eVXHdff }9,5_eVXHdff }),5_dVXHdfg dff5_eVXHde it5_dVXHdff5_eVXHdfg5_eVXHeggefg5_eVXHde const res = 5_eVXHdfg' const res = {};5_eVXHdfg% const res = {};5_eVXHegg5_fVXHef5_eVXHegh egg5_fVXHef const write5_eVXIeggefg5_fVXIegh6 const writeHead = res.writeHead = sinon.spy();5_fVXIfhi fhh5_?VXI?Aj ?Ai5_@VXI?Aj // TODO Tear down after5_hVXI"gij fileHandler(res)5_hVXI#gij fileHandler(res);5_hVXI9gij fileHandler(res, '/);5_hVXIBhjk hjj5_i'VXIJikl ikk5_jVXISNikl expect(writeHead5_i'VXIvikm ikl5_jVXIyOikm console.log(5_jVXIij+ console.log(writeHead.getCall(0).args);5_j2VXIPikl5 expect(writeHead.getCall(0).args).to.deep.eq([]);5_g1VXIgim gil5_iVXIhjm fileHandler(res, '/foo');5_iVXIiln ikm5_jVXIjlo5_kVXIQjk5_iVXIRhjo fileHandler(res, '/foo');5_eVXISdfo! describe('fileHandler', () => {5_jVXIjlp jlo5_k9VXITjlp: // An error is expected since '/foo' does not exist.5_k:VXIjlpF // An error is expected since '/foo' does not exist (as a file).5_g1VXIgipghp5_h VXIgiq2 const writeHead = res.writeHead = sinon.spy();5_hVXIgiq, const end = res.writeHead = sinon.spy();5_nVXJnpqnoq5_oVXJno( expect(writeHead.called).to.be.true;5_oVXJoqqopq5_p VXJUoqr( expect(writeHead.called).to.be.true;5_p VXJ prrpqr5_q VXJ Vprs" expect(end.called).to.be.true;5_qVXJ!Wprs4 expect(end.getCall(0).args[0]).to.eq(undefined);5_pVXJ+Xoqs" expect(end.called).to.be.true;5_jVXJ5Yiks% await fileHandler(res, '/foo');5_pVXJ@oqs$ //expect(end.called).to.be.true;5_pVXJ@oqs# /expect(end.called).to.be.true;5_qVXJ@prs6 //expect(end.getCall(0).args[0]).to.eq(undefined);5_qVXJ@Zprs5 /expect(end.getCall(0).args[0]).to.eq(undefined);5_jVXJ_iks" await fileHandler(res, '/');5_jVXJ_iks! await fileHandler(res, '');5_j VXJaiks# await fileHandler(res, './');5_j.VXJe[iks2 await fileHandler(res, './server.test.js'');5_n'VXJu\npt nps5_oVXJno+ console.log(writeHead.getCall(0).args);5_oEVXJnpsI expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders()]);5_oKVXJ]npsO expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders('js.js)]);5_qVXJ^prs4 expect(end.getCall(0).args[0]).to.eq(undefined);5_oFVXJnpsP expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders('js.js')]);5_h%VXJhjt hjs5_i VXJhjt$ const name = './server.test.js';5_kVXJjlt1 await fileHandler(res, './server.test.js');5_kVXJjlt await fileHandler(res, );5_pEVXJoqtK expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders('')]);5_pEVXJoqtJ expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders(')]);5_pEVXJ_oqtI expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders()]);5_qVXJ`prt" expect(end.called).to.be.true;5_pVXJpru prt5_q$VXJapru& console.log(end.getCall(0).args));5_iVXKbhju$ const path = './server.test.js';5_iVXK hju% const path = '../server.test.js';5_iVXK!chju$ const path = './server.test.js';5_VXKAvu5_VXKEvimport readFile5_VXKFvimport {readFile5_VXKGdvimport { readFile5_ VXKUvimport { readFile } from 'fs';5_ VXKXewv5_VXKffyx5_mVXKsmoz moy5_ VXKz&const readfile = promisify(_readfile);5_n#VXKgmoz# const contents = await readFile5_ VXKhzimport { _readFile } from 'fs';5_ VXKiz&const readFile = promisify(_readfile);5_wVXKvxz$ //expect(end.called).to.be.true;5_wVXKvxz# /expect(end.called).to.be.true;5_xVXKwyz6 //expect(end.getCall(0).args[0]).to.eq(undefined);5_xVXKwyz5 /expect(end.getCall(0).args[0]).to.eq(undefined);5_x)VXKjwyz4 expect(end.getCall(0).args[0]).to.eq(undefined);5_vVXKkuv% console.log(end.getCall(0).args);5_w&VXKvxy3 expect(end.getCall(0).args[0]).to.eq(contents);5_w*VXKlvxy7 expect(end.getCall(0).args[0]).to.deepeq(contents);5_rVXKqrD // An error is expected since '/foo' does not exist as a file.5_oooVXKno try {5_oooVXKnpw# await fileHandler(res, path);5_ppqVXKmop } catch (err) { }5_oppVXKnnpu! await fileHandler(res, path);5_oppVXKonpu fileHandler(res, path);5_i ppVXKikv iku5_jqqVXLjlvjkv5_jrrVXLij it('sh5_jqqVXLikv9 it('should serve the appropriate response', () => {5_kktXLkuv 2 const writeHead = res.writeHead = sinon.spy();& const end = res.end = sinon.spy();) const path = './dist/server.test.js';* const contents = await readFile(path);! await fileHandler(res, path);( expect(writeHead.called).to.be.true;M expect(writeHead.getCall(0).args).to.deep.eq([200, createHeaders(path)]);" expect(end.called).to.be.true;8 expect(end.getCall(0).args[0]).to.deep.eq(contents);jlv# const res = {};5_tktXLptvw tvv5_j0ktXLikw7 it('should serve the appropriate response', () => {5_iktXLqhjw' describe('fileHandler', async () => {5_ktXL3rx w5_wluXL8wzy wyx5_y luXL;x{z describe5_yluXL@y{| y{{5_zluXLByz z5_yluXLBy{| y{{5_zluXLCyz zz5_yluXLFy|| y{{5_zluXLcz|}5_EluXLgDEK // TODO Tear down after -------------------------------------------------5_zktXLiy{}5_ zktXLy{}N getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_  zktXLsz|~ z|}5_   ktXLt ~import {5_   ktXL ~5_   mvXL5_  $mvXL% const server = createButlerServer()5_ nwXL };)5_nwXL })5_VXL% const server = createButlerServer({ });5_xVXLx|~xy~5_yyzXLy{ });xz% const server = createButlerServer({5_yyzXLy{ y{5_zy{XMz| z|5_{y|XMu{} {}5_}y}XM'v|~ });5_xy}XMfxz xz5_y&z~XMwxzB // Required, as creating a server initializes the opts global.5_y1z~XMzyxzM // Required, as creating a server is used to initializes the opts global.5_X>! it('should do stuff', () => {5_X>% it('', () => {5_X>UB it('should return the path relative to the directory', () => {5_ X>]Z const ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_! X>]Y onst ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_ "!X>^X nst ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_!#"X>^W st ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_"$#X>^V t ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_#%$X>^U ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_$&%X>^T ret = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_%'&X>^S et = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_&('X>^R t = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_')(X>^Q = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_(*)X>^P = getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_)+*X>^O getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_*,+NX>_N getTrimmedFilename('./dist/server.test.js', 'server.test.js', './dist');5_+-,X>6 getTrimmedFilename('/foo/bar/', 'file.ts', './')5_,.-=X>z= expect(getTrimmedFilename('/foo/bar/', 'file.ts', './')5_-/.X>{ expect(ret).to.eq('foo');5_.0/*X?jP expect(getTrimmedFilename('/foo/bar/', 'file.ts', './')).to.eq('file.ts');5_/10<X?nS expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', './')).to.eq('file.ts');5_021=X?uR expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/')).to.eq('file.ts');5_132<X?xU expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/bar')).to.eq('file.ts');5_243<X?yT expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', 'bar')).to.eq('file.ts');5_354@X?{X expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foobar')).to.eq('file.ts');5_465OX?Y expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('file.ts');5_576OX?_ expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('./baz/file.ts');5_687OX?^ expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('/baz/file.ts');5_798OX?] expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('baz/file.ts');5_8:9OX?}^ expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('/baz/file.ts');5_9;:@X?~] expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('baz/file.ts');5_:<;|X?{} directory: '.',5_;=<|X?{} directory: '',5_<>=zzX?z port: '8080', directory: '/foo', basePath: '/', }, () => {});y{' const server = createButlerServer({5_=?>@zX?Y expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo')).to.eq('baz/file.ts');5_>@?yyJVJX?xyL // Required, as creating a server is used to initialize the opts global.)// const server = createButlerServer({// port: '8080',// directory: '/foo',// basePath: '/',// }, () => {});//5_?A@zyJyVJX?z|}z{}5_@BA{)yJyVJX?z|~] expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('baz/file.ts');5_ACB{KyJyVJX?z|~Y expect(getTrimmedFilename('/foo/bar', 'file.ts', '/foo/bar')).to.eq('baz/file.ts');5_BDC{KyJyVJX?z|~X expect(getTrimmedFilename('/foo/bar', 'file.ts', '/foo/bar')).to.eq('az/file.ts');5_CED{KyJyVJX?z|~W expect(getTrimmedFilename('/foo/bar', 'file.ts', '/foo/bar')).to.eq('z/file.ts');5_DFE{KyJyVJX?z|~V expect(getTrimmedFilename('/foo/bar', 'file.ts', '/foo/bar')).to.eq('/file.ts');5_EGF{yJyVJX@z{U expect(getTrimmedFilename('/foo/bar', 'file.ts', '/foo/bar')).to.eq('file.ts');5_FHGyyJyVJX@y{}yz}5_GIHyyJyVJX@y{ y{~5_HJI{/yJyVJX@%{} {}5_IKJ}&yJyVJX@8}}~5_JLK}yJyVJX@Q} }5_KML@yJyVJX@i~] expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo/bar')).to.eq('baz/file.ts');5_LNMKyJyVJX@p~Y expect(getTrimmedFilename('/foo/bar/baz', 'file.ts', '/foo')).to.eq('baz/file.ts');5_MON~ yJyVJX@x} // 5_NPOyJyVJX@ 5_OQPyJyVJX@ 5_PRQyJyVJX@ it('', () => {5_QSR"yJyVJXAW expect(getTrimmedFilename('/foo/bar', 'file.ts', '/')).to.eq('/foo/bar/file.ts');5_RTS&yJyVJXA P expect(getTrimmedFilename('/', 'file.ts', '/')).to.eq('/foo/bar/file.ts');5_SUT%yJyVJXA) 5_TVU7yJyVJXAVI expect(getTrimmedFilename('/', '', '/')).to.eq('/foo/bar/file.ts');5_UWV6yJyVJXAd: expect(getTrimmedFilename('/', '', '/')).to.eq('/');5_VXW"V1XC9 expect(getTrimmedFilename('/', '', '/')).to.eq('');5_WYX=V1XC@ expect(getTrimmedFilename('/foo/bar', '', '/')).to.eq('');5_XZYV1XDO it('should include the leading slash when the root directory is /', () => {5_Y[ZV1XDN it('should nclude the leading slash when the root directory is /', () => {5_Z\[V1XDM it('should clude the leading slash when the root directory is /', () => {5_[]\V1XDL it('should lude the leading slash when the root directory is /', () => {5_\^]V1XDK it('should ude the leading slash when the root directory is /', () => {5_]_^V1XDJ it('should de the leading slash when the root directory is /', () => {5_^`_V1XDI it('should e the leading slash when the root directory is /', () => {5__a`V1XDH it('should the leading slash when the root directory is /', () => {5_`ba>V1XD5_acb-V1XDH expect(getTrimmedFilename('/foo/bar', '', '/')).to.eq('/foo/bar');5_bdc%V1XDO expect(getTrimmedFilename('/foo/bar', 'file.ts', '/')).to.eq('/foo/bar');5_cedEV1XDK expect(getTrimmedFilename('/foo', 'file.ts', '/')).to.eq('/foo/bar');5_dfe=V1XEH expect(getTrimmedFilename('/foo/bar', '', '/')).to.eq('/foo/bar');5_egf@V1XEO expect(getTrimmedFilename('/foo', 'file.ts', '/')).to.eq('/foo/file.ts');5_fhgV1XF 5_gihV1XF5_hjiV1XF/ 5_ikjV1XF55_jlkV1XFB listContents('../')5_kmlV1XFF expect(listContents('../')5_lnm#V1XFW* expect(listContents('../')).to.eq({});5_monV1XFh/ expect(listContents('../')).to.deep.eq({});5_npoV1XF 5_oqpV1XF5_prq'V1XF' const server = createButlerServer({5_qsrV1XF });5_rtsV1XF5_sut,V1XF. expect(listContents('./')).to.deep.eq({});5_tvu&V1XF( const server = createButlerServer();5_uwv,V1XF8 expect(listContents('./')).to.deep.eq({}, () => {});5_vxw,V1XF5 expect(listContents('./')).to.deep.eq({}) => {});5_wyx'V1XF4 const server = createButlerServer({}, () => {});5_xzyV1XF 5_y{zV1XF 5_z|{V1XF 5_{}|V1XF 5_|~}V1XF });5_}~V1XF5_~V1XF. expect(listContents('./')).to.deep.eq({});5_ V1XG 5_ V1XG0 expect(listContents('./')).to.deep.eq({});5_V1XG! it('should do stuff', () => {5_V1XG 5_V1XH. directory: './',5_V1XH! directory: './test/sample',5_"V1XH6 expect(await listContents('./')).to.deep.eq({});5_$V1XH7 expect(await listContents('../')).to.deep.eq({});5_!V1XHB expect(await listContents('../test/sample')).to.deep.eq({});5_XP  5_HXP1 5_XP8A expect(await listContents('./test/sample')).to.deep.eq({});5_!XPE' it('should do stuff', async () => {5_$XPF 5_!XPc+ it('should do stuff', async (done) => {5_!XP 5_ XP 5_XP }5_XP5_XP 5_XP cc5_XP 5_XP done();5_XPI const { directories, files } = await listContents('./test/sample');5_!XP' it('should do stuff', async () => {5_XP 5_XP 5_XP5_XP done()- console.log('res', directories, files);5_XP 5_XP li5_XPK const { directories, files } = await listContents('./test/sample'); done(); } catch (err) { console.log(err); done(); } try {5_XP 5_XQ 5_XQ 5_XQ+ it('should do stuff', async (done) => {5_XQ console.log('hi');5_XRO% it('should do stuff', (done) => {5_XRQ! it('should do stuff', () => {5_XRW1 listContents('./test/sample').then(res => {5_HXReV const { directories, files } = await listContents('./test/sample').then(res => {5_HXRfH const { directories, files } = await listContents('./test/sample')5_XRg console.log('hi', res);5_XRg done();5_XRg });5_XRh 5_&XRz; expect(directories).to.deep.eq([ 'test/sample/bar' ],5_7XR|: expect(directories).to.deep.eq(['test/sample/bar' ],5_9XR}9 expect(directories).to.deep.eq(['test/sample/bar'],5_9XR5_ XR: expect(directories).to.deep.eq(['test/sample/bar']);5_XR4 expect(files).to.deep.eq(['test/sample/bar']);5_6XR: expect(files).to.deep.eq([ 'test/sample/foo.txt' ]);5_ XR9 expect(files).to.deep.eq([ 'test/sample/foo.txt']);5_ V XR //try {M // const { directories, files } = await listContents('./test/sample'); // done(); //} catch (err) { // console.log(err); // done(); //}/ //console.log('res', directories, files); //done()5_ V XRC //expect(await listContents('./test/sample')).to.deep.eq({});5_ V XR5_ V XR' it('should do stuff', async () => {5_ V XR it('should ', async () => {5_ V XR 5_ V XR5_ V XR5_ V XR 5_ V XS5_ V XSS directoryHandler(res, 5_ V XSW directoryHandler(res,5_ V XS] directoryHandler(res, '5_ V XSf directoryHandler(res, '/te5_% V XSk 5_JLVXSw5_JLVXSx const res 5_VXSy' const res = {};6 const writeHead = res.writeHead = sinon.spy();* const end = res.end = sinon.spy();5_VXSy% const res = {};4 const writeHead = res.writeHead = sinon.spy();( const end = res.end = sinon.spy();5_VXT 5_VXT });5_VXT5_XT2 const writeHead = res.writeHead = sinon.spy();& const end = res.end = sinon.spy();+ directoryHandler(res, './test/sample');# const res = {};5_XT 5_XT4 const writeHead = res.writeHead = sinon.spy();5_ XT expect(5_XUT- directoryHandler(res, './test/sample');5_XUX it('stuff', () => {5_XUc 5_XUi5_XUi expect5_XUjV expect(writeHead.getCall(0).args).to.deep.eq([opts.statusCode, opts.headers]);5_ XUkT expect(writeHead.getCall(0).args).to.deep.eq([opts.statusCode, opts.headers]);5_XU it('stuff', async () => {5_5XUE it('should render a list of files and directories', async () => {5_!XUN expect(end.getCall(0).args).to.deep.eq([opts.statusCode, opts.headers]);5_XU! expect(end.getCall(0).args)5_XU xpect(end.getCall(0).args)5_XU pect(end.getCall(0).args)5_XU ect(end.getCall(0).args)5_XU ct(end.getCall(0).args)5_XU t(end.getCall(0).args)5_XU (end.getCall(0).args)5_XU end.getCall(0).args)5_&XU& console.log(end.getCall(0).args)5_%XU' console.log(end.getCall(0).args);5_XU* console.log(end.getCall(0).args[0]);5_XU) onsole.log(end.getCall(0).args[0]);5_XU( nsole.log(end.getCall(0).args[0]);5_XU' sole.log(end.getCall(0).args[0]);5_XU& ole.log(end.getCall(0).args[0]);5_XU% le.log(end.getCall(0).args[0]);5_XU$ e.log(end.getCall(0).args[0]);5_XU# .log(end.getCall(0).args[0]);5_XU" log(end.getCall(0).args[0]);5_XU! og(end.getCall(0).args[0]);5_XU g(end.getCall(0).args[0]);5_XU (end.getCall(0).args[0]);5_XU end.getCall(0).args[0]);5_XV 5_XV : expect(output.match(/

Files in ./test/sample

5_XV ; expect(output.match(/\

Files in ./test/sample

5_:XV: expect(output.match(/

Files in ./test/sample

5_;XV; expect(output.match(/

Files in ./test/sample

/5_+XVZ- const output = end.getCall(0).args[0]);5_<XVI expect(output.match(/

Files in ./test/sample

/)).to.be.true;5_ XVJ expect(output.match(/

Files in ./test/sample

/).).to.be.true;5_>XVL expect(!!output.match(/

Files in ./test/sample

/).).to.be.true;5_XVK expect(!!output.match(/

Files in ./test/sample

/)).to.be.true;5_!XVL expect(!!output.match(/\

Files in ./test/sample

/)).to.be.true;5_!XVM expect(!!output.match(/\Files in ./test/sample/)).to.be.true;5_9XVM expect(!!output.match(/\Files in ./test/sample/)).to.be.true;5_;XVN expect(!!output.match(/\Files in ./test/sample\/)).to.be.true;5_?XVO expect(!!output.match(/\Files in ./test/sample\<\/h1>/)).to.be.true;5_ XVP expect(!!output.match(/\Files in ./test/sample\<\/h1\>/)).to.be.true;5_  VXV5_   VXV5_   VXV_ it('should render a list of files and directories if there is no index.html', async () => {5_   'VXW@ it('should render an index file if it exists', async () => {5_  VXW9 it('should render an index file when ', async () => {5_ "VXW= it('should render an index.htm file when ', async () => {5_.VXW > it('should render an index.html file when ', async () => {5_0VXW23 await directoryHandler(res, './test/sample');5_VXW8K expect(!!output.match('

Files in ./test/sample

')).to.be.true;5_)VXW[ 5_VXW console.log('hi', output);5_VXW+ console.log('hi', output.toString());5_+VXW, const output = end.getCall(0).args[0];5_4VXW7 const output = end.getCall(0).args[0].toString8);5_VXX 5_VXX 5_VXXs 5_VXXx };5_VXXz5_VXX5_VXX it('foo', () => {5_VXX5_ 6VXX 5_" %VXX7 const { path, stats, error } = getPathStats('/');5_ #!"VXX5_"$#VXX5_#%$VXX directory: './',5_$&%VXY.' const server = createButlerServer({ port: '8080', directory: './test', basePath: '/', }, () => {});5_%'&:VXY2= const { path, stats, error } = await getPathStats('/');5_&('VXY\ 5_')(VXYl5_(*)VXYqimport { resolve } from 'path';5_)+*VXYt5_*,+VXYuimport { resolve } from 'path';5_+-,VXYu5_,.->VXYB const { path, stats, error } = await getPathStats('/test/');5_-/.+VXY 5_.0/VXY% expect(error).to.be(undefined);5_/10VXY% expect(error).to.eq(undefined);5_021#VXY 5_132VXY expect(stats).to.5_243VXZ $ expect(error).to.be.undefined;5_354'VXZ' expect(error).to.be.an(undefined;5_465&VXZ' expect(error).to.be.an(undefined)5_576VXZ( expect(error).to.be.an(undefined')5_687)VXZ) expect(error).to.be.an('undefined')5_798VXZS& console.log(path, stats, error);5_8:9VXZ\ it('foo', async () => {5_9;:&VXZ 5_:<;"VXZ0 expect(stats.isFile).to.be.an('function');5_;=<VXZ' expect(stats).to.be.an('object');5_<>=VXZ5_=?>VXZ/ expect(stats.isFile).to.be.a('function');5_>@?VXZ 5_?A@VXZ 5_@BAVXZ expect5_ACBVXZ5_BDC>VX[A const { path, stats, error } = await getPathStats('/test');5_CEDIVX[5_DFEVX[%5_EHFVX[& expect5_FIGHVX[+5_HJI(VX[-, expect(path).to.eq(resolve('./test'));5_IKJ?VX[7M const { path, stats, error } = await getPathStats('/test/bar/symlink');5_JLK)VX[:- expect(path).to.eq(resolve('./test/'));5_KML"VX[E 5_LNM++V+X[Q/ expect(stats.isFile).to.be.a('function');4 expect(stats.isDirectory).to.be.a('function');5_MON++V+X[R* expect(error).to.be.an('undefined');5_NPO++V+X[T* expect(error).to.be.an('undefined');5_OQP++V+X[WA const { path, stats, error } = await getPathStats('/test');5_PRQ++V+X[X9 const { path, stats} = await getPathStats('/test');5_QSR++V+X[YT const { path, stats, error } = await getPathStats('/test/sample/bar/symlink');5_RTS++V+X[ZL const { path, stats} = await getPathStats('/test/sample/bar/symlink');5_SUT++V+X[g, expect(stats.isSymlink()).to.be.false;5_TVU++V+X[}1 expect(stats.isSymbolicLink()).to.be.false;5_UWV++V+X[}5_VXW++V+X\ 5_WYX++V+X\ console.log('path', path);5_XZY++V+X\" console.log('t path', path);5_Y[Z++V+X\/ expect(stats.isFile).to.be.a('function');5_Z\[++V+X\4 expect(stats.isDirectory).to.be.a('function');5_[]\(++V+X\6 expect(stats.isDirectory()).to.be.a('function');5_\^]++V+X] 5_]_^ ++V+X] 5_^`_++V+X] 5__a`++V+X]5_`ba++V+X]5_acb++V+X] requestHandler(req, res);5_bdc++V+X]$ describe('requestHandler', () => {5_cedNSVX]5_dfe NSVX]&import { ServerResponse } from 'http';5_egfNSVX] 5_fhgNSVX]$ const req = {};5_gihNSVX]5_hjiNSVX]' const res = {};5_ikjNSVX]5_jlkNSVX]' const res = {};5_kmlVX^  5_lnmVX^& 5_monVX^6 const spyLogRequest = spy5_npo VX^= expect(logRequest).5_oqpVX^A expect(spyLogRequest).5_prqVX^C! expect(spyLogRequest).to.have5_qsr$VX^F( expect(spyLogRequest.called).to.have5_rts+VX^H5_sutVX^K6 const writeHead = res.writeHead = sinon.spy();* const end = res.end = sinon.spy();$ opts.name(res, redirectUrl);, expect(writeHead.called).to.be.true;& expect(end.called).to.be.true;5_tvuVX^N4 const writeHead = res.writeHead = sinon.spy();( const end = res.end = sinon.spy();" opts.name(res, redirectUrl);* expect(writeHead.called).to.be.true;$ expect(end.called).to.be.true;5_uwvX^S& const end = res.end = sinon.spy(); opts.name(res, redirectUrl);( expect(writeHead.called).to.be.true;" expect(end.called).to.be.true;2 const writeHead = res.writeHead = sinon.spy();5_vxwX^ 5_wyx$X^ 5_xzyX^ const 5_y{zX^% const headers = req.headers = {};5_z|{X^$ onst headers = req.headers = {};5_{}|X^# nst headers = req.headers = {};5_|~}X^" st headers = req.headers = {};5_}~X^! t headers = req.headers = {};5_~X^ headers = req.headers = {};5_X^ headers = req.headers = {};5_X^ eaders = req.headers = {};5_X^ aders = req.headers = {};5_X^ ders = req.headers = {};5_X^ ers = req.headers = {};5_X^ rs = req.headers = {};5_X^ s = req.headers = {};5_X^ = req.headers = {};5_X^ = req.headers = {};5_X^ req.headers = {};5_X^5_X^ req.headers = {};5_X_ 5_X_ req.connection = {};5_X_# req.connection.remoteAddress5_X_P req.headers = {};5_X_a/ req.connection.remoteAddress = 'localhost';5_X_ 5_X_ 5_X_ res.end = 5_X_ 5_X_5_X_* const end = res.end = sinon.spy();5_X_ res.end5_X_5 req.headers = { 'x-forwarded-for': '127.0.0.1' };5_X` J req.headers = { 'host': '127.0.0.1', 'x-forwarded-for': '127.0.0.1' };5_ X`; host': '127.0.0.1', 'x-forwarded-for': '127.0.0.1' };5_X`: host: '127.0.0.1', 'x-forwarded-for': '127.0.0.1' };5_$X`' 'x-forwarded-for': '127.0.0.1' };5_&X`( 'x-forwarded-for': '127.0.0.1', };5_X`H, expect(spyLogRequest.called).to.be.true;5_X`P# await requestHandler(req, res);5_X`V% //await requestHandler(req, res);5_X`V$ /await requestHandler(req, res);5_X`W. //expect(spyLogRequest.called).to.be.true;5_X`W- /expect(spyLogRequest.called).to.be.true;5_X`a, expect(spyLogRequest.called).to.be.true;5_X`0 const spyLogRequest = sinon.spy(logRequest);5_X`. //expect(spyLogRequest.called).to.be.true;5_Xa 5_@Xa%A const directoryHandlerSpy = sinon.spy(directoryHandlerSpy);hh5_?Xa%@ const directoryHandlerSpy = sinon.spy(directoryHandlerSpy);h5_:Xa&? const directoryHandlerSpy = sinon.spy(directoryHandlerSpy);5_:Xa&> const directoryHandlerSpy = sinon.spy(directoryHandlerpy);5_:Xa&= const directoryHandlerSpy = sinon.spy(directoryHandlery);5_"Xa' 5_"Xa 5_ Xa2 expect(directoryHandlerSpy.called).to.be.true;5_Xa expect(res.end).to.be.true;5_ Xa& expect(res.end.called).to.be.true;5_ Xa% expect(es.end.called).to.be.true;5_ Xa$ expect(s.end.called).to.be.true;5_ Xa# expect(.end.called).to.be.true;5_Xa% console.log(directoryHandlerSpy);5_Xa 5_Xa* describe('requestHandler', async () => {5_Xa it('should'5_$Xa$ it('should respond to a request'5_#Xa& it('should respond to a request', 5_5Xb5 it('should respond to a request as appropriate', 5_AXb 5_Xb });5_Xb5_Xb  req.headers = {  host: '127.0.0.1',% 'x-forwarded-for': '127.0.0.1', }; req.url = '/';< const directoryHandlerSpy = sinon.spy(directoryHandler);# const res = {};& const end = res.end = sinon.spy();# await requestHandler(req, res);" expect(end.called).to.be.true;4 //const writeHead = res.writeHead = sinon.spy();( //const end = res.end = sinon.spy();" //opts.name(res, redirectUrl);* //expect(writeHead.called).to.be.true;$ //expect(end.called).to.be.true;$ const req = {};5_VXb6 //const writeHead = res.writeHead = sinon.spy();* //const end = res.end = sinon.spy();$ //opts.name(res, redirectUrl);, //expect(writeHead.called).to.be.true;& //expect(end.called).to.be.true;5_VXb(> const directoryHandlerSpy = sinon.spy(directoryHandler);5_VXb($ = sinon.spy(directoryHandler);5_VXb-5_ VXb.$ expect(end.called).to.be.true;5_VXbH1 expect(directoryHandler.called).to.be.true;5_VXbJ5 directoryHandler = sinon.spy(directoryHandler);5_VXb 5_VXb 5_#VXb5_ VXb$ expect(end.called).to.be.true;5_&VXb7 const spy = sinon.spy(testing, 'requestHandler');5_VXd59 const spy = sinon.spy(testing, 'directoryHandler');5_VXdD testing,5_VXdR$ expect(spy.called).to.be.true;5_$VXe& const req = {};5_VXe req.headers = { 5_VXe eq.headers = { 5_VXe q.headers = { 5_VXe .headers = { 5_ VXe headers = { 5_ VXe headers= { 5_ VXe headers { 5_ V Xe  headers: {  host: '127.0.0.1',' 'x-forwarded-for': '127.0.0.1', };5_ V Xe 5_Xe  host: '127.0.0.1',' 'x-forwarded-for': '127.0.0.1', }; headers: { 5_ Xe };5_Xe req.url = '/';5_Xe5_Xe  req.url = '/';5_Xe  eq.url = '/';5_Xe  q.url = '/';5_Xe  .url = '/';5_Xe! url = '/';5_ Xe# url = '/';5_ Xe# url= '/';5_ Xe# url '/';5_Xe$ url: '/';5_Xe& url: '/',5_Xe&5_Xe' url: '/',5_Xe(5_XeW& //expect(spy.called).to.be.true;5_XeX 5_Xe[. const spy = sinon.spy(directoryHandler);5_Xe\ console.log(5_Xee console.log(end.5_(Xek) console.log(end.getCall(0).args);,,5_'Xek( console.log(end.getCall(0).args);,5_Xew$ expect(end.called).to.be.true;5_XfG 5_5XfNB it('should respond to a request as appropriate', async () => {5_6XfO< it('should respond to a request as appropriate', () => {5_XfR% await requestHandler(req, res);5_XfR$ wait requestHandler(req, res);5_XfS# ait requestHandler(req, res);5_XfS" it requestHandler(req, res);5_XfS! t requestHandler(req, res);5_XfS requestHandler(req, res);5_XfT requestHandler(req, res);5_XfY 5_Xf` setTimeout({5_Xfa' console.log(end.getCall(0).args);5_Xfa5_Xfb' console.log(end.getCall(0).args);5_Xfc 5_  Xfi });5_  Xfk) console.log(end.getCall(0).args);5_   Xfk5_   Xfl5_   Xfl) console.log(end.getCall(0).args);5_  Xfm 5_  Xf| }, 100);5_ Xf| }, 00);5_ Xf }, 0);5_ Xf  }, );5_ Xf  }, 10);5_ Xf }, 1);5_ Xf  }, );5_ Xf 5_<Xf@ const directoryHandlerSpy = sinon.spy(directoryHandlerSpy)5_<Xf? const directoryHandlerSpy = sinon.spy(directoryHandlerpy)5_<Xf> const directoryHandlerSpy = sinon.spy(directoryHandlery)5_=Xf= const directoryHandlerSpy = sinon.spy(directoryHandler)5_(Xf5_Xf ) console.log(end.getCall(0).args);5_(Xf 9 console.log(directoryHandlerSpy.getCall(0).args);5_XfA console.log(directoryHandlerSpy.called, '-------------');5_Xf5_!Xf) console.log(end.getCall(0).args);5_" !'XgA console.log(directoryHandlerSpy.called, '-------------');5_!#"Xg 5_"2#Xg 5_#3$2VXh+ const expectedDirectoryHandlerOutputs = { './test/sample', };5_243VXh& console.log('result', result);5_354$VXh/ requestHandler(req, res).then(result => {5_465%VXh5_576VXh5_687VXh 5_798VXh const output+ console.log(end.getCall(0).args);5_8:9VXh8 const output console.log(end.getCall(0).args);5_9;:VXh9 const output =console.log(end.getCall(0).args);5_:<;VXh3 const output =e.log(end.getCall(0).args);5_;=<VXh- const output =end.getCall(0).args);5_<>=.VXh. const output = end.getCall(0).args);5_=?>/VXh5_>@?VXh5_?A@VXh expect(output.match5_@BAVXh expect(!!output.match5_ACBVXh, expect(!!output.match).to.be.true;5_BDC!VXh3 expect(!!output.match(/files).to.be.true;5_CED&VXh3 expect(!!output.match(/Files).to.be.true;5_DFE*VXh7 expect(!!output.match(/Files in ).to.be.true;5_EGF*VXhC expect(!!output.match(/Files in test\/sample).to.be.true;5_FIG9VXhF expect(!!output.match(/Files in .* test\/sample).to.be.true;5_GJHIVXh url: '/',5_IKJ!VXiH expect(!!output.match(/Files in .* test\/sample/)).to.be.true;5_JLK VXi7 expect(!!output.match(//sample/)).to.be.true;5_KML VXi . expect(!!output.match()).to.be.true;5_LNM!VXi 0 expect(!!output.match(//)).to.be.true;5_MONVXi: console.log(directoryHandlerSpy, '-------------');5_NPOVXi& //expect(end.called).to.be.true;5_OQPVXiJ 5_PRQVXiK co5_QSRVXiL 5_RTSVXiT5_SUTVXi^5_TVUVXia$ const createRequest = (url) => {5_UWV VXin url: '/test/sample',5_VXWVXit> const directoryHandlerSpy = sinon.spy(directoryHandler);5_WYXVXix5_XZY%VXi 5_Y[ZVXi callback(output);5_Z\[ VXi done();5_[]\VXi< expect(!!output.match(/test\/sample/)).to.be.true;5_\^]VXi 5_]_^VXi5_^`_VXi5__a`$VXi+ createRequest('/test/sample', () => {5_`ba$VXi* createRequest('/test/sample', ) => {5_acb$VXi) createRequest('/test/sample', => {5_bdcVXi5_cedVXi 5_dfeVXi< expect(!!output.match(/test\/sample/)).to.be.true; done();5_egf VXi$ const req = { url: '/test/sample', headers: {  host: '127.0.0.1',) 'x-forwarded-for': '127.0.0.1', }, };% const res = {};( const end = res.end = sinon.spy();> const directoryHandlerSpy = sinon.spy(directoryHandler);+ requestHandler(req, res).then(() => { setTimeout(() => {0 const output = end.getCall(0).args[0];< expect(!!output.match(/test\/sample/)).to.be.true; done(); }, 50); });5_fhg VXi. const createRequest = (url, callback) => {5_gih0 VXi6 const createRequest = (url: string, callback) => {5_hji; VXi@ const createRequest = (url: string, callback: Function) => {5_ikj; VXiF const createRequest = (url: string, callback: Function): void => {5_jlk; VXi? const createRequest = (url: string, callback: Function)=> {5_kml* VXi/ createRequest('/test/sample', output => {5_lnm$ VXi7 createRequest('/test/sample', output: string => {5_mon3 VXi8 createRequest('/test/sample', (output: string => {5_npo VXi5_oqp VXi@ it('should respond to a request as appropriate', (done) => {5_prq=V=Xj5_qsr=V=Xj5_rts"=V=Xj L it('should serve requests for directory urls appropriately', (done) => {5_sut!=V=Xj9 createRequest('/test/sample', (output: string) => {5_tvu%=V=Xj$: expect(!!output.match(/test\/sample/)).to.be.true;5_uwv=V=Xj'; expect(!!output.match(/test\/csample/)).to.be.true;5_vxw=V=Xj) , expect(!!output.match()).to.be.true;5_wyx"=V=XjR 5_xzy=V=XjY" res.writeHead = sinon.spy();5_y{z=V=Xjc" res.writeHead = sinon.spy();5_z|{=V=Xjn callback(output);5_{}|=V=Xj2 const writeHead res.writeHead = sinon.spy();5_|~}=V=Xj!+ riteHead res.writeHead = sinon.spy();5_}~=V=Xj" 5_~=V=Xj8 expect(!!output.match(/Hi there\!/)).to.be.true;5_=V=Xj## console.log('out', output);5_=V=Xj 5_=V=Xj$ // f // difficultie3 // These tests are quite... weird and suboptimal 5_ =V=Xk% }, 50);5_XtZ' headers: { 5_GIHVXh url: '/testu',5_#%2$Xg '/test/sample',5_$&%XhK expect(!!output.match('

Files in ./test/sample

')).to.be.true;5_%'&XhY '/test/sample', expect(!!output.match('

Files in ./test/sample

')).to.be.true;5_&('XhX '/test/sample' expect(!!output.match('

Files in ./test/sample

')).to.be.true;5_')(XhA '/test/sample''

Files in ./test/sample

')).to.be.true;5_(*)XhC '/test/sample': '

Files in ./test/sample

')).to.be.true;5_)+*CXh7 '/test/sample': '

Files in ./test/sample

'),5_*,+5Xh6 '/test/sample': '

Files in ./test/sample

',5_+-,5Xh * '/test/sample/bar': '

Hello!

',5_,.-)Xh?. console.log(end.getCall(0).args[0]);5_-/.,XhDZ console.log(end.getCall(0).args[0].match(expectedDirectoryHandlerOutputs[/test);5_.0/ZXhPb console.log(end.getCall(0).args[0].match(expectedDirectoryHandlerOutputs['/test/sample']5_/10Xh\ url: '/test/sample',5_01bXhbe console.log(end.getCall(0).args[0].match(expectedDirectoryHandlerOutputs['/test/sample']));5_! Xf5_#Xe9# const res = { };5_Xe:  end: sinon.spy(),5_XeD5_ XeE( expect(res.end.called).to.be.true;5_VXbD5_X_5_FHGVX[*, expect(path).to.eq(resolve('./test'));/ expect(stats.isFile).to.be.a('function');4 expect(stats.isDirectory).to.be.a('function');* expect(error).to.be.an('undefined');5_ "!VXX' const server = createButlerServer({ port: '8080', directory: './', basePath: '/', }, () => {});5_2XVQ expect(!!output.match(/\Files in ./test\/sample\<\/h1\>/)).to.be.true;5_-XVR expect(!!output.match(/\Files in .\/test\/sample\<\/h1\>/)).to.be.true;5_(XU+ console.log(end.getCall(0).args[0].);5_XU5_ V XR it('should e, async () => {5_!XR> expect(files).to.deep.eq(['[ 'test/sample/foo.txt' ]']);5_XP5_#V1XHA expect(await listContents('./test/sample')).to.deep.eq({});5_X>X5_X>Y  expect(5_ luXL2 w5_OQPA69EXFABj5_? <<VXD_>@D4 expect(writeHead.getCall(0.args)).to.deep.eq([5_ >;;VXD3=?A riteHead.getCall(0).args);5_>;;VXD+=?5_=;;VXD,=>@ =?A const { args } 5_>;;VXD.=?5_>8<XC/=?A# console.log('hi', writeHead);5