Matjaz Mesnjak da65f00f6c Initial commit.
2017-09-20 23:19:33 +02:00

237 lines
5.2 KiB
JavaScript

'use strict';
require('chai').should();
const express = require('express');
const EventSource = require('eventsource');
const SSE = require('../index');
describe('express-sse', () => {
let app;
let server;
beforeEach(function (done) {
app = express();
server = app.listen(3000, done);
});
afterEach(function (done) {
server.close(done);
});
it('should send events', done => {
const sse = new SSE();
app.get('/stream', sse.init);
const es = new EventSource('http://localhost:3000/stream');
setTimeout(() => {
sse.send('test message');
}, 100);
es.onmessage = e => {
JSON.parse(e.data).should.equal('test message');
es.close();
done();
};
});
it('should allow sending custom events', done => {
const sse = new SSE();
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
setTimeout(() => {
sse.send('test message', 'custom event');
}, 100);
es.addEventListener('custom event', event => {
JSON.parse(event.data).should.equal('test message');
es.close();
done();
});
});
it('should allow sending custom IDs', done => {
const sse = new SSE();
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
setTimeout(() => {
sse.send('test message', null, 1337);
}, 100);
es.onmessage = e => {
JSON.parse(e.data).should.equal('test message');
e.lastEventId.should.equal('1337');
es.close();
done();
};
});
it('should allow for serialization of arrays', done => {
const sse = new SSE();
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
setTimeout(() => {
sse.serialize([1, 2, 3, 4, 5]);
}, 100);
let counter = 0;
es.onmessage = e => {
counter++;
if (counter === 5) {
es.close();
done();
}
};
});
it('should send a single event if a non-array is passed to serialize', done => {
const sse = new SSE();
app.get('/stream', sse.init);
const es = new EventSource('http://localhost:3000/stream');
setTimeout(() => {
sse.serialize('test message');
}, 100);
es.onmessage = e => {
JSON.parse(e.data).should.equal('test message');
es.close();
done();
};
});
it('should serve initial data', done => {
const sse = new SSE('initial message');
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
JSON.parse(e.data).should.equal('initial message');
es.close();
done();
};
});
it('should serialize initial data by default (isSerialized = true)', done => {
const sse = new SSE([1, 2, 3, 4, 5]);
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
let counter = 0;
es.onmessage = e => {
counter++;
if (counter === 5) {
es.close();
done();
}
};
});
it('should send initial data as array if isSerialized is false', done => {
const sse = new SSE([1, 2, 3, 4, 5], { isSerialized: false });
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
e.data.should.equal(JSON.stringify([1, 2, 3, 4, 5]));
es.close();
done();
};
});
it('should be able to update initial data', done => {
const sse = new SSE(null, { isSerialized: false });
app.get('/', sse.init);
sse.updateInit([1, 2, 3, 4, 5]);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
e.data.should.equal(JSON.stringify([1, 2, 3, 4, 5]));
es.close();
done();
};
});
it('should update initial data even if a non-array is passed', done => {
const sse = new SSE(null);
app.get('/', sse.init);
sse.updateInit(1);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
JSON.parse(e.data).should.equal(1);
es.close();
done();
};
});
it('should allow dropping the initial data', done => {
const sse = new SSE([1, 2, 3]);
app.get('/', sse.init);
sse.dropInit();
setTimeout(() => {
sse.send(1);
}, 100);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
JSON.parse(e.data).should.equal(1);
es.close();
done();
};
});
it('should not send an event for an empty array if isSerialized is false', done => {
const sse = new SSE([1, 2, 3], { isSerialized: false });
app.get('/', sse.init);
sse.dropInit();
setTimeout(() => {
sse.send(1);
}, 100);
const es = new EventSource('http://localhost:3000/');
es.onmessage = e => {
JSON.parse(e.data).should.equal(1);
es.close();
done();
};
});
it('should send a custom initial event if the option is defined', done => {
const sse = new SSE([1, 2, 3], { isSerialized: false, initialEvent: 'custom initial event' });
app.get('/', sse.init);
const es = new EventSource('http://localhost:3000');
es.addEventListener('custom initial event', event => {
event.data.should.equal(JSON.stringify([1, 2, 3]));
es.close();
done();
});
});
});