From 6ba7133619b431a296912b8c9f4160111a64c588 Mon Sep 17 00:00:00 2001 From: Douglas Gubert Date: Fri, 5 Sep 2025 14:26:36 +0000 Subject: [PATCH] chore: add withStream method to MockedAppRootBuilder (#36875) --- .../src/MockedAppRootBuilder.tsx | 65 ++++++++++++++++++- packages/mock-providers/src/index.ts | 1 + 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx index 625934876a135..9b3f706570520 100644 --- a/packages/mock-providers/src/MockedAppRootBuilder.tsx +++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx @@ -9,7 +9,16 @@ import type { Serialized, SettingValue, } from '@rocket.chat/core-typings'; -import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn } from '@rocket.chat/ddp-client'; +import type { + ServerMethodName, + ServerMethodParameters, + ServerMethodReturn, + StreamerCallback, + StreamerCallbackArgs, + StreamerEvents, + StreamKeys, + StreamNames, +} from '@rocket.chat/ddp-client'; import { Emitter } from '@rocket.chat/emitter'; import languages from '@rocket.chat/i18n/dist/languages'; import { createPredicateFromFilter } from '@rocket.chat/mongo-adapter'; @@ -52,9 +61,35 @@ type Mutable = { }; // eslint-disable-next-line @typescript-eslint/naming-convention -interface MockedAppRootEvents { +// interface MockedAppRootEvents extends Record<`stream-${StreamNames}-${StreamKeys}`, any> { +// 'update-modal': void; +// } +// Extract all key values from objects that have a 'key' property +type ExtractKeys = T extends readonly (infer U)[] + ? U extends { key: infer K } + ? K extends string + ? string extends K + ? never + : `stream-${N}-${K}` + : never + : never + : never; + +// Union of all key values from all streams +type AllStreamerEventKeys = { + [K in keyof StreamerEvents]: ExtractKeys; +}[keyof StreamerEvents]; + +type MockedAppRootEvents = { 'update-modal': void; -} +} & Record; + +export type StreamControllerRef = { + controller?: { + emit: >(eventName: K, args: StreamerCallbackArgs) => void; + has: (eventName: StreamKeys) => boolean; + }; +}; const empty = [] as const; @@ -248,6 +283,30 @@ export class MockedAppRootBuilder { return this; } + withStream(streamName: N, ref: StreamControllerRef): this { + const innerFn = this.server.getStream; + + const outerFn: ServerContextValue['getStream'] = (innerStreamName) => { + if (innerStreamName === (streamName as StreamNames)) { + ref.controller = { + emit: >(eventName: K, args: StreamerCallbackArgs) => { + this.events.emit(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys, ...args); + }, + has: (eventName: string) => this.events.has(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys), + }; + + return >(eventName: K, callback: StreamerCallback) => + this.events.on(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys, callback); + } + + return innerFn(innerStreamName); + }; + + this.server.getStream = outerFn; + + return this; + } + withMethod(methodName: TMethodName, response: () => ServerMethodReturn): this { const innerFn = this.server.callMethod; diff --git a/packages/mock-providers/src/index.ts b/packages/mock-providers/src/index.ts index 941d613a14125..0c3bd99c8dc01 100644 --- a/packages/mock-providers/src/index.ts +++ b/packages/mock-providers/src/index.ts @@ -9,3 +9,4 @@ export * from './MockedServerContext'; export * from './MockedSettingsContext'; export * from './MockedUserContext'; export * from './MockedDeviceContext'; +export * from './MockedAppRootBuilder';