X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;ds=sidebyside;f=test%2Flib%2Fdingus.js;h=356974fee0f48342dd80cfd710ccbd91bb64b210;hb=3b70d88ed735041cb0ec358dfc478b825c1c12e7;hp=a1070a558c534a24c4f2d80a529e24bd8b7e64ed;hpb=29837f0eeb9fcb4c53426e5bd89e9bdf7e9d961b;p=squeep-api-dingus diff --git a/test/lib/dingus.js b/test/lib/dingus.js index a1070a5..356974f 100644 --- a/test/lib/dingus.js +++ b/test/lib/dingus.js @@ -13,8 +13,10 @@ const Enum = require('../../lib/enum'); const noExpectedException = 'did not get expected exception'; describe('Dingus', function () { - const dingus = new Dingus(); - + let dingus; + beforeEach(function () { + dingus = new Dingus(); + }); afterEach(function () { sinon.restore(); }); @@ -224,7 +226,7 @@ describe('Dingus', function () { dingus.on('GET', '/', () => {}); assert(stubOn.called); }); - }); + }); // on describe('setEndBodyHandler', function () { let req, res, ctx, handler, origEnd, origWrite; @@ -267,7 +269,7 @@ describe('Dingus', function () { }; ctx = {}; }); - it('collects body without writing', function () { + it('collects response without writing', function () { Dingus.setHeadHandler(req, res, ctx); res.write(Buffer.from('foo')); res.write('baz'); @@ -275,6 +277,16 @@ describe('Dingus', function () { res.end('quux'); assert(!origWrite.called); assert(origEnd.called); + assert.deepStrictEqual(ctx.responseBody, undefined); + }); + it('collects response without writing, persists written data', function () { + Dingus.setHeadHandler(req, res, ctx, true); + res.write(Buffer.from('foo')); + res.write('baz'); + res.write(); + res.end('quux'); + assert(!origWrite.called); + assert(origEnd.called); assert.deepStrictEqual(ctx.responseBody, Buffer.from('foobazquux')); }); it('ignores non-head method', function () { @@ -437,7 +449,13 @@ describe('Dingus', function () { await dingus.dispatch(req, res, ctx); assert(dingus.handlerBadRequest.called); }); - + it('calls handler with additional arguments', async function () { + dingus.on('GET', '/', stubHandler, 'foo', 'bar'); + await dingus.dispatch(req, res, ctx); + assert(stubHandler.called); + assert.strictEqual(stubHandler.args[0][3], 'foo'); + assert.strictEqual(stubHandler.args[0][4], 'bar'); + }); }); // dispatch describe('parseBody', function () { @@ -506,10 +524,21 @@ describe('Dingus', function () { assert.strictEqual(e, 'foo'); } }); + it('limits size', async function () { + const p = dingus.bodyData(res, 8); + resEvents['data'](Buffer.from('foobar')); + resEvents['data'](Buffer.from('bazquux')); + try { + await p; + assert.fail(noExpectedException); + } catch (e) { + assert.strictEqual(e.statusCode, 413); + } + }); }); // bodyData describe('ingestBody', function () { - it('covers', async function () { + it('ingests json', async function () { const req = {}; const res = {}; const ctx = {}; @@ -517,6 +546,30 @@ describe('Dingus', function () { sinon.stub(Dingus, 'getRequestContentType').returns(Enum.ContentType.ApplicationJson); await dingus.ingestBody(req, res, ctx); assert.deepStrictEqual(ctx.parsedBody, { foo: 'bar' }); + assert.deepStrictEqual(ctx.rawBody, undefined); + }); + it('persists rawBody', async function () { + const req = {}; + const res = {}; + const ctx = {}; + const body = '{"foo":"bar"}'; + sinon.stub(dingus, 'bodyData').resolves(body); + sinon.stub(Dingus, 'getRequestContentType').returns(Enum.ContentType.ApplicationJson); + await dingus.ingestBody(req, res, ctx, { persistRawBody: true }); + assert.deepStrictEqual(ctx.parsedBody, { foo: 'bar' }); + assert.deepStrictEqual(ctx.rawBody, body); + }); + it('skips parsing empty body', async function () { + const req = {}; + const res = {}; + const ctx = {}; + const body = ''; + sinon.stub(dingus, 'bodyData').resolves(body); + sinon.stub(Dingus, 'getRequestContentType').returns(Enum.ContentType.ApplicationJson); + sinon.spy(dingus, 'parseBody'); + await dingus.ingestBody(req, res, ctx, { parseEmptyBody: false }); + assert.deepStrictEqual(ctx.parsedBody, undefined); + assert(dingus.parseBody.notCalled); }); }); // ingestBody @@ -550,7 +603,7 @@ describe('Dingus', function () { dingus.strictAccept = false; dingus.setResponseType(['my/type'], req, res, ctx); assert.strictEqual(ctx.responseType, 'my/type'); - }); + }); }); // setResponseType @@ -591,6 +644,33 @@ describe('Dingus', function () { }); }); // _readFileInfo + describe('_serveFileMetaHeaders', function () { + let res, directory, fileName; + beforeEach(function () { + sinon.stub(dingus, '_readFileInfo'); + res = { + setHeader: sinon.stub(), + }; + directory = '/path'; + fileName = 'filename'; + }); + it('covers no meta file', async function() { + dingus._readFileInfo.resolves([null, null]); + await dingus._serveFileMetaHeaders(res, directory, fileName); + assert(!res.setHeader.called); + }); + it('adds extra headers', async function () { + dingus._readFileInfo.resolves([{}, Buffer.from(`Link: ; rel="relation" +X-Folded-Header: data + data under + the fold +Content-Type: image/sgi +`)]); + await dingus._serveFileMetaHeaders(res, directory, fileName); + assert(res.setHeader.called); + }); + }); // _serveFileMetaHeaders + describe('serveFile', function () { const path = require('path'); let ctx, req, res, directory, fileName, filestats; @@ -632,8 +712,8 @@ describe('Dingus', function () { size: 8, blocks: 17, atimeMs: 1613253436842.815, - mtimeMs: 1603485933192.8610, - ctimeMs: 1603485933192.8610, + mtimeMs: 1603485933192.861, + ctimeMs: 1603485933192.861, birthtimeMs: 0, atime: '2021-02-13T21:57:16.843Z', mtime: '2020-10-23T13:45:33.193Z', @@ -649,6 +729,12 @@ describe('Dingus', function () { assert(fs.promises.readFile.called); assert(!dingus.handlerNotFound.called); }); + it('covers no meta headers', async function () { + dingus.staticMetadata = false; + await dingus.serveFile(req, res, ctx, directory, fileName); + assert(fs.promises.readFile.called); + assert(!dingus.handlerNotFound.called); + }); it('does not serve dot-file', async function () { fileName = '.example'; await dingus.serveFile(req, res, ctx, directory, fileName); @@ -666,6 +752,11 @@ describe('Dingus', function () { await dingus.serveFile(req, res, ctx, directory, fileName); assert(dingus.handlerNotFound.called); }); + it('requires directory be specified', async function () { + await dingus.serveFile(req, res, ctx, '', fileName); + assert(!fs.promises.readFile.called); + assert(dingus.handlerNotFound.called); + }); it('covers fs error', async function () { const expectedException = new Error('blah'); fs.promises.stat.restore(); @@ -870,4 +961,54 @@ describe('Dingus', function () { assert(pfxDingus.handlerNotFound.called); }); }); // proxyPrefix + + describe('handlerRedirect', function () { + let req, res, ctx; + beforeEach(function () { + req = { + getHeader: sinon.stub(), + }; + res = { + setHeader: sinon.stub(), + end: sinon.stub(), + }; + ctx = {}; + }); + it('covers', async function () { + await dingus.handlerRedirect(req, res, ctx); + assert(res.setHeader.called); + assert(res.end.called); + }); + it('covers non-defaults', async function () { + await dingus.handlerRedirect(req, res, ctx, 308); + assert(res.setHeader.called); + assert(res.end.called); + }); + }); // handlerRedirect + + describe('handlerGetStaticFile', function () { + let req, res, ctx; + beforeEach(function () { + req = { + getHeader: sinon.stub(), + }; + res = { + setHeader: sinon.stub(), + }; + ctx = { + params: { + file: '', + }, + }; + sinon.stub(dingus, 'serveFile'); + }); + it('covers', async function () { + await dingus.handlerGetStaticFile(req, res, ctx); + assert(dingus.serveFile.called); + }); + it('covers specified file', async function () { + await dingus.handlerGetStaticFile(req, res, ctx, 'file.txt'); + assert(dingus.serveFile.called); + }); + }); // handlerGetStaticFile }); \ No newline at end of file