@shopware-ag/meteor-admin-sdk
Version:
The Meteor SDK for the Shopware Administration.
170 lines • 7.68 kB
JavaScript
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