forgejo/web_src/js/utils.test.js
wxiaoguang 5cc0801de9
Introduce GitHub markdown editor, keep EasyMDE as fallback (#23876)
The first step of the plan

* #23290

Thanks to @silverwind for the first try in #15394 . Close #10729 and a
lot of related issues.

The EasyMDE is not removed, now it works as a fallback, users can switch
between these two editors.

Editor list:

* Issue / PR comment
* Issue / PR comment edit
* Issue / PR comment quote reply
* PR diff view, inline comment
* PR diff view, inline comment edit
* PR diff view, inline comment quote reply
* Release editor
* Wiki editor

Some editors have attached dropzone

Screenshots:

<details>


![image](https://user-images.githubusercontent.com/2114189/229363558-7e44dcd4-fb6d-48a0-92f8-bd12f57bb0a0.png)


![image](https://user-images.githubusercontent.com/2114189/229363566-781489c8-5306-4347-9714-d71af5d5b0b1.png)


![image](https://user-images.githubusercontent.com/2114189/229363771-1717bf5c-0f2a-4fc2-ba84-4f5b2a343a11.png)


![image](https://user-images.githubusercontent.com/2114189/229363793-ad362d0f-a045-47bd-8f9d-05a9a842bb39.png)

</details>

---------

Co-authored-by: silverwind <me@silverwind.io>
2023-04-03 18:06:57 +08:00

146 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {expect, test} from 'vitest';
import {
basename, extname, isObject, stripTags, joinPaths, parseIssueHref,
prettyNumber, parseUrl, translateMonth, translateDay, blobToDataURI,
toAbsoluteUrl,
} from './utils.js';
test('basename', () => {
expect(basename('/path/to/file.js')).toEqual('file.js');
expect(basename('/path/to/file')).toEqual('file');
expect(basename('file.js')).toEqual('file.js');
});
test('extname', () => {
expect(extname('/path/to/file.js')).toEqual('.js');
expect(extname('/path/')).toEqual('');
expect(extname('/path')).toEqual('');
expect(extname('file.js')).toEqual('.js');
});
test('joinPaths', () => {
expect(joinPaths('', '')).toEqual('');
expect(joinPaths('', 'b')).toEqual('b');
expect(joinPaths('', '/b')).toEqual('/b');
expect(joinPaths('', '/b/')).toEqual('/b/');
expect(joinPaths('a', '')).toEqual('a');
expect(joinPaths('/a', '')).toEqual('/a');
expect(joinPaths('/a/', '')).toEqual('/a/');
expect(joinPaths('a', 'b')).toEqual('a/b');
expect(joinPaths('a', '/b')).toEqual('a/b');
expect(joinPaths('/a', '/b')).toEqual('/a/b');
expect(joinPaths('/a', '/b')).toEqual('/a/b');
expect(joinPaths('/a/', '/b')).toEqual('/a/b');
expect(joinPaths('/a', '/b/')).toEqual('/a/b/');
expect(joinPaths('/a/', '/b/')).toEqual('/a/b/');
expect(joinPaths('', '', '')).toEqual('');
expect(joinPaths('', 'b', '')).toEqual('b');
expect(joinPaths('', 'b', 'c')).toEqual('b/c');
expect(joinPaths('', '', 'c')).toEqual('c');
expect(joinPaths('', '/b', '/c')).toEqual('/b/c');
expect(joinPaths('/a', '', '/c')).toEqual('/a/c');
expect(joinPaths('/a', '/b', '')).toEqual('/a/b');
expect(joinPaths('', '/')).toEqual('/');
expect(joinPaths('a', '/')).toEqual('a/');
expect(joinPaths('', '/', '/')).toEqual('/');
expect(joinPaths('/', '/')).toEqual('/');
expect(joinPaths('/', '')).toEqual('/');
expect(joinPaths('/', 'b')).toEqual('/b');
expect(joinPaths('/', 'b/')).toEqual('/b/');
expect(joinPaths('/', '', '/')).toEqual('/');
expect(joinPaths('/', 'b', '/')).toEqual('/b/');
expect(joinPaths('/', 'b/', '/')).toEqual('/b/');
expect(joinPaths('a', '/', '/')).toEqual('a/');
expect(joinPaths('/', '/', 'c')).toEqual('/c');
expect(joinPaths('/', '/', 'c/')).toEqual('/c/');
});
test('isObject', () => {
expect(isObject({})).toBeTruthy();
expect(isObject([])).toBeFalsy();
});
test('stripTags', () => {
expect(stripTags('<a>test</a>')).toEqual('test');
});
test('parseIssueHref', () => {
expect(parseIssueHref('/owner/repo/issues/1')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('/owner/repo/pulls/1?query')).toEqual({owner: 'owner', repo: 'repo', type: 'pulls', index: '1'});
expect(parseIssueHref('/owner/repo/issues/1#hash')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('/sub/owner/repo/issues/1')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('/sub/sub2/owner/repo/pulls/1')).toEqual({owner: 'owner', repo: 'repo', type: 'pulls', index: '1'});
expect(parseIssueHref('/sub/sub2/owner/repo/issues/1?query')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('/sub/sub2/owner/repo/issues/1#hash')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('https://example.com/owner/repo/issues/1')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('https://example.com/owner/repo/pulls/1?query')).toEqual({owner: 'owner', repo: 'repo', type: 'pulls', index: '1'});
expect(parseIssueHref('https://example.com/owner/repo/issues/1#hash')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('https://example.com/sub/owner/repo/issues/1')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/pulls/1')).toEqual({owner: 'owner', repo: 'repo', type: 'pulls', index: '1'});
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/issues/1?query')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/issues/1#hash')).toEqual({owner: 'owner', repo: 'repo', type: 'issues', index: '1'});
expect(parseIssueHref('')).toEqual({owner: undefined, repo: undefined, type: undefined, index: undefined});
});
test('prettyNumber', () => {
expect(prettyNumber()).toEqual('');
expect(prettyNumber(null)).toEqual('');
expect(prettyNumber(undefined)).toEqual('');
expect(prettyNumber('1200')).toEqual('');
expect(prettyNumber(12345678, 'en-US')).toEqual('12,345,678');
expect(prettyNumber(12345678, 'de-DE')).toEqual('12.345.678');
expect(prettyNumber(12345678, 'be-BE')).toEqual('12 345 678');
expect(prettyNumber(12345678, 'hi-IN')).toEqual('1,23,45,678');
});
test('parseUrl', () => {
expect(parseUrl('').pathname).toEqual('/');
expect(parseUrl('/path').pathname).toEqual('/path');
expect(parseUrl('/path?search').pathname).toEqual('/path');
expect(parseUrl('/path?search').search).toEqual('?search');
expect(parseUrl('/path?search#hash').hash).toEqual('#hash');
expect(parseUrl('https://localhost/path').pathname).toEqual('/path');
expect(parseUrl('https://localhost/path?search').pathname).toEqual('/path');
expect(parseUrl('https://localhost/path?search').search).toEqual('?search');
expect(parseUrl('https://localhost/path?search#hash').hash).toEqual('#hash');
});
test('translateMonth', () => {
const originalLang = document.documentElement.lang;
document.documentElement.lang = 'en-US';
expect(translateMonth(0)).toEqual('Jan');
expect(translateMonth(4)).toEqual('May');
document.documentElement.lang = 'es-ES';
expect(translateMonth(5)).toEqual('jun');
expect(translateMonth(6)).toEqual('jul');
document.documentElement.lang = originalLang;
});
test('translateDay', () => {
const originalLang = document.documentElement.lang;
document.documentElement.lang = 'fr-FR';
expect(translateDay(1)).toEqual('lun.');
expect(translateDay(5)).toEqual('ven.');
document.documentElement.lang = 'pl-PL';
expect(translateDay(1)).toEqual('pon.');
expect(translateDay(5)).toEqual('pt.');
document.documentElement.lang = originalLang;
});
test('blobToDataURI', async () => {
const blob = new Blob([JSON.stringify({test: true})], {type: 'application/json'});
expect(await blobToDataURI(blob)).toEqual('data:application/json;base64,eyJ0ZXN0Ijp0cnVlfQ==');
});
test('toAbsoluteUrl', () => {
expect(toAbsoluteUrl('//host/dir')).toEqual('http://host/dir');
expect(toAbsoluteUrl('https://host/dir')).toEqual('https://host/dir');
expect(toAbsoluteUrl('')).toEqual('http://localhost:3000');
expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo');
expect(() => toAbsoluteUrl('path')).toThrowError('unsupported');
});