Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/pumpify/test.js b/node_modules/pumpify/test.js
new file mode 100644
index 0000000..b603c4d
--- /dev/null
+++ b/node_modules/pumpify/test.js
@@ -0,0 +1,235 @@
+var tape = require('tape')
+var through = require('through2')
+var pumpify = require('./')
+var stream = require('stream')
+var duplexify = require('duplexify')
+
+tape('basic', function(t) {
+  t.plan(3)
+
+  var pipeline = pumpify(
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'HELLO')
+      cb(null, data.toString().toLowerCase())
+    })
+  )
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'hello')
+    t.end()
+  })
+})
+
+tape('3 times', function(t) {
+  t.plan(4)
+
+  var pipeline = pumpify(
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'HELLO')
+      cb(null, data.toString().toLowerCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    })
+  )
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'HELLO')
+    t.end()
+  })
+})
+
+tape('destroy', function(t) {
+  var test = through()
+  test.destroy = function() {
+    t.ok(true)
+    t.end()
+  }
+
+  var pipeline = pumpify(through(), test)
+
+  pipeline.destroy()
+})
+
+tape('close', function(t) {
+  var test = through()
+  var pipeline = pumpify(through(), test)
+
+  pipeline.on('error', function(err) {
+    t.same(err.message, 'lol')
+    t.end()
+  })
+
+  test.emit('error', new Error('lol'))
+})
+
+tape('end waits for last one', function(t) {
+  var ran = false
+
+  var a = through()
+  var b = through()
+  var c = through(function(data, enc, cb) {
+    setTimeout(function() {
+      ran = true
+      cb()
+    }, 100)
+  })
+
+  var pipeline = pumpify(a, b, c)
+
+  pipeline.write('foo')
+  pipeline.end(function() {
+    t.ok(ran)
+    t.end()
+  })
+
+  t.ok(!ran)
+})
+
+tape('always wait for finish', function(t) {
+  var a = new stream.Readable()
+  a._read = function() {}
+  a.push('hello')
+
+  var pipeline = pumpify(a, through(), through())
+  var ran = false
+
+  pipeline.on('finish', function() {
+    t.ok(ran)
+    t.end()
+  })
+
+  setTimeout(function() {
+    ran = true
+    a.push(null)
+  }, 100)
+})
+
+tape('async', function(t) {
+  var pipeline = pumpify()
+
+  t.plan(4)
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'HELLO')
+    t.end()
+  })
+
+  setTimeout(function() {
+    pipeline.setPipeline(
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'hello')
+        cb(null, data.toString().toUpperCase())
+      }),
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'HELLO')
+        cb(null, data.toString().toLowerCase())
+      }),
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'hello')
+        cb(null, data.toString().toUpperCase())
+      })
+    )
+  }, 100)
+})
+
+tape('early destroy', function(t) {
+  var a = through()
+  var b = through()
+  var c = through()
+
+  b.destroy = function() {
+    t.ok(true)
+    t.end()
+  }
+
+  var pipeline = pumpify()
+
+  pipeline.destroy()
+  setTimeout(function() {
+    pipeline.setPipeline(a, b, c)
+  }, 100)
+})
+
+tape('preserves error', function (t) {
+  var a = through()
+  var b = through(function (data, enc, cb) {
+    cb(new Error('stop'))
+  })
+  var c = through()
+  var s = pumpify()
+
+  s.on('error', function (err) {
+    t.same(err.message, 'stop')
+    t.end()
+  })
+
+  s.setPipeline(a, b, c)
+  s.resume()
+  s.write('hi')
+})
+
+tape('preserves error again', function (t) {
+  var ws = new stream.Writable()
+  var rs = new stream.Readable({highWaterMark: 16})
+
+  ws._write = function (data, enc, cb) {
+    cb(null)
+  }
+
+  rs._read = function () {
+    process.nextTick(function () {
+      rs.push('hello world')
+    })
+  }
+
+  var pumpifyErr = pumpify(
+    through(),
+    through(function(chunk, _, cb) {
+      cb(new Error('test'))
+    }),
+    ws
+  )
+
+  rs.pipe(pumpifyErr)
+    .on('error', function (err) {
+      t.ok(err)
+      t.ok(err.message !== 'premature close', 'does not close with premature close')
+      t.end()
+    })
+})
+
+tape('returns error from duplexify', function (t) {
+  var a = through()
+  var b = duplexify()
+  var s = pumpify()
+
+  s.setPipeline(a, b)
+
+  s.on('error', function (err) {
+    t.same(err.message, 'stop')
+    t.end()
+  })
+
+  s.write('data')
+  // Test passes if `.end()` is not called
+  s.end()
+
+  b.setWritable(through())
+
+  setImmediate(function () {
+    b.destroy(new Error('stop'))
+  })
+})