From edef8cca0426d71e16ef53478ebca06efff58242 Mon Sep 17 00:00:00 2001 From: jadahiya-MSFT <95651173+jadahiya-MSFT@users.noreply.github.com> Date: Wed, 10 Jan 2024 10:58:24 -0800 Subject: [PATCH] Acquiring list of validDomains from CDN (#2089) * Adding in validDomains json object and publishing it as an Artifact * Change files * Renamed utils folder to artifactsForCDN and explicitly referencing validDomains.json file in build-test-publish * Update @microsoft-teams-js-9f9754ac-4921-4f0b-a615-4498501e1ee1.json * Renamed validOrigins to validDomains * Updated reference from utils to artifactsForCDN * Testing validDomains acquisition from CDN * Moved validDomains.json into src folder and modified utils.ts to include reference to CDN * Removed async calls * Reverting back to main utils * Added fetch mock for jest tests * Change files * Removed console.log statements * Removing hardcoded list of validDomains * Moved validOriginsJson to constants * Added missing description for validOriginsFallback * Added in validDomains.ts file, changed the way we call functions, looking into PrivateApi.spec for why unsupported domains are failing/timing out * Updated tests to account for async processing of messages * Updated tests and added new unit tests for fallback logic * Added in 'caching' for validDomains * Fixed improper import of json file * Made JSON nomenclature more known * Added logging, renamed validDomains to validOrigins for consistency, added JSON validation, repalced badactor with badactor.example in unit tests * Added in SSR check * Changed validateOriginsFromCDN to isValidOriginsJSONVald * Fixed naming and try catch block * Updated SDF endpoint to PROD endpoint --------- Co-authored-by: Trevor Harris --- ...-71f0dd2d-88b0-4651-9a93-2a52e32a466e.json | 7 + .../artifactsForCDN/validDomains.json | 0 .../teams-js/src/internal/communication.ts | 42 +- packages/teams-js/src/internal/constants.ts | 70 +-- packages/teams-js/src/internal/utils.ts | 69 --- .../teams-js/src/internal/validOrigins.ts | 131 +++++ packages/teams-js/src/public/app.ts | 3 +- .../test/internal/communication.spec.ts | 124 ++--- packages/teams-js/test/internal/utils.spec.ts | 101 ---- .../test/internal/validOrigins.spec.ts | 497 ++++++++++++++++++ packages/teams-js/test/private/files.spec.ts | 38 +- packages/teams-js/test/private/logs.spec.ts | 6 +- .../teams-js/test/private/privateAPIs.spec.ts | 36 +- .../test/private/remoteCamera.spec.ts | 24 +- packages/teams-js/test/private/teams.spec.ts | 20 +- .../test/private/videoEffectsEx.spec.ts | 50 +- packages/teams-js/test/public/app.spec.ts | 124 ++--- .../test/public/appInstallDialog.spec.ts | 4 +- .../test/public/authentication.spec.ts | 84 +-- packages/teams-js/test/public/barCode.spec.ts | 12 +- .../teams-js/test/public/calendar.spec.ts | 16 +- packages/teams-js/test/public/call.spec.ts | 6 +- packages/teams-js/test/public/chat.spec.ts | 8 +- .../teams-js/test/public/clipboard.spec.ts | 32 +- packages/teams-js/test/public/dialog.spec.ts | 72 +-- .../teams-js/test/public/geoLocation.spec.ts | 20 +- .../test/public/liveShareHost.spec.ts | 16 +- .../teams-js/test/public/location.spec.ts | 16 +- packages/teams-js/test/public/mail.spec.ts | 12 +- .../teams-js/test/public/marketplace.spec.ts | 16 +- packages/teams-js/test/public/media.spec.ts | 36 +- packages/teams-js/test/public/meeting.spec.ts | 86 +-- packages/teams-js/test/public/pages.spec.ts | 174 +++--- .../teams-js/test/public/publicAPIs.spec.ts | 84 +-- .../teams-js/test/public/settings.spec.ts | 24 +- packages/teams-js/test/public/tasks.spec.ts | 4 +- .../teams-js/test/public/teamsAPIs.spec.ts | 8 +- .../public/thirdPartyCloudStorage.spec.ts | 2 + .../teams-js/test/public/videoEffects.spec.ts | 32 +- packages/teams-js/test/utils.ts | 26 +- packages/teams-js/tsconfig.json | 3 +- tools/yaml-templates/build-test-publish.yml | 2 +- 42 files changed, 1305 insertions(+), 832 deletions(-) create mode 100644 change/@microsoft-teams-js-71f0dd2d-88b0-4651-9a93-2a52e32a466e.json rename packages/teams-js/{ => src}/artifactsForCDN/validDomains.json (100%) create mode 100644 packages/teams-js/src/internal/validOrigins.ts create mode 100644 packages/teams-js/test/internal/validOrigins.spec.ts diff --git a/change/@microsoft-teams-js-71f0dd2d-88b0-4651-9a93-2a52e32a466e.json b/change/@microsoft-teams-js-71f0dd2d-88b0-4651-9a93-2a52e32a466e.json new file mode 100644 index 0000000000..9f85c9c654 --- /dev/null +++ b/change/@microsoft-teams-js-71f0dd2d-88b0-4651-9a93-2a52e32a466e.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Added new feature to acquire list of valid origins from a CDN endpoint", + "packageName": "@microsoft/teams-js", + "email": "jadahiya@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/teams-js/artifactsForCDN/validDomains.json b/packages/teams-js/src/artifactsForCDN/validDomains.json similarity index 100% rename from packages/teams-js/artifactsForCDN/validDomains.json rename to packages/teams-js/src/artifactsForCDN/validDomains.json diff --git a/packages/teams-js/src/internal/communication.ts b/packages/teams-js/src/internal/communication.ts index 7b491c504b..910b10c32f 100644 --- a/packages/teams-js/src/internal/communication.ts +++ b/packages/teams-js/src/internal/communication.ts @@ -12,7 +12,8 @@ import { callHandler } from './handlers'; import { DOMMessageEvent, ExtendedWindow } from './interfaces'; import { MessageRequest, MessageRequestWithRequiredProperties, MessageResponse } from './messageObjects'; import { getLogger, isFollowingApiVersionTagFormat } from './telemetry'; -import { ssrSafeWindow, validateOrigin } from './utils'; +import { ssrSafeWindow } from './utils'; +import { validateOrigin } from './validOrigins'; const communicationLogger = getLogger('communication'); @@ -65,7 +66,7 @@ export function initializeCommunication( apiVersionTag: string, ): Promise { // Listen for messages post to our window - CommunicationPrivate.messageListener = (evt: DOMMessageEvent): void => processMessage(evt); + CommunicationPrivate.messageListener = async (evt: DOMMessageEvent): Promise => await processMessage(evt); // If we are in an iframe, our parent window is the one hosting us (i.e., window.parent); otherwise, // it's the window that opened us (i.e., window.opener) @@ -452,7 +453,7 @@ const processMessageLogger = communicationLogger.extend('processMessage'); * @internal * Limited to Microsoft-internal use */ -function processMessage(evt: DOMMessageEvent): void { +async function processMessage(evt: DOMMessageEvent): Promise { // Process only if we received a valid message if (!evt || !evt.data || typeof evt.data !== 'object') { processMessageLogger('Unrecognized message format received by app, message being ignored. Message: %o', evt); @@ -464,22 +465,23 @@ function processMessage(evt: DOMMessageEvent): void { // in their call to app.initialize const messageSource = evt.source || (evt.originalEvent && evt.originalEvent.source); const messageOrigin = evt.origin || (evt.originalEvent && evt.originalEvent.origin); - if (!shouldProcessMessage(messageSource, messageOrigin)) { - processMessageLogger( - 'Message being ignored by app because it is either coming from the current window or a different window with an invalid origin', - ); - return; - } - - // Update our parent and child relationships based on this message - updateRelationships(messageSource, messageOrigin); - // Handle the message - if (messageSource === Communication.parentWindow) { - handleParentMessage(evt); - } else if (messageSource === Communication.childWindow) { - handleChildMessage(evt); - } + return shouldProcessMessage(messageSource, messageOrigin).then((result) => { + if (!result) { + processMessageLogger( + 'Message being ignored by app because it is either coming from the current window or a different window with an invalid origin', + ); + return; + } + // Update our parent and child relationships based on this message + updateRelationships(messageSource, messageOrigin); + // Handle the message + if (messageSource === Communication.parentWindow) { + handleParentMessage(evt); + } else if (messageSource === Communication.childWindow) { + handleChildMessage(evt); + } + }); } const shouldProcessMessageLogger = communicationLogger.extend('shouldProcessMessage'); @@ -491,7 +493,7 @@ const shouldProcessMessageLogger = communicationLogger.extend('shouldProcessMess * @internal * Limited to Microsoft-internal use */ -function shouldProcessMessage(messageSource: Window, messageOrigin: string): boolean { +async function shouldProcessMessage(messageSource: Window, messageOrigin: string): Promise { // Process if message source is a different window and if origin is either in // Teams' pre-known whitelist or supplied as valid origin by user during initialization if (Communication.currentWindow && messageSource === Communication.currentWindow) { @@ -505,7 +507,7 @@ function shouldProcessMessage(messageSource: Window, messageOrigin: string): boo ) { return true; } else { - const isOriginValid = validateOrigin(new URL(messageOrigin)); + const isOriginValid = await validateOrigin(new URL(messageOrigin)); if (!isOriginValid) { shouldProcessMessageLogger('Message has an invalid origin of %s', messageOrigin); } diff --git a/packages/teams-js/src/internal/constants.ts b/packages/teams-js/src/internal/constants.ts index 3deea9d9fe..b3679e7ac7 100644 --- a/packages/teams-js/src/internal/constants.ts +++ b/packages/teams-js/src/internal/constants.ts @@ -1,3 +1,5 @@ +import * as validOriginsJSON from '../artifactsForCDN/validDomains.json'; + /** * @hidden * The client version when all SDK APIs started to check platform compatibility for the APIs was 1.6.0. @@ -110,48 +112,32 @@ export const scanBarCodeAPIMobileSupportVersion = '1.9.0'; /** * @hidden - * List of supported Host origins - * - * @internal - * Limited to Microsoft-internal use - */ -export const validOrigins = [ - 'teams.microsoft.com', - 'teams.microsoft.us', - 'gov.teams.microsoft.us', - 'dod.teams.microsoft.us', - 'int.teams.microsoft.com', - 'teams.live.com', - 'devspaces.skype.com', - 'ssauth.skype.com', - 'local.teams.live.com', // local development - 'local.teams.live.com:8080', // local development - 'local.teams.office.com', // local development - 'local.teams.office.com:8080', // local development - 'outlook.office.com', - 'outlook-sdf.office.com', - 'outlook.office365.com', - 'outlook-sdf.office365.com', - 'outlook.live.com', - 'outlook-sdf.live.com', - '*.teams.microsoft.com', - '*.www.office.com', - 'www.office.com', - 'word.office.com', - 'excel.office.com', - 'powerpoint.office.com', - 'www.officeppe.com', - '*.www.microsoft365.com', - 'www.microsoft365.com', - 'bing.com', - 'edgeservices.bing.com', - 'www.bing.com', - 'www.staging-bing-int.com', - 'teams.cloud.microsoft', - 'outlook.cloud.microsoft', - 'm365.cloud.microsoft', - 'copilot.microsoft.com', -]; + * Fallback list of valid origins in JSON format + * + * @internal + * Limited to Microsoft-internal use + */ +const validOriginsLocal = validOriginsJSON; + +/** + * @hidden + * Fallback list of valid origins + * + * @internal + * Limited to Microsoft-internal use + */ +export const validOriginsFallback = validOriginsLocal.validOrigins; + +/** + * @hidden + * CDN endpoint of the list of valid origins + * + * @internal + * Limited to Microsoft-internal use + */ +export const validOriginsCdnEndpoint = new URL( + 'https://res.cdn.office.net/teams-js/validDomains/json/validDomains.json', +); /** * @hidden diff --git a/packages/teams-js/src/internal/utils.ts b/packages/teams-js/src/internal/utils.ts index 147012f82e..9368f86c7b 100644 --- a/packages/teams-js/src/internal/utils.ts +++ b/packages/teams-js/src/internal/utils.ts @@ -2,78 +2,9 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import * as uuid from 'uuid'; -import { GlobalVars } from '../internal/globalVars'; import { minAdaptiveCardVersion } from '../public/constants'; import { AdaptiveCardVersion, SdkError } from '../public/interfaces'; import { pages } from '../public/pages'; -import { validOrigins } from './constants'; -import { getLogger } from './telemetry'; - -/** - * @param pattern - reference pattern - * @param host - candidate string - * @returns returns true if host matches pre-know valid pattern - * - * @example - * validateHostAgainstPattern('*.teams.microsoft.com', 'subdomain.teams.microsoft.com') returns true - * validateHostAgainstPattern('teams.microsoft.com', 'team.microsoft.com') returns false - * - * @internal - * Limited to Microsoft-internal use - */ -function validateHostAgainstPattern(pattern: string, host: string): boolean { - if (pattern.substring(0, 2) === '*.') { - const suffix = pattern.substring(1); - if ( - host.length > suffix.length && - host.split('.').length === suffix.split('.').length && - host.substring(host.length - suffix.length) === suffix - ) { - return true; - } - } else if (pattern === host) { - return true; - } - return false; -} - -const validateOriginLogger = getLogger('validateOrigin'); - -/** - * @internal - * Limited to Microsoft-internal use - */ -export function validateOrigin(messageOrigin: URL): boolean { - // Check whether the url is in the pre-known allowlist or supplied by user - if (!isValidHttpsURL(messageOrigin)) { - validateOriginLogger( - 'Origin %s is invalid because it is not using https protocol. Protocol being used: %s', - messageOrigin, - messageOrigin.protocol, - ); - return false; - } - const messageOriginHost = messageOrigin.host; - - if (validOrigins.some((pattern) => validateHostAgainstPattern(pattern, messageOriginHost))) { - return true; - } - - for (const domainOrPattern of GlobalVars.additionalValidOrigins) { - const pattern = domainOrPattern.substring(0, 8) === 'https://' ? domainOrPattern.substring(8) : domainOrPattern; - if (validateHostAgainstPattern(pattern, messageOriginHost)) { - return true; - } - } - - validateOriginLogger( - 'Origin %s is invalid because it is not an origin approved by this library or included in the call to app.initialize.\nOrigins approved by this library: %o\nOrigins included in app.initialize: %o', - messageOrigin, - validOrigins, - GlobalVars.additionalValidOrigins, - ); - return false; -} /** * @internal diff --git a/packages/teams-js/src/internal/validOrigins.ts b/packages/teams-js/src/internal/validOrigins.ts new file mode 100644 index 0000000000..ea3dc6e422 --- /dev/null +++ b/packages/teams-js/src/internal/validOrigins.ts @@ -0,0 +1,131 @@ +import { validOriginsCdnEndpoint, validOriginsFallback } from './constants'; +import { GlobalVars } from './globalVars'; +import { getLogger } from './telemetry'; +import { inServerSideRenderingEnvironment, isValidHttpsURL } from './utils'; + +let validOriginsCache: string[] = []; +const validateOriginLogger = getLogger('validateOrigin'); + +export async function prefetchOriginsFromCDN(): Promise { + await getValidOriginsListFromCDN(); +} + +function isValidOriginsCacheEmpty(): boolean { + return validOriginsCache.length !== 0; +} + +async function getValidOriginsListFromCDN(): Promise { + if (isValidOriginsCacheEmpty()) { + return validOriginsCache; + } + if (!inServerSideRenderingEnvironment()) { + return fetch(validOriginsCdnEndpoint) + .then((response) => { + if (!response.ok) { + throw new Error('Invalid Response from Fetch Call'); + } + return response.json().then((validOriginsCDN) => { + if (isValidOriginsJSONValid(JSON.stringify(validOriginsCDN))) { + validOriginsCache = validOriginsCDN.validOrigins; + return validOriginsCache; + } else { + throw new Error('Valid Origins List Is Invalid'); + } + }); + }) + .catch((e) => { + validateOriginLogger('validOrigins fetch call to CDN failed with error: %s. Defaulting to fallback list', e); + validOriginsCache = validOriginsFallback; + return validOriginsCache; + }); + } else { + validOriginsCache = validOriginsFallback; + return validOriginsFallback; + } +} + +function isValidOriginsJSONValid(validOriginsJSON: string): boolean { + let validOriginsCDN = JSON.parse(validOriginsJSON); + try { + validOriginsCDN = JSON.parse(validOriginsJSON); + } catch (_) { + return false; + } + if (!validOriginsCDN.validOrigins) { + return false; + } + for (const validOrigin of validOriginsCDN.validOrigins) { + try { + new URL('https://' + validOrigin); + } catch (_) { + validateOriginLogger('isValidOriginsFromCDN call failed to validate origin: %s', validOrigin); + return false; + } + } + return true; +} + +/** + * @param pattern - reference pattern + * @param host - candidate string + * @returns returns true if host matches pre-know valid pattern + * + * @example + * validateHostAgainstPattern('*.teams.microsoft.com', 'subdomain.teams.microsoft.com') returns true + * validateHostAgainstPattern('teams.microsoft.com', 'team.microsoft.com') returns false + * + * @internal + * Limited to Microsoft-internal use + */ +function validateHostAgainstPattern(pattern: string, host: string): boolean { + if (pattern.substring(0, 2) === '*.') { + const suffix = pattern.substring(1); + if ( + host.length > suffix.length && + host.split('.').length === suffix.split('.').length && + host.substring(host.length - suffix.length) === suffix + ) { + return true; + } + } else if (pattern === host) { + return true; + } + return false; +} + +/** + * @internal + * Limited to Microsoft-internal use + */ +export function validateOrigin(messageOrigin: URL): Promise { + return getValidOriginsListFromCDN().then((validOriginsList) => { + // Check whether the url is in the pre-known allowlist or supplied by user + if (!isValidHttpsURL(messageOrigin)) { + validateOriginLogger( + 'Origin %s is invalid because it is not using https protocol. Protocol being used: %s', + messageOrigin, + messageOrigin.protocol, + ); + return false; + } + const messageOriginHost = messageOrigin.host; + if (validOriginsList.some((pattern) => validateHostAgainstPattern(pattern, messageOriginHost))) { + return true; + } + + for (const domainOrPattern of GlobalVars.additionalValidOrigins) { + const pattern = domainOrPattern.substring(0, 8) === 'https://' ? domainOrPattern.substring(8) : domainOrPattern; + if (validateHostAgainstPattern(pattern, messageOriginHost)) { + return true; + } + } + + validateOriginLogger( + 'Origin %s is invalid because it is not an origin approved by this library or included in the call to app.initialize.\nOrigins approved by this library: %o\nOrigins included in app.initialize: %o', + messageOrigin, + validOriginsList, + GlobalVars.additionalValidOrigins, + ); + return false; + }); +} diff --git a/packages/teams-js/src/public/app.ts b/packages/teams-js/src/public/app.ts index b1027f8069..ad976e7be5 100644 --- a/packages/teams-js/src/public/app.ts +++ b/packages/teams-js/src/public/app.ts @@ -18,6 +18,7 @@ import { ApiName, ApiVersionNumber, getApiVersionTag } from '../internal/telemet import { getLogger } from '../internal/telemetry'; import { isNullOrUndefined } from '../internal/typeCheckUtilities'; import { compareSDKVersions, inServerSideRenderingEnvironment, runWithTimeout } from '../internal/utils'; +import { prefetchOriginsFromCDN } from '../internal/validOrigins'; import { authentication } from './authentication'; import { ChannelType, FrameContexts, HostClientType, HostName, TeamType, UserTeamRole } from './constants'; import { dialog } from './dialog'; @@ -69,7 +70,6 @@ function initializeHelper(apiVersionTag: string, validMessageOrigins?: string[]) // Just no-op if that happens to make it easier to use. if (!GlobalVars.initializeCalled) { GlobalVars.initializeCalled = true; - Handlers.initializeHandlers(); GlobalVars.initializePromise = initializeCommunication(validMessageOrigins, apiVersionTag).then( ({ context, clientType, runtimeConfig, clientSupportedSDKVersion = defaultSDKVersionForCompatCheck }) => { @@ -730,6 +730,7 @@ export namespace app { * @returns Promise that will be fulfilled when initialization has completed, or rejected if the initialization fails or times out */ export function initialize(validMessageOrigins?: string[]): Promise { + prefetchOriginsFromCDN(); return appInitializeHelper( getApiVersionTag(appTelemetryVersionNumber, ApiName.App_Initialize), validMessageOrigins, diff --git a/packages/teams-js/test/internal/communication.spec.ts b/packages/teams-js/test/internal/communication.spec.ts index b3317b43b4..49cc24b59a 100644 --- a/packages/teams-js/test/internal/communication.spec.ts +++ b/packages/teams-js/test/internal/communication.spec.ts @@ -36,7 +36,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); const initializeResponse = await initPromise; @@ -55,7 +55,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -68,7 +68,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -81,7 +81,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -96,7 +96,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); try { const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; } catch (e) { @@ -119,7 +119,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); try { const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; } catch (e) { @@ -137,7 +137,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -150,7 +150,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -170,7 +170,7 @@ describe('Testing communication', () => { throw new Error('initialize message not found'); } - utils.respondToNativeMessage(initMessage, false, FrameContexts.content); + await utils.respondToNativeMessage(initMessage, false, FrameContexts.content); await initPromise; @@ -211,7 +211,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); const initializeResponse = await initPromise; const expectedResponse = { @@ -227,7 +227,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(communication.Communication.currentWindow).toStrictEqual(utils.mockWindow); @@ -239,7 +239,7 @@ describe('Testing communication', () => { expect(communication.Communication.parentOrigin).toBeNull(); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; /* eslint-disable-next-line strict-null-checks/all */ expect(communication.Communication.parentOrigin).toBe(utils.validOrigin); @@ -265,7 +265,7 @@ describe('Testing communication', () => { communication.Communication.parentWindow.closed = true; const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); expect(communication.Communication.parentWindow).toBeNull(); /* eslint-disable-next-line strict-null-checks/all */ @@ -275,7 +275,7 @@ describe('Testing communication', () => { it('should be in framed mode when there is a parent window that is not self', async () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(GlobalVars.isFramelessWindow).toBeFalsy(); @@ -288,7 +288,7 @@ describe('Testing communication', () => { const initPromise = communication.initializeCommunication(undefined, testApiVersion); const initMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessageAsOpener(initMessage, FrameContexts.content); + await utils.respondToMessageAsOpener(initMessage, FrameContexts.content); await initPromise; expect(GlobalVars.isFramelessWindow).toBeFalsy(); @@ -425,12 +425,12 @@ describe('Testing communication', () => { } }); - it('unresolved message callbacks should not be triggered after communication has been uninitialized', () => { + it('unresolved message callbacks should not be triggered after communication has been uninitialized', async () => { app._initialize(utils.mockWindow); communication.initializeCommunication(undefined, testApiVersion); let callbackWasCalled = false; const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); communication.sendMessageToParent('testAction', () => { callbackWasCalled = true; @@ -439,7 +439,7 @@ describe('Testing communication', () => { communication.uninitializeCommunication(); utils.processMessage = tempProcessMessage; - utils.respondToMessage({ id: 1, func: 'testAction' }, false); + await utils.respondToMessage({ id: 1, func: 'testAction' }, false); expect(callbackWasCalled).toBeFalsy(); }); @@ -454,7 +454,7 @@ describe('Testing communication', () => { communication.uninitializeCommunication(); utils.processMessage = tempProcessMessage; - utils.respondToMessage({ id: 1, func: 'testAction' }, false); + await utils.respondToMessage({ id: 1, func: 'testAction' }, false); messageParent.then(() => expect(false).toBeTruthy()); expect(true).toBeTruthy(); @@ -507,7 +507,7 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToNativeMessage(sentMessage, false, []); + await utils.respondToNativeMessage(sentMessage, false, []); return expect(messagePromise).resolves; }); @@ -528,7 +528,7 @@ describe('Testing communication', () => { const messagePromise = communication.sendMessageToParentAsync(actionName); - utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); + await utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); await messagePromise; const sentMessage = utils.findMessageByFunc(actionName); @@ -553,7 +553,7 @@ describe('Testing communication', () => { const messagePromise = communication.sendMessageToParentAsync(actionName); - utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); + await utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); messagePromise.then(() => { expect(true).toBeTruthy(); @@ -586,7 +586,7 @@ describe('Testing communication', () => { it('should receive response to postMessage when running in a framed window and Communication.currentWindow has a parent with an origin', async () => { communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendMessageToParentAsync(actionName); @@ -594,14 +594,14 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, false, []); + await utils.respondToMessage(sentMessage, false, []); return expect(messagePromise).resolves; }); - it('args passed in should be sent with the postMessage', () => { + it('args passed in should be sent with the postMessage', async () => { communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const arg1 = 'testArg1'; communication.sendMessageToParentAsync(actionName, [arg1]); @@ -617,7 +617,7 @@ describe('Testing communication', () => { expect(sentMessage.args.length).toBe(1); expect(sentMessage.args[0]).toBe(arg1); }); - it('should not send postMessage until after initialization response received', () => { + it('should not send postMessage until after initialization response received', async () => { communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); @@ -628,7 +628,7 @@ describe('Testing communication', () => { throw new Error('Should not find a sent message until after the initialization response was received'); } - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); sentMessage = utils.findMessageByFunc(actionName); if (sentMessage === null) { @@ -662,7 +662,7 @@ describe('Testing communication', () => { expect(utils.messages[0].args[1]).toBe('one'); } }); - it('should receive response via callback when sending framelessPostMessage to window when running in a frameless window and Communication.currentWindow is set and has a nativeInterface', () => { + it('should receive response via callback when sending framelessPostMessage to window when running in a frameless window and Communication.currentWindow is set and has a nativeInterface', async () => { expect.assertions(1); utils.mockWindow.parent = undefined; @@ -676,7 +676,7 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToNativeMessage(sentMessage, false, []); + await utils.respondToNativeMessage(sentMessage, false, []); }); it('should never send message if there is no Communication.currentWindow when message is sent', () => { GlobalVars.isFramelessWindow = true; @@ -698,7 +698,7 @@ describe('Testing communication', () => { expect(true).toBeTruthy(); }); - utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); + await utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); const sentMessage = utils.findMessageByFunc(actionName); // eslint-disable-next-line strict-null-checks/all @@ -722,7 +722,7 @@ describe('Testing communication', () => { communication.sendMessageToParent(actionName, () => expect(true).toBeTruthy()); - utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); + await utils.respondToNativeMessage({ id: 1, func: actionName }, false, []); }); it('should send a message to window when running in a framed window and Communication.parentWindow and Communication.parentOrigin are set', () => { GlobalVars.isFramelessWindow = false; @@ -739,7 +739,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); communication.sendMessageToParent(actionName, () => expect(true).toBeTruthy()); @@ -747,12 +747,12 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, false, []); + await utils.respondToMessage(sentMessage, false, []); }); - it('args passed in should be sent with the postMessage', () => { + it('args passed in should be sent with the postMessage', async () => { communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const arg1 = 'testArg1'; communication.sendMessageToParent(actionName, [arg1]); @@ -768,7 +768,7 @@ describe('Testing communication', () => { expect(sentMessage.args.length).toBe(1); expect(sentMessage.args[0]).toBe(arg1); }); - it('should not send postMessage until after initialization response received', () => { + it('should not send postMessage until after initialization response received', async () => { communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); @@ -779,7 +779,7 @@ describe('Testing communication', () => { throw new Error('Should not find a sent message until after the initialization response was received'); } - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); sentMessage = utils.findMessageByFunc(actionName); if (sentMessage === null) { @@ -804,7 +804,7 @@ describe('Testing communication', () => { expect.assertions(2); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndUnwrap(actionName); @@ -812,7 +812,7 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, actionName); + await utils.respondToMessage(sentMessage, actionName); const response = await messagePromise; expect(response).toBe(actionName); @@ -823,7 +823,7 @@ describe('Testing communication', () => { if (sentMessage2 === null) { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage2, actionName2); + await utils.respondToMessage(sentMessage2, actionName2); const response2 = await messagePromise2; expect(response2).toStrictEqual([actionName2]); @@ -845,7 +845,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleStatusAndReason(actionName); @@ -854,7 +854,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } const errorMessage = 'this message should show up in the error'; - utils.respondToMessage(sentMessage, false, errorMessage); + await utils.respondToMessage(sentMessage, false, errorMessage); await expect(messagePromise).rejects.toThrowError(errorMessage); }); @@ -863,7 +863,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleStatusAndReason(actionName); @@ -872,7 +872,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } const errorMessage = 'this message should show up in the error'; - utils.respondToMessage(sentMessage, true, errorMessage); + await utils.respondToMessage(sentMessage, true, errorMessage); await expect(messagePromise).resolves.toBeUndefined(); }); @@ -881,7 +881,7 @@ describe('Testing communication', () => { expect.assertions(3); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); communication.sendAndHandleStatusAndReason(actionName, 'arg1', 'arg2', 'arg3'); const sentMessage = utils.findMessageByFunc(actionName); @@ -908,7 +908,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const defaultErrorMessage = 'This is the default error message'; const messagePromise = communication.sendAndHandleStatusAndReasonWithDefaultError( @@ -921,7 +921,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } const errorMessage = 'this message should show up in the error'; - utils.respondToMessage(sentMessage, false, errorMessage); + await utils.respondToMessage(sentMessage, false, errorMessage); await expect(messagePromise).rejects.toThrowError(errorMessage); }); @@ -930,7 +930,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const defaultErrorMessage = 'This is the default error message'; const messagePromise = communication.sendAndHandleStatusAndReasonWithDefaultError( @@ -942,7 +942,7 @@ describe('Testing communication', () => { if (sentMessage === null) { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, false); + await utils.respondToMessage(sentMessage, false); await expect(messagePromise).rejects.toThrowError(defaultErrorMessage); }); @@ -950,7 +950,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleStatusAndReasonWithDefaultError(actionName, 'default error'); @@ -959,7 +959,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } const errorMessage = 'this message should show up in the error'; - utils.respondToMessage(sentMessage, true, errorMessage); + await utils.respondToMessage(sentMessage, true, errorMessage); await expect(messagePromise).resolves.toBeUndefined(); }); @@ -968,7 +968,7 @@ describe('Testing communication', () => { expect.assertions(3); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); communication.sendAndHandleStatusAndReasonWithDefaultError(actionName, 'default error', 'arg1', 'arg2', 'arg3'); const sentMessage = utils.findMessageByFunc(actionName); @@ -996,7 +996,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleSdkError(actionName); @@ -1005,7 +1005,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } const sdkError = { errorCode: 1, message: 'SdkError Message' }; - utils.respondToMessage(sentMessage, sdkError, 'result value'); + await utils.respondToMessage(sentMessage, sdkError, 'result value'); await messagePromise.catch((e) => expect(e).toStrictEqual(sdkError)); }); @@ -1015,7 +1015,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleSdkError(actionName); @@ -1024,7 +1024,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, true, 'result value'); + await utils.respondToMessage(sentMessage, true, 'result value'); await messagePromise.catch((e) => expect(e).toStrictEqual(true)); }); @@ -1033,7 +1033,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleSdkError(actionName); @@ -1043,7 +1043,7 @@ describe('Testing communication', () => { } // eslint-disable-next-line strict-null-checks/all - utils.respondToMessage(sentMessage, undefined, 'result value'); + await utils.respondToMessage(sentMessage, undefined, 'result value'); await messagePromise.then((value) => expect(value).toBe('result value')); }); @@ -1053,7 +1053,7 @@ describe('Testing communication', () => { expect.assertions(1); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); const messagePromise = communication.sendAndHandleSdkError(actionName); @@ -1062,7 +1062,7 @@ describe('Testing communication', () => { throw new Error('No sent message was found'); } - utils.respondToMessage(sentMessage, false, 'result value'); + await utils.respondToMessage(sentMessage, false, 'result value'); await messagePromise.then((value) => expect(value).toBe('result value')); }); @@ -1071,7 +1071,7 @@ describe('Testing communication', () => { expect.assertions(3); communication.initializeCommunication(undefined, testApiVersion); const initializeMessage = utils.findInitializeMessageOrThrow(); - utils.respondToMessage(initializeMessage); + await utils.respondToMessage(initializeMessage); communication.sendAndHandleSdkError(actionName, 'arg1', 'arg2', 'arg3'); const sentMessage = utils.findMessageByFunc(actionName); diff --git a/packages/teams-js/test/internal/utils.spec.ts b/packages/teams-js/test/internal/utils.spec.ts index 7c7dc8a857..690bc119dd 100644 --- a/packages/teams-js/test/internal/utils.spec.ts +++ b/packages/teams-js/test/internal/utils.spec.ts @@ -1,11 +1,9 @@ -import { GlobalVars } from '../../src/internal/globalVars'; import { base64ToBlob, compareSDKVersions, createTeamsAppLink, getBase64StringFromBlob, validateAppIdIsGuid, - validateOrigin, } from '../../src/internal/utils'; import { pages } from '../../src/public'; import { ClipboardSupportedMimeType } from '../../src/public/interfaces'; @@ -21,105 +19,6 @@ describe('utils', () => { expect(compareSDKVersions('2', '1.10.345')).toEqual(1); expect(compareSDKVersions('1.9.1', '1.9.0.0')).toEqual(1); }); - it('validateOrigin returns true if origin is in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://teams.microsoft.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns true if origin for subdomains in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://subdomain.teams.microsoft.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns false if origin is not in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://badorigin.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if origin is not an exact match in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://team.microsoft.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns true if origin is valid origin supplied by user ', () => { - const messageOrigin = new URL('https://testorigin.com'); - GlobalVars.additionalValidOrigins = [messageOrigin.origin]; - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns false if origin is not supplied by user', () => { - const messageOrigin = new URL('https://badorigin.com'); - GlobalVars.additionalValidOrigins = ['https://testorigin.com']; - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns true if origin for subdomains is in the user supplied list', () => { - const messageOrigin = new URL('https://subdomain.badorigin.com'); - GlobalVars.additionalValidOrigins = ['https://*.badorigin.com']; - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns false if origin for subdomains is not in the user supplied list', () => { - const messageOrigin = new URL('https://subdomain.badorigin.com'); - GlobalVars.additionalValidOrigins = ['https://*.testorigin.com']; - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if the port number of valid origin is not in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://local.teams.live.com:4000'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if the port number of valid origin is not in the user supplied list', () => { - const messageOrigin = new URL('https://testorigin.com:4000'); - GlobalVars.additionalValidOrigins = ['https://testorigin.com:8080']; - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns true if the port number of valid origin is in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://local.teams.live.com:8080'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns true if the port number of valid origin is in the user supplied list', () => { - const messageOrigin = new URL('https://testorigin.com:8080'); - GlobalVars.additionalValidOrigins = ['https://testorigin.com:8080']; - const result = validateOrigin(messageOrigin); - expect(result).toBe(true); - }); - it('validateOrigin returns false if origin has extra appended', () => { - const messageOrigin = new URL('https://teams.microsoft.com.evil.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it("validateOrigin returns false if the protocol of origin is not 'https:'", () => { - /* eslint-disable-next-line @microsoft/sdl/no-insecure-url */ /* Intentionally using http here because of what it is testing */ - const messageOrigin = new URL('http://teams.microsoft.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if first end of origin is not matched valid subdomains in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://myteams.microsoft.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if first end of origin is not matched valid subdomains in the user supplied list', () => { - const messageOrigin = new URL('https://myteams.microsoft.com'); - const result = validateOrigin(messageOrigin); - GlobalVars.additionalValidOrigins = ['https://*.teams.microsoft.com']; - expect(result).toBe(false); - }); - it('validateOrigin returns false if origin for subdomains does not match in teams pre-known allowlist', () => { - const messageOrigin = new URL('https://a.b.sharepoint.com'); - const result = validateOrigin(messageOrigin); - expect(result).toBe(false); - }); - it('validateOrigin returns false if origin for subdomains does not match in the user supplied list', () => { - const messageOrigin = new URL('https://a.b.testdomain.com'); - const result = validateOrigin(messageOrigin); - GlobalVars.additionalValidOrigins = ['https://*.testdomain.com']; - expect(result).toBe(false); - }); describe('createTeamsAppLink', () => { it('builds a basic URL with an appId and pageId', () => { const params: pages.NavigateToAppParams = { diff --git a/packages/teams-js/test/internal/validOrigins.spec.ts b/packages/teams-js/test/internal/validOrigins.spec.ts new file mode 100644 index 0000000000..fc34eccb14 --- /dev/null +++ b/packages/teams-js/test/internal/validOrigins.spec.ts @@ -0,0 +1,497 @@ +import { GlobalVars } from '../../src/internal/globalVars'; +import { validateOrigin } from '../../src/internal/validOrigins'; +import { app } from '../../src/public/app'; +import { _minRuntimeConfigToUninitialize } from '../../src/public/runtime'; +import { Utils } from '../utils'; +describe('validOrigins', () => { + describe('testing main validOrigins flow', () => { + let utils: Utils = new Utils(); + beforeEach(() => { + // Set a mock window for testing + utils = new Utils(); + utils.mockWindow.parent = undefined; + app._initialize(utils.mockWindow); + GlobalVars.isFramelessWindow = false; + }); + + afterAll(() => { + GlobalVars.isFramelessWindow = false; + }); + afterEach(() => { + // Reset the object since it's a singleton + if (app._uninitialize) { + utils.setRuntimeConfig(_minRuntimeConfigToUninitialize); + app._uninitialize(); + } + }); + it('validateOrigin returns true if origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if origin for subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://subdomain.teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin is not an exact match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://team.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin is valid origin supplied by user ', async () => { + const messageOrigin = new URL('https://testorigin.example.com'); + GlobalVars.additionalValidOrigins = [messageOrigin.origin]; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not supplied by user', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin for subdomains is in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.badorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin for subdomains is not in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:4000'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:4000'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if the port number of valid origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:8080'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if the port number of valid origin is in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:8080'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin has extra appended', async () => { + const messageOrigin = new URL('https://teams.microsoft.com.evil.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it("validateOrigin returns false if the protocol of origin is not 'https:'", async () => { + /* eslint-disable-next-line @microsoft/sdl/no-insecure-url */ /* Intentionally using http here because of what it is testing */ + const messageOrigin = new URL('http://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in the user supplied list', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.teams.microsoft.com']; + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://a.b.sharepoint.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in the user supplied list', async () => { + const messageOrigin = new URL('https://a.b.testdomain.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.testdomain.com']; + expect(result).toBe(false); + }); + }); + describe('testing main validOrigins flow with invalid json object', () => { + let utils: Utils = new Utils(); + beforeEach(() => { + // Set a mock window for testing + utils = new Utils(); + utils.mockWindow.parent = undefined; + app._initialize(utils.mockWindow); + GlobalVars.isFramelessWindow = false; + global.fetch = jest.fn(() => + Promise.resolve({ + status: 200, + ok: true, + json: async () => { + return { badExample: 'badLink' }; + }, + } as Response), + ); + }); + afterAll(() => { + GlobalVars.isFramelessWindow = false; + }); + afterEach(() => { + // Reset the object since it's a singleton + if (app._uninitialize) { + utils.setRuntimeConfig(_minRuntimeConfigToUninitialize); + app._uninitialize(); + } + }); + it('validateOrigin returns true if origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if origin for subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://subdomain.teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin is not an exact match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://team.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin is valid origin supplied by user ', async () => { + const messageOrigin = new URL('https://testorigin.example.com'); + GlobalVars.additionalValidOrigins = [messageOrigin.origin]; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not supplied by user', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin for subdomains is in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.badorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin for subdomains is not in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:4000'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:4000'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if the port number of valid origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:8080'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if the port number of valid origin is in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:8080'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin has extra appended', async () => { + const messageOrigin = new URL('https://teams.microsoft.com.evil.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it("validateOrigin returns false if the protocol of origin is not 'https:'", async () => { + /* eslint-disable-next-line @microsoft/sdl/no-insecure-url */ /* Intentionally using http here because of what it is testing */ + const messageOrigin = new URL('http://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in the user supplied list', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.teams.microsoft.com']; + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://a.b.sharepoint.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in the user supplied list', async () => { + const messageOrigin = new URL('https://a.b.testdomain.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.testdomain.com']; + expect(result).toBe(false); + }); + }); + describe('testing fallback validOrigins flow with fetch succeeding and no json object', () => { + let utils: Utils = new Utils(); + beforeEach(() => { + // Set a mock window for testing + utils = new Utils(); + utils.mockWindow.parent = undefined; + app._initialize(utils.mockWindow); + GlobalVars.isFramelessWindow = false; + global.fetch = jest.fn(() => Promise.resolve({ status: 200, ok: true } as Response)); + }); + + afterAll(() => { + GlobalVars.isFramelessWindow = false; + }); + afterEach(() => { + // Reset the object since it's a singleton + if (app._uninitialize) { + utils.setRuntimeConfig(_minRuntimeConfigToUninitialize); + app._uninitialize(); + } + }); + it('validateOrigin returns true if origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if origin for subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://subdomain.teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin is not an exact match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://team.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin is valid origin supplied by user ', async () => { + const messageOrigin = new URL('https://testorigin.example.com'); + GlobalVars.additionalValidOrigins = [messageOrigin.origin]; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not supplied by user', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin for subdomains is in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.badorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin for subdomains is not in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:4000'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:4000'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if the port number of valid origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:8080'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if the port number of valid origin is in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:8080'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin has extra appended', async () => { + const messageOrigin = new URL('https://teams.microsoft.com.evil.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it("validateOrigin returns false if the protocol of origin is not 'https:'", async () => { + /* eslint-disable-next-line @microsoft/sdl/no-insecure-url */ /* Intentionally using http here because of what it is testing */ + const messageOrigin = new URL('http://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in the user supplied list', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.teams.microsoft.com']; + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://a.b.sharepoint.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in the user supplied list', async () => { + const messageOrigin = new URL('https://a.b.testdomain.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.testdomain.com']; + expect(result).toBe(false); + }); + }); + describe('testing fallback validOrigins flow with fetch error', () => { + let utils: Utils = new Utils(); + beforeEach(() => { + // Set a mock window for testing + utils = new Utils(); + utils.mockWindow.parent = undefined; + app._initialize(utils.mockWindow); + GlobalVars.isFramelessWindow = false; + global.fetch = jest.fn(() => Promise.resolve({ status: 503, ok: false } as Response)); + }); + + afterAll(() => { + GlobalVars.isFramelessWindow = false; + }); + afterEach(() => { + // Reset the object since it's a singleton + if (app._uninitialize) { + utils.setRuntimeConfig(_minRuntimeConfigToUninitialize); + app._uninitialize(); + } + }); + it('validateOrigin returns true if origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if origin for subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://subdomain.teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin is not an exact match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://team.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin is valid origin supplied by user ', async () => { + const messageOrigin = new URL('https://testorigin.example.com'); + GlobalVars.additionalValidOrigins = [messageOrigin.origin]; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin is not supplied by user', async () => { + const messageOrigin = new URL('https://badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if origin for subdomains is in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.badorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin for subdomains is not in the user supplied list', async () => { + const messageOrigin = new URL('https://subdomain.badorigin.example.com'); + GlobalVars.additionalValidOrigins = ['https://*.testorigin.example.com']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:4000'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if the port number of valid origin is not in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:4000'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns true if the port number of valid origin is in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://local.teams.live.com:8080'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns true if the port number of valid origin is in the user supplied list', async () => { + const messageOrigin = new URL('https://testorigin.example.com:8080'); + GlobalVars.additionalValidOrigins = ['https://testorigin.example.com:8080']; + const result = await validateOrigin(messageOrigin); + expect(result).toBe(true); + }); + it('validateOrigin returns false if origin has extra appended', async () => { + const messageOrigin = new URL('https://teams.microsoft.com.evil.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it("validateOrigin returns false if the protocol of origin is not 'https:'", async () => { + /* eslint-disable-next-line @microsoft/sdl/no-insecure-url */ /* Intentionally using http here because of what it is testing */ + const messageOrigin = new URL('http://teams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if first end of origin is not matched valid subdomains in the user supplied list', async () => { + const messageOrigin = new URL('https://myteams.microsoft.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.teams.microsoft.com']; + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in teams pre-known allowlist', async () => { + const messageOrigin = new URL('https://a.b.sharepoint.com'); + const result = await validateOrigin(messageOrigin); + expect(result).toBe(false); + }); + it('validateOrigin returns false if origin for subdomains does not match in the user supplied list', async () => { + const messageOrigin = new URL('https://a.b.testdomain.com'); + const result = await validateOrigin(messageOrigin); + GlobalVars.additionalValidOrigins = ['https://*.testdomain.com']; + expect(result).toBe(false); + }); + }); +}); diff --git a/packages/teams-js/test/private/files.spec.ts b/packages/teams-js/test/private/files.spec.ts index 9681880440..2d4fccfaf7 100644 --- a/packages/teams-js/test/private/files.spec.ts +++ b/packages/teams-js/test/private/files.spec.ts @@ -81,7 +81,7 @@ describe('files', () => { const getCloudStorageFoldersMessage = utils.findMessageByFunc('files.getCloudStorageFolders'); expect(getCloudStorageFoldersMessage).not.toBeNull(); - utils.respondToMessage(getCloudStorageFoldersMessage, false, mockCloudStorageFolders); + await utils.respondToMessage(getCloudStorageFoldersMessage, false, mockCloudStorageFolders); expect(callback).toHaveBeenCalled(); }); }); @@ -133,7 +133,7 @@ describe('files', () => { const addCloudStorageFolderMessage = utils.findMessageByFunc('files.addCloudStorageFolder'); expect(addCloudStorageFolderMessage).not.toBeNull(); - utils.respondToMessage(addCloudStorageFolderMessage, false, true, mockCloudStorageFolders); + await utils.respondToMessage(addCloudStorageFolderMessage, false, true, mockCloudStorageFolders); expect(callback).toHaveBeenCalled(); }); }); @@ -188,7 +188,7 @@ describe('files', () => { const deleteCloudStorageFolderMessage = utils.findMessageByFunc('files.deleteCloudStorageFolder'); expect(deleteCloudStorageFolderMessage).not.toBeNull(); - utils.respondToMessage(deleteCloudStorageFolderMessage, false, true); + await utils.respondToMessage(deleteCloudStorageFolderMessage, false, true); expect(callback).toHaveBeenCalled(); }); }); @@ -276,7 +276,7 @@ describe('files', () => { const getCloudStorageFolderContentsMessage = utils.findMessageByFunc('files.getCloudStorageFolderContents'); expect(getCloudStorageFolderContentsMessage).not.toBeNull(); - utils.respondToMessage(getCloudStorageFolderContentsMessage, false, mockCloudStorageFolderItems); + await utils.respondToMessage(getCloudStorageFolderContentsMessage, false, mockCloudStorageFolderItems); expect(callback).toHaveBeenCalled(); }); @@ -301,7 +301,7 @@ describe('files', () => { const getCloudStorageFolderContentsMessage = utils.findMessageByFunc('files.getCloudStorageFolderContents'); expect(getCloudStorageFolderContentsMessage).not.toBeNull(); - utils.respondToMessage(getCloudStorageFolderContentsMessage, false, mockCloudStorageFolderItems); + await utils.respondToMessage(getCloudStorageFolderContentsMessage, false, mockCloudStorageFolderItems); expect(callback).toHaveBeenCalled(); }); }); @@ -399,7 +399,7 @@ describe('files', () => { const getExternalProviders = utils.findMessageByFunc('files.getExternalProviders'); expect(getExternalProviders).not.toBeNull(); - utils.respondToMessage(getExternalProviders, false, mockExternalProviders); + await utils.respondToMessage(getExternalProviders, false, mockExternalProviders); expect(callback).toHaveBeenCalled(); }); }); @@ -460,7 +460,7 @@ describe('files', () => { ); const copyMoveFilesMessage = utils.findMessageByFunc('files.copyMoveFiles'); expect(copyMoveFilesMessage).not.toBeNull(); - utils.respondToMessage(copyMoveFilesMessage, false); + await utils.respondToMessage(copyMoveFilesMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -501,7 +501,7 @@ describe('files', () => { const getFileDownloadsMessage = utils.findMessageByFunc('files.getFileDownloads'); expect(getFileDownloadsMessage).not.toBeNull(); - utils.respondToMessage(getFileDownloadsMessage, false, mockFileDownloads); + await utils.respondToMessage(getFileDownloadsMessage, false, mockFileDownloads); expect(callback).toHaveBeenCalled(); }); }); @@ -535,7 +535,7 @@ describe('files', () => { const openDownloadFolderMessage = utils.findMessageByFunc('files.openDownloadFolder'); expect(openDownloadFolderMessage).not.toBeNull(); - utils.respondToMessage(openDownloadFolderMessage, false); + await utils.respondToMessage(openDownloadFolderMessage, false); expect(callback).toHaveBeenCalled(); }); @@ -551,7 +551,7 @@ describe('files', () => { const openDownloadFolderMessage = utils.findMessageByFunc('files.openDownloadFolder'); expect(openDownloadFolderMessage).not.toBeNull(); - utils.respondToMessage(openDownloadFolderMessage, false); + await utils.respondToMessage(openDownloadFolderMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -585,7 +585,7 @@ describe('files', () => { const addCloudStorageProviderMessage = utils.findMessageByFunc('files.addCloudStorageProvider'); expect(addCloudStorageProviderMessage).not.toBeNull(); - utils.respondToMessage(addCloudStorageProviderMessage, false, files.CloudStorageProvider.Dropbox); + await utils.respondToMessage(addCloudStorageProviderMessage, false, files.CloudStorageProvider.Dropbox); expect(callback).toHaveBeenCalled(); }); @@ -605,7 +605,7 @@ describe('files', () => { const addCloudStorageProviderMessage = utils.findMessageByFunc('files.addCloudStorageProvider'); expect(addCloudStorageProviderMessage).not.toBeNull(); - utils.respondToMessage(addCloudStorageProviderMessage, sdkError); + await utils.respondToMessage(addCloudStorageProviderMessage, sdkError); expect(callback).toHaveBeenCalled(); }); @@ -626,7 +626,7 @@ describe('files', () => { const addCloudStorageProviderMessage = utils.findMessageByFunc('files.addCloudStorageProvider'); expect(addCloudStorageProviderMessage).not.toBeNull(); - utils.respondToMessage(addCloudStorageProviderMessage, sdkError, undefined); + await utils.respondToMessage(addCloudStorageProviderMessage, sdkError, undefined); expect(callback).toHaveBeenCalled(); }); }); @@ -667,7 +667,7 @@ describe('files', () => { const removeCloudStorageProviderMessage = utils.findMessageByFunc('files.removeCloudStorageProvider'); expect(removeCloudStorageProviderMessage).not.toBeNull(); - utils.respondToMessage(removeCloudStorageProviderMessage, false); + await utils.respondToMessage(removeCloudStorageProviderMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -720,7 +720,7 @@ describe('files', () => { const addCloudStorageProviderFileMessage = utils.findMessageByFunc('files.addCloudStorageProviderFile'); expect(addCloudStorageProviderFileMessage).not.toBeNull(); - utils.respondToMessage(addCloudStorageProviderFileMessage, false); + await utils.respondToMessage(addCloudStorageProviderFileMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -781,7 +781,7 @@ describe('files', () => { const renameCloudStorageProviderFileMessage = utils.findMessageByFunc('files.renameCloudStorageProviderFile'); expect(renameCloudStorageProviderFileMessage).not.toBeNull(); - utils.respondToMessage(renameCloudStorageProviderFileMessage, false); + await utils.respondToMessage(renameCloudStorageProviderFileMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -884,7 +884,7 @@ describe('files', () => { const deleteCloudStorageProviderFileMessage = utils.findMessageByFunc('files.deleteCloudStorageProviderFile'); expect(deleteCloudStorageProviderFileMessage).not.toBeNull(); - utils.respondToMessage(deleteCloudStorageProviderFileMessage, false); + await utils.respondToMessage(deleteCloudStorageProviderFileMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -971,7 +971,7 @@ describe('files', () => { const downloadCloudStorageProviderFileMessage = utils.findMessageByFunc('files.downloadCloudStorageProviderFile'); expect(downloadCloudStorageProviderFileMessage).not.toBeNull(); - utils.respondToMessage(downloadCloudStorageProviderFileMessage, false); + await utils.respondToMessage(downloadCloudStorageProviderFileMessage, false); expect(callback).toHaveBeenCalled(); }); }); @@ -1092,7 +1092,7 @@ describe('files', () => { const uploadCloudStorageProviderFileMessage = utils.findMessageByFunc('files.uploadCloudStorageProviderFile'); expect(uploadCloudStorageProviderFileMessage).not.toBeNull(); - utils.respondToMessage(uploadCloudStorageProviderFileMessage, false); + await utils.respondToMessage(uploadCloudStorageProviderFileMessage, false); expect(callback).toHaveBeenCalled(); }); }); diff --git a/packages/teams-js/test/private/logs.spec.ts b/packages/teams-js/test/private/logs.spec.ts index 77377c2d7d..05f60ea7e2 100644 --- a/packages/teams-js/test/private/logs.spec.ts +++ b/packages/teams-js/test/private/logs.spec.ts @@ -72,7 +72,7 @@ describe('logs', () => { return ''; }); - utils.sendMessage('log.request'); + await utils.sendMessage('log.request'); expect(handlerInvoked).toBe(true); }); @@ -87,7 +87,7 @@ describe('logs', () => { return log; }); - utils.sendMessage('log.request'); + await utils.sendMessage('log.request'); const sendLogMessage = utils.findMessageByFunc('log.receive'); expect(sendLogMessage).not.toBeNull(); @@ -98,7 +98,7 @@ describe('logs', () => { it(`logs.registerGetLogHandler should not send log when no get log handler is registered when initialized with ${context} content`, async () => { await utils.initializeWithContext(context); - utils.sendMessage('log.request'); + await utils.sendMessage('log.request'); const sendLogMessage = utils.findMessageByFunc('log.receive'); expect(sendLogMessage).toBeNull(); diff --git a/packages/teams-js/test/private/privateAPIs.spec.ts b/packages/teams-js/test/private/privateAPIs.spec.ts index ddfd2c8f3d..a284683b05 100644 --- a/packages/teams-js/test/private/privateAPIs.spec.ts +++ b/packages/teams-js/test/private/privateAPIs.spec.ts @@ -71,7 +71,7 @@ describe('AppSDK-privateAPIs', () => { expect(getContextMessage).not.toBeNull(); callbackCalled = false; - utils.processMessage({ + await utils.processMessage({ origin: unSupportedDomain, source: utils.mockWindow.parent, data: { @@ -202,7 +202,7 @@ describe('AppSDK-privateAPIs', () => { expect(utils.findMessageByFunc('getContext')).toBeNull(); // init completes - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; // Now the getContext call should have been dequeued @@ -318,9 +318,9 @@ describe('AppSDK-privateAPIs', () => { }; // respond in the wrong order - utils.respondToMessage(getContextMessage3, contextBridge3); - utils.respondToMessage(getContextMessage1, contextBridge1); - utils.respondToMessage(getContextMessage2, contextBridge2); + await utils.respondToMessage(getContextMessage3, contextBridge3); + await utils.respondToMessage(getContextMessage1, contextBridge1); + await utils.respondToMessage(getContextMessage2, contextBridge2); // The callbacks were associated with the correct utils.messages return Promise.all([ @@ -359,7 +359,7 @@ describe('AppSDK-privateAPIs', () => { // Get many responses to the same message for (let i = 0; i < 100; i++) { - utils.respondToMessage(getContextMessage, expectedContext); + await utils.respondToMessage(getContextMessage, expectedContext); } await contextPromise; @@ -377,17 +377,17 @@ describe('AppSDK-privateAPIs', () => { changedUserSettingValue = updatedValue; }); - utils.sendMessage('userSettingsChange', UserSettingTypes.fileOpenPreference, 'value'); + await utils.sendMessage('userSettingsChange', UserSettingTypes.fileOpenPreference, 'value'); expect(changedUserSettingType).toBe(UserSettingTypes.fileOpenPreference); expect(changedUserSettingValue).toBe('value'); }); - it('should treat messages to frameless windows as coming from the child', () => { + it('should treat messages to frameless windows as coming from the child', async () => { utils.initializeAsFrameless(['https://www.example.com']); // Simulate recieving a child message as a frameless window - utils.processMessage({ + await utils.processMessage({ origin: 'https://www.example.com', source: utils.childWindow, data: { @@ -401,11 +401,11 @@ describe('AppSDK-privateAPIs', () => { expect(utils.childMessages.length).toBe(1); }); - it('should properly pass partial responses to nested child frames ', () => { + it('should properly pass partial responses to nested child frames ', async () => { utils.initializeAsFrameless(['https://www.example.com']); // Simulate recieving a child message as a frameless window - utils.processMessage({ + await utils.processMessage({ origin: 'https://www.example.com', source: utils.childWindow, data: { @@ -417,7 +417,7 @@ describe('AppSDK-privateAPIs', () => { // Send a partial response back const parentMessage = utils.findMessageByFunc('testPartialFunc1'); - utils.respondToNativeMessage(parentMessage, true, {}); + await utils.respondToNativeMessage(parentMessage, true, {}); // The child window should properly receive the partial response plus // the original event @@ -427,7 +427,7 @@ describe('AppSDK-privateAPIs', () => { expect(secondChildMessage.isPartialResponse).toBeTruthy(); // Pass the final response (non partial) - utils.respondToNativeMessage(parentMessage, false, {}); + await utils.respondToNativeMessage(parentMessage, false, {}); // The child window should properly receive the non-partial response expect(utils.childMessages.length).toBe(3); @@ -437,7 +437,7 @@ describe('AppSDK-privateAPIs', () => { it('Proxy messages to child window', async () => { await utils.initializeWithContext('content', null, ['https://teams.microsoft.com']); - utils.processMessage({ + await utils.processMessage({ origin: 'https://outlook.office.com', source: utils.childWindow, data: { @@ -472,7 +472,7 @@ describe('AppSDK-privateAPIs', () => { //trigger child window setup //trigger processing of message received from child - utils.processMessage({ + await utils.processMessage({ origin: 'https://tasks.office.com', source: utils.childWindow, data: { @@ -504,7 +504,7 @@ describe('AppSDK-privateAPIs', () => { return []; }); - utils.sendMessage(customActionName, 'arg1', 123, 4.5, true); + await utils.sendMessage(customActionName, 'arg1', 123, 4.5, true); expect(callbackCalled).toBe(true); expect(callbackArgs).toEqual(['arg1', 123, 4.5, true]); }); @@ -522,7 +522,7 @@ describe('AppSDK-privateAPIs', () => { }); //trigger processing of message received from child - utils.processMessage({ + await utils.processMessage({ origin: 'https://tasks.office.com', source: utils.childWindow, data: { @@ -549,7 +549,7 @@ describe('AppSDK-privateAPIs', () => { }); //trigger processing of message received from child - utils.processMessage({ + await utils.processMessage({ origin: 'https://tasks.office.net', source: utils.childWindow, data: { diff --git a/packages/teams-js/test/private/remoteCamera.spec.ts b/packages/teams-js/test/private/remoteCamera.spec.ts index 41a9257a14..cebf879914 100644 --- a/packages/teams-js/test/private/remoteCamera.spec.ts +++ b/packages/teams-js/test/private/remoteCamera.spec.ts @@ -102,7 +102,7 @@ describe('remoteCamera', () => { error: null, participants: capableParticipantsMock, }; - utils.respondToMessage(message, data.error, data.participants); + await utils.respondToMessage(message, data.error, data.participants); // check data is returned properly expect(returnedParticipant).toEqual(capableParticipantsMock); @@ -130,7 +130,7 @@ describe('remoteCamera', () => { error: sdkErrorMock, participants: null, }; - utils.respondToMessage(message, data.error, data.participants); + await utils.respondToMessage(message, data.error, data.participants); // check data is returned properly expect(returnedParticipant).toBeNull(); @@ -205,7 +205,7 @@ describe('remoteCamera', () => { error: null, requestResult: true, }; - utils.respondToMessage(message, data.error, data.requestResult); + await utils.respondToMessage(message, data.error, data.requestResult); // check data is returned properly expect(returnedRequestResponse).toEqual(true); @@ -233,7 +233,7 @@ describe('remoteCamera', () => { error: sdkErrorMock, requestResult: null, }; - utils.respondToMessage(message, data.error, data.requestResult); + await utils.respondToMessage(message, data.error, data.requestResult); // check data is returned properly expect(returnedRequestResponse).toBeNull(); @@ -303,7 +303,7 @@ describe('remoteCamera', () => { const data = { error: null, }; - utils.respondToMessage(message, data.error); + await utils.respondToMessage(message, data.error); // check data is returned properly expect(returnedSdkError).toBeNull(); @@ -327,7 +327,7 @@ describe('remoteCamera', () => { const data = { error: sdkErrorMock, }; - utils.respondToMessage(message, data.error); + await utils.respondToMessage(message, data.error); // check data is returned properly expect(returnedSdkError).toEqual(sdkErrorMock); @@ -387,7 +387,7 @@ describe('remoteCamera', () => { const data = { error: null, }; - utils.respondToMessage(message, data.error); + await utils.respondToMessage(message, data.error); // check data is returned properly expect(returnedSdkError).toBeNull(); @@ -411,7 +411,7 @@ describe('remoteCamera', () => { const data = { error: sdkErrorMock, }; - utils.respondToMessage(message, data.error); + await utils.respondToMessage(message, data.error); // check data is returned properly expect(returnedSdkError).toEqual(sdkErrorMock); @@ -470,7 +470,7 @@ describe('remoteCamera', () => { }; remoteCamera.registerOnCapableParticipantsChangeHandler(handlerMock); - utils.sendMessage('remoteCamera.capableParticipantsChange', capableParticipantsMock); + await utils.sendMessage('remoteCamera.capableParticipantsChange', capableParticipantsMock); expect(handlerInvoked).toEqual(true); expect(capableParticipants).toEqual(capableParticipantsMock); @@ -530,7 +530,7 @@ describe('remoteCamera', () => { }; remoteCamera.registerOnErrorHandler(handlerMock); - utils.sendMessage('remoteCamera.handlerError', errorReasonMock); + await utils.sendMessage('remoteCamera.handlerError', errorReasonMock); expect(handlerInvoked).toEqual(true); expect(handlerError).toEqual(errorReasonMock); @@ -590,7 +590,7 @@ describe('remoteCamera', () => { }; remoteCamera.registerOnDeviceStateChangeHandler(handlerMock); - utils.sendMessage('remoteCamera.deviceStateChange', deviceStateChangeMock); + await utils.sendMessage('remoteCamera.deviceStateChange', deviceStateChangeMock); expect(handlerInvoked).toEqual(true); expect(deviceState).toEqual(deviceStateChangeMock); @@ -650,7 +650,7 @@ describe('remoteCamera', () => { }; remoteCamera.registerOnSessionStatusChangeHandler(handlerMock); - utils.sendMessage('remoteCamera.sessionStatusChange', sessionStatusChangeMock); + await utils.sendMessage('remoteCamera.sessionStatusChange', sessionStatusChangeMock); expect(handlerInvoked).toEqual(true); expect(sessionStatus).toEqual(sessionStatusChangeMock); diff --git a/packages/teams-js/test/private/teams.spec.ts b/packages/teams-js/test/private/teams.spec.ts index e62f3077da..ca8fe9ca17 100644 --- a/packages/teams-js/test/private/teams.spec.ts +++ b/packages/teams-js/test/private/teams.spec.ts @@ -91,7 +91,7 @@ describe('Testing teams capabillity', () => { const getCloudStorageFoldersMessage = utils.findMessageByFunc('teams.getTeamChannels'); expect(getCloudStorageFoldersMessage).not.toBeNull(); - utils.respondToMessage(getCloudStorageFoldersMessage, false, mockTeamsChannels); + await utils.respondToMessage(getCloudStorageFoldersMessage, false, mockTeamsChannels); expect(callback).toHaveBeenCalled(); }); } else { @@ -150,7 +150,7 @@ describe('Testing teams capabillity', () => { const getCloudStorageFoldersMessage = utils.findMessageByFunc('teams.refreshSiteUrl'); expect(getCloudStorageFoldersMessage).not.toBeNull(); - utils.respondToMessage(getCloudStorageFoldersMessage, false, 'Some Message'); + await utils.respondToMessage(getCloudStorageFoldersMessage, false, 'Some Message'); expect(callback).toHaveBeenCalled(); }); }); @@ -207,7 +207,7 @@ describe('Testing teams capabillity', () => { const getUserJoinedTeamsMessage = utils.findMessageByFunc('getUserJoinedTeams'); expect(getUserJoinedTeamsMessage).not.toBeNull(); - utils.respondToMessage(getUserJoinedTeamsMessage, {}); + await utils.respondToMessage(getUserJoinedTeamsMessage, {}); return expect(promise).resolves; }); @@ -221,7 +221,7 @@ describe('Testing teams capabillity', () => { const getUserJoinedTeamsMessage = utils.findMessageByFunc('getUserJoinedTeams'); expect(getUserJoinedTeamsMessage).not.toBeNull(); - utils.respondToMessage(getUserJoinedTeamsMessage, {}); + await utils.respondToMessage(getUserJoinedTeamsMessage, {}); return expect(promise).resolves; }); @@ -233,7 +233,7 @@ describe('Testing teams capabillity', () => { const getUserJoinedTeamsMessage = utils.findMessageByFunc('getUserJoinedTeams'); expect(getUserJoinedTeamsMessage).not.toBeNull(); - utils.respondToMessage(getUserJoinedTeamsMessage, {}); + await utils.respondToMessage(getUserJoinedTeamsMessage, {}); return expect(promise).resolves; }); @@ -244,7 +244,7 @@ describe('Testing teams capabillity', () => { const getUserJoinedTeamsMessage = utils.findMessageByFunc('getUserJoinedTeams'); expect(getUserJoinedTeamsMessage).not.toBeNull(); - utils.respondToMessage(getUserJoinedTeamsMessage, {}); + await utils.respondToMessage(getUserJoinedTeamsMessage, {}); return expect(promise).resolves; }); }); @@ -332,7 +332,7 @@ describe('Testing teams capabillity', () => { const getConfigSettingMessage = utils.findMessageByFunc('getConfigSetting'); expect(getConfigSettingMessage).not.toBeNull(); - utils.respondToMessage(getConfigSettingMessage, {}); + await utils.respondToMessage(getConfigSettingMessage, {}); return expect(promise).resolves; }); @@ -343,7 +343,7 @@ describe('Testing teams capabillity', () => { const getConfigSettingMessage = utils.findMessageByFunc('getConfigSetting'); expect(getConfigSettingMessage).not.toBeNull(); - utils.respondToMessage(getConfigSettingMessage, {}); + await utils.respondToMessage(getConfigSettingMessage, {}); expect(promise).resolves; }); @@ -354,7 +354,7 @@ describe('Testing teams capabillity', () => { const getConfigSettingMessage = utils.findMessageByFunc('getConfigSetting'); expect(getConfigSettingMessage).not.toBeNull(); - utils.respondToMessage(getConfigSettingMessage, {}); + await utils.respondToMessage(getConfigSettingMessage, {}); expect(promise).resolves; }); @@ -365,7 +365,7 @@ describe('Testing teams capabillity', () => { const getConfigSettingMessage = utils.findMessageByFunc('getConfigSetting'); expect(getConfigSettingMessage).not.toBeNull(); - utils.respondToMessage(getConfigSettingMessage, {}); + await utils.respondToMessage(getConfigSettingMessage, {}); expect(promise).resolves; }); }); diff --git a/packages/teams-js/test/private/videoEffectsEx.spec.ts b/packages/teams-js/test/private/videoEffectsEx.spec.ts index b8fb61dffa..8860eeae40 100644 --- a/packages/teams-js/test/private/videoEffectsEx.spec.ts +++ b/packages/teams-js/test/private/videoEffectsEx.spec.ts @@ -123,7 +123,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [videoFrameMock], @@ -155,7 +155,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [videoFrameMock], @@ -187,7 +187,7 @@ describe('videoEffectsEx', () => { data: 101, timestamp: 200, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [videoFrameMock], @@ -223,7 +223,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [videoFrameMock], @@ -258,7 +258,7 @@ describe('videoEffectsEx', () => { data: 101, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [videoFrameMock], @@ -287,7 +287,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoBufferHandler: videoBufferCallback, }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.newVideoFrame', args: [undefined], @@ -302,7 +302,7 @@ describe('videoEffectsEx', () => { const setFrameProcessTimeLimitSpy = jest.spyOn(VideoPerformanceMonitor.prototype, 'setFrameProcessTimeLimit'); // Act videoEffectsEx.registerForVideoFrame(registerForVideoFrameParameters); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.setFrameProcessTimeLimit', args: [100], @@ -342,7 +342,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.startVideoExtensibilityVideoStream', args: [{ streamId: 'stream id' }], @@ -371,7 +371,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.startVideoExtensibilityVideoStream', args: [{ streamId: 'stream id', metadataInTexture: true }], @@ -406,7 +406,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.startVideoExtensibilityVideoStream', args: [{ streamId: 'stream id' }], @@ -435,7 +435,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.startVideoExtensibilityVideoStream', args: [{ streamId: 'stream id' }], @@ -549,7 +549,7 @@ describe('videoEffectsEx', () => { videoEffectsEx.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.effectParameterChange', args: [effectId, effectParameter], @@ -571,7 +571,7 @@ describe('videoEffectsEx', () => { videoEffectsEx.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.effectParameterChange', args: [effectId, effectParameter], @@ -599,7 +599,7 @@ describe('videoEffectsEx', () => { videoEffects.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'video.effectParameterChange', args: [effectId, effectParameter], @@ -770,7 +770,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.sendMessage('video.newVideoFrame', videoFrameMock); + await utils.sendMessage('video.newVideoFrame', videoFrameMock); expect(returnedVideoFrame!).toEqual(videoFrameMock); expect(handlerInvoked).toBeTruthy(); }); @@ -794,7 +794,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.sendMessage('video.newVideoFrame', videoFrameMock); + await utils.sendMessage('video.newVideoFrame', videoFrameMock); const message = utils.findMessageByFunc('video.videoFrameProcessed'); expect(message).not.toBeNull(); @@ -822,7 +822,7 @@ describe('videoEffectsEx', () => { data: 101, timestamp: 200, }; - utils.sendMessage('video.newVideoFrame', videoFrameMock); + await utils.sendMessage('video.newVideoFrame', videoFrameMock); const message = utils.findMessageByFunc('video.videoFrameProcessed'); expect(message).not.toBeNull(); @@ -850,7 +850,7 @@ describe('videoEffectsEx', () => { height: 40, data: 101, }; - utils.sendMessage('video.newVideoFrame', videoFrameMock); + await utils.sendMessage('video.newVideoFrame', videoFrameMock); const message = utils.findMessageByFunc('video.notifyError'); expect(message).not.toBeNull(); @@ -873,7 +873,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoBufferHandler: videoBufferCallback, }); - utils.sendMessage('video.newVideoFrame', undefined); + await utils.sendMessage('video.newVideoFrame', undefined); expect(handlerInvoked).toBe(false); }); @@ -905,7 +905,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -929,7 +929,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -951,7 +951,7 @@ describe('videoEffectsEx', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await utils.sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -1059,7 +1059,7 @@ describe('videoEffectsEx', () => { videoEffectsEx.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.sendMessage('video.effectParameterChange', effectId, effectParameter); + await utils.sendMessage('video.effectParameterChange', effectId, effectParameter); expect(returnedEffectId).toEqual(effectId); expect(returnedEffectParameter).toEqual(effectParameter); expect(handlerInvoked).toBeTruthy(); @@ -1076,7 +1076,7 @@ describe('videoEffectsEx', () => { videoEffectsEx.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.sendMessage('video.effectParameterChange', effectId, effectParameter); + await utils.sendMessage('video.effectParameterChange', effectId, effectParameter); await videoEffectCallBack.mock.results[0].value; // Assert @@ -1099,7 +1099,7 @@ describe('videoEffectsEx', () => { videoEffects.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; const effectParameter = 'sampleEffectParameter'; - utils.sendMessage('video.effectParameterChange', effectId, effectParameter); + await utils.sendMessage('video.effectParameterChange', effectId, effectParameter); await videoEffectCallBack.mock.results[0].value.catch(() => {}); // Assert diff --git a/packages/teams-js/test/public/app.spec.ts b/packages/teams-js/test/public/app.spec.ts index 6d4fcde08d..7b4ca2ef7d 100644 --- a/packages/teams-js/test/public/app.spec.ts +++ b/packages/teams-js/test/public/app.spec.ts @@ -78,7 +78,7 @@ describe('Testing app capability', () => { expect(app.isInitialized()).toBe(false); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -140,7 +140,7 @@ describe('Testing app capability', () => { expect(secondCallbackInvoked).toBe(false); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; expect(firstCallbackInvoked).toBe(true); @@ -154,7 +154,7 @@ describe('Testing app capability', () => { expect(utils.messages.length).toBe(1); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; let callbackInvoked = false; @@ -170,7 +170,7 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); const highestSupportedVersion: string = '1.6.0'; - utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, highestSupportedVersion); + await utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, highestSupportedVersion); await initPromise; expect(runtime).toEqual( generateVersionBasedTeamsRuntimeConfig( @@ -186,7 +186,13 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); const highestSupportedVersion: string = '1.6.0'; - utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, '', highestSupportedVersion); + await utils.respondToMessage( + initMessage, + FrameContexts.content, + HostClientType.web, + '', + highestSupportedVersion, + ); await initPromise; expect(runtime).toEqual( @@ -203,7 +209,7 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); const highestSupportedVersion: string = '1.6.0'; - utils.respondToMessage( + await utils.respondToMessage( initMessage, FrameContexts.content, HostClientType.web, @@ -225,7 +231,7 @@ describe('Testing app capability', () => { const promise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, null); + await utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, null); await expect(promise).rejects.toThrowError('Received runtime config is invalid'); }); @@ -234,7 +240,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage( + await utils.respondToMessage( initMessage, FrameContexts.content, HostClientType.web, @@ -250,7 +256,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage( + await utils.respondToMessage( initMessage, FrameContexts.content, HostClientType.web, @@ -267,7 +273,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage( + await utils.respondToMessage( initMessage, FrameContexts.content, HostClientType.web, @@ -285,7 +291,7 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); const highestSupportedVersion: string = '1.6.0'; - utils.respondToMessage( + await utils.respondToMessage( initMessage, FrameContexts.content, HostClientType.web, @@ -309,7 +315,7 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); expect(initMessage).not.toBeNull(); - utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, '1.6.0', 'null'); + await utils.respondToMessage(initMessage, FrameContexts.content, HostClientType.web, '1.6.0', 'null'); await expect(initPromise).rejects.toThrowError( 'givenRuntimeConfig string was successfully parsed. However, it parsed to value of null', @@ -321,7 +327,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content, hostClientType, '', '1.6.0'); + await utils.respondToMessage(initMessage, FrameContexts.content, hostClientType, '', '1.6.0'); await initPromise; expect(GlobalVars.hostClientType).toBe(hostClientType); @@ -333,7 +339,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(spy).toHaveBeenCalled(); @@ -344,7 +350,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(spy).toHaveBeenCalled(); @@ -355,7 +361,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(spy).toHaveBeenCalled(); @@ -366,7 +372,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(spy).toHaveBeenCalled(); @@ -377,7 +383,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize([validOrigin]); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToMessage(initMessage, FrameContexts.content); + await utils.respondToMessage(initMessage, FrameContexts.content); await initPromise; expect(GlobalVars.additionalValidOrigins.length).toBe(1); @@ -401,7 +407,7 @@ describe('Testing app capability', () => { let message = utils.findMessageByFunc('getContext'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -418,7 +424,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, {}); + await utils.respondToMessage(getContextMessage, {}); const actualContext = await contextPromise; expect(actualContext.page.frameContext).toBe(context); @@ -432,7 +438,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, { frameContext: context }); + await utils.respondToMessage(getContextMessage, { frameContext: context }); const actualContext = await contextPromise; expect(actualContext.page.frameContext).toBe(context); @@ -446,7 +452,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, {}); + await utils.respondToMessage(getContextMessage, {}); const actualContext = await contextPromise; expect(actualContext.page.frameContext).toBe(context); @@ -628,7 +634,7 @@ describe('Testing app capability', () => { }; //insert expected time comparison here? - utils.respondToMessage(getContextMessage, contextBridge); + await utils.respondToMessage(getContextMessage, contextBridge); const actualContext = await contextPromise; const firstActionItem = @@ -662,7 +668,7 @@ describe('Testing app capability', () => { let message = utils.findMessageByFunc('appInitialization.appLoaded'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -698,7 +704,7 @@ describe('Testing app capability', () => { let message = utils.findMessageByFunc('appInitialization.success'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -742,7 +748,7 @@ describe('Testing app capability', () => { let message = utils.findMessageByFunc('appInitialization.failure'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -794,7 +800,7 @@ describe('Testing app capability', () => { app.registerOnThemeChangeHandler((theme) => { newTheme = theme; }); - utils.sendMessage('themeChange', 'someTheme'); + await utils.sendMessage('themeChange', 'someTheme'); expect(newTheme).toBe('someTheme'); }); }); @@ -817,7 +823,7 @@ describe('Testing app capability', () => { it('should call navigateBack automatically when no back button handler is registered', async () => { await utils.initializeWithContext('content'); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).not.toBeNull(); @@ -849,7 +855,7 @@ describe('Testing app capability', () => { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); await expect(promise).resolves.not.toThrow(); }); @@ -872,7 +878,7 @@ describe('Testing app capability', () => { success: false, error: mockErrorMessage, }; - utils.respondToMessage(message, data.success, data.error); + await utils.respondToMessage(message, data.success, data.error); await expect(promise).rejects.toThrowError(mockErrorMessage); }); }); @@ -892,7 +898,7 @@ describe('Testing app capability', () => { app.lifecycle.registerBeforeSuspendOrTerminateHandler(() => {}); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); let readyToUnloadMessage = utils.findMessageByFunc('readyToUnload'); expect(readyToUnloadMessage).not.toBeNull(); @@ -917,7 +923,7 @@ describe('Testing app capability', () => { handlerInvoked = true; }); - utils.sendMessage('load'); + await utils.sendMessage('load'); expect(handlerInvoked).toBe(true); }); }); @@ -951,7 +957,7 @@ describe('Testing app capability', () => { expect(app.isInitialized()).toBe(false); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1015,7 +1021,7 @@ describe('Testing app capability', () => { expect(secondCallbackInvoked).toBe(false); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1033,7 +1039,7 @@ describe('Testing app capability', () => { expect(utils.messages.length).toBe(1); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1054,7 +1060,7 @@ describe('Testing app capability', () => { const initMessage = utils.findMessageByFunc('initialize'); const highestSupportedVersion = '1.6.0'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, highestSupportedVersion], @@ -1076,7 +1082,7 @@ describe('Testing app capability', () => { const highestSupportedVersion = '1.6.0'; const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, '', highestSupportedVersion], @@ -1098,7 +1104,7 @@ describe('Testing app capability', () => { const highestSupportedVersion = '1.6.0'; const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, 'nonJSONStr', highestSupportedVersion], @@ -1119,7 +1125,7 @@ describe('Testing app capability', () => { const promise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, null], @@ -1132,7 +1138,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, '{"apiVersion":1, "supports":{"mail":{}}}'], @@ -1148,7 +1154,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, '{"apiVersion":1, "supports":{"mail":{}}}', '1.0.0'], @@ -1164,7 +1170,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, '1.0.0', '{"apiVersion":1, "supports":{"mail":{}}}'], @@ -1181,7 +1187,7 @@ describe('Testing app capability', () => { const highestSupportedVersion = '1.6.0'; const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, HostClientType.web, highestSupportedVersion, 'nonJSONStr'], @@ -1203,7 +1209,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [FrameContexts.content, hostClientType, '', '1.6.0'], @@ -1220,7 +1226,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1236,7 +1242,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1252,7 +1258,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1268,7 +1274,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize(); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1284,7 +1290,7 @@ describe('Testing app capability', () => { const initPromise = app.initialize([validOrigin]); const initMessage = utils.findMessageByFunc('initialize'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: initMessage.id, args: [], @@ -1311,7 +1317,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: getContextMessage.id, args: [{}], @@ -1329,7 +1335,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: getContextMessage.id, args: [{ frameContext: context }], @@ -1348,7 +1354,7 @@ describe('Testing app capability', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: getContextMessage.id, args: [{}], @@ -1486,7 +1492,7 @@ describe('Testing app capability', () => { }, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: getContextMessage.id, args: [contextBridge], @@ -1589,7 +1595,7 @@ describe('Testing app capability', () => { app.registerOnThemeChangeHandler((theme) => { newTheme = theme; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'themeChange', args: ['someTheme'], @@ -1603,7 +1609,7 @@ describe('Testing app capability', () => { it('should call navigateBack automatically when no back button handler is registered', async () => { await utils.initializeWithContext('content'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'backButtonPress', args: ['navigateBack'], @@ -1640,7 +1646,7 @@ describe('Testing app capability', () => { success: true, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [data.success], @@ -1668,7 +1674,7 @@ describe('Testing app capability', () => { success: false, error: mockErrorMessage, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [data.success, data.error], @@ -1692,7 +1698,7 @@ describe('Testing app capability', () => { await utils.initializeWithContext(context); app.lifecycle.registerBeforeSuspendOrTerminateHandler(() => {}); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'beforeUnload', }, @@ -1720,7 +1726,7 @@ describe('Testing app capability', () => { app.lifecycle.registerOnResumeHandler(() => { handlerInvoked = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'load', }, diff --git a/packages/teams-js/test/public/appInstallDialog.spec.ts b/packages/teams-js/test/public/appInstallDialog.spec.ts index 35ac8f7efe..a21b4ba375 100644 --- a/packages/teams-js/test/public/appInstallDialog.spec.ts +++ b/packages/teams-js/test/public/appInstallDialog.spec.ts @@ -67,7 +67,7 @@ describe('appInstallDialog', () => { const msg = utils.findMessageByFunc('appInstallDialog.openAppInstallDialog'); expect(msg).toBeTruthy(); expect(msg.args).toEqual([mockOpenAppInstallDialogParams]); - utils.respondToMessage(msg, undefined); + await utils.respondToMessage(msg, undefined); const response = await promise; expect(response).toBeUndefined(); }); @@ -90,7 +90,7 @@ describe('appInstallDialog', () => { expect(appInstallDialogDeepLink.pathname).toEqual( teamsDeepLinkUrlPathForAppInstall + mockOpenAppInstallDialogParams.appId, ); - utils.respondToMessage(executeDeepLinkMsg, true); + await utils.respondToMessage(executeDeepLinkMsg, true); const response = await promise; expect(response).toBeUndefined(); }); diff --git a/packages/teams-js/test/public/authentication.spec.ts b/packages/teams-js/test/public/authentication.spec.ts index ec9c24284e..ce67b765a2 100644 --- a/packages/teams-js/test/public/authentication.spec.ts +++ b/packages/teams-js/test/public/authentication.spec.ts @@ -363,7 +363,7 @@ describe('Testing authentication capability', () => { }); it(`authentication.authenticate it should successfully handle auth success in the ${hostClientType} client in legacy flow from ${context} context`, (done) => { - utils.initializeWithContext(context, hostClientType).then(() => { + utils.initializeWithContext(context, hostClientType).then(async () => { const authenticationParams = { url: 'https://someUrl', width: 100, @@ -382,13 +382,13 @@ describe('Testing authentication capability', () => { expect.assertions(2); const message = utils.findMessageByFunc('authentication.authenticate'); expect(message).not.toBeNull(); - utils.respondToMessage(message, true, mockResult); + await utils.respondToMessage(message, true, mockResult); }); }); it(`authentication.authenticate should successfully handle auth failure in the ${hostClientType} client in legacy flow from ${context} context`, (done) => { expect.assertions(2); - utils.initializeWithContext(context, hostClientType).then(() => { + utils.initializeWithContext(context, hostClientType).then(async () => { const authenticationParams = { url: 'https://someUrl', width: 100, @@ -407,7 +407,7 @@ describe('Testing authentication capability', () => { const message = utils.findMessageByFunc('authentication.authenticate'); expect(message).not.toBeNull(); - utils.respondToMessage(message, false, errorMessage); + await utils.respondToMessage(message, false, errorMessage); }); }); } else { @@ -478,7 +478,7 @@ describe('Testing authentication capability', () => { let message = utils.findMessageByFunc('authentication.getAuthToken'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -489,7 +489,7 @@ describe('Testing authentication capability', () => { Object.values(FrameContexts).forEach((context) => { it(`authentication.getAuthToken should successfully return token in case of success in legacy flow from ${context} context`, (done) => { expect.assertions(6); - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const authTokenRequest = { resources: [mockResource], claims: [mockClaim], @@ -512,13 +512,13 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual([mockClaim]); expect(message.args[2]).toEqual(false); - utils.respondToMessage(message, true, 'token'); + await utils.respondToMessage(message, true, 'token'); }); }); it(`authentication.getAuthToken should successfully return error from getAuthToken in case of failure in legacy flow from ${context} context`, (done) => { expect.assertions(6); - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const authTokenRequest = { resources: [mockResource], failureCallback: (error) => { @@ -539,7 +539,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual(undefined); expect(message.args[2]).toEqual(undefined); - utils.respondToMessage(message, false, errorMessage); + await utils.respondToMessage(message, false, errorMessage); }); }); @@ -561,7 +561,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual([mockClaim]); expect(message.args[2]).toEqual(false); - utils.respondToMessage(message, true, 'token'); + await utils.respondToMessage(message, true, 'token'); await expect(promise).resolves.toEqual('token'); }); @@ -577,7 +577,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual(undefined); expect(message.args[2]).toEqual(undefined); - utils.respondToMessage(message, true, 'token'); + await utils.respondToMessage(message, true, 'token'); await expect(promise).resolves.toEqual('token'); }); @@ -597,7 +597,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual(undefined); expect(message.args[2]).toEqual(undefined); - utils.respondToMessage(message, false, errorMessage); + await utils.respondToMessage(message, false, errorMessage); await expect(promise).rejects.toThrowError(errorMessage); }); @@ -613,7 +613,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual(undefined); expect(message.args[2]).toEqual(undefined); - utils.respondToMessage(message, false, errorMessage); + await utils.respondToMessage(message, false, errorMessage); await expect(promise).rejects.toThrowError(errorMessage); }); }); @@ -635,7 +635,7 @@ describe('Testing authentication capability', () => { let message = utils.findMessageByFunc('authentication.getUser'); expect(message).toBeNull(); - utils.respondToMessage(initMessage, 'content'); + await utils.respondToMessage(initMessage, 'content'); await initPromise; @@ -645,7 +645,7 @@ describe('Testing authentication capability', () => { Object.values(FrameContexts).forEach((context) => { it(`authentication.getUser should successfully get user profile in legacy flow with ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const successCallback = (user: authentication.UserProfile): void => { expect(user).toEqual(mockResult); done(); @@ -662,12 +662,12 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToMessage(message, true, mockResult); + await utils.respondToMessage(message, true, mockResult); }); }); it(`authentication.getUser should throw error in getting user profile in legacy flow with ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const successCallback = (): void => { done(); }; @@ -684,7 +684,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToMessage(message, false, mockResult); + await utils.respondToMessage(message, false, mockResult); }); }); @@ -696,7 +696,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToMessage(message, false, mockResult); + await utils.respondToMessage(message, false, mockResult); await expect(promise).rejects.toThrowError(mockResult); }); @@ -708,7 +708,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToMessage(message, true, mockUser); + await utils.respondToMessage(message, true, mockUser); await expect(promise).resolves.toEqual(mockUser); }); @@ -720,7 +720,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToMessage(message, true, mockUserWithDataResidency); + await utils.respondToMessage(message, true, mockUserWithDataResidency); await expect(promise).resolves.toEqual(mockUserWithDataResidency); }); }); @@ -1013,7 +1013,7 @@ describe('Testing authentication capability', () => { expect(message.args[2]).toBe(authenticationParams.height); expect(message.args[3]).toBe(authenticationParams.isExternal); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, mockResult], @@ -1033,7 +1033,7 @@ describe('Testing authentication capability', () => { const promise = authentication.authenticate(authenticationParams); const message = utils.findMessageByFunc('authentication.authenticate'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, func: 'authentication.authenticate.failure', @@ -1052,7 +1052,7 @@ describe('Testing authentication capability', () => { allowedContexts.forEach((context) => { allowedHostClientType.forEach((hostClientType) => { it(`authentication.registerAuthenticationHandlers should successfully ask parent window to open auth window with parameters in the ${hostClientType} client from ${context} context in legacy flow`, (done) => { - utils.initializeWithContext(context, hostClientType).then(() => { + utils.initializeWithContext(context, hostClientType).then(async () => { const authenticationParams: authentication.AuthenticateParameters = { url: 'https://someurl', width: 100, @@ -1077,7 +1077,7 @@ describe('Testing authentication capability', () => { expect(message.args[2]).toBe(authenticationParams.height); expect(message.args[3]).toBe(authenticationParams.isExternal); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, mockResult], @@ -1087,7 +1087,7 @@ describe('Testing authentication capability', () => { }); it(`authentication.registerAuthenticationHandlers should handle auth failure with parameters in the ${hostClientType} client from ${context} context in legacy flow`, (done) => { - utils.initializeWithContext(context, hostClientType).then(() => { + utils.initializeWithContext(context, hostClientType).then(async () => { const authenticationParams: authentication.AuthenticateParameters = { url: 'https://someurl', width: 100, @@ -1105,7 +1105,7 @@ describe('Testing authentication capability', () => { authentication.authenticate(); const message = utils.findMessageByFunc('authentication.authenticate'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [errorMessage], @@ -1130,7 +1130,7 @@ describe('Testing authentication capability', () => { Object.values(FrameContexts).forEach((context) => { it(`authentication.getAuthToken should successfully return token in case of success in legacy flow from ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const authTokenRequest = { resources: [mockResource], claims: [mockClaim], @@ -1153,7 +1153,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toEqual([mockClaim]); expect(message.args[2]).toEqual(false); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, 'token'], @@ -1163,7 +1163,7 @@ describe('Testing authentication capability', () => { }); it(`authentication.getAuthToken should throw error in case of failure in legacy flow from ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const authTokenRequest = { resources: [mockResource], failureCallback: (error) => { @@ -1183,7 +1183,7 @@ describe('Testing authentication capability', () => { expect(message.args[0]).toEqual([mockResource]); expect(message.args[1]).toBeNull(); expect(message.args[2]).toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [false, errorMessage], @@ -1209,7 +1209,7 @@ describe('Testing authentication capability', () => { expect(message.args[0]).toEqual([mockResource]); expect(message.args[1]).toEqual([mockClaim]); expect(message.args[2]).toEqual(false); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, 'token'], @@ -1230,7 +1230,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toBeNull(); expect(message.args[2]).toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, 'token'], @@ -1254,7 +1254,7 @@ describe('Testing authentication capability', () => { expect(message.args[0]).toEqual([mockResource]); expect(message.args[1]).toBeNull(); expect(message.args[2]).toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [false, errorMessage], @@ -1275,7 +1275,7 @@ describe('Testing authentication capability', () => { expect(message.args[1]).toBeNull(); expect(message.args[2]).toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [false, errorMessage], @@ -1293,7 +1293,7 @@ describe('Testing authentication capability', () => { Object.values(FrameContexts).forEach((context) => { it(`authentication.getUser should successfully get user profile in legacy flow with ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const successCallback = (user: authentication.UserProfile): void => { expect(user).toEqual(mockResult); done(); @@ -1310,7 +1310,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, mockResult], @@ -1320,7 +1320,7 @@ describe('Testing authentication capability', () => { }); it(`authentication.getUser should throw error in getting user profile in legacy flow with ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { const successCallback = (): void => { done(); }; @@ -1337,7 +1337,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [false, mockResult], @@ -1354,7 +1354,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [false, mockResult], @@ -1371,7 +1371,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, mockUser], @@ -1388,7 +1388,7 @@ describe('Testing authentication capability', () => { expect(message).not.toBeNull(); expect(message.id).toBe(1); expect(message.args[0]).toBe(undefined); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [true, mockUserWithDataResidency], diff --git a/packages/teams-js/test/public/barCode.spec.ts b/packages/teams-js/test/public/barCode.spec.ts index 1007d9010c..749767bb15 100644 --- a/packages/teams-js/test/public/barCode.spec.ts +++ b/packages/teams-js/test/public/barCode.spec.ts @@ -74,7 +74,7 @@ describe('barCode', () => { const callbackId = message.id; const response = 'scannedCode'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, response], @@ -95,7 +95,7 @@ describe('barCode', () => { expect(message.args[0]).toEqual(barCodeConfig); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.OPERATION_TIMED_OUT }], @@ -170,7 +170,7 @@ describe('barCode', () => { expect(message.args[0]).toBe('media'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -191,7 +191,7 @@ describe('barCode', () => { expect(message.args[0]).toBe('media'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], @@ -250,7 +250,7 @@ describe('barCode', () => { expect(message.args[0]).toBe('media'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -271,7 +271,7 @@ describe('barCode', () => { expect(message.args[0]).toBe('media'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], diff --git a/packages/teams-js/test/public/calendar.spec.ts b/packages/teams-js/test/public/calendar.spec.ts index 4b39e37d49..dc3970ba7c 100644 --- a/packages/teams-js/test/public/calendar.spec.ts +++ b/packages/teams-js/test/public/calendar.spec.ts @@ -128,7 +128,7 @@ describe('calendar', () => { error: 'Something went wrong...', }; - utils.respondToMessage(openCalendarItemMessage, data.success, data.error); + await utils.respondToMessage(openCalendarItemMessage, data.success, data.error); await openCalendarItemPromise.catch((e) => expect(e).toMatchObject(new Error('Something went wrong...'))); }); @@ -145,7 +145,7 @@ describe('calendar', () => { success: true, }; - utils.respondToMessage(openCalendarItemMessage, data.success); + await utils.respondToMessage(openCalendarItemMessage, data.success); await openCalendarItemPromise; expect(openCalendarItemMessage).not.toBeNull(); @@ -165,7 +165,7 @@ describe('calendar', () => { success: true, }; - utils.respondToMessage(openCalendarItemMessage, data.success); + await utils.respondToMessage(openCalendarItemMessage, data.success); await expect(openCalendarItemPromise).resolves.not.toThrow(); }); }); @@ -228,7 +228,7 @@ describe('calendar', () => { error: 'Something went wrong...', }; - utils.respondToMessage(composeMeeting, data.success, data.error); + await utils.respondToMessage(composeMeeting, data.success, data.error); await composeMeetingPromise.catch((e) => expect(e).toMatchObject(new Error('Something went wrong...'))); }); @@ -244,7 +244,7 @@ describe('calendar', () => { success: true, }; - utils.respondToMessage(composeMeetingMessage, data.success); + await utils.respondToMessage(composeMeetingMessage, data.success); await composeMeetingPromise; expect(composeMeetingMessage).not.toBeNull(); @@ -265,7 +265,7 @@ describe('calendar', () => { const calendarDeepLink: URL = new URL(executeDeepLinkMessage.args[0] as string); validateCalendarDeepLinkPrefix(calendarDeepLink); - utils.respondToMessage(executeDeepLinkMessage, true); + await utils.respondToMessage(executeDeepLinkMessage, true); await expect(promise).resolves.not.toThrow(); }); @@ -281,7 +281,7 @@ describe('calendar', () => { success: true, }; - utils.respondToMessage(composeMeetingMessage, data.success); + await utils.respondToMessage(composeMeetingMessage, data.success); await expect(composeMeetingPromise).resolves.not.toThrow(); }); @@ -297,7 +297,7 @@ describe('calendar', () => { success: true, }; - utils.respondToMessage(composeMeetingMessage, data.success); + await utils.respondToMessage(composeMeetingMessage, data.success); await expect(composeMeetingPromise).resolves.not.toThrow(); }); }); diff --git a/packages/teams-js/test/public/call.spec.ts b/packages/teams-js/test/public/call.spec.ts index f9666d1fd1..1426e03367 100644 --- a/packages/teams-js/test/public/call.spec.ts +++ b/packages/teams-js/test/public/call.spec.ts @@ -65,7 +65,7 @@ describe('call', () => { const msg = utils.findMessageByFunc('call.startCall'); expect(msg).toBeTruthy(); expect(msg.args).toEqual([mockStartCallParams]); - utils.respondToMessage(msg, true); + await utils.respondToMessage(msg, true); const response = await promise; expect(response).toBe(true); }); @@ -88,7 +88,7 @@ describe('call', () => { validateCallDeepLinkPrefix(callDeepLink); validateDeepLinkUsers(callDeepLink, mockStartCallParams.targets); - utils.respondToMessage(executeDeepLinkMsg, true); + await utils.respondToMessage(executeDeepLinkMsg, true); await expect(promise).resolves.toBe(true); }); @@ -110,7 +110,7 @@ describe('call', () => { validateCallDeepLinkPrefix(callDeepLink); validateDeepLinkUsers(callDeepLink, mockStartCallParams.targets); - utils.respondToMessage(executeDeepLinkMsg, false, errorCallNotStarted); + await utils.respondToMessage(executeDeepLinkMsg, false, errorCallNotStarted); await expect(promise).rejects.toThrowError(errorCallNotStarted); }); }); diff --git a/packages/teams-js/test/public/chat.spec.ts b/packages/teams-js/test/public/chat.spec.ts index 7a92408128..e59ff287ba 100644 --- a/packages/teams-js/test/public/chat.spec.ts +++ b/packages/teams-js/test/public/chat.spec.ts @@ -109,7 +109,7 @@ describe('chat', () => { expect(await isPromiseStillPending(promise)).toBe(true); const openChatMessage = utils.findMessageByFunc('chat.openChat'); - utils.respondToMessage(openChatMessage, true); + await utils.respondToMessage(openChatMessage, true); await expect(promise).resolves.not.toThrow(); }); @@ -134,7 +134,7 @@ describe('chat', () => { validateDeepLinkUsers(chatDeepLink, [chatRequest.user]); validateChatDeepLinkMessage(chatDeepLink, chatRequest.message); - utils.respondToMessage(executeDeepLinkMessage, true); + await utils.respondToMessage(executeDeepLinkMessage, true); await expect(promise).resolves.not.toThrow(); }); } @@ -242,7 +242,7 @@ describe('chat', () => { expect(await isPromiseStillPending(chatPromise)).toBe(true); const openChatMessage = utils.findMessageByFunc('chat.openChat'); - utils.respondToMessage(openChatMessage, true); + await utils.respondToMessage(openChatMessage, true); await expect(chatPromise).resolves.not.toThrow(); }); @@ -269,7 +269,7 @@ describe('chat', () => { validateChatDeepLinkMessage(chatDeepLink, chatRequest.message); validateChatDeepLinkTopic(chatDeepLink, chatRequest.topic); - utils.respondToMessage(executeDeepLinkMessage, true); + await utils.respondToMessage(executeDeepLinkMessage, true); await expect(promise).resolves.not.toThrow(); }); } diff --git a/packages/teams-js/test/public/clipboard.spec.ts b/packages/teams-js/test/public/clipboard.spec.ts index 687286021d..fe35f815c9 100644 --- a/packages/teams-js/test/public/clipboard.spec.ts +++ b/packages/teams-js/test/public/clipboard.spec.ts @@ -95,7 +95,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -111,7 +111,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -127,7 +127,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -143,7 +143,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); } else { @@ -220,7 +220,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -236,7 +236,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -252,7 +252,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); @@ -268,7 +268,7 @@ describe('clipboard', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); } - message && utils.respondToMessage(message, undefined as unknown); + message && (await utils.respondToMessage(message, undefined as unknown)); expect(promise).resolves; }); } else { @@ -328,7 +328,7 @@ describe('clipboard', () => { try { const promise = clipboard.read(); const clipboardReadMessage = utils.findMessageByFunc('clipboard.readFromClipboard'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: clipboardReadMessage?.id, args: [undefined, base64ResponsePlainText as string], @@ -347,7 +347,7 @@ describe('clipboard', () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { clipboard: {} } }); const promise = clipboard.read(); const clipboardReadMessage = utils.findMessageByFunc('clipboard.readFromClipboard'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: clipboardReadMessage?.id, args: [undefined, base64ResponseHtmlText], @@ -367,7 +367,7 @@ describe('clipboard', () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { clipboard: {} } }); const promise = clipboard.read(); const clipboardReadMessage = utils.findMessageByFunc('clipboard.readFromClipboard'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: clipboardReadMessage?.id, args: [undefined, base64ResponseJpeg], @@ -387,7 +387,7 @@ describe('clipboard', () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { clipboard: {} } }); const promise = clipboard.read(); const clipboardReadMessage = utils.findMessageByFunc('clipboard.readFromClipboard'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: clipboardReadMessage?.id, args: [undefined, base64ResponsePng], @@ -455,7 +455,7 @@ describe('clipboard', () => { if (message && message.args) { expect(message).not.toBeNull(); } - message && utils.respondToMessage(message, undefined as unknown, dataToCopy); + message && (await utils.respondToMessage(message, undefined as unknown, dataToCopy)); const response = await promise; expect(response.type).toEqual(dataToCopy.type); }); @@ -468,7 +468,7 @@ describe('clipboard', () => { if (message && message.args) { expect(message).not.toBeNull(); } - message && utils.respondToMessage(message, undefined as unknown, htmlDataToCopy); + message && (await utils.respondToMessage(message, undefined as unknown, htmlDataToCopy)); const response = await promise; expect(response.type).toEqual(htmlDataToCopy.type); }); @@ -481,7 +481,7 @@ describe('clipboard', () => { if (message && message.args) { expect(message).not.toBeNull(); } - message && utils.respondToMessage(message, undefined as unknown, imagePngdataToCopy); + message && (await utils.respondToMessage(message, undefined as unknown, imagePngdataToCopy)); const response = await promise; expect(response.type).toEqual(imagePngdataToCopy.type); }); @@ -493,7 +493,7 @@ describe('clipboard', () => { if (message && message.args) { expect(message).not.toBeNull(); } - message && utils.respondToMessage(message, undefined as unknown, imageJpegDataToCopy); + message && (await utils.respondToMessage(message, undefined as unknown, imageJpegDataToCopy)); const response = await promise; expect(response.type).toEqual(imageJpegDataToCopy.type); }); diff --git a/packages/teams-js/test/public/dialog.spec.ts b/packages/teams-js/test/public/dialog.spec.ts index 69b0d8ae1d..6a0af0a11f 100644 --- a/packages/teams-js/test/public/dialog.spec.ts +++ b/packages/teams-js/test/public/dialog.spec.ts @@ -94,7 +94,7 @@ describe('Dialog', () => { }); it(`Frameless: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { expect.assertions(2); const urlDialogInfo: UrlDialogInfo = { url: 'someUrl', @@ -111,7 +111,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -121,7 +121,7 @@ describe('Dialog', () => { }); it(`Frameless: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { expect.assertions(2); const urlDialogInfo: UrlDialogInfo = { url: 'someUrl', @@ -138,7 +138,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [error, undefined], @@ -164,7 +164,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); expect(doesHandlerExist('messageForParent')).toBeTruthy(); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -429,7 +429,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); expect(doesHandlerExist('messageForParent')).toBeTruthy(); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -439,7 +439,7 @@ describe('Dialog', () => { }); it(`FRAMELESS: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { dialog: { url: { bot: {} } } } }); const submitString = 'succesfullySubmit'; // eslint-disable-next-line @typescript-eslint/no-empty-function @@ -451,7 +451,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -461,7 +461,7 @@ describe('Dialog', () => { }); it(`FRAMELESS: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { dialog: { url: { bot: {} } } } }); dialog.url.bot.open(botUrlDialogInfo, (result: dialog.ISdkResponse) => { expect(result.result).toBeFalsy(); @@ -472,7 +472,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [error, undefined], @@ -748,7 +748,7 @@ describe('Dialog', () => { }); it(`Frameless: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -764,7 +764,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -774,7 +774,7 @@ describe('Dialog', () => { }); it(`Frameless: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -790,7 +790,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [error, undefined], @@ -920,7 +920,7 @@ describe('Dialog', () => { }); it(`FRAMELESS: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -936,7 +936,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, submitString], @@ -946,7 +946,7 @@ describe('Dialog', () => { }); it(`FRAMELESS: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -961,7 +961,7 @@ describe('Dialog', () => { const message = utils.findMessageByFunc('tasks.startTask'); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [error, undefined], @@ -1106,7 +1106,7 @@ describe('Dialog', () => { }); it(`FRAMED: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { expect.assertions(2); const urlDialogInfo: UrlDialogInfo = { url: 'someUrl', @@ -1123,12 +1123,12 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, undefined, submitString); + await utils.respondToMessage(message, undefined, submitString); }); }); it(`FRAMED: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { expect.assertions(2); const urlDialogInfo: UrlDialogInfo = { url: 'someUrl', @@ -1145,7 +1145,7 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, error, undefined); + await utils.respondToMessage(message, error, undefined); }); }); @@ -1166,7 +1166,7 @@ describe('Dialog', () => { expect(doesHandlerExist('messageForParent')).toBeTruthy(); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, null, submitString); + await utils.respondToMessage(message, null, submitString); expect(doesHandlerExist('messageForParent')).toBeFalsy(); }); } else { @@ -1376,12 +1376,12 @@ describe('Dialog', () => { expect(doesHandlerExist('messageForParent')).toBeTruthy(); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, null, submitString); + await utils.respondToMessage(message, null, submitString); expect(doesHandlerExist('messageForParent')).toBeFalsy(); }); it(`FRAMED: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { dialog: { url: { bot: {} } } } }); expect.assertions(2); @@ -1394,12 +1394,12 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, undefined, submitString); + await utils.respondToMessage(message, undefined, submitString); }); }); it(`FRAMED: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, supports: { dialog: { url: { bot: {} } } } }); expect.assertions(2); const error = { errorCode: 500, message: 'Internal Error Occured' }; @@ -1410,7 +1410,7 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, error, undefined); + await utils.respondToMessage(message, error, undefined); }); }); } else { @@ -1639,7 +1639,7 @@ describe('Dialog', () => { }); it(`FRAMED: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -1655,12 +1655,12 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, undefined, submitString); + await utils.respondToMessage(message, undefined, submitString); }); }); it(`FRAMED: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -1676,7 +1676,7 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, error, undefined); + await utils.respondToMessage(message, error, undefined); }); }); } else { @@ -1768,7 +1768,7 @@ describe('Dialog', () => { }); it(`FRAMED: Should successfully call the callback with result when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -1785,12 +1785,12 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, undefined, submitString); + await utils.respondToMessage(message, undefined, submitString); }); }); it(`FRAMED: Should successfully call the callback with error when dialog is closed. ${context} context`, (done) => { - utils.initializeWithContext(context).then(() => { + utils.initializeWithContext(context).then(async () => { utils.setRuntimeConfig({ apiVersion: 2, hostVersionsInfo: { adaptiveCardSchemaVersion: minAdaptiveCardVersion }, @@ -1807,7 +1807,7 @@ describe('Dialog', () => { }); const message = utils.findMessageByFunc('tasks.startTask'); - utils.respondToMessage(message, error, undefined); + await utils.respondToMessage(message, error, undefined); }); }); } else { diff --git a/packages/teams-js/test/public/geoLocation.spec.ts b/packages/teams-js/test/public/geoLocation.spec.ts index 3deecfff0d..0eb552f4d8 100644 --- a/packages/teams-js/test/public/geoLocation.spec.ts +++ b/packages/teams-js/test/public/geoLocation.spec.ts @@ -86,7 +86,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocationProps); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, defaultLocation], @@ -109,7 +109,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocationProps); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], @@ -184,7 +184,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(DevicePermission.GeoLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -206,7 +206,7 @@ describe('geoLocation', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], @@ -281,7 +281,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(DevicePermission.GeoLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -303,7 +303,7 @@ describe('geoLocation', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], @@ -416,7 +416,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -441,7 +441,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], @@ -531,7 +531,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocationPropsForChooseLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, defaultLocation], @@ -557,7 +557,7 @@ describe('geoLocation', () => { expect(message.args[0]).toEqual(defaultLocationPropsForChooseLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], diff --git a/packages/teams-js/test/public/liveShareHost.spec.ts b/packages/teams-js/test/public/liveShareHost.spec.ts index 3074a2585f..b0e1e366ba 100644 --- a/packages/teams-js/test/public/liveShareHost.spec.ts +++ b/packages/teams-js/test/public/liveShareHost.spec.ts @@ -84,7 +84,7 @@ describe('LiveShareHost', () => { const getFluidTenantInfoMessage = utils.findMessageByFunc('interactive.getFluidTenantInfo'); expect(getFluidTenantInfoMessage).not.toBeNull(); - utils.respondToMessage(getFluidTenantInfoMessage, false, mockTenantInfo); + await utils.respondToMessage(getFluidTenantInfoMessage, false, mockTenantInfo); await expect(promise).resolves.toEqual(mockTenantInfo); }); }); @@ -119,7 +119,7 @@ describe('LiveShareHost', () => { const getFluidTokenMessage = utils.findMessageByFunc('interactive.getFluidToken'); expect(getFluidTokenMessage).not.toBeNull(); expect(getFluidTokenMessage.args).toStrictEqual(['test-container']); - utils.respondToMessage(getFluidTokenMessage, false, mockToken); + await utils.respondToMessage(getFluidTokenMessage, false, mockToken); await expect(promise).resolves.toStrictEqual(mockToken); }); }); @@ -159,7 +159,7 @@ describe('LiveShareHost', () => { const getFluidContainerIdMessage = utils.findMessageByFunc('interactive.getFluidContainerId'); expect(getFluidContainerIdMessage).not.toBeNull(); - utils.respondToMessage(getFluidContainerIdMessage, false, mockContainerInfo); + await utils.respondToMessage(getFluidContainerIdMessage, false, mockContainerInfo); await expect(promise).resolves.toEqual(mockContainerInfo); }); }); @@ -200,7 +200,7 @@ describe('LiveShareHost', () => { const setFluidContainerIdMessage = utils.findMessageByFunc('interactive.setFluidContainerId'); expect(setFluidContainerIdMessage).not.toBeNull(); expect(setFluidContainerIdMessage.args).toStrictEqual(['test-container']); - utils.respondToMessage(setFluidContainerIdMessage, false, mockContainerInfo); + await utils.respondToMessage(setFluidContainerIdMessage, false, mockContainerInfo); await expect(promise).resolves.toStrictEqual(mockContainerInfo); }); }); @@ -238,7 +238,7 @@ describe('LiveShareHost', () => { const getNtpTimeMessage = utils.findMessageByFunc('interactive.getNtpTime'); expect(getNtpTimeMessage).not.toBeNull(); - utils.respondToMessage(getNtpTimeMessage, false, mockNtpTime); + await utils.respondToMessage(getNtpTimeMessage, false, mockNtpTime); await expect(promise).resolves.toEqual(mockNtpTime); }); }); @@ -273,7 +273,7 @@ describe('LiveShareHost', () => { const registerClientIdMessage = utils.findMessageByFunc('interactive.registerClientId'); expect(registerClientIdMessage).not.toBeNull(); expect(registerClientIdMessage.args).toStrictEqual(['test-client']); - utils.respondToMessage(registerClientIdMessage, false, userRoles); + await utils.respondToMessage(registerClientIdMessage, false, userRoles); await expect(promise).resolves.toStrictEqual(userRoles); }); }); @@ -308,7 +308,7 @@ describe('LiveShareHost', () => { const getClientRolesMessage = utils.findMessageByFunc('interactive.getClientRoles'); expect(getClientRolesMessage).not.toBeNull(); expect(getClientRolesMessage.args).toStrictEqual(['test-client']); - utils.respondToMessage(getClientRolesMessage, false, userRoles); + await utils.respondToMessage(getClientRolesMessage, false, userRoles); await expect(promise).resolves.toStrictEqual(userRoles); }); }); @@ -347,7 +347,7 @@ describe('LiveShareHost', () => { const getClientInfoMessage = utils.findMessageByFunc('interactive.getClientInfo'); expect(getClientInfoMessage).not.toBeNull(); expect(getClientInfoMessage.args).toStrictEqual(['test-client']); - utils.respondToMessage(getClientInfoMessage, false, userInfo); + await utils.respondToMessage(getClientInfoMessage, false, userInfo); await expect(promise).resolves.toStrictEqual(userInfo); }); }); diff --git a/packages/teams-js/test/public/location.spec.ts b/packages/teams-js/test/public/location.spec.ts index 5a42bdcf39..27ca82beeb 100644 --- a/packages/teams-js/test/public/location.spec.ts +++ b/packages/teams-js/test/public/location.spec.ts @@ -118,7 +118,7 @@ describe('location', () => { }); it('getLocation calls with successful result', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { utils.setClientSupportedSDKVersion(minVersionForLocationAPIs); utils.setRuntimeConfig({ apiVersion: 1, supports: { location: {} } }); @@ -138,7 +138,7 @@ describe('location', () => { expect(message.args[0]).toEqual(defaultLocationProps); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, defaultLocation], @@ -148,7 +148,7 @@ describe('location', () => { }); it('getLocation calls with error', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { utils.setClientSupportedSDKVersion(minVersionForLocationAPIs); utils.setRuntimeConfig({ apiVersion: 1, supports: { location: {} } }); @@ -164,7 +164,7 @@ describe('location', () => { expect(message.args[0]).toEqual(defaultLocationProps); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], @@ -240,7 +240,7 @@ describe('location', () => { }); it('showLocation calls with successful result', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { utils.setClientSupportedSDKVersion(minVersionForLocationAPIs); utils.setRuntimeConfig({ apiVersion: 1, supports: { location: {} } }); @@ -256,7 +256,7 @@ describe('location', () => { expect(message.args[0]).toEqual(defaultLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -266,7 +266,7 @@ describe('location', () => { }); it('showLocation calls with error', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { utils.setClientSupportedSDKVersion(minVersionForLocationAPIs); utils.setRuntimeConfig({ apiVersion: 1, supports: { location: {} } }); @@ -282,7 +282,7 @@ describe('location', () => { expect(message.args[0]).toEqual(defaultLocation); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], diff --git a/packages/teams-js/test/public/mail.spec.ts b/packages/teams-js/test/public/mail.spec.ts index 14fd2c3d83..624e19946d 100644 --- a/packages/teams-js/test/public/mail.spec.ts +++ b/packages/teams-js/test/public/mail.spec.ts @@ -122,7 +122,7 @@ describe('mail', () => { error: dataError, }; - utils.respondToMessage(openMailItemMessage, data.success, data.error); + await utils.respondToMessage(openMailItemMessage, data.success, data.error); await openMailItemPromise.catch((e) => expect(e).toMatchObject(new Error(dataError))); }); @@ -138,7 +138,7 @@ describe('mail', () => { success: true, }; - utils.respondToMessage(openMailItemMessage, data.success); + await utils.respondToMessage(openMailItemMessage, data.success); await promise; expect(openMailItemMessage).not.toBeNull(); @@ -158,7 +158,7 @@ describe('mail', () => { success: true, }; - utils.respondToMessage(openMailItemMessage, data.success); + await utils.respondToMessage(openMailItemMessage, data.success); await expect(promise).resolves.not.toThrow(); }); @@ -224,7 +224,7 @@ describe('mail', () => { error: dataError, }; - utils.respondToMessage(composeMail, data.success, data.error); + await utils.respondToMessage(composeMail, data.success, data.error); await composeMailPromise.catch((e) => expect(e).toMatchObject(new Error(dataError))); }); @@ -240,7 +240,7 @@ describe('mail', () => { success: true, }; - utils.respondToMessage(composeMailMessage, data.success); + await utils.respondToMessage(composeMailMessage, data.success); await promise; expect(composeMailMessage).not.toBeNull(); @@ -260,7 +260,7 @@ describe('mail', () => { success: true, }; - utils.respondToMessage(composeMailMessage, data.success); + await utils.respondToMessage(composeMailMessage, data.success); await expect(promise).resolves.not.toThrow(); }); }); diff --git a/packages/teams-js/test/public/marketplace.spec.ts b/packages/teams-js/test/public/marketplace.spec.ts index 3d61e6887b..535ff1182c 100644 --- a/packages/teams-js/test/public/marketplace.spec.ts +++ b/packages/teams-js/test/public/marketplace.spec.ts @@ -103,7 +103,7 @@ describe('Testing marketplace capability', () => { const getCartItemsMessage = utils.findMessageByFunc('marketplace.getCart'); validateExpectedArgumentsInRequest(getCartItemsMessage, 'marketplace.getCart', MatcherType.ToStrictEqual); - utils.respondToMessage(getCartItemsMessage!); + await utils.respondToMessage(getCartItemsMessage!); await promise; }); } else { @@ -167,7 +167,7 @@ describe('Testing marketplace capability', () => { }, ); - utils.respondToMessage(addOrUpdateCartItemsMessage!); + await utils.respondToMessage(addOrUpdateCartItemsMessage!); await promise; }); } else { @@ -244,7 +244,7 @@ describe('Testing marketplace capability', () => { }, ); - utils.respondToMessage(removeCartItemsMessage!); + await utils.respondToMessage(removeCartItemsMessage!); await promise; }); } else { @@ -309,7 +309,7 @@ describe('Testing marketplace capability', () => { }, ); - utils.respondToMessage(updateCartStatusMessage!); + await utils.respondToMessage(updateCartStatusMessage!); await promise; }); } else { @@ -399,7 +399,7 @@ describe('Testing marketplace capability', () => { const promise = marketplace.getCart(); const getCartMessage = utils.findMessageByFunc('marketplace.getCart'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: getCartMessage!.id, args: [undefined, cart], @@ -477,7 +477,7 @@ describe('Testing marketplace capability', () => { const promise = marketplace.addOrUpdateCartItems(addOrUpdateCartItemsParams); const addOrUpdateCartItemsMessage = utils.findMessageByFunc('marketplace.addOrUpdateCartItems'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: addOrUpdateCartItemsMessage!.id, args: [undefined, cart], @@ -568,7 +568,7 @@ describe('Testing marketplace capability', () => { const promise = marketplace.removeCartItems(removeCartItemsParams); const removeCartItemsMessage = utils.findMessageByFunc('marketplace.removeCartItems'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: removeCartItemsMessage!.id, args: [undefined, cart], @@ -648,7 +648,7 @@ describe('Testing marketplace capability', () => { const promise = marketplace.updateCartStatus(cartStatusParams); const updateCartStatusMessage = utils.findMessageByFunc('marketplace.updateCartStatus'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: updateCartStatusMessage!.id, args: [undefined, cart], diff --git a/packages/teams-js/test/public/media.spec.ts b/packages/teams-js/test/public/media.spec.ts index 67d7b55a0a..fead8a95f3 100644 --- a/packages/teams-js/test/public/media.spec.ts +++ b/packages/teams-js/test/public/media.spec.ts @@ -124,7 +124,7 @@ describe('media', () => { size: 300, } as media.File, ]; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, filesArray], @@ -145,7 +145,7 @@ describe('media', () => { expect(message.args.length).toBe(0); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.PERMISSION_DENIED }], @@ -196,7 +196,7 @@ describe('media', () => { expect(message.args[0]).toEqual(DevicePermission.Media); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -218,7 +218,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], @@ -282,7 +282,7 @@ describe('media', () => { expect(message.args[0]).toEqual(DevicePermission.Media); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, true], @@ -304,7 +304,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }], @@ -433,7 +433,7 @@ describe('media', () => { size: 300, } as media.Media, ]; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, filesArray], @@ -473,7 +473,7 @@ describe('media', () => { size: 300, } as media.Media, ]; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, filesArray], @@ -516,7 +516,7 @@ describe('media', () => { size: 300, } as media.Media, ]; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, filesArray], @@ -555,7 +555,7 @@ describe('media', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.SIZE_EXCEEDED }], @@ -580,7 +580,7 @@ describe('media', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, undefined, 2], @@ -609,7 +609,7 @@ describe('media', () => { expect(message).not.toBeNull(); expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, undefined, 1], @@ -635,7 +635,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined], @@ -661,7 +661,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [err], @@ -820,7 +820,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.FILE_NOT_FOUND }], @@ -880,7 +880,7 @@ describe('media', () => { const callbackId = message.id; const response = 'decodedText'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, response], @@ -906,7 +906,7 @@ describe('media', () => { const callbackId = message.id; const response = 'decodedText'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [undefined, response], @@ -927,7 +927,7 @@ describe('media', () => { expect(message.args.length).toBe(1); const callbackId = message.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.OPERATION_TIMED_OUT }], diff --git a/packages/teams-js/test/public/meeting.spec.ts b/packages/teams-js/test/public/meeting.spec.ts index 493f3181fb..d2ed38e2e6 100644 --- a/packages/teams-js/test/public/meeting.spec.ts +++ b/packages/teams-js/test/public/meeting.spec.ts @@ -44,7 +44,7 @@ describe('meeting', () => { returnedLiveStreamState = liveStreamState; }); - utils.sendMessage('meeting.liveStreamChanged', { isStreaming: true }); + await utils.sendMessage('meeting.liveStreamChanged', { isStreaming: true }); expect(handlerCalled).toBe(true); expect(returnedLiveStreamState).not.toBeNull(); @@ -94,7 +94,7 @@ describe('meeting', () => { const requestAppAudioHandlingMessage = utils.findMessageByFunc('meeting.requestAppAudioHandling'); expect(requestAppAudioHandlingMessage).not.toBeNull(); - utils.respondToMessage(requestAppAudioHandlingMessage, null, requestIsHostAudioless); + await utils.respondToMessage(requestAppAudioHandlingMessage, null, requestIsHostAudioless); // check that the registerHandler for audio device selection was called const registerHandlerMessage = utils.findMessageByFunc('registerHandler', 1); @@ -171,7 +171,7 @@ describe('meeting', () => { const toggleIncomingClientAudioMessage = utils.findMessageByFunc('toggleIncomingClientAudio'); expect(toggleIncomingClientAudioMessage).not.toBeNull(); const callbackId = toggleIncomingClientAudioMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, true], @@ -197,7 +197,7 @@ describe('meeting', () => { const toggleIncomingClientAudioMessage = utils.findMessageByFunc('toggleIncomingClientAudio'); expect(toggleIncomingClientAudioMessage).not.toBeNull(); const callbackId = toggleIncomingClientAudioMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -253,7 +253,7 @@ describe('meeting', () => { const getIncomingClientAudioMessage = utils.findMessageByFunc('getIncomingClientAudioState'); expect(getIncomingClientAudioMessage).not.toBeNull(); const callbackId = getIncomingClientAudioMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, true], @@ -279,7 +279,7 @@ describe('meeting', () => { const getIncomingClientAudioMessage = utils.findMessageByFunc('getIncomingClientAudioState'); expect(getIncomingClientAudioMessage).not.toBeNull(); const callbackId = getIncomingClientAudioMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -355,7 +355,7 @@ describe('meeting', () => { conversation, organizer, }; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, meetingDetails], @@ -381,7 +381,7 @@ describe('meeting', () => { const getMeetingDetailsMessage = utils.findMessageByFunc('meeting.getMeetingDetails'); expect(getMeetingDetailsMessage).not.toBeNull(); const callbackId = getMeetingDetailsMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -440,7 +440,7 @@ describe('meeting', () => { expect(getAnonymousUserTokenMessage).not.toBeNull(); const callbackId = getAnonymousUserTokenMessage.id; const mockAuthenticationToken = '1234567890oiuytrdeswasdcfvbgnhjmuy6t54ewsxdcvbnu743edfvbnm,o98'; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, mockAuthenticationToken], @@ -469,7 +469,7 @@ describe('meeting', () => { ); expect(getAnonymousUserTokenMessage).not.toBeNull(); const callbackId = getAnonymousUserTokenMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -522,7 +522,7 @@ describe('meeting', () => { expect(getLiveStreamStateMessage).not.toBeNull(); const callbackId = getLiveStreamStateMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, { isStreaming: true }], @@ -552,7 +552,7 @@ describe('meeting', () => { expect(getLiveStreamStateMessage).not.toBeNull(); const callbackId = getLiveStreamStateMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -612,7 +612,7 @@ describe('meeting', () => { expect(requestStartLiveStreamMessage).not.toBeNull(); const callbackId = requestStartLiveStreamMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, { isStreaming: true }], @@ -642,7 +642,7 @@ describe('meeting', () => { expect(requestStartLiveStreamMessage).not.toBeNull(); const callbackId = requestStartLiveStreamMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, { isStreaming: true }], @@ -698,7 +698,7 @@ describe('meeting', () => { expect(requestStopLiveStreamingMessage).not.toBeNull(); const callbackId = requestStopLiveStreamingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -724,7 +724,7 @@ describe('meeting', () => { expect(requestStopLiveStreamingMessage).not.toBeNull(); const callbackId = requestStopLiveStreamingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, { isStreaming: false }], @@ -790,7 +790,7 @@ describe('meeting', () => { const shareAppContentToStageMessage = utils.findMessageByFunc('meeting.shareAppContentToStage'); expect(shareAppContentToStageMessage).not.toBeNull(); const callbackId = shareAppContentToStageMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, true], @@ -825,7 +825,7 @@ describe('meeting', () => { const shareAppContentToStageMessage = utils.findMessageByFunc('meeting.shareAppContentToStage'); expect(shareAppContentToStageMessage).not.toBeNull(); const callbackId = shareAppContentToStageMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, true], @@ -854,7 +854,7 @@ describe('meeting', () => { const shareAppContentToStageMessage = utils.findMessageByFunc('meeting.shareAppContentToStage'); expect(shareAppContentToStageMessage).not.toBeNull(); const callbackId = shareAppContentToStageMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -916,7 +916,7 @@ describe('meeting', () => { ); expect(appContentStageSharingCapabilitiesMessage).not.toBeNull(); const callbackId = appContentStageSharingCapabilitiesMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, appContentStageSharingCapabilities], @@ -946,7 +946,7 @@ describe('meeting', () => { ); expect(appContentStageSharingCapabilitiesMessage).not.toBeNull(); const callbackId = appContentStageSharingCapabilitiesMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -1002,7 +1002,7 @@ describe('meeting', () => { const stopSharingAppContentToStageMessage = utils.findMessageByFunc('meeting.stopSharingAppContentToStage'); expect(stopSharingAppContentToStageMessage).not.toBeNull(); const callbackId = stopSharingAppContentToStageMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, true], @@ -1028,7 +1028,7 @@ describe('meeting', () => { const stopSharingAppContentToStageMessage = utils.findMessageByFunc('meeting.stopSharingAppContentToStage'); expect(stopSharingAppContentToStageMessage).not.toBeNull(); const callbackId = stopSharingAppContentToStageMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -1091,7 +1091,7 @@ describe('meeting', () => { ); expect(appContentStageSharingStateMessage).not.toBeNull(); const callbackId = appContentStageSharingStateMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, appContentStageSharingState], @@ -1122,7 +1122,7 @@ describe('meeting', () => { ); expect(appContentStageSharingStateMessage).not.toBeNull(); const callbackId = appContentStageSharingStateMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [{ errorCode: ErrorCode.INTERNAL_ERROR }, null], @@ -1180,7 +1180,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.speakingStateChanged'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.speakingStateChanged', args: [speakingState], @@ -1208,7 +1208,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.speakingStateChanged'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.speakingStateChanged', args: [speakingState], @@ -1254,7 +1254,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.raiseHandStateChanged'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.raiseHandStateChanged', args: [raiseHandState], @@ -1284,7 +1284,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.raiseHandStateChanged'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.raiseHandStateChanged', args: [raiseHandState], @@ -1330,7 +1330,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.meetingReactionReceived'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.meetingReactionReceived', args: [meetingReaction], @@ -1360,7 +1360,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args.length).toBe(1); expect(registerHandlerMessage.args[0]).toBe('meeting.meetingReactionReceived'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.meetingReactionReceived', args: [meetingReaction], @@ -1483,7 +1483,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1513,7 +1513,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1544,7 +1544,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1558,7 +1558,7 @@ describe('meeting', () => { expect(registerHandlerMessage.args[0]).toBe('meeting.micStateChanged'); // respond to the registerHandler - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.micStateChanged', args: [{ isMicMuted: true }], @@ -1593,7 +1593,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1609,7 +1609,7 @@ describe('meeting', () => { const mockPayload = {}; // respond to the registerHandler - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.audioDeviceSelectionChanged', args: [mockPayload], @@ -1639,7 +1639,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1648,7 +1648,7 @@ describe('meeting', () => { // respond to the registerHandler const passedInIsMicMuted = false; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.micStateChanged', args: [{ isMicMuted: passedInIsMicMuted }], @@ -1683,7 +1683,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1692,7 +1692,7 @@ describe('meeting', () => { // respond to the registerHandler const passedInIsMicMuted = false; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.micStateChanged', args: [{ isMicMuted: passedInIsMicMuted }], @@ -1728,7 +1728,7 @@ describe('meeting', () => { expect(requestAppAudioHandlingMessage).not.toBeNull(); const callbackId = requestAppAudioHandlingMessage.id; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: callbackId, args: [null, requestIsHostAudioless], @@ -1737,7 +1737,7 @@ describe('meeting', () => { // respond to the registerHandler const passedInIsMicMuted = false; - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'meeting.micStateChanged', args: [{ isMicMuted: passedInIsMicMuted }], diff --git a/packages/teams-js/test/public/pages.spec.ts b/packages/teams-js/test/public/pages.spec.ts index bb806c1962..c7d3030b5b 100644 --- a/packages/teams-js/test/public/pages.spec.ts +++ b/packages/teams-js/test/public/pages.spec.ts @@ -106,7 +106,7 @@ describe('Testing pages module', () => { return true; }); - utils.sendMessage('focusEnter'); + await utils.sendMessage('focusEnter'); expect(handlerInvoked).toBe(true); }); @@ -119,7 +119,7 @@ describe('Testing pages module', () => { return false; }); - utils.sendMessage('focusEnter'); + await utils.sendMessage('focusEnter'); expect(handlerInvoked).toBe(false); }); }); @@ -247,7 +247,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('settings.getSettings'); validateRequestWithoutArguments(message, 'settings.getSettings'); - utils.respondToMessage(message!, expectedSettings); + await utils.respondToMessage(message!, expectedSettings); return expect(promise).resolves.toBe(expectedSettings); }); } else { @@ -295,7 +295,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false); + await utils.respondToMessage(navigateCrossDomainMessage!, false); await expect(promise).rejects.toThrow( 'Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.', @@ -308,7 +308,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); + await utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); await expect(promise).rejects.toThrow('Url is invalid'); }); @@ -319,7 +319,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); + await utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); await expect(promise).rejects.toThrow('Url is invalid'); }); @@ -330,7 +330,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); + await utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); await expect(promise).rejects.toThrow('Url is invalid'); }); @@ -341,7 +341,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); + await utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); await expect(promise).rejects.toThrow('Url is invalid'); }); @@ -352,7 +352,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); + await utils.respondToMessage(navigateCrossDomainMessage!, false, 'Url is invalid'); await expect(promise).rejects.toThrow('Url is invalid'); }); @@ -365,7 +365,7 @@ describe('Testing pages module', () => { const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); validateRequestWithoutArguments(navigateCrossDomainMessage, 'navigateCrossDomain'); - utils.respondToMessage(navigateCrossDomainMessage!, true); + await utils.respondToMessage(navigateCrossDomainMessage!, true); await expect(promise).resolves.not.toThrow(); }); @@ -410,7 +410,7 @@ describe('Testing pages module', () => { 'https://invalid.origin.com', ); - utils.respondToMessage(navigateCrossDomainMessage!, false); + await utils.respondToMessage(navigateCrossDomainMessage!, false); await expect(promise).rejects.toThrowError( 'Cross-origin navigation is only supported for URLs matching the pattern registered in the manifest.', @@ -460,7 +460,7 @@ describe('Testing pages module', () => { const navigateToAppMessage = utils.findMessageByFunc('pages.navigateToApp'); validateRequestWithoutArguments(navigateToAppMessage, 'pages.navigateToApp'); - utils.respondToMessage(navigateToAppMessage!, true); + await utils.respondToMessage(navigateToAppMessage!, true); await expect(promise).resolves.toBe(undefined); }); @@ -479,7 +479,7 @@ describe('Testing pages module', () => { navigateToAppParams, ); - utils.respondToMessage(navigateToAppMessage!, true); + await utils.respondToMessage(navigateToAppMessage!, true); await promise; }); @@ -503,7 +503,7 @@ describe('Testing pages module', () => { 'https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https%3A%2F%2Ftasklist.example.com%2F123&context=%7B%22channelId%22%3A%2219%3Acbe3683f25094106b826c9cada3afbe0%40thread.skype%22%2C%22subEntityId%22%3A%22task456%22%7D', ); - utils.respondToMessage(executeDeepLinkMessage!, true); + await utils.respondToMessage(executeDeepLinkMessage!, true); await promise; }); } else { @@ -558,7 +558,7 @@ describe('Testing pages module', () => { const navigateToMessage = utils.findMessageByFunc('pages.currentApp.navigateTo'); validateRequestWithoutArguments(navigateToMessage, 'pages.currentApp.navigateTo'); - utils.respondToMessage(navigateToMessage!); + await utils.respondToMessage(navigateToMessage!); await expect(promise).resolves.toBe(undefined); }); @@ -577,7 +577,7 @@ describe('Testing pages module', () => { NavigateToParams, ); - utils.respondToMessage(navigateToMessage!); + await utils.respondToMessage(navigateToMessage!); await promise; }); } else { @@ -627,7 +627,7 @@ describe('Testing pages module', () => { const navigateToDefaultPageMessage = utils.findMessageByFunc('pages.currentApp.navigateToDefaultPage'); validateRequestWithoutArguments(navigateToDefaultPageMessage, 'pages.currentApp.navigateToDefaultPage'); - utils.respondToMessage(navigateToDefaultPageMessage!); + await utils.respondToMessage(navigateToDefaultPageMessage!); await expect(promise).resolves.toBe(undefined); }); @@ -641,7 +641,7 @@ describe('Testing pages module', () => { const navigateToDefaultPageMessage = utils.findMessageByFunc('pages.currentApp.navigateToDefaultPage'); validateRequestWithoutArguments(navigateToDefaultPageMessage, 'pages.currentApp.navigateToDefaultPage'); - utils.respondToMessage(navigateToDefaultPageMessage!); + await utils.respondToMessage(navigateToDefaultPageMessage!); expect(await promise).toBeUndefined(); }); } else { @@ -758,7 +758,7 @@ describe('Testing pages module', () => { return true; }); - utils.sendMessage('fullScreenChange'); + await utils.sendMessage('fullScreenChange'); expect(handlerInvoked).toBe(true); }); @@ -771,7 +771,7 @@ describe('Testing pages module', () => { return false; }); - utils.sendMessage('fullScreenChange'); + await utils.sendMessage('fullScreenChange'); expect(handlerInvoked).toBe(false); }); }); @@ -845,7 +845,7 @@ describe('Testing pages module', () => { const navigateToTabMsg = utils.findMessageByFunc('navigateToTab'); validateRequestWithoutArguments(navigateToTabMsg, 'navigateToTab'); - utils.respondToMessage(navigateToTabMsg!, false); + await utils.respondToMessage(navigateToTabMsg!, false); await promise.catch((e) => expect(e).toMatchObject(new Error('Invalid internalTabInstanceId and/or channelId were/was provided')), ); @@ -890,7 +890,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getTabInstances'); validateRequestWithoutArguments(message, 'getTabInstances'); - utils.respondToMessage(message!, expectedTabInstanceParameters); + await utils.respondToMessage(message!, expectedTabInstanceParameters); expect(promise).resolves.toBe(expectedTabInstanceParameters); }); @@ -901,7 +901,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getTabInstances'); validateRequestWithoutArguments(message, 'getTabInstances'); - utils.respondToMessage(message!); + await utils.respondToMessage(message!); expect(promise).resolves.toBeUndefined(); }); @@ -912,7 +912,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getTabInstances'); validateRequestWithoutArguments(message, 'getTabInstances'); - utils.respondToMessage(message!); + await utils.respondToMessage(message!); expect(promise).resolves.toBeUndefined(); }); }); @@ -948,7 +948,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getMruTabInstances'); validateRequestWithoutArguments(message, 'getMruTabInstances'); - utils.respondToMessage(message!, expectedTabInstanceParameters); + await utils.respondToMessage(message!, expectedTabInstanceParameters); expect(promise).resolves.toBe(expectedTabInstanceParameters); }); @@ -959,7 +959,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getMruTabInstances'); validateRequestWithoutArguments(message, 'getMruTabInstances'); - utils.respondToMessage(message!); + await utils.respondToMessage(message!); expect(promise).resolves.toBeUndefined(); }); @@ -970,7 +970,7 @@ describe('Testing pages module', () => { const message = utils.findMessageByFunc('getMruTabInstances'); validateRequestWithoutArguments(message, 'getMruTabInstances'); - utils.respondToMessage(message!); + await utils.respondToMessage(message!); expect(promise).resolves.toBeUndefined(); }); }); @@ -1180,7 +1180,7 @@ describe('Testing pages module', () => { pages.config.registerOnSaveHandler(() => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); }); @@ -1191,7 +1191,7 @@ describe('Testing pages module', () => { handlerCalled = true; expect(saveEvent.result['webhookUrl']).not.toBeNull(); }); - utils.sendMessage('settings.save', [ + await utils.sendMessage('settings.save', [ { webhookUrl: 'someWebhookUrl', }, @@ -1211,7 +1211,7 @@ describe('Testing pages module', () => { handler2Called = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handler1Called).toBe(false); expect(handler2Called).toBe(true); @@ -1224,7 +1224,7 @@ describe('Testing pages module', () => { saveEvent.notifySuccess(); handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.success'); validateRequestWithoutArguments(message, 'settings.save.success'); @@ -1237,7 +1237,7 @@ describe('Testing pages module', () => { saveEvent.notifyFailure('someReason'); handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.failure'); validateExpectedArgumentsInRequest(message, 'settings.save.failure', MatcherType.ToBe, 'someReason'); @@ -1256,7 +1256,7 @@ describe('Testing pages module', () => { ); handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.success'); validateRequestWithoutArguments(message, 'settings.save.success'); @@ -1265,7 +1265,7 @@ describe('Testing pages module', () => { it('pages.config.registerOnSaveHandler should proxy to childWindow if no handler in top window', async () => { await utils.initializeWithContext(context, null, ['https://teams.microsoft.com']); pages.config.registerOnSaveHandler(undefined); - utils.processMessage({ + await utils.processMessage({ origin: 'https://outlook.office365.com', source: utils.childWindow, data: { @@ -1287,7 +1287,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); expect(handlerCalled).toBe(false); - utils.processMessage({ + await utils.processMessage({ origin: 'https://outlook.office365.com', source: utils.childWindow, data: { @@ -1357,7 +1357,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); expect(handlerCalled).toBeTruthy(); }); @@ -1365,7 +1365,7 @@ describe('Testing pages module', () => { it('pages.config.registerOnRemoveHandler should proxy to childWindow if no handler in top window', async () => { await utils.initializeWithContext(context, null, ['https://teams.microsoft.com']); pages.config.registerOnRemoveHandler(undefined); - utils.processMessage({ + await utils.processMessage({ origin: 'https://outlook.office365.com', source: utils.childWindow, data: { @@ -1386,7 +1386,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); expect(handlerCalled).toBe(false); - utils.processMessage({ + await utils.processMessage({ origin: 'https://outlook.office365.com', source: utils.childWindow, data: { @@ -1408,7 +1408,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.remove.success'); @@ -1424,7 +1424,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.remove.failure'); @@ -1484,7 +1484,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.sendMessage('changeSettings', ''); + await utils.sendMessage('changeSettings', ''); expect(handlerCalled).toBeTruthy(); }); } else { @@ -1629,7 +1629,7 @@ describe('Testing pages module', () => { return true; }); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).toBeNull(); @@ -1645,7 +1645,7 @@ describe('Testing pages module', () => { return false; }); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).not.toBeNull(); @@ -1846,7 +1846,7 @@ describe('Testing pages module', () => { pages.appButton.onClick(() => { handlerCalled = true; }); - utils.sendMessage('appButtonClick', ''); + await utils.sendMessage('appButtonClick', ''); expect(handlerCalled).toBeTruthy(); }); } else { @@ -1899,7 +1899,7 @@ describe('Testing pages module', () => { pages.appButton.onHoverEnter(() => { handlerCalled = true; }); - utils.sendMessage('appButtonHoverEnter', ''); + await utils.sendMessage('appButtonHoverEnter', ''); expect(handlerCalled).toBeTruthy(); }); } else { @@ -1952,7 +1952,7 @@ describe('Testing pages module', () => { pages.appButton.onHoverLeave(() => { handlerCalled = true; }); - utils.sendMessage('appButtonHoverLeave', ''); + await utils.sendMessage('appButtonHoverLeave', ''); expect(handlerCalled).toBeTruthy(); }); } else { @@ -2089,7 +2089,7 @@ describe('Testing pages module', () => { handlerInvoked = true; return true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'focusEnter', args: [true], @@ -2107,7 +2107,7 @@ describe('Testing pages module', () => { return false; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'focusEnter', args: [true], @@ -2239,7 +2239,7 @@ describe('Testing pages module', () => { await utils.initializeWithContext(context); const promise = pages.getConfig(); const message = utils.findMessageByFunc('settings.getSettings'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [expectedSettings], @@ -2292,7 +2292,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain('https://badorigin.com'); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [ @@ -2312,7 +2312,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain(''); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false, 'Url is invalid'], @@ -2327,7 +2327,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain(' '); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false, 'Url is invalid'], @@ -2342,7 +2342,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain('blahblah'); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false, 'Url is invalid'], @@ -2357,7 +2357,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain('https://blahblah'); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false, 'Url is invalid'], @@ -2372,7 +2372,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain('blah://valid.origin.com'); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false, 'Url is invalid'], @@ -2389,7 +2389,7 @@ describe('Testing pages module', () => { const promise = pages.navigateCrossDomain('https://valid.origin.com'); const navigateCrossDomainMessage = utils.findMessageByFunc('navigateCrossDomain'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: ['https://valid.origin.com'], @@ -2435,7 +2435,7 @@ describe('Testing pages module', () => { expect(navigateCrossDomainMessage.args[0]).toBe('https://invalid.origin.com'); expect(navigateCrossDomainMessage).not.toBeNull(); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateCrossDomainMessage.id, args: [false], @@ -2487,7 +2487,7 @@ describe('Testing pages module', () => { const promise = pages.navigateToApp(navigateToAppParams); const navigateToAppMessage = utils.findMessageByFunc('pages.navigateToApp'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToAppMessage.id, args: [true] }, } as DOMMessageEvent); @@ -2500,7 +2500,7 @@ describe('Testing pages module', () => { const promise = pages.navigateToApp(navigateToAppParams); const navigateToAppMessage = utils.findMessageByFunc('pages.navigateToApp'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToAppMessage.id, args: [navigateToAppParams], @@ -2518,7 +2518,7 @@ describe('Testing pages module', () => { const promise = pages.navigateToApp(navigateToAppParams); const executeDeepLinkMessage = utils.findMessageByFunc('executeDeepLink'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: executeDeepLinkMessage.id, args: [true] }, } as DOMMessageEvent); await promise; @@ -2595,7 +2595,7 @@ describe('Testing pages module', () => { utils.setRuntimeConfig({ apiVersion: 1, supports: { pages: { currentApp: {} } } }); const promise = pages.currentApp.navigateTo(NavigateToParams); const navigateToMessage = utils.findMessageByFunc('pages.currentApp.navigateTo'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToMessage.id, args: [], @@ -2610,7 +2610,7 @@ describe('Testing pages module', () => { utils.setRuntimeConfig({ apiVersion: 1, supports: { pages: { currentApp: {} } } }); const promise = pages.currentApp.navigateTo(NavigateToParams); const navigateToMessage = utils.findMessageByFunc('pages.currentApp.navigateTo'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToMessage.id, args: [], @@ -2665,7 +2665,7 @@ describe('Testing pages module', () => { const promise = pages.currentApp.navigateToDefaultPage(); const navigateToDefaultPageMessage = utils.findMessageByFunc('pages.currentApp.navigateToDefaultPage'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToDefaultPageMessage.id, args: [], @@ -2682,7 +2682,7 @@ describe('Testing pages module', () => { const promise = pages.currentApp.navigateToDefaultPage(); const navigateToDefaultPageMessage = utils.findMessageByFunc('pages.currentApp.navigateToDefaultPage'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: navigateToDefaultPageMessage.id, args: [], @@ -2793,7 +2793,7 @@ describe('Testing pages module', () => { return true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'fullScreenChange', args: [undefined] }, } as DOMMessageEvent); expect(handlerInvoked).toBe(true); @@ -2808,7 +2808,7 @@ describe('Testing pages module', () => { return false; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'fullScreenChange', args: [undefined] }, } as DOMMessageEvent); expect(handlerInvoked).toBe(false); @@ -2898,7 +2898,7 @@ describe('Testing pages module', () => { const promise = pages.tabs.getTabInstances(); const message = utils.findMessageByFunc('getTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [expectedTabInstanceParameters] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -2911,7 +2911,7 @@ describe('Testing pages module', () => { const promise = pages.tabs.getTabInstances(expectedTabInstanceParameters); const message = utils.findMessageByFunc('getTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [expectedTabInstanceParameters] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -2924,7 +2924,7 @@ describe('Testing pages module', () => { const promise = pages.tabs.getTabInstances(); const message = utils.findMessageByFunc('getTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [undefined] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -2961,7 +2961,7 @@ describe('Testing pages module', () => { utils.setRuntimeConfig({ apiVersion: 1, supports: { pages: { tabs: {} } } }); const promise = pages.tabs.getMruTabInstances(); const message = utils.findMessageByFunc('getMruTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [expectedTabInstanceParameters] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -2974,7 +2974,7 @@ describe('Testing pages module', () => { const promise = pages.tabs.getMruTabInstances(expectedTabInstanceParameters); const message = utils.findMessageByFunc('getMruTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [expectedTabInstanceParameters] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -2987,7 +2987,7 @@ describe('Testing pages module', () => { const promise = pages.tabs.getMruTabInstances(); const message = utils.findMessageByFunc('getMruTabInstances'); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { id: message.id, args: [undefined] }, } as DOMMessageEvent); expect(message).not.toBeNull(); @@ -3183,7 +3183,7 @@ describe('Testing pages module', () => { pages.config.registerOnSaveHandler(() => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: [undefined] }, } as DOMMessageEvent); expect(handlerCalled).toBe(true); @@ -3196,7 +3196,7 @@ describe('Testing pages module', () => { handlerCalled = true; expect(saveEvent.result['webhookUrl']).not.toBeNull(); }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: [{ webhookUrl: 'someWebhookUrl' }], @@ -3217,7 +3217,7 @@ describe('Testing pages module', () => { handler2Called = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: [undefined] }, } as DOMMessageEvent); @@ -3233,7 +3233,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: [undefined] }, } as DOMMessageEvent); @@ -3250,7 +3250,7 @@ describe('Testing pages module', () => { saveEvent.notifyFailure('someReason'); handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: ['someReason'] }, } as DOMMessageEvent); @@ -3275,7 +3275,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.save', args: [undefined] }, } as DOMMessageEvent); @@ -3338,7 +3338,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.remove', args: [undefined] }, } as DOMMessageEvent); @@ -3354,7 +3354,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.remove', args: [undefined] }, } as DOMMessageEvent); @@ -3373,7 +3373,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'settings.remove', args: [undefined] }, } as DOMMessageEvent); @@ -3437,7 +3437,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'changeSettings', args: [undefined] }, } as DOMMessageEvent); expect(handlerCalled).toBeTruthy(); @@ -3554,7 +3554,7 @@ describe('Testing pages module', () => { return true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'backButtonPress', args: [undefined] }, } as DOMMessageEvent); @@ -3572,7 +3572,7 @@ describe('Testing pages module', () => { return false; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'backButtonPress', args: [undefined] }, } as DOMMessageEvent); @@ -3721,7 +3721,7 @@ describe('Testing pages module', () => { pages.appButton.onClick(() => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'appButtonClick', args: [undefined] }, } as DOMMessageEvent); expect(handlerCalled).toBeTruthy(); @@ -3777,7 +3777,7 @@ describe('Testing pages module', () => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'appButtonHoverEnter', args: [undefined] }, } as DOMMessageEvent); @@ -3833,7 +3833,7 @@ describe('Testing pages module', () => { pages.appButton.onHoverLeave(() => { handlerCalled = true; }); - utils.respondToFramelessMessage({ + await utils.respondToFramelessMessage({ data: { func: 'appButtonHoverLeave', args: [undefined] }, } as DOMMessageEvent); diff --git a/packages/teams-js/test/public/publicAPIs.spec.ts b/packages/teams-js/test/public/publicAPIs.spec.ts index 0958ef7f2f..bfddc49a6f 100644 --- a/packages/teams-js/test/public/publicAPIs.spec.ts +++ b/packages/teams-js/test/public/publicAPIs.spec.ts @@ -143,7 +143,7 @@ describe('MicrosoftTeams-publicAPIs', () => { handlerCalled = true; }); - utils.sendMessage('changeSettings', ''); + await utils.sendMessage('changeSettings', ''); expect(handlerCalled).toBeTruthy(); }); @@ -164,7 +164,7 @@ describe('MicrosoftTeams-publicAPIs', () => { handlerCalled = true; }); - utils.sendMessage('appButtonClick', ''); + await utils.sendMessage('appButtonClick', ''); expect(handlerCalled).toBeTruthy(); }); @@ -184,7 +184,7 @@ describe('MicrosoftTeams-publicAPIs', () => { handlerCalled = true; }); - utils.sendMessage('appButtonHoverEnter', ''); + await utils.sendMessage('appButtonHoverEnter', ''); expect(handlerCalled).toBeTruthy(); }); @@ -205,7 +205,7 @@ describe('MicrosoftTeams-publicAPIs', () => { handlerCalled = true; }); - utils.sendMessage('appButtonHoverLeave', ''); + await utils.sendMessage('appButtonHoverLeave', ''); expect(handlerCalled).toBeTruthy(); }); @@ -226,7 +226,7 @@ describe('MicrosoftTeams-publicAPIs', () => { newTheme = theme; }); - utils.sendMessage('themeChange', 'someTheme'); + await utils.sendMessage('themeChange', 'someTheme'); expect(newTheme).toBe('someTheme'); }); @@ -234,7 +234,7 @@ describe('MicrosoftTeams-publicAPIs', () => { it('should call navigateBack automatically when no back button handler is registered', async () => { await utils.initializeWithContext(FrameContexts.content); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).not.toBeNull(); @@ -248,7 +248,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return true; }); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).toBeNull(); @@ -275,7 +275,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return true; }); - utils.sendMessage('focusEnter'); + await utils.sendMessage('focusEnter'); expect(handlerInvoked).toBe(true); }); @@ -299,7 +299,7 @@ describe('MicrosoftTeams-publicAPIs', () => { handlerInvoked = true; }); - utils.sendMessage('fullScreenChange'); + await utils.sendMessage('fullScreenChange'); expect(handlerInvoked).toBe(true); }); @@ -313,7 +313,7 @@ describe('MicrosoftTeams-publicAPIs', () => { }); it('should successfully get context', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const expectedContext: Context = { groupId: 'someGroupId', teamId: 'someTeamId', @@ -361,12 +361,12 @@ describe('MicrosoftTeams-publicAPIs', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); //insert expected time comparison here? - utils.respondToMessage(getContextMessage, expectedContext); + await utils.respondToMessage(getContextMessage, expectedContext); }); }); it('should successfully get frame context in side panel', (done) => { - utils.initializeWithContext(FrameContexts.sidePanel).then(() => { + utils.initializeWithContext(FrameContexts.sidePanel).then(async () => { getContext((context) => { expect(context.frameContext).toBe(FrameContexts.sidePanel); done(); @@ -375,12 +375,12 @@ describe('MicrosoftTeams-publicAPIs', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, {}); + await utils.respondToMessage(getContextMessage, {}); }); }); it('should successfully get frame context when returned from client', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { getContext((context) => { expect(context.frameContext).toBe(FrameContexts.sidePanel); done(); @@ -389,12 +389,12 @@ describe('MicrosoftTeams-publicAPIs', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, { frameContext: FrameContexts.sidePanel }); + await utils.respondToMessage(getContextMessage, { frameContext: FrameContexts.sidePanel }); }); }); it('should successfully get frame context in side panel with fallback logic if not returned from client', (done) => { - utils.initializeWithContext(FrameContexts.sidePanel).then(() => { + utils.initializeWithContext(FrameContexts.sidePanel).then(async () => { getContext((context) => { expect(context.frameContext).toBe(FrameContexts.sidePanel); done(); @@ -403,7 +403,7 @@ describe('MicrosoftTeams-publicAPIs', () => { const getContextMessage = utils.findMessageByFunc('getContext'); expect(getContextMessage).not.toBeNull(); - utils.respondToMessage(getContextMessage, {}); + await utils.respondToMessage(getContextMessage, {}); }); }); @@ -416,7 +416,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return false; }); - utils.sendMessage('backButtonPress'); + await utils.sendMessage('backButtonPress'); const navigateBackMessage = utils.findMessageByFunc('navigateBack'); expect(navigateBackMessage).not.toBeNull(); @@ -453,7 +453,7 @@ describe('MicrosoftTeams-publicAPIs', () => { }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { expect(status).toBe(true); @@ -476,12 +476,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); it('should invoke error callback', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { expect(status).toBe(false); @@ -504,12 +504,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: false, error: 'Something went wrong...', }; - utils.respondToMessage(message, data.success, data.error); + await utils.respondToMessage(message, data.success, data.error); }); }); it('should invoke getGenericOnCompleteHandler when no callback is provided.', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const request = 'dummyDeepLink'; jest.spyOn(utilFunc, 'getGenericOnCompleteHandler').mockImplementation(() => { return (success: boolean, reason: string): void => { @@ -535,12 +535,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: false, error: 'Something went wrong...', }; - utils.respondToMessage(message, data.success, data.error); + await utils.respondToMessage(message, data.success, data.error); }); }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { expect(status).toBe(true); @@ -562,7 +562,7 @@ describe('MicrosoftTeams-publicAPIs', () => { const data = { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); }); @@ -577,7 +577,7 @@ describe('MicrosoftTeams-publicAPIs', () => { }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.sidePanel).then(() => { + utils.initializeWithContext(FrameContexts.sidePanel).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -601,12 +601,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); it('should invoke error callback', (done) => { - utils.initializeWithContext(FrameContexts.sidePanel).then(() => { + utils.initializeWithContext(FrameContexts.sidePanel).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -630,12 +630,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: false, error: 'Something went wrong...', }; - utils.respondToMessage(message, data.success, data.error); + await utils.respondToMessage(message, data.success, data.error); }); }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.sidePanel).then(() => { + utils.initializeWithContext(FrameContexts.sidePanel).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -658,7 +658,7 @@ describe('MicrosoftTeams-publicAPIs', () => { const data = { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); }); @@ -673,7 +673,7 @@ describe('MicrosoftTeams-publicAPIs', () => { }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.task).then(() => { + utils.initializeWithContext(FrameContexts.task).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -697,12 +697,12 @@ describe('MicrosoftTeams-publicAPIs', () => { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); it('should invoke error callback', (done) => { - utils.initializeWithContext(FrameContexts.task).then(() => { + utils.initializeWithContext(FrameContexts.task).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -727,12 +727,12 @@ describe('MicrosoftTeams-publicAPIs', () => { error: 'Something went wrong...', }; - utils.respondToMessage(message, data.success, data.error); + await utils.respondToMessage(message, data.success, data.error); }); }); it('should successfully send a request', (done) => { - utils.initializeWithContext(FrameContexts.content).then(() => { + utils.initializeWithContext(FrameContexts.content).then(async () => { const request = 'dummyDeepLink'; const onComplete = (status: boolean, reason?: string): void => { @@ -756,7 +756,7 @@ describe('MicrosoftTeams-publicAPIs', () => { success: true, }; - utils.respondToMessage(message, data.success); + await utils.respondToMessage(message, data.success); }); }); }); @@ -849,7 +849,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return false; }); - utils.sendMessage('load'); + await utils.sendMessage('load'); expect(handlerInvoked).toBe(true); }); @@ -905,7 +905,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return false; }); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); expect(handlerInvoked).toBe(true); }); @@ -924,7 +924,7 @@ describe('MicrosoftTeams-publicAPIs', () => { it('should call readyToUnload automatically when no before unload handler is registered', async () => { await utils.initializeWithContext(FrameContexts.content); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); const readyToUnloadMessage = utils.findMessageByFunc('readyToUnload'); expect(readyToUnloadMessage).not.toBeNull(); @@ -975,7 +975,7 @@ describe('MicrosoftTeams-publicAPIs', () => { return true; }); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); let readyToUnloadMessage = utils.findMessageByFunc('readyToUnload'); expect(readyToUnloadMessage).toBeNull(); diff --git a/packages/teams-js/test/public/settings.spec.ts b/packages/teams-js/test/public/settings.spec.ts index adb0e752dd..8943364d8e 100644 --- a/packages/teams-js/test/public/settings.spec.ts +++ b/packages/teams-js/test/public/settings.spec.ts @@ -33,7 +33,7 @@ describe('settings', () => { it('should successfully notify success on save when there is no registered handler', async () => { await utils.initializeWithContext(FrameContexts.settings); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); const message = utils.findMessageByFunc('settings.save.success'); expect(message).not.toBeNull(); @@ -118,7 +118,7 @@ describe('settings', () => { const message = utils.findMessageByFunc('settings.getSettings'); expect(message).not.toBeNull(); - utils.respondToMessage(message, expectedSettings); + await utils.respondToMessage(message, expectedSettings); }); } }); @@ -211,7 +211,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); }); @@ -233,7 +233,7 @@ describe('settings', () => { expect(saveEvent.result['webhookUrl']).not.toBeNull(); }); - utils.sendMessage('settings.save', [ + await utils.sendMessage('settings.save', [ { webhookUrl: 'someWebhookUrl', }, @@ -254,7 +254,7 @@ describe('settings', () => { handler2Called = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handler1Called).toBe(false); expect(handler2Called).toBe(true); @@ -269,7 +269,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.success'); @@ -286,7 +286,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.failure'); @@ -306,7 +306,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.success'); @@ -325,7 +325,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.save'); + await utils.sendMessage('settings.save'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.save.failure'); @@ -353,7 +353,7 @@ describe('settings', () => { it('settings.registerOnRemoveHandler should successfully notify success on remove when there is no registered handler', async () => { await utils.initializeWithContext(FrameContexts.remove); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); const message = utils.findMessageByFunc('settings.remove.success'); expect(message).not.toBeNull(); @@ -377,7 +377,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.remove.success'); @@ -394,7 +394,7 @@ describe('settings', () => { handlerCalled = true; }); - utils.sendMessage('settings.remove'); + await utils.sendMessage('settings.remove'); expect(handlerCalled).toBe(true); const message = utils.findMessageByFunc('settings.remove.failure'); diff --git a/packages/teams-js/test/public/tasks.spec.ts b/packages/teams-js/test/public/tasks.spec.ts index cb9558a18a..003e832759 100644 --- a/packages/teams-js/test/public/tasks.spec.ts +++ b/packages/teams-js/test/public/tasks.spec.ts @@ -173,7 +173,7 @@ describe('tasks', () => { const startTaskMessage = utils.findMessageByFunc('tasks.startTask'); expect(startTaskMessage).not.toBeNull(); - utils.respondToMessage(startTaskMessage, null, 'someResult'); + await utils.respondToMessage(startTaskMessage, null, 'someResult'); expect(callbackCalled).toBe(true); }); @@ -190,7 +190,7 @@ describe('tasks', () => { const startTaskMessage = utils.findMessageByFunc('tasks.startTask'); expect(startTaskMessage).not.toBeNull(); - utils.respondToMessage(startTaskMessage, 'someError'); + await utils.respondToMessage(startTaskMessage, 'someError'); expect(callbackCalled).toBe(true); }); } else { diff --git a/packages/teams-js/test/public/teamsAPIs.spec.ts b/packages/teams-js/test/public/teamsAPIs.spec.ts index e87600ee24..6077f907b6 100644 --- a/packages/teams-js/test/public/teamsAPIs.spec.ts +++ b/packages/teams-js/test/public/teamsAPIs.spec.ts @@ -164,7 +164,7 @@ describe('Testing TeamsCore Capability', () => { return false; }); - utils.sendMessage('load'); + await utils.sendMessage('load'); expect(handlerInvoked).toBe(true); }); @@ -203,7 +203,7 @@ describe('Testing TeamsCore Capability', () => { return false; }); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); expect(handlerInvoked).toBe(true); }); @@ -211,7 +211,7 @@ describe('Testing TeamsCore Capability', () => { it(`teamsCore.registerBeforeUnloadHandler should call readyToUnload automatically when no before unload handler is registered. context: ${context}`, async () => { await utils.initializeWithContext(context); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); const readyToUnloadMessage = utils.findMessageByFunc('readyToUnload'); expect(readyToUnloadMessage).not.toBeNull(); @@ -228,7 +228,7 @@ describe('Testing TeamsCore Capability', () => { return true; }); - utils.sendMessage('beforeUnload'); + await utils.sendMessage('beforeUnload'); let readyToUnloadMessage = utils.findMessageByFunc('readyToUnload'); expect(readyToUnloadMessage).toBeNull(); diff --git a/packages/teams-js/test/public/thirdPartyCloudStorage.spec.ts b/packages/teams-js/test/public/thirdPartyCloudStorage.spec.ts index 4b810b6abf..914c577098 100644 --- a/packages/teams-js/test/public/thirdPartyCloudStorage.spec.ts +++ b/packages/teams-js/test/public/thirdPartyCloudStorage.spec.ts @@ -44,6 +44,8 @@ describe('thirdPartyCloudStorage', () => { beforeEach(() => { jest.restoreAllMocks(); + global.fetch = jest.fn(() => Promise.resolve({ status: 200, ok: true } as Response)); + jest.mock('../../src/internal/mediaUtil', () => ({ decodeAttachment: mockDecodeAttachment, })); diff --git a/packages/teams-js/test/public/videoEffects.spec.ts b/packages/teams-js/test/public/videoEffects.spec.ts index 9b0c226b7a..ae629eb5e2 100644 --- a/packages/teams-js/test/public/videoEffects.spec.ts +++ b/packages/teams-js/test/public/videoEffects.spec.ts @@ -21,14 +21,14 @@ describe('video', () => { describe.each([ { framedOrFrameless: 'frameless', - sendMessage: (func: string, ...args: unknown[]) => { - utils.respondToFramelessMessage({ data: { func, args } } as DOMMessageEvent); + sendMessage: async (func: string, ...args: unknown[]) => { + await utils.respondToFramelessMessage({ data: { func, args } } as DOMMessageEvent); }, }, { framedOrFrameless: 'framed', - sendMessage: (func: string, ...args: unknown[]) => { - utils.sendMessage(func, ...args); + sendMessage: async (func: string, ...args: unknown[]) => { + await utils.sendMessage(func, ...args); }, }, ] as const)('$framedOrFrameless', ({ framedOrFrameless, sendMessage }) => { @@ -103,12 +103,12 @@ describe('video', () => { expect(messageForRegister).toBeNull(); }); - it('should listen to videoEffects.setFrameProcessTimeLimit', () => { + it('should listen to videoEffects.setFrameProcessTimeLimit', async () => { expect.assertions(2); const setFrameProcessTimeLimitSpy = jest.spyOn(VideoPerformanceMonitor.prototype, 'setFrameProcessTimeLimit'); // Act videoEffects.registerForVideoFrame(registerForVideoFrameParameters); - sendMessage('video.setFrameProcessTimeLimit', { timeLimit: 100 }); + await sendMessage('video.setFrameProcessTimeLimit', { timeLimit: 100 }); // Assert expect(setFrameProcessTimeLimitSpy).toBeCalledTimes(1); @@ -136,7 +136,7 @@ describe('video', () => { ...registerForVideoFrameParameters, videoBufferHandler, }); - sendMessage('video.newVideoFrame', frameData); + await sendMessage('video.newVideoFrame', frameData); // Assert expect(videoBufferHandler).toHaveBeenCalledTimes(1); @@ -165,7 +165,7 @@ describe('video', () => { // Act videoEffects.registerForVideoFrame({ ...registerForVideoFrameParameters, videoBufferHandler }); const videoFrameMock = { width: 30, height: 40, data: 101, timestamp: 200 }; - sendMessage('video.newVideoFrame', videoFrameMock); + await sendMessage('video.newVideoFrame', videoFrameMock); // Assert expect(reportStartFrameProcessingSpy).toBeCalledWith(30, 40); @@ -191,7 +191,7 @@ describe('video', () => { videoBufferHandler, }); const videoFrameMock = { width: 30, height: 40, data: 101 }; - sendMessage('video.newVideoFrame', videoFrameMock); + await sendMessage('video.newVideoFrame', videoFrameMock); // Assert const message = utils.findMessageByFunc('video.notifyError'); @@ -208,7 +208,7 @@ describe('video', () => { // Act videoEffects.registerForVideoFrame({ ...registerForVideoFrameParameters, videoBufferHandler }); - sendMessage('video.newVideoFrame', undefined); + await sendMessage('video.newVideoFrame', undefined); // Assert expect(videoBufferHandler).not.toHaveBeenCalled(); @@ -236,7 +236,7 @@ describe('video', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -260,7 +260,7 @@ describe('video', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -282,7 +282,7 @@ describe('video', () => { ...registerForVideoFrameParameters, videoFrameHandler, }); - sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); + await sendMessage('video.startVideoExtensibilityVideoStream', { streamId: 'stream id' }); await utils.flushPromises(); // Assert @@ -340,7 +340,7 @@ describe('video', () => { // Act videoEffects.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; - sendMessage('video.effectParameterChange', effectId); + await sendMessage('video.effectParameterChange', effectId); // Assert expect(reportApplyingVideoEffectSpy).toHaveBeenCalledTimes(1); @@ -362,7 +362,7 @@ describe('video', () => { // Act videoEffects.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; - sendMessage('video.effectParameterChange', effectId); + await sendMessage('video.effectParameterChange', effectId); await videoEffectCallBack.mock.results[0].value; // Assert @@ -385,7 +385,7 @@ describe('video', () => { // Act videoEffects.registerForVideoEffect(videoEffectCallBack); const effectId = 'sampleEffectId'; - sendMessage('video.effectParameterChange', effectId); + await sendMessage('video.effectParameterChange', effectId); await videoEffectCallBack.mock.results[0].value.catch(() => {}); // Assert diff --git a/packages/teams-js/test/utils.ts b/packages/teams-js/test/utils.ts index 0c73a84578..60e94f9835 100644 --- a/packages/teams-js/test/utils.ts +++ b/packages/teams-js/test/utils.ts @@ -1,3 +1,4 @@ +import { validOriginsFallback as validOrigins } from '../src/internal/constants'; import { defaultSDKVersionForCompatCheck } from '../src/internal/constants'; import { GlobalVars } from '../src/internal/globalVars'; import { DOMMessageEvent, ExtendedWindow } from '../src/internal/interfaces'; @@ -49,7 +50,7 @@ export class Utils { outerHeight: 768, screenLeft: 0, screenTop: 0, - addEventListener: (type: string, listener: (ev: MessageEvent) => void): void => { + addEventListener: (type: string, listener: (ev: MessageEvent) => Promise): void => { if (type === 'message') { this.processMessage = listener; } @@ -99,9 +100,18 @@ export class Utils { }, closed: false, }; + global.fetch = jest.fn(() => + Promise.resolve({ + status: 200, + ok: true, + json: async () => { + return { validOrigins }; + }, + } as Response), + ); } - public processMessage: null | ((ev: MessageEvent) => void); + public processMessage: null | ((ev: MessageEvent) => Promise); public initializeWithContext = async ( frameContext: string, @@ -169,7 +179,7 @@ export class Utils { return null; }; - public respondToMessage = (message: MessageRequest, ...args: unknown[]): void => { + public respondToMessage = async (message: MessageRequest, ...args: unknown[]): Promise => { if (this.processMessage === null) { throw Error( `Cannot respond to message ${message.id} because processMessage function has not been set and is null`, @@ -183,7 +193,7 @@ export class Utils { } as DOMMessageEvent; (this.mockWindow as unknown as ExtendedWindow).onNativeMessage(domEvent); } else { - this.processMessage({ + await this.processMessage({ origin: this.validOrigin, source: this.mockWindow.parent, data: { @@ -194,14 +204,14 @@ export class Utils { } }; - public respondToMessageAsOpener = (message: MessageRequest, ...args: unknown[]): void => { + public respondToMessageAsOpener = async (message: MessageRequest, ...args: unknown[]): Promise => { if (this.processMessage === null) { throw Error( `Cannot respond to message ${message.id} because processMessage function has not been set and is null`, ); } - this.processMessage({ + await this.processMessage({ origin: this.validOrigin, source: this.mockWindow.opener, data: { @@ -221,14 +231,14 @@ export class Utils { } as DOMMessageEvent); }; - public sendMessage = (func: string, ...args: unknown[]): void => { + public sendMessage = async (func: string, ...args: unknown[]): Promise => { if (this.processMessage === null) { throw Error( `Cannot send message calling function ${func} because processMessage function has not been set and is null`, ); } - this.processMessage({ + await this.processMessage({ origin: this.validOrigin, source: this.mockWindow.parent, data: { diff --git a/packages/teams-js/tsconfig.json b/packages/teams-js/tsconfig.json index cbff5f7cf2..d7f061f27c 100644 --- a/packages/teams-js/tsconfig.json +++ b/packages/teams-js/tsconfig.json @@ -12,7 +12,8 @@ "noImplicitReturns": true, "sourceMap": true, "declaration": true, - "strictNullChecks": true + "strictNullChecks": true, + "resolveJsonModule": true }, "exclude": ["node_modules", "./test", "./webpack.config.ts"] } diff --git a/tools/yaml-templates/build-test-publish.yml b/tools/yaml-templates/build-test-publish.yml index 4327b5c1f0..0faac7184a 100644 --- a/tools/yaml-templates/build-test-publish.yml +++ b/tools/yaml-templates/build-test-publish.yml @@ -101,7 +101,7 @@ steps: - task: CopyFiles@2 inputs: Contents: | - packages\teams-js\artifactsForCDN\validDomains.json + packages\teams-js\src\artifactsForCDN\validDomains.json TargetFolder: '$(Build.ArtifactStagingDirectory)\CDNFeed\validDomains\json' flattenFolders: true displayName: 'Copy validDomains for CDN'