mirror of
https://github.com/feathersjs/feathers.git
synced 2026-01-25 15:23:13 +00:00
99 lines
2.9 KiB
TypeScript
99 lines
2.9 KiB
TypeScript
import { io } from 'socket.io-client'
|
|
import assert from 'assert'
|
|
import { feathers, Application } from '@feathersjs/feathers'
|
|
import socketio from '@feathersjs/socketio'
|
|
import socketioClient from '@feathersjs/socketio-client'
|
|
|
|
import authClient from '../../src'
|
|
import getApp from './fixture'
|
|
import commonTests from './commons'
|
|
import { AuthenticationResult } from '@feathersjs/authentication/lib'
|
|
|
|
describe('@feathersjs/authentication-client Socket.io integration', () => {
|
|
let app: Application
|
|
|
|
before(async () => {
|
|
app = getApp(feathers().configure(socketio()))
|
|
|
|
await app.listen(9777)
|
|
})
|
|
|
|
after((done) => app.io.close(() => done()))
|
|
|
|
it('allows to authenticate with handshake headers and sends login event', async () => {
|
|
const user = { email: 'authtest@example.com', password: 'alsosecret' }
|
|
|
|
await app.service('users').create(user)
|
|
|
|
const { accessToken } = await app.service('authentication').create({
|
|
strategy: 'local',
|
|
...user
|
|
})
|
|
|
|
const socket = io('http://localhost:9777', {
|
|
transports: ['websocket'],
|
|
transportOptions: {
|
|
websocket: {
|
|
extraHeaders: {
|
|
Authorization: `Bearer ${accessToken}`
|
|
}
|
|
}
|
|
}
|
|
})
|
|
const authResult: any = await new Promise((resolve) => app.once('login', (res) => resolve(res)))
|
|
|
|
assert.strictEqual(authResult.accessToken, accessToken)
|
|
|
|
const dummy: any = await new Promise((resolve, reject) => {
|
|
socket.emit('find', 'dummy', {}, (error: Error, page: any) => (error ? reject(error) : resolve(page)))
|
|
})
|
|
|
|
assert.strictEqual(dummy.user.email, user.email)
|
|
assert.strictEqual(dummy.authentication.accessToken, accessToken)
|
|
assert.strictEqual(dummy.headers.authorization, `Bearer ${accessToken}`)
|
|
})
|
|
|
|
it('reconnects after socket disconnection', async () => {
|
|
const user = { email: 'disconnecttest@example.com', password: 'alsosecret' }
|
|
const socket = io('http://localhost:9777', {
|
|
timeout: 500,
|
|
reconnection: true,
|
|
reconnectionDelay: 100
|
|
})
|
|
const client = feathers().configure(socketioClient(socket)).configure(authClient())
|
|
|
|
await app.service('users').create(user)
|
|
await client.authenticate({
|
|
strategy: 'local',
|
|
...user
|
|
})
|
|
|
|
const onLogin = new Promise<AuthenticationResult>((resolve) => app.once('login', (data) => resolve(data)))
|
|
|
|
socket.once('disconnect', () => socket.connect())
|
|
socket.disconnect()
|
|
|
|
const {
|
|
authentication: { strategy }
|
|
} = await onLogin
|
|
const dummy = await client.service('dummy').find()
|
|
|
|
assert.strictEqual(strategy, 'jwt')
|
|
assert.strictEqual(dummy.user.email, user.email)
|
|
})
|
|
|
|
commonTests(
|
|
() => app,
|
|
() => {
|
|
return feathers()
|
|
.configure(socketioClient(io('http://localhost:9777')))
|
|
.configure(authClient())
|
|
},
|
|
{
|
|
email: 'socketioauth@feathersjs.com',
|
|
password: 'secretive',
|
|
provider: 'socketio'
|
|
}
|
|
)
|
|
})
|