33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import { test } from 'node:test';
|
|||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import { getCallInBrowserUrl, resolveWebAppUrl } from './callInBrowser';
|
||
|
|
|
||
|
|
test('resolveWebAppUrl keeps an https origin (+ path) without a trailing slash', () => {
|
||
|
|
assert.equal(resolveWebAppUrl('https://chat.example.org'), 'https://chat.example.org');
|
||
|
|
assert.equal(resolveWebAppUrl('https://chat.example.org/'), 'https://chat.example.org');
|
||
|
|
assert.equal(resolveWebAppUrl('https://example.org/chat/'), 'https://example.org/chat');
|
||
|
|
assert.equal(resolveWebAppUrl('https://chat.example.org/?x=1#y'), 'https://chat.example.org');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('resolveWebAppUrl rejects anything but absolute https', () => {
|
||
|
|
[
|
||
|
|
undefined,
|
||
|
|
null,
|
||
|
|
1,
|
||
|
|
'',
|
||
|
|
' ',
|
||
|
|
'/home',
|
||
|
|
'http://chat.example.org',
|
||
|
|
'not a url',
|
||
|
|
['javascript', 'alert(1)'].join(':'),
|
||
|
|
'data:text/html,x',
|
||
|
|
].forEach((v) => assert.equal(resolveWebAppUrl(v), undefined, String(v)));
|
||
|
|
});
|
||
|
|
|
||
|
|
test('getCallInBrowserUrl points at the room in the web app (no auto-join)', () => {
|
||
|
|
const url = getCallInBrowserUrl('https://chat.example.org', '!room:example.org');
|
||
|
|
assert.equal(url, 'https://chat.example.org/home/!room%3Aexample.org');
|
||
|
|
assert.ok(!/join|call=/i.test(url ?? ''));
|
||
|
|
assert.equal(getCallInBrowserUrl(undefined, '!room:example.org'), undefined);
|
||
|
|
});
|