diff options
Diffstat (limited to 'packages/misskey-js/test/streaming.ts')
| -rw-r--r-- | packages/misskey-js/test/streaming.ts | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/packages/misskey-js/test/streaming.ts b/packages/misskey-js/test/streaming.ts new file mode 100644 index 0000000000..913db8b287 --- /dev/null +++ b/packages/misskey-js/test/streaming.ts @@ -0,0 +1,165 @@ +import WS from 'jest-websocket-mock'; +import Stream from '../src/streaming'; + +describe('Streaming', () => { + test('useChannel', async () => { + const server = new WS('wss://misskey.test/streaming'); + const stream = new Stream('https://misskey.test', { token: 'TOKEN' }); + const mainChannelReceived: any[] = []; + const main = stream.useChannel('main'); + main.on('meUpdated', payload => { + mainChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN'); + + const msg = JSON.parse(await server.nextMessage as string); + const mainChannelId = msg.body.id; + expect(msg.type).toEqual('connect'); + expect(msg.body.channel).toEqual('main'); + expect(mainChannelId != null).toEqual(true); + + server.send(JSON.stringify({ + type: 'channel', + body: { + id: mainChannelId, + type: 'meUpdated', + body: { + id: 'foo' + } + } + })); + + expect(mainChannelReceived[0]).toEqual({ + id: 'foo' + }); + + stream.close(); + server.close(); + }); + + test('useChannel with parameters', async () => { + const server = new WS('wss://misskey.test/streaming'); + const stream = new Stream('https://misskey.test', { token: 'TOKEN' }); + const messagingChannelReceived: any[] = []; + const messaging = stream.useChannel('messaging', { otherparty: 'aaa' }); + messaging.on('message', payload => { + messagingChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN'); + + const msg = JSON.parse(await server.nextMessage as string); + const messagingChannelId = msg.body.id; + expect(msg.type).toEqual('connect'); + expect(msg.body.channel).toEqual('messaging'); + expect(msg.body.params).toEqual({ otherparty: 'aaa' }); + expect(messagingChannelId != null).toEqual(true); + + server.send(JSON.stringify({ + type: 'channel', + body: { + id: messagingChannelId, + type: 'message', + body: { + id: 'foo' + } + } + })); + + expect(messagingChannelReceived[0]).toEqual({ + id: 'foo' + }); + + stream.close(); + server.close(); + }); + + test('ちゃんとチャンネルごとにidが異なる', async () => { + const server = new WS('wss://misskey.test/streaming'); + const stream = new Stream('https://misskey.test', { token: 'TOKEN' }); + + stream.useChannel('messaging', { otherparty: 'aaa' }); + stream.useChannel('messaging', { otherparty: 'bbb' }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN'); + + const msg = JSON.parse(await server.nextMessage as string); + const messagingChannelId = msg.body.id; + const msg2 = JSON.parse(await server.nextMessage as string); + const messagingChannelId2 = msg2.body.id; + + expect(messagingChannelId != null).toEqual(true); + expect(messagingChannelId2 != null).toEqual(true); + expect(messagingChannelId).not.toEqual(messagingChannelId2); + + stream.close(); + server.close(); + }); + + test('Connection#send', async () => { + const server = new WS('wss://misskey.test/streaming'); + const stream = new Stream('https://misskey.test', { token: 'TOKEN' }); + + const messaging = stream.useChannel('messaging', { otherparty: 'aaa' }); + messaging.send('read', { id: 'aaa' }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN'); + + const connectMsg = JSON.parse(await server.nextMessage as string); + const channelId = connectMsg.body.id; + const msg = JSON.parse(await server.nextMessage as string); + + expect(msg.type).toEqual('ch'); + expect(msg.body.id).toEqual(channelId); + expect(msg.body.type).toEqual('read'); + expect(msg.body.body).toEqual({ id: 'aaa' }); + + stream.close(); + server.close(); + }); + + test('Connection#dispose', async () => { + const server = new WS('wss://misskey.test/streaming'); + const stream = new Stream('https://misskey.test', { token: 'TOKEN' }); + const mainChannelReceived: any[] = []; + const main = stream.useChannel('main'); + main.on('meUpdated', payload => { + mainChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get('i')).toEqual('TOKEN'); + + const msg = JSON.parse(await server.nextMessage as string); + const mainChannelId = msg.body.id; + expect(msg.type).toEqual('connect'); + expect(msg.body.channel).toEqual('main'); + expect(mainChannelId != null).toEqual(true); + main.dispose(); + + server.send(JSON.stringify({ + type: 'channel', + body: { + id: mainChannelId, + type: 'meUpdated', + body: { + id: 'foo' + } + } + })); + + expect(mainChannelReceived.length).toEqual(0); + + stream.close(); + server.close(); + }); + + // TODO: SharedConnection#dispose して一定時間経ったら disconnect メッセージがサーバーに送られてくるかのテスト + + // TODO: チャンネル接続が使いまわされるかのテスト +}); |