From e677901eaf70964761912b4a210ebb8b6b53900e Mon Sep 17 00:00:00 2001 From: Kerry Date: Wed, 16 Mar 2022 14:11:06 +0100 Subject: [PATCH] Add test utils for Beacons (#8064) * copy beacon event test utils from js-sdk Signed-off-by: Kerry Archibald * mock with event emitter test util * set return type getMockClientWithEventEmitter Signed-off-by: Kerry Archibald * fix lint Signed-off-by: Kerry Archibald * copyright Signed-off-by: Kerry Archibald * pr improvements Signed-off-by: Kerry Archibald --- test/test-utils/beacon.ts | 117 ++++++++++++++++++++++++++++++++++++++ test/test-utils/client.ts | 55 ++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 test/test-utils/beacon.ts create mode 100644 test/test-utils/client.ts diff --git a/test/test-utils/beacon.ts b/test/test-utils/beacon.ts new file mode 100644 index 0000000000..38a586948e --- /dev/null +++ b/test/test-utils/beacon.ts @@ -0,0 +1,117 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { makeBeaconInfoContent, makeBeaconContent } from "matrix-js-sdk/src/content-helpers"; +import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { M_BEACON, M_BEACON_INFO } from "matrix-js-sdk/src/@types/beacon"; +import { LocationAssetType } from "matrix-js-sdk/src/@types/location"; + +type InfoContentProps = { + timeout: number; + isLive?: boolean; + assetType?: LocationAssetType; + description?: string; +}; +const DEFAULT_INFO_CONTENT_PROPS: InfoContentProps = { + timeout: 3600000, +}; + +let count = 1; + +/** + * Create an m.beacon_info event + * all required properties are mocked + * override with contentProps + */ +export const makeBeaconInfoEvent = ( + sender: string, + roomId: string, + contentProps: Partial = {}, + eventId?: string, +): MatrixEvent => { + const { + timeout, isLive, description, assetType, + } = { + ...DEFAULT_INFO_CONTENT_PROPS, + ...contentProps, + }; + const event = new MatrixEvent({ + type: `${M_BEACON_INFO.name}.${sender}.${++count}`, + room_id: roomId, + state_key: sender, + content: makeBeaconInfoContent(timeout, isLive, description, assetType), + }); + + // live beacons use the beacon_info event id + // set or default this + event.replaceLocalEventId(eventId || `$${Math.random()}-${Math.random()}`); + + return event; +}; + +type ContentProps = { + geoUri: string; + timestamp: number; + beaconInfoId: string; + description?: string; +}; +const DEFAULT_CONTENT_PROPS: ContentProps = { + geoUri: 'geo:-36.24484561954707,175.46884959563613;u=10', + timestamp: 123, + beaconInfoId: '$123', +}; + +/** + * Create an m.beacon event + * all required properties are mocked + * override with contentProps + */ +export const makeBeaconEvent = ( + sender: string, + contentProps: Partial = {}, +): MatrixEvent => { + const { geoUri, timestamp, beaconInfoId, description } = { + ...DEFAULT_CONTENT_PROPS, + ...contentProps, + }; + + return new MatrixEvent({ + type: M_BEACON.name, + sender, + content: makeBeaconContent(geoUri, timestamp, beaconInfoId, description), + }); +}; + +/** + * Create a mock geolocation position + * defaults all required properties + */ +export const makeGeolocationPosition = ( + { timestamp, coords }: + { timestamp?: number, coords: Partial }, +): GeolocationPosition => ({ + timestamp: timestamp ?? 1647256791840, + coords: { + accuracy: 1, + latitude: 54.001927, + longitude: -8.253491, + altitude: null, + altitudeAccuracy: null, + heading: null, + speed: null, + ...coords, + }, +}); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts new file mode 100644 index 0000000000..bd7b832f72 --- /dev/null +++ b/test/test-utils/client.ts @@ -0,0 +1,55 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import EventEmitter from "events"; +import { MethodKeysOf, mocked, MockedObject } from "jest-mock"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; + +import { MatrixClientPeg } from "../../src/MatrixClientPeg"; + +/** + * Mock client with real event emitter + * useful for testing code that listens + * to MatrixClient events + */ +export class MockClientWithEventEmitter extends EventEmitter { + constructor(mockProperties: Partial, unknown>> = {}) { + super(); + + Object.assign(this, mockProperties); + } +} + +/** + * - make a mock client + * - cast the type to mocked(MatrixClient) + * - spy on MatrixClientPeg.get to return the mock + * eg + * ``` + * const mockClient = getMockClientWithEventEmitter({ + getUserId: jest.fn().mockReturnValue(aliceId), + }); + * ``` + */ +export const getMockClientWithEventEmitter = ( + mockProperties: Partial, unknown>>, +): MockedObject => { + const mock = mocked(new MockClientWithEventEmitter(mockProperties) as unknown as MatrixClient); + + jest.spyOn(MatrixClientPeg, 'get').mockReturnValue(mock); + return mock; +}; +