1
import type { Accountability } from '@directus/types';
2
import { afterEach, describe, expect, test, vi } from 'vitest';
3
import { WebSocketController, getWebSocketController } from '../websocket/controllers/index.js';
4
import type { WebSocketClient } from '../websocket/types.js';
5
import { WebSocketService } from './websocket.js';
8
vi.mock('../websocket/controllers/index');
12
vi.mock('@directus/env', () => ({
13
useEnv: vi.fn().mockReturnValue({
14
WEBSOCKETS_ENABLED: true,
15
WEBSOCKETS_REST_ENABLED: true,
16
EXTENSIONS_PATH: './extensions',
17
EMAIL_TEMPLATES_PATH: './templates',
25
function mockClient(accountability: Accountability | null = null) {
32
} as unknown as WebSocketClient;
35
describe('WebSocketService', () => {
36
test('get clients', () => {
37
vi.mocked(getWebSocketController).mockReturnValue({
38
clients: new Set([mockClient(), mockClient(), mockClient()]),
39
} as unknown as WebSocketController);
41
const wsService = new WebSocketService();
42
expect(wsService.clients().size).toBe(3);
45
test('broadcast', () => {
46
const clients = new Set([mockClient(), mockClient(), mockClient()]);
47
const message = 'test 123';
49
vi.mocked(getWebSocketController).mockReturnValue({ clients } as unknown as WebSocketController);
51
const wsService = new WebSocketService();
52
wsService.broadcast(message);
54
for (const client of clients) {
55
expect(client.send).toBeCalledWith(message);
59
test('broadcast with role filter', () => {
60
const clients = [mockClient({ user: 'test', role: 'test' }), mockClient({ user: 'test2', role: 'test2' })];
61
const message = 'test 123';
63
vi.mocked(getWebSocketController).mockReturnValue({ clients: new Set(clients) } as unknown as WebSocketController);
65
const wsService = new WebSocketService();
66
wsService.broadcast(message, { role: 'test' });
68
expect(clients[0]!.send).toBeCalledWith(message);
69
expect(clients[1]!.send).not.toBeCalled();
72
test('broadcast with user filter', () => {
73
const clients = [mockClient({ user: 'test', role: 'test' }), mockClient({ user: 'test2', role: 'test2' })];
74
const message = 'test 123';
76
vi.mocked(getWebSocketController).mockReturnValue({ clients: new Set(clients) } as unknown as WebSocketController);
78
const wsService = new WebSocketService();
79
wsService.broadcast(message, { user: 'test2' });
81
expect(clients[0]!.send).not.toBeCalled();
82
expect(clients[1]!.send).toBeCalledWith(message);