Files
standardnotes-server/packages/websockets/src/Domain/UseCase/SendMessageToClient/SendMessageToClient.spec.ts
T
Karol SójkoandGitHub 69b404f5d4 feat: send event to client upon items change on server (#941)
* 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
2023-11-28 09:31:42 +01:00

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)
})
})