/*! * promise2stream * * 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('assertit') var promise2stream = require('./index') var isPromise = require('is-promise') var isStream = require('is-node-stream') var isBuffer = require('is-buffer') var Promize = require('pinkie-promise') test.true = function (val) { test.strictEqual(isStream(val), true) } test('should throw TypeError if `val` not a promise', function (done) { function fixture () { promise2stream(123) } test.throws(fixture, TypeError) test.throws(fixture, /expect `val` be promise/) done() }) test('should create stream from a resolved promise', function (done) { var promiseNumber = Promize.resolve(123) var promiseString = Promize.resolve('str') var promiseBuffer = Promize.resolve(new Buffer('buff')) test.true(promise2stream(promiseNumber)) test.true(promise2stream(promiseString)) test.true(promise2stream(promiseBuffer)) done() }) test('should fire `end` event if promise resolves `null` value', function (done) { var promise = Promize.resolve(null) var stream = promise2stream(promise) var called = 0 /* istanbul ignore next */ stream.on('data', function (val) { called++ }) stream.once('error', done) stream.once('end', function () { test.strictEqual(called, 0) done() }) }) test('should fire `error` event if rejected promise', function (done) { var rejectedPromise = Promize.reject(new Error('foo bar')) var stream = promise2stream(rejectedPromise) stream.once('error', function (err) { test.strictEqual(err instanceof Error, true) test.strictEqual(err.message, 'foo bar') done() }) }) test('should fire `data` event if resolved promise with number value', function (done) { var resolvedPromise = Promize.resolve(123) var stream = promise2stream(resolvedPromise) stream.on('data', function (val) { test.strictEqual(val, 123) }) stream.once('error', done) stream.once('end', done) }) test('should fire `data` event if object value', function (done) { var promise = Promize.resolve({ a: 'b' }) var stream = promise2stream(promise) stream.on('data', function (val) { test.deepEqual(val, { a: 'b' }) }) stream.once('error', done) stream.once('end', done) }) test('should get buffer if promise resolves buffer value', function (done) { var buffer = Promize.resolve(new Buffer('a b. c')) promise2stream(buffer) .on('data', function (buf) { test.strictEqual(isBuffer(buf), true) test.strictEqual(buf.toString('utf8'), 'a b. c') }) .on('end', done) }) test('should not be object mode stream (opts.objectMode: false)', function (done) { var promise = Promize.resolve({ foo: 'bar' }) var stream = promise2stream(promise, { objectMode: false }) stream.on('error', function (err) { test.ifError(!err) test.strictEqual(err instanceof TypeError, true) test.strictEqual(/Invalid non-string\/buffer chunk/gi.test(err.message), true) done() }) }) test('should access the promise from returned stream, e.g. `stream.promise`', function (done) { var promise = Promize.resolve(456) var stream = promise2stream(promise) test.strictEqual(isPromise(stream.promise), true) stream.promise.then(function (val) { test.strictEqual(val, 456) done() }, done) }) test('should get value of promise that resolves another promise', function (done) { var promise = Promize.resolve('foo bar') var resolved = Promize.resolve(promise) var stream = promise2stream(resolved) stream .on('data', function (val) { test.strictEqual(val, 'foo bar') }) .once('error', done) .once('end', done) }) test('should not get value of resolved stream', function (done) { var pkgStream = fs.createReadStream('package.json') pkgStream .on('data', function (val) { var str = val.toString('utf8') test.strictEqual(isBuffer(val), true) test.strictEqual(str.indexOf('license') !== -1, true) }) .once('error', done) .once('end', function () { var promise = Promize.resolve(pkgStream) var stream = promise2stream(promise) stream .on('data', function (val) { test.strictEqual(isStream(val), true) }) .once('error', done) .once('end', done) }) })