Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 62 additions & 3 deletions packages/mock-providers/src/MockedAppRootBuilder.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -52,9 +61,35 @@ type Mutable<T> = {
};

// eslint-disable-next-line @typescript-eslint/naming-convention
interface MockedAppRootEvents {
// interface MockedAppRootEvents extends Record<`stream-${StreamNames}-${StreamKeys<StreamNames>}`, any> {
// 'update-modal': void;
// }
// Extract all key values from objects that have a 'key' property
type ExtractKeys<T, N extends string> = 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<StreamerEvents[K], K>;
}[keyof StreamerEvents];

type MockedAppRootEvents = {
'update-modal': void;
}
} & Record<AllStreamerEventKeys, any>;

export type StreamControllerRef<N extends StreamNames> = {
controller?: {
emit: <K extends StreamKeys<N>>(eventName: K, args: StreamerCallbackArgs<N, K>) => void;
has: (eventName: StreamKeys<N>) => boolean;
};
};

const empty = [] as const;

Expand Down Expand Up @@ -248,6 +283,30 @@ export class MockedAppRootBuilder {
return this;
}

withStream<N extends StreamNames>(streamName: N, ref: StreamControllerRef<N>): this {
const innerFn = this.server.getStream;

const outerFn: ServerContextValue['getStream'] = (innerStreamName) => {
if (innerStreamName === (streamName as StreamNames)) {
ref.controller = {
emit: <K extends StreamKeys<N>>(eventName: K, args: StreamerCallbackArgs<N, K>) => {
this.events.emit(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys, ...args);
},
has: (eventName: string) => this.events.has(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys),
};

return <K extends StreamKeys<N>>(eventName: K, callback: StreamerCallback<N, K>) =>
this.events.on(`stream-${innerStreamName}-${eventName}` as AllStreamerEventKeys, callback);
}

return innerFn(innerStreamName);
};

this.server.getStream = outerFn;

return this;
}

withMethod<TMethodName extends ServerMethodName>(methodName: TMethodName, response: () => ServerMethodReturn<TMethodName>): this {
const innerFn = this.server.callMethod;

Expand Down
1 change: 1 addition & 0 deletions packages/mock-providers/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export * from './MockedServerContext';
export * from './MockedSettingsContext';
export * from './MockedUserContext';
export * from './MockedDeviceContext';
export * from './MockedAppRootBuilder';
Loading