UNPKG

@shopware-ag/meteor-admin-sdk

Version:

The Meteor SDK for the Shopware Administration.

170 lines 7.68 kB
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()); }); }; import { BroadcastChannel } from 'worker_threads'; import Vue from 'vue'; import flushPromises from 'flush-promises'; import localforage from 'localforage'; Vue.config.devtools = false; Vue.config.productionTip = false; let useAsyncSharedState; function mockLoadComposableInApp(composable) { let result; const app = new Vue({ setup() { result = composable(); return () => { }; }, }); app.$mount(document.createElement('div')); return [result, app]; } describe('useAsyncSharedState composable', () => { const storeMock = localforage.createInstance({ name: 'adminExtensionSDK', storeName: 'persistentSharedValueStore', }); 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); } }); useAsyncSharedState = yield (yield import('./useAsyncSharedState')).useAsyncSharedState; const setExtensions = yield (yield import('../../channel')).setExtensions; setExtensions({ 'test-extension': { baseUrl: 'http://localhost', permissions: {}, }, }); })); beforeEach(() => __awaiter(void 0, void 0, void 0, function* () { // @ts-expect-error - Mocking BroadcastChannel global.BroadcastChannel = BroadcastChannel; const localStorageMock = (function () { let store = {}; return { getItem(key) { var _a; // @ts-expect-error - Mocking localStorage return (_a = store[key]) !== null && _a !== void 0 ? _a : null; }, setItem(key, value) { // @ts-expect-error - Mocking localStorage store[key] = value; }, clear() { store = {}; }, removeItem(key) { // @ts-expect-error - Mocking localStorage delete store[key]; }, getAll() { return store; }, }; })(); Object.defineProperty(window, 'localStorage', { value: localStorageMock }); yield storeMock.clear(); })); afterEach(() => __awaiter(void 0, void 0, void 0, function* () { window.localStorage.clear(); yield storeMock.clear(); })); it('should be not ready at the beginning and become ready afterwards', () => __awaiter(void 0, void 0, void 0, function* () { const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); expect(result.isReady.value).toBe(false); yield flushPromises(); expect(result.isReady.value).toBe(true); app.$destroy(); })); it('should resolve the ready promise', () => __awaiter(void 0, void 0, void 0, function* () { const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); let isReady = false; void result.ready.then(() => { isReady = true; }); expect(isReady).toBe(false); yield flushPromises(); expect(isReady).toBe(true); app.$destroy(); })); it('should be ready after the value is loaded from the store', () => __awaiter(void 0, void 0, void 0, function* () { yield storeMock.setItem('age', 27); const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); expect(result.isReady.value).toBe(false); expect(result.state.value).toBe(0); yield flushPromises(); expect(result.isReady.value).toBe(true); expect(result.state.value).toBe(27); app.$destroy(); })); it('should update the state when the value is updated', () => __awaiter(void 0, void 0, void 0, function* () { const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); expect(result.state.value).toBe(0); yield flushPromises(); result.state.value = 27; expect(result.state.value).toBe(27); yield flushPromises(); app.$destroy(); })); it('should update the state when the value is updated somewhere else', () => __awaiter(void 0, void 0, void 0, function* () { const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); const [result2, app2] = mockLoadComposableInApp(() => useAsyncSharedState('age', 0)); expect(result.state.value).toBe(0); yield flushPromises(); result2.state.value = 27; yield flushPromises(); expect(result.state.value).toBe(27); yield flushPromises(); app.$destroy(); app2.$destroy(); })); it('should support deep reactivity with objects', () => __awaiter(void 0, void 0, void 0, function* () { const initialValue = { user: { name: 'John', age: 30 } }; const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('user', initialValue)); expect(result.state.value).toEqual(initialValue); yield flushPromises(); // Update nested property result.state.value.user.age = 31; expect(result.state.value.user.age).toBe(31); expect(result.state.value.user.name).toBe('John'); // Update entire nested object result.state.value.user = { name: 'Jane', age: 25 }; expect(result.state.value.user).toEqual({ name: 'Jane', age: 25 }); yield flushPromises(); app.$destroy(); })); it('should support deep reactivity with objects and update the state somewhere else', () => __awaiter(void 0, void 0, void 0, function* () { const initialValue = { user: { name: 'John', age: 30 } }; const [result, app] = mockLoadComposableInApp(() => useAsyncSharedState('user', initialValue)); const [result2, app2] = mockLoadComposableInApp(() => useAsyncSharedState('user', initialValue)); expect(result.state.value).toEqual(initialValue); yield flushPromises(); // Update nested property result2.state.value.user.age = 31; yield flushPromises(); expect(result.state.value.user.age).toBe(31); expect(result.state.value.user.name).toBe('John'); // Update entire nested object result.state.value.user = { name: 'Jane', age: 25 }; expect(result.state.value.user).toEqual({ name: 'Jane', age: 25 }); yield flushPromises(); app.$destroy(); app2.$destroy(); })); }); //# sourceMappingURL=useAsyncSharedState.spec.js.map