mirror of
https://github.com/standardnotes/server
synced 2026-07-14 00:01:54 -04:00
* feat(websockets): persist connections in mysql * fix: add sending event to client upon items changed on server * fix payload * fix: add cathcing errors * fix: send changed items event only on a 10% dice roll
100 lines
3.5 KiB
TypeScript
100 lines
3.5 KiB
TypeScript
import { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi'
|
|
import { WebSocketsConnectionRepositoryInterface } from '../../WebSockets/WebSocketsConnectionRepositoryInterface'
|
|
import { SendMessageToClient } from './SendMessageToClient'
|
|
import { Logger } from 'winston'
|
|
import { Connection } from '../../Connection/Connection'
|
|
import { Timestamps, Uuid } from '@standardnotes/domain-core'
|
|
|
|
describe('SendMessageToClient', () => {
|
|
let webSocketsConnectionRepository: WebSocketsConnectionRepositoryInterface
|
|
let apiGatewayManagementClient: ApiGatewayManagementApiClient
|
|
let logger: Logger
|
|
|
|
const createUseCase = () =>
|
|
new SendMessageToClient(webSocketsConnectionRepository, apiGatewayManagementClient, logger)
|
|
|
|
beforeEach(() => {
|
|
const connection = Connection.create({
|
|
userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
|
|
connectionId: 'connection-id',
|
|
sessionUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
|
|
timestamps: Timestamps.create(123, 123).getValue(),
|
|
}).getValue()
|
|
|
|
webSocketsConnectionRepository = {} as jest.Mocked<WebSocketsConnectionRepositoryInterface>
|
|
webSocketsConnectionRepository.findAllByUserUuid = jest.fn().mockResolvedValue([connection])
|
|
|
|
apiGatewayManagementClient = {} as jest.Mocked<ApiGatewayManagementApiClient>
|
|
apiGatewayManagementClient.send = jest.fn().mockResolvedValue({ $metadata: { httpStatusCode: 200 } })
|
|
|
|
logger = {} as jest.Mocked<Logger>
|
|
logger.debug = jest.fn()
|
|
logger.error = jest.fn()
|
|
})
|
|
|
|
it('sends message to all connections for a user', async () => {
|
|
const useCase = createUseCase()
|
|
|
|
const result = await useCase.execute({
|
|
userUuid: '00000000-0000-0000-0000-000000000000',
|
|
message: 'message',
|
|
})
|
|
|
|
expect(result.isFailed()).toBe(false)
|
|
expect(apiGatewayManagementClient.send).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it('does not send message to originating session', async () => {
|
|
const useCase = createUseCase()
|
|
|
|
const result = await useCase.execute({
|
|
userUuid: '00000000-0000-0000-0000-000000000000',
|
|
message: 'message',
|
|
originatingSessionUuid: '00000000-0000-0000-0000-000000000000',
|
|
})
|
|
|
|
expect(result.isFailed()).toBe(false)
|
|
expect(apiGatewayManagementClient.send).toHaveBeenCalledTimes(0)
|
|
})
|
|
|
|
it('returns error if sending message fails', async () => {
|
|
apiGatewayManagementClient.send = jest.fn().mockRejectedValue(new Error('error'))
|
|
|
|
const useCase = createUseCase()
|
|
|
|
const result = await useCase.execute({
|
|
userUuid: '00000000-0000-0000-0000-000000000000',
|
|
message: 'message',
|
|
})
|
|
|
|
expect(result.isFailed()).toBe(true)
|
|
expect(result.getError()).toBe(
|
|
'Could not send message to connection connection-id for user 00000000-0000-0000-0000-000000000000. Error: error',
|
|
)
|
|
})
|
|
|
|
it('returns error if the user uuid is invalid', async () => {
|
|
const useCase = createUseCase()
|
|
|
|
const result = await useCase.execute({
|
|
userUuid: 'invalid',
|
|
message: 'message',
|
|
})
|
|
|
|
expect(result.isFailed()).toBe(true)
|
|
})
|
|
|
|
it('return error if sending the message does not return a 200 status code', async () => {
|
|
apiGatewayManagementClient.send = jest.fn().mockResolvedValue({ $metadata: { httpStatusCode: 500 } })
|
|
|
|
const useCase = createUseCase()
|
|
|
|
const result = await useCase.execute({
|
|
userUuid: '00000000-0000-0000-0000-000000000000',
|
|
message: 'message',
|
|
})
|
|
|
|
expect(result.isFailed()).toBe(true)
|
|
})
|
|
})
|