@heyframe-ag/meteor-admin-sdk
Version: 
The Meteor SDK for the HeyFrame Administration.
248 lines • 12.2 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "flush-promises", "./_internals/privileges/missing-privileges-error"], factory);
    }
})(function (require, exports) {
    "use strict";
    var __syncRequire = typeof module === "object" && typeof module.exports === "object";
    Object.defineProperty(exports, "__esModule", { value: true });
    const flush_promises_1 = __importDefault(require("flush-promises"));
    const missing_privileges_error_1 = __importDefault(require("./_internals/privileges/missing-privileges-error"));
    // Channel send timout + 1000
    jest.setTimeout(8000);
    let send;
    let handle;
    let createSender;
    let createHandler;
    let subscribe;
    let publish;
    let setExtensions;
    describe('Test the channel bridge from iFrame to admin', () => {
        beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
            window.addEventListener('message', (event) => {
                if (event.origin === '') {
                    event.stopImmediatePropagation();
                    const eventWithOrigin = new MessageEvent('message', {
                        data: event.data,
                        origin: window.location.href,
                    });
                    window.dispatchEvent(eventWithOrigin);
                }
            });
            const channel = yield __syncRequire ? Promise.resolve().then(() => __importStar(require('./channel'))) : new Promise((resolve_1, reject_1) => { require(['./channel'], resolve_1, reject_1); }).then(__importStar);
            send = channel.send;
            handle = channel.handle;
            createSender = channel.createSender;
            createHandler = channel.createHandler;
            subscribe = channel.subscribe;
            publish = channel.publish;
            setExtensions = channel.setExtensions;
            setExtensions({
                'test-extension': {
                    baseUrl: 'http://localhost',
                    permissions: {},
                },
            });
        }));
        beforeEach(() => {
            // reset extensions
            setExtensions({});
        });
        it('should send "reload" command to the admin', (done) => {
            const removeListener = handle('windowReload', (result) => {
                expect(result).toEqual({});
                removeListener();
                done();
            });
            send('windowReload', {});
        });
        it('should send "reload" command to the admin also without options', (done) => {
            const removeListener = handle('windowReload', (result) => {
                expect(result).toEqual({});
                removeListener();
                done();
            });
            // safety check if non-ts user aren't providing options
            // @ts-expect-error
            send('windowReload');
        });
        it('should get value back from admin', () => __awaiter(void 0, void 0, void 0, function* () {
            const PAGE_TITLE = 'Awesome page title';
            const removeListener = handle('getPageTitle', () => {
                return PAGE_TITLE;
            });
            const pageTitle = yield send('getPageTitle', {});
            expect(pageTitle).toEqual(PAGE_TITLE);
            removeListener();
        }));
        it('should create a sender and handler with required options', () => __awaiter(void 0, void 0, void 0, function* () {
            const getPageTitle = createSender('getPageTitle');
            const handlePageTitle = createHandler('getPageTitle');
            const PAGE_TITLE = 'Awesome page title';
            const removeListener = handlePageTitle(() => {
                return PAGE_TITLE;
            });
            const pageTitle = yield getPageTitle({});
            expect(pageTitle).toEqual(PAGE_TITLE);
            removeListener();
        }));
        it('should create a sender and handler with optional options', () => __awaiter(void 0, void 0, void 0, function* () {
            const reload = createSender('windowReload', {});
            const handleReload = createHandler('windowReload');
            const removeListener = handleReload(() => { });
            yield reload();
            removeListener();
        }));
        it('should convert functions in options and call them on the handler side', (done) => {
            const buttonMethodMock = jest.fn(() => { });
            const dispatchNotification = createSender('notificationDispatch');
            const handleNotification = createHandler('notificationDispatch');
            const removeListener = handleNotification(({ actions }) => __awaiter(void 0, void 0, void 0, function* () {
                if (!actions || (actions === null || actions === void 0 ? void 0 : actions.length) <= 0) {
                    fail('The notification handler does not get any actions from the sender');
                    return;
                }
                const firstAction = actions[0];
                if (!firstAction.method) {
                    fail('"method" in the firstAction is undefined');
                }
                expect(typeof firstAction.method).toBe('function');
                expect(buttonMethodMock).toHaveBeenCalledTimes(0);
                yield firstAction.method();
                expect(buttonMethodMock).toHaveBeenCalledTimes(1);
            }));
            dispatchNotification({
                title: 'Notification with action',
                message: 'The action should contain a callable method',
                actions: [
                    {
                        label: 'Button with method',
                        method: () => buttonMethodMock()
                    }
                ]
            }).then(() => {
                removeListener();
                done();
            });
        });
        it('should convert functions in options and call them on the handler side with arguments and return value', () => __awaiter(void 0, void 0, void 0, function* () {
            const methodMock = jest.fn((firstNumber, secondNumber) => {
                return firstNumber * secondNumber;
            });
            const sendMultiply = createSender('_multiply');
            const handleMultiply = createHandler('_multiply');
            const removeListener = handleMultiply(({ firstNumber, secondNumber }) => {
                return Promise.resolve(methodMock(firstNumber, secondNumber));
            });
            const result = yield sendMultiply({ firstNumber: 7, secondNumber: 8 });
            expect(result).toEqual(56);
            removeListener();
        }));
        it('should get data from published messages when subscribed', () => __awaiter(void 0, void 0, void 0, function* () {
            const localeMethodMock = jest.fn();
            const fallbackLocaleMethodMock = jest.fn();
            const removeSubscription = subscribe('contextLocale', ({ locale, fallbackLocale }) => {
                localeMethodMock(locale);
                fallbackLocaleMethodMock(fallbackLocale);
            });
            expect(localeMethodMock).toHaveBeenCalledTimes(0);
            expect(fallbackLocaleMethodMock).toHaveBeenCalledTimes(0);
            publish('contextLocale', {
                locale: 'en-GB',
                fallbackLocale: 'en-GB',
            });
            yield (0, flush_promises_1.default)();
            expect(localeMethodMock).toHaveBeenCalledTimes(1);
            expect(localeMethodMock).toHaveBeenLastCalledWith('en-GB');
            expect(fallbackLocaleMethodMock).toHaveBeenCalledTimes(1);
            expect(fallbackLocaleMethodMock).toHaveBeenLastCalledWith('en-GB');
            publish('contextLocale', {
                locale: 'de-DE',
                fallbackLocale: 'en-GB',
            });
            yield (0, flush_promises_1.default)();
            expect(localeMethodMock).toHaveBeenCalledTimes(2);
            expect(localeMethodMock).toHaveBeenLastCalledWith('de-DE');
            expect(fallbackLocaleMethodMock).toHaveBeenCalledTimes(2);
            expect(fallbackLocaleMethodMock).toHaveBeenLastCalledWith('en-GB');
            removeSubscription();
            publish('contextLocale', {
                locale: 'nl-NL',
                fallbackLocale: 'en-GB',
            });
            yield (0, flush_promises_1.default)();
            expect(localeMethodMock).toHaveBeenCalledTimes(2);
            expect(fallbackLocaleMethodMock).toHaveBeenCalledTimes(2);
        }));
        it('should reject send with missing privileges', () => {
            send('_privileges', {}).catch(e => {
                const expectedError = new missing_privileges_error_1.default('_privileges', ['additional:not_entity_related', 'create:user', 'read:user', 'update:user', 'delete:user']);
                expect(e.message).toEqual(expectedError.message);
            });
        });
        it('should not call handle callback with missing extensions', () => {
            const callback = jest.fn();
            const removeHandle = handle('_privileges', callback);
            // Simulate a postMessage call from an iFrame
            window.dispatchEvent(new Event('message'));
            removeHandle();
            expect(callback).toHaveBeenCalledTimes(0);
        });
        it('should not call handle callback with missing privileges', () => {
            const url = 'http://example.com';
            const callback = jest.fn();
            // change the extensions for this test
            setExtensions({});
            const removeHandle = handle('_privileges', callback);
            const event = new Event('message');
            // Simulate a postMessage call from an iFrame with a none registered origin
            window.dispatchEvent(event);
            // Simulate a postMessage call from an iFrame
            // @ts-expect-error
            event.origin = url;
            window.dispatchEvent(event);
            removeHandle();
            expect(callback).toHaveBeenCalledTimes(0);
        });
    });
});
//# sourceMappingURL=channel.spec.js.map