UNPKG

pubnub

Version:

Publish & Subscribe Real-time Messaging with PubNub

301 lines (269 loc) 8.64 kB
/* global describe, beforeEach, it, before, after */ /* eslint no-console: 0 */ import assert from 'assert'; import nock from 'nock'; import utils from '../../utils'; import PubNub from '../../../src/node/index'; describe('publish endpoints', () => { let pubnub; before(() => { nock.disableNetConnect(); }); after(() => { nock.enableNetConnect(); }); beforeEach(() => { nock.cleanAll(); pubnub = new PubNub({ subscribeKey: 'mySubKey', publishKey: 'myPublishKey', uuid: 'myUUID', authKey: 'myAuthKey', useRandomIVs: false }); }); describe('##validation', () => { it('fails if channel is missing', (done) => { const scope = utils .createNock() .get('/publish/*') .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.publish({ message: { such: 'object' } }).catch((err) => { assert.equal(scope.isDone(), false); assert.equal(err.status.message, 'Missing Channel'); done(); }); }); }); it('publishes a complex object via GET', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%7B%22such%22%3A%22object%22%7D' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1' }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('publishes without replication via GET', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%7B%22such%22%3A%22object%22%7D' ) .query({ norep: true, pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', replicate: false }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('publishes a complex object via GET with encryption', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%22toDEeIZkmIyoiLpSojGu7n3%2B2t1rn7%2FDsrEZ1r8JKR4%3D%22' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.setCipherKey('myCipherKey'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1' }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('supports ttl param', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%22toDEeIZkmIyoiLpSojGu7n3%2B2t1rn7%2FDsrEZ1r8JKR4%3D%22' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', ttl: '10', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.setCipherKey('myCipherKey'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', ttl: 10 }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('supports storeInHistory=0', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%22toDEeIZkmIyoiLpSojGu7n3%2B2t1rn7%2FDsrEZ1r8JKR4%3D%22' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', store: '0', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.setCipherKey('myCipherKey'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', storeInHistory: false }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('supports storeInHistory=1', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%22toDEeIZkmIyoiLpSojGu7n3%2B2t1rn7%2FDsrEZ1r8JKR4%3D%22' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', store: '1', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.setCipherKey('myCipherKey'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', storeInHistory: true }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('publishes a complex object via POST', (done) => { const scope = utils .createNock() .post('/publish/myPublishKey/mySubKey/0/ch1/0', '{"such":"object"}') .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', sendByPost: true }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('publishes a complex object via POST with encryption', (done) => { const scope = utils .createNock() .post( '/publish/myPublishKey/mySubKey/0/ch1/0', '"toDEeIZkmIyoiLpSojGu7n3+2t1rn7/DsrEZ1r8JKR4="' ) .query({ pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.setCipherKey('myCipherKey'); pubnub.publish( { message: { such: 'object' }, channel: 'ch1', sendByPost: true }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); it('should add publish API telemetry information', (done) => { let scope = utils.createNock().get('/publish/myPublishKey/mySubKey/0/ch1/0/%7B%22such%22%3A%22object%22%7D').query(true); const delays = [100, 200, 300, 400]; const countedDelays = delays.slice(0, delays.length - 1); const average = Math.floor(countedDelays.reduce((acc, delay) => acc + delay, 0) / countedDelays.length); const leeway = 50; utils.runAPIWithResponseDelays(scope, 200, '[1,"Sent","14647523059145592"]', delays, (completion) => { pubnub.publish( { message: { such: 'object' }, channel: 'ch1' }, () => { completion(); } ); }) .then((lastRequest) => { utils.verifyRequestTelemetry(lastRequest.path, 'l_pub', average, leeway); done(); }); }).timeout(60000); describe('#fire', () => { it('publishes a complex object via GET', (done) => { const scope = utils .createNock() .get( '/publish/myPublishKey/mySubKey/0/ch1/0/%7B%22such%22%3A%22object%22%7D' ) .query({ norep: true, store: 0, pnsdk: `PubNub-JS-Nodejs/${pubnub.getVersion()}`, uuid: 'myUUID', auth: 'myAuthKey', }) .reply(200, '[1,"Sent","14647523059145592"]'); pubnub.fire( { message: { such: 'object' }, channel: 'ch1' }, (status, response) => { assert.equal(status.error, false); assert.deepEqual(response.timetoken, 14647523059145592); assert.equal(scope.isDone(), true); done(); } ); }); }); });