import React from 'react';
import { beforeEach, describe, expect, it } from 'vitest'
import { render, cleanup } from '@testing-library/preact';
import { lml2jsx } from '../core';
import { LML } from '../types';
import { h } from 'preact';
describe('LML - Sanitization', () => {
let errors: string[] = [];
beforeEach(() => {
errors = [];
});
const MyCpt = (props: { title: string, className?: string, children?: any }) => {
const { title, className, children } = props;
return
}
function getJSX(v: LML) {
return lml2jsx(v, h, () => MyCpt, (msg) => {
errors.push(msg);
});
}
function printJSX(jsxContent: JSX.Element | string | null | (JSX.Element | string)[]) {
cleanup();
let container = render(jsxContent);
return container.baseElement.innerHTML;
}
function print(v: LML) {
return printJSX((getJSX(v)));
}
it('should not raise errors for valid elements', async () => {
getJSX("abcd");
expect(errors).toMatchObject([]);
getJSX(["abcd"]);
expect(errors).toMatchObject([]);
getJSX(["#span", "abcd"]);
expect(errors).toMatchObject([]);
});
it('should raise error for unauthorized elements', async () => {
expect(print(["#script", "alert(1)"])).toBe('');
expect(errors).toMatchObject([
"Unauthorized element: script"
]);
errors = [];
getJSX(["*script", "alert(1)"]);
expect(errors).toMatchObject([]); // ok for a component
});
it('should raise an error for unauthorized attributes', async () => {
getJSX(["#span", { "class": "ok" }, "abcd"]);
expect(errors).toMatchObject([]); // ok
expect(print(["#span", { "class": "ok", "style": { "color": "red" } }, "abcd"])).toBe('abcd
');
expect(errors).toMatchObject([
"Unauthorized element attribute: style"
]);
});
it('should raise an error for unauthorized event handler', async () => {
expect(print(["#span", { "class": "ok", "onclick": "alert(1)" }, "abcd"])).toBe('abcd
');
expect(errors).toMatchObject([
"Unauthorized event handler: onclick"
]);
});
it('should check url attributes', async () => {
expect(print(["#img", { "src": "http://foo.com/myimage.png" }, "abcd"])).toBe('');
expect(errors).toMatchObject([]); // ok
expect(print(["#img", { "src": "javascript:alert(1)" }, "abcd"])).toBe('');
expect(errors).toMatchObject([
'Unauthorized URL: src="javascript:alert(1)"'
]);
errors=[];
expect(print(["#img", { "src": "data:text/html:..." }, "abcd"])).toBe('');
expect(errors).toMatchObject([
'Unauthorized URL: src="data:text/html:..."'
]);
});
});