import { AnimationInformationPayload, DemosPayload, LanguageInformationPayload, VariantInformationPayload, ViewerStatus, ViewerAPIMessage, ViewerAPIMessageSource, Message, } from './types'; import { Visao } from './visao'; import { Demo } from './demo'; const VIEWER_ID = 'viewer'; const LANGUAGE = 'en'; const LANGUAGES = ['en', 'fr']; const VARIANT = 'green'; const VARIANTS = ['green', 'blue']; const ANIMATION = 'walk'; const ANIMATIONS = ['walk', 'run']; const DEMOS = [ new Demo({ id: 'demo id', name: 'demo name', }), ]; const LOADED_STATUS_MESSAGE = { source: ViewerAPIMessageSource.VIEWER, type: ViewerAPIMessage.SEND_STATUS, payload: { status: ViewerStatus.LOADED, }, }; const LANGUAGE_INFORMATION_MESSAGE = { source: ViewerAPIMessageSource.VIEWER, type: ViewerAPIMessage.SEND_LANGUAGE_INFO, payload: { language: LANGUAGE, languages: LANGUAGES, }, }; const VARIANT_INFORMATION_MESSAGE = { source: ViewerAPIMessageSource.VIEWER, type: ViewerAPIMessage.SEND_VARIANT_INFO, payload: { modelVariant: VARIANT, modelVariants: VARIANTS, }, }; const ANIMATION_INFORMATION_MESSAGE = { source: ViewerAPIMessageSource.VIEWER, type: ViewerAPIMessage.SEND_ANIMATION_INFO, payload: { animation: ANIMATION, animations: ANIMATIONS, }, }; const DEMOS_MESSAGE = { source: ViewerAPIMessageSource.VIEWER, type: ViewerAPIMessage.SEND_DEMOS, payload: { demos: DEMOS, }, }; describe('testing message reception', () => { let viewer: Visao; beforeAll(() => { document.body.innerHTML = `
`; }); beforeEach(() => { viewer = new Visao(VIEWER_ID); viewer.setViewerElement( document.getElementById(VIEWER_ID) as HTMLIFrameElement ); }); describe('when listening to viewer status', () => { it('should return new statuses on changes via callback', async () => { const statusPromise = new Promise((resolve) => { viewer.listenToViewerStatus(resolve); }); receiveMessageFromExternalAPI(LOADED_STATUS_MESSAGE); const status = await statusPromise; expect(status).toBe(LOADED_STATUS_MESSAGE.payload.status); }); }); describe('when listening for language information changes', () => { beforeEach(async () => { await waitForViewerToBeLoaded(); }); it('should return the new language information via callback', async () => { const languageInformationPromise = new Promise((resolve) => { viewer.getLanguageInformation(resolve); }); receiveMessageFromExternalAPI(LANGUAGE_INFORMATION_MESSAGE); const languageInformation = await languageInformationPromise; expect(languageInformation.language).toBe(LANGUAGE); expect(languageInformation.languages).toEqual(LANGUAGES); }); }); describe('when listening for variant information changes', () => { beforeEach(async () => { await waitForViewerToBeLoaded(); }); it('should return the variant information via callback', async () => { const variantInformationPromise = new Promise( (resolve) => { viewer.getVariantInformation(resolve); } ); receiveMessageFromExternalAPI(VARIANT_INFORMATION_MESSAGE); const variantInformation = await variantInformationPromise; expect(variantInformation.modelVariant).toBe(VARIANT); expect(variantInformation.modelVariants).toEqual(VARIANTS); }); }); describe('when listening for animation information changes', () => { beforeEach(async () => { await waitForViewerToBeLoaded(); }); it('should return the animation information via callback', async () => { const animationInformationPromise = new Promise((resolve) => { viewer.getAnimationInformation(resolve); }); receiveMessageFromExternalAPI(ANIMATION_INFORMATION_MESSAGE); const animationInformation = await animationInformationPromise; expect(animationInformation.animation).toBe(ANIMATION); expect(animationInformation.animations).toEqual(ANIMATIONS); }); }); describe('when listening for demos', () => { beforeEach(async () => { await waitForViewerToBeLoaded(); }); it('should return the demos via callback', async () => { const demosPromise = new Promise((resolve) => { viewer.getDemos(resolve); }); receiveMessageFromExternalAPI(DEMOS_MESSAGE); const demosPayload = await demosPromise; expect(demosPayload.demos).toEqual(DEMOS); }); }); function receiveMessageFromExternalAPI(message: Message) { window.postMessage(JSON.stringify(message), '*'); } async function waitForViewerToBeLoaded() { const statusPromise = new Promise((resolve) => { viewer.listenToViewerStatus(() => resolve()); }); receiveMessageFromExternalAPI(LOADED_STATUS_MESSAGE); await statusPromise; } });