taro-s4s
Version:
Nerv-multi多端开发解决方案
226 lines (209 loc) • 7.1 kB
JavaScript
/* eslint-disable */
import { Websocket, Server } from 'mock-socket'
import mockConsole from 'jest-mock-console'
import Taro from '../index.js'
Taro.initNativeApi(Taro)
describe('websocket', () => {
test('options should be object', () => {
mockConsole()
expect.assertions(2)
return Taro.connectSocket()
.catch(err => {
const expectErrMsg = 'connectSocket:fail parameter error: parameter should be Object instead of Undefined'
expect(console.error).toHaveBeenNthCalledWith(1, expectErrMsg)
expect(err.errMsg).toMatch(expectErrMsg)
})
})
test('options.url should be string', () => {
mockConsole()
const success = jest.fn()
const fail = jest.fn()
const complete = jest.fn()
expect.assertions(7)
return Taro.connectSocket({
url: 1,
success,
fail,
complete
})
.catch(err => {
const expectErrMsg = 'connectSocket:fail parameter error: parameter.url should be String instead of Number'
expect(success.mock.calls.length).toBe(0)
expect(fail.mock.calls.length).toBe(1)
expect(fail.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(complete.mock.calls.length).toBe(1)
expect(complete.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(console.error).toHaveBeenCalledWith(expectErrMsg)
expect(err.errMsg).toMatch(expectErrMsg)
})
})
test('options.url should be starts with ws:// or wss://', () => {
mockConsole()
const url = 'http://localhost:8080'
const success = jest.fn()
const fail = jest.fn()
const complete = jest.fn()
expect.assertions(7)
return Taro.connectSocket({
url,
success,
fail,
complete
})
.catch(err => {
const expectErrMsg = `request:fail invalid url "${url}"`
expect(success.mock.calls.length).toBe(0)
expect(fail.mock.calls.length).toBe(1)
expect(fail.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(complete.mock.calls.length).toBe(1)
expect(complete.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(console.error).toHaveBeenCalledWith(expectErrMsg)
expect(err.errMsg).toMatch(expectErrMsg)
})
})
test('should not keep more than 2 connection', () => {
mockConsole()
const success = jest.fn()
const fail = jest.fn()
const complete = jest.fn()
expect.assertions(9)
return Promise.all([
Taro.connectSocket({ url: 'wss://localhost:8080', success })
.then(task => {
expect(success.mock.calls[0][0]).toEqual({ socketTaskId: 1, errMsg: 'connectSocket:ok'})
task.close()
}),
Taro.connectSocket({ url: 'wss://localhost:8090', success })
.then(task => {
task.close()
expect(success.mock.calls[1][0]).toEqual({ socketTaskId: 2, errMsg: 'connectSocket:ok'})
}),
Taro.connectSocket({
url: 'wss://localhost:9090',
success,
fail,
complete
})
.catch(err => {
const expectErrMsg = `同时最多发起 2 个 socket 请求,更多请参考文档。`
expect(success.mock.calls.length).toBe(2)
expect(fail.mock.calls.length).toBe(1)
expect(fail.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(complete.mock.calls.length).toBe(1)
expect(complete.mock.calls[0][0]).toEqual({ errMsg: expectErrMsg })
expect(console.error).toHaveBeenCalledWith(expectErrMsg)
expect(err.errMsg).toMatch(expectErrMsg)
})
])
})
test('should work basically', done => {
const mockServer = new Server('wss://localhost:8080')
const connected = jest.fn()
const success = jest.fn()
const complete = jest.fn()
const msg = 'hello'
const msg2 = 'hello too'
mockServer.on('connection', connected)
mockServer.on('message', message => {
expect(message).toMatch(msg)
mockServer.send(msg2)
})
expect.assertions(11)
Taro.connectSocket({
url: 'wss://localhost:8080',
success,
complete
})
.then(task => {
const closeCode = 100
const closeReason = 'yeah'
jest.spyOn(task.ws, 'send')
jest.spyOn(task.ws, 'close')
task.onOpen(() => {
task.send({ data: msg })
.then(res => {
expect(task.ws.send).toHaveBeenCalled()
expect(res.errMsg).toMatch('sendSocketMessage:ok')
})
})
task.onMessage(res => {
expect(res.data).toMatch(msg2)
task.close({
code: closeCode,
reason: closeReason
})
.then(res => {
expect(task.ws.close).toHaveBeenCalled()
expect(res.errMsg).toMatch('closeSocket:ok')
})
})
task.onClose(({ code, reason }) => {
const expectMsg = 'connectSocket:ok'
expect(connected.mock.calls.length).toBe(1)
expect(success.mock.calls[0][0].errMsg).toMatch(expectMsg)
expect(complete.mock.calls[0][0].errMsg).toMatch(expectMsg)
expect(code).toBe(closeCode)
expect(reason).toBe(closeReason)
done()
})
})
})
test('that passing protocols into the constructor works', () => {
expect.assertions(2)
return Promise.all([
Taro.connectSocket({ url: 'ws://not-real', protocols: ['foo'] })
.then(task => {
expect(task.ws.protocol).toMatch('foo')
task.close()
}),
Taro.connectSocket({ url: 'ws://not-real-too', protocols: 'bar' })
.then(task => {
expect(task.ws.protocol).toMatch('')
task.close()
})
])
})
test('that on(open, message, error, and close) can be set', () => {
expect.assertions(4)
return Taro.connectSocket({
url: 'wss://localhost:8080'
})
.then(task => {
task.onOpen(() => {})
task.onMessage(res => {})
task.onClose(() => {})
task.onError(() => {})
const { listeners } = task.ws
expect(listeners.open.length).toBe(1)
expect(listeners.message.length).toBe(1)
expect(listeners.close.length).toBe(1)
expect(listeners.error.length).toBe(1)
task.close()
})
})
test('that sending when the socket is closed throws an expection', () => {
mockConsole()
const success = jest.fn()
const fail = jest.fn()
const complete = jest.fn()
expect.assertions(4)
return Taro.connectSocket({
url: 'wss://localhost:8080'
})
.then(task => {
task.send({
data: 'test',
success,
fail,
complete
})
.catch(res => {
expect(console.error).toHaveBeenLastCalledWith(res.errMsg)
expect(success.mock.calls.length).toBe(0)
expect(fail.mock.calls[0][0]).toEqual(res)
expect(complete.mock.calls[0][0]).toEqual(res)
task.close()
})
})
})
})