hybridables/callback2stream

View on GitHub
test.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * callback2stream <https://github.com/hybridables/callback2stream>
 *
 * Copyright (c) 2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk)
 * Released under the MIT license.
 */

'use strict'

var fs = require('fs')
var test = require('mukla')
var callback2stream = require('./index')
var isBuffer = require('is-buffer')

test('should always return a function', function (done) {
  test.strictEqual(typeof callback2stream(), 'function')
  test.strictEqual(typeof callback2stream(123), 'function')
  test.strictEqual(typeof callback2stream('abc'), 'function')
  done()
})

test('should create stream from async function (fs.readFile)', function (done) {
  var readFile = callback2stream(fs.readFile)
  var stream = readFile('./package.json', 'utf8')
  stream
    .on('data', function (val) {
      test.strictEqual(typeof val, 'string')
      test.strictEqual(val, fs.readFileSync('./package.json', 'utf8'))
      test.ok(val.indexOf('"license":"MIT"'))
    })
    .once('error', done)
    .once('end', done)
})

test('should create stream with buffer contents', function (done) {
  var readBuffer = callback2stream(fs.readFile)
  var stream = readBuffer('./package.json')
  stream
    .on('data', function (val) {
      test.strictEqual(isBuffer(val), true)
      test.ok(val.toString('utf8').indexOf('"license":"MIT"'))
    })
    .once('error', done)
    .once('end', done)
})

test('should get fs.stat stream', function (done) {
  var statFile = callback2stream(fs.stat)
  statFile('./package.json')
    .on('data', function (val) {
      test.strictEqual(typeof val, 'object')
      test.ok(val.mtime)
      test.ok(val.size)
    })
    .once('error', done)
    .once('end', done)
})

test('should work for sync functions (fs.readFileSync)', function (done) {
  var createReadStream = callback2stream(fs.readFileSync)
  createReadStream('./package.json', 'utf8')
    .on('data', function (val) {
      test.strictEqual(typeof val, 'string')
      test.ok(val.indexOf('"license":"MIT"'))
    })
    .once('error', done)
    .once('end', done)
})

test('should work for natives like JSON.parse', function (done) {
  var JSONParseStream = callback2stream(JSON.parse)
  JSONParseStream('{"foo":"bar"}')
    .on('data', function (val) {
      test.strictEqual(typeof val, 'object')
      test.strictEqual(val.foo, 'bar')
    })
    .once('error', done)
    .once('end', done)
})

test('should work for natives like JSON.stringify', function (done) {
  var JSONStringify = callback2stream(JSON.stringify)
  JSONStringify({ a: 'b', c: 'd' })
    .on('data', function (val) {
      test.strictEqual(typeof val, 'string')
      test.strictEqual(val, '{"a":"b","c":"d"}')
    })
    .once('error', done)
    .once('end', done)
})

test('should work for JSON.stringify with identation', function (done) {
  var stringifyStream = callback2stream(JSON.stringify)
  stringifyStream({ bar: 'qux', xxx: 'yyy' }, null, 2)
    .on('data', function (val) {
      test.strictEqual(typeof val, 'string')
      test.strictEqual(val, '{\n  "bar": "qux",\n  "xxx": "yyy"\n}')
    })
    .once('error', done)
    .once('end', done)
})

test('should handle async errors correctly (fs.readFile ENOENT)', function (done) {
  var readFileError = callback2stream(fs.readFile)
  readFileError('not exist', 'utf8')
    .once('error', function (err) {
      test.ifError(!err)
      test.strictEqual(err instanceof Error, true)
      test.strictEqual(err.code, 'ENOENT')
      done()
    })
})

test('should handle sync errors correctly (fs.readFileSync ENOENT)', function (done) {
  var syncError = callback2stream(fs.readFileSync)
  syncError('not exist', 'utf8').once('error', function (err) {
    test.strictEqual(err instanceof Error, true)
    test.strictEqual(/no such file or directory, open/.test(err.message), true)
    done()
  })
})

test('should handle json parse error', function (done) {
  var parseStream = callback2stream(JSON.parse)
  parseStream('{foo: bar qux, invalid')
    .once('error', function (err) {
      test.ifError(!err)
      test.strictEqual(err instanceof Error, true)
      test.strictEqual(err.name, 'SyntaxError')
      test.strictEqual(err.message, 'Unexpected token f')
      done()
    })
})

test('should work for successful generator function', function (done) {
  var generatorStream = callback2stream(function * (a, b) {
    var val = yield [a + 111]
    return yield [val[0] + b]
  })
  generatorStream(444, 222)
    .on('data', function (val) {
      test.deepEqual(val, [777])
    })
    .once('error', done)
    .once('end', done)
})

test('should handle error from generator function', function (done) {
  var genStream = callback2stream(function * (foo) {
    throw new Error('msg ' + foo)
  })
  genStream('hi')
    .once('error', function (err) {
      test.ifError(!err)
      test.strictEqual(err.message, 'msg hi')
      done()
    })
})