@shopware-ag/meteor-admin-sdk
Version:
The Meteor SDK for the Shopware Administration.
209 lines • 10.8 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", "worker_threads", "vue", "flush-promises", "localforage"], factory);
}
})(function (require, exports) {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
Object.defineProperty(exports, "__esModule", { value: true });
const worker_threads_1 = require("worker_threads");
const vue_1 = __importDefault(require("vue"));
const flush_promises_1 = __importDefault(require("flush-promises"));
const localforage_1 = __importDefault(require("localforage"));
vue_1.default.config.devtools = false;
vue_1.default.config.productionTip = false;
let useAsyncSharedState;
function mockLoadComposableInApp(composable) {
let result;
const app = new vue_1.default({
setup() {
result = composable();
return () => { };
},
});
app.$mount(document.createElement('div'));
return [result, app];
}
describe('useAsyncSharedState composable', () => {
const storeMock = localforage_1.default.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 __syncRequire ? Promise.resolve().then(() => __importStar(require('./useAsyncSharedState'))) : new Promise((resolve_1, reject_1) => { require(['./useAsyncSharedState'], resolve_1, reject_1); }).then(__importStar)).useAsyncSharedState;
const setExtensions = yield (yield __syncRequire ? Promise.resolve().then(() => __importStar(require('../../channel'))) : new Promise((resolve_2, reject_2) => { require(['../../channel'], resolve_2, reject_2); }).then(__importStar)).setExtensions;
setExtensions({
'test-extension': {
baseUrl: 'http://localhost',
permissions: {},
},
});
}));
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
// @ts-expect-error - Mocking BroadcastChannel
global.BroadcastChannel = worker_threads_1.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 (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
result.state.value = 27;
expect(result.state.value).toBe(27);
yield (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
result2.state.value = 27;
yield (0, flush_promises_1.default)();
expect(result.state.value).toBe(27);
yield (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
// 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 (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
// Update nested property
result2.state.value.user.age = 31;
yield (0, flush_promises_1.default)();
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 (0, flush_promises_1.default)();
app.$destroy();
app2.$destroy();
}));
});
});
//# sourceMappingURL=useAsyncSharedState.spec.js.map