summaryrefslogtreecommitdiffstats
path: root/fastify-busboy/test/dicer-endfinish.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'fastify-busboy/test/dicer-endfinish.test.js')
-rw-r--r--fastify-busboy/test/dicer-endfinish.test.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/fastify-busboy/test/dicer-endfinish.test.js b/fastify-busboy/test/dicer-endfinish.test.js
new file mode 100644
index 0000000..4718076
--- /dev/null
+++ b/fastify-busboy/test/dicer-endfinish.test.js
@@ -0,0 +1,96 @@
+'use strict'
+
+const Dicer = require('../deps/dicer/lib/Dicer')
+const { test } = require('tap')
+
+test('dicer-endfinish', t => {
+ t.plan(1)
+
+ t.test('should properly handle finish', t => {
+ t.plan(4)
+
+ const CRLF = '\r\n'
+ const boundary = 'boundary'
+
+ const writeSep = '--' + boundary
+
+ const writePart = [
+ writeSep,
+ 'Content-Type: text/plain',
+ 'Content-Length: 0'
+ ].join(CRLF) +
+ CRLF + CRLF +
+ 'some data' + CRLF
+
+ const writeEnd = '--' + CRLF
+
+ let firedEnd = false
+ let firedFinish = false
+
+ const dicer = new Dicer({ boundary })
+ dicer.on('part', partListener)
+ dicer.on('finish', finishListener)
+ dicer.write(writePart + writeSep)
+
+ function partListener (partReadStream) {
+ partReadStream.on('data', function () { })
+ partReadStream.on('end', partEndListener)
+ }
+ function partEndListener () {
+ firedEnd = true
+ setImmediate(afterEnd)
+ }
+ function afterEnd () {
+ dicer.end(writeEnd)
+ setImmediate(afterWrite)
+ }
+ function finishListener () {
+ t.ok(firedEnd, 'end before finishing')
+ firedFinish = true
+ test2()
+ }
+ function afterWrite () {
+ t.ok(firedFinish, 'Failed to finish')
+ }
+
+ let isPausePush = true
+
+ let firedPauseCallback = false
+ let firedPauseFinish = false
+
+ let dicer2 = null
+
+ function test2 () {
+ dicer2 = new Dicer({ boundary })
+ dicer2.on('part', pausePartListener)
+ dicer2.on('finish', pauseFinish)
+ dicer2.write(writePart + writeSep, 'utf8', pausePartCallback)
+ setImmediate(pauseAfterWrite)
+ }
+ function pausePartListener (partReadStream) {
+ partReadStream.on('data', function () { })
+ partReadStream.on('end', function () { })
+ const realPush = partReadStream.push
+ partReadStream.push = function fakePush () {
+ realPush.apply(partReadStream, arguments)
+ if (!isPausePush) { return true }
+ isPausePush = false
+ return false
+ }
+ }
+ function pauseAfterWrite () {
+ dicer2.end(writeEnd)
+ setImmediate(pauseAfterEnd)
+ }
+ function pauseAfterEnd () {
+ t.ok(firedPauseCallback, 'Called callback after pause')
+ t.ok(firedPauseFinish, 'Finish after pause')
+ }
+ function pauseFinish () {
+ firedPauseFinish = true
+ }
+ function pausePartCallback () {
+ firedPauseCallback = true
+ }
+ })
+})