@schukai/monster
Version:
Monster is a simple library for creating fast, robust and lightweight websites.
105 lines (80 loc) • 3.51 kB
JavaScript
import * as chai from 'chai';
import {chaiDom} from "../../../util/chai-dom.mjs";
import {initJSDOM} from "../../../util/jsdom.mjs";
let expect = chai.expect;
chai.use(chaiDom);
let Dataset;
function buildDatasource(id, payload) {
const ds = document.createElement('monster-datasource-dom');
ds.id = id;
ds.innerHTML = `<script type="application/json">${JSON.stringify(payload)}</script>`;
return ds;
}
describe('Dataset writeBack sanitizer', function () {
before(async function () {
await initJSDOM();
await import("element-internals-polyfill").catch(() => {});
await import("../../../../source/components/datatable/datasource/dom.mjs");
const mod = await import("../../../../source/components/datatable/dataset.mjs");
Dataset = mod['DataSet'];
});
beforeEach(() => {
const mocks = document.getElementById('mocks');
mocks.innerHTML = '';
});
afterEach(() => {
const mocks = document.getElementById('mocks');
mocks.innerHTML = '';
});
it('sanitizes data before write and avoids side effects', async function () {
const mocks = document.getElementById('mocks');
const ds = buildDatasource('ds-sanitize', [{}]);
mocks.appendChild(ds);
const dataset = document.createElement('monster-dataset');
expect(dataset).is.instanceof(Dataset);
dataset.setOption('datasource.selector', '#ds-sanitize');
dataset.setOption('mapping.data', '');
const initial = {name: '', email: 'a@b', tags: []};
dataset.setOption('data', initial);
dataset.setOption('writeBack.transformer', 'call:sanitize');
dataset.setOption('writeBack.callbacks', {
sanitize: (obj) => {
for (const [key, value] of Object.entries(obj)) {
if (value === '' || value === null || value === undefined) {
delete obj[key];
continue;
}
if (Array.isArray(value) && value.length === 0) {
delete obj[key];
}
}
return obj;
},
});
mocks.appendChild(dataset);
await new Promise((resolve) => setTimeout(resolve, 30));
await dataset.write();
expect(ds.data[0]).deep.equal({email: 'a@b'});
const internal = dataset.getInternalUpdateCloneData();
expect(internal.data).deep.equal({name: '', email: 'a@b', tags: []});
expect(initial).deep.equal({name: '', email: 'a@b', tags: []});
});
it('uses original data when sanitizer returns undefined', async function () {
const mocks = document.getElementById('mocks');
const ds = buildDatasource('ds-undefined', [{}]);
mocks.appendChild(ds);
const dataset = document.createElement('monster-dataset');
dataset.setOption('datasource.selector', '#ds-undefined');
dataset.setOption('mapping.data', '');
const initial = {name: '', email: 'a@b'};
dataset.setOption('data', initial);
dataset.setOption('writeBack.transformer', 'call:noop');
dataset.setOption('writeBack.callbacks', {
noop: () => undefined,
});
mocks.appendChild(dataset);
await new Promise((resolve) => setTimeout(resolve, 30));
await dataset.write();
expect(ds.data[0]).deep.equal({name: '', email: 'a@b'});
});
});