UNPKG

urban-airship-connect

Version:

node client for Airship's Real Time Data Streaming

311 lines (243 loc) 6.5 kB
var http = require('http') var util = require('util') var zlib = require('zlib') var test = require('tape') var findPort = require('portfinder').getPort var connect = require('../') var mockConnect = require('./mock') test('posts to provided URL with provided token', function (t) { t.plan(7) var toWrite = { whatever: 'who cares' } var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(checkRequest).listen(port, runTests) function runTests() { stream = connect('appkey1', 'accesstoken2', { uri: 'http://localhost:' + port, }) stream.write(toWrite) } } function checkRequest(req, res) { t.equal(req.method.toLowerCase(), 'post') t.equal( req.headers.accept, 'application/vnd.urbanairship+x-ndjson;version=3;' ) t.equal(req.headers['content-type'], 'application/json') t.equal( req.headers['content-length'], JSON.stringify(toWrite).length.toString() ) t.equal(req.headers.authorization, 'Bearer accesstoken2') t.equal(req.headers['x-ua-appkey'], 'appkey1') req.on('data', function (data) { t.equal(data.toString(), JSON.stringify(toWrite)) const gzip = zlib.createGzip() gzip.pipe(res) gzip.end() server.close() stream.end() t.end() }) } }) test('emits an error on bad JSON with blob attached', function (t) { t.plan(2) var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(emitBad).listen(port, runTests) function runTests() { stream = connect('appkey1', 'accesstoken2', { uri: 'http://localhost:' + port, }) stream.on('error', function (err) { t.ok(util.isError(err)) t.equal(err.blob, 'undefined') stream.end() server.close() t.end() }) stream.write({ whatever: 'who cares' }) } } function emitBad(req, res) { req.on('data', function (data) { var gzip = zlib.createGzip() gzip.pipe(res) gzip.end('undefined') }) } }) test('can provide custom parser', function (t) { t.plan(2) var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(emitBad).listen(port, runTests) function runTests() { stream = connect('appkey1', 'accesstoken2', { uri: 'http://localhost:' + port, parser: customParser, }) stream.on('error', t.fail) stream.on('data', function (data) { t.deepEqual(data, { wacky: 'wut' }) stream.end() server.close() t.end() }) stream.write({ whatever: 'who cares' }) } } function customParser(data) { t.equal(data, 'undefined') return { wacky: 'wut' } } function emitBad(req, res) { req.on('data', function (data) { var gzip = zlib.createGzip() gzip.pipe(res) gzip.end('undefined') }) } }) test('emits an error on bad encoding', function (t) { t.plan(1) var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(emitBad).listen(port, runTests) function runTests() { stream = connect('appkey1', 'accesstoken2', { uri: 'http://localhost:' + port, }) stream.on('error', function (err) { t.ok(util.isError(err)) server.close() stream.end() t.end() }) stream.write({ whatever: 'who cares' }) } } function emitBad(req, res) { req.on('data', function (data) { res.end('not gzipped') }) } }) test('sets a cookie for redirect, emits event', function (t) { t.plan(2) var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(redirectHandler).listen(port, runTests) function runTests() { stream = connect('x', 'x', { uri: 'http://localhost:' + port }) stream.once('redirect', function () { t.pass('event emitted') }) stream.write({ whatever: 'who cares' }) } } function redirectHandler(req, res) { var gzip = zlib.createGzip() gzip.pipe(res) if (req.headers.cookie) { t.equal(req.headers.cookie, 'chocolate-chip') gzip.end() server.close() stream.end() t.end() } else { res.setHeader('set-cookie', ['chocolate-chip']) res.statusCode = 307 gzip.end() } } }) test('resumes at last offset on reconnect', function (t) { t.plan(1) var server var stream getPort(setupServer) function setupServer(port) { server = http.createServer(firstHandler).listen(port, setupStream) function setupStream() { stream = connect('x', 'x', { uri: 'http://localhost:' + port }) stream.once('data', function () { server.close(restartServer) }) stream.write({ whatever: 'who cares' }) } function restartServer() { server = http.createServer(secondHandler).listen(port) } function secondHandler(req, res) { var buf = '' req.on('data', function (data) { buf += data }) req.on('end', function () { t.equal(JSON.parse(buf).resume_offset, '12345') var gzip = zlib.createGzip() gzip.pipe(res) gzip.end() server.close() stream.end() t.end() }) } } function firstHandler(req, res) { var gzip = zlib.createGzip() gzip.pipe(res) gzip.end(JSON.stringify({ offset: '12345' }) + '\n') } }) test('emits data objects', function (t) { t.plan(3) var data = [ { lol: true }, { cats: ['garfield', 'top cat'] }, { x: 1, y: -1, z: 10000 }, ] var server var stream getPort(setupMock) function setupMock(port) { server = mockConnect(data) server.listen(port, runTests) function runTests() { stream = connect('x', 'x', { uri: 'http://localhost:' + port }) var counter = 0 stream.on('data', function (x) { t.deepEqual(x, data[counter]) if (++counter === data.length) { server.close() stream.end() t.end() } }) stream.write({ merp: 'lol' }) } } }) function getPort(ready) { findPort(readyOrError) function readyOrError(err, port) { if (err) { console.error('Unable to find an available port for test server') process.exit(1) } ready(port) } }