mirror of
https://github.com/go-gitea/gitea.git
synced 2026-04-14 16:37:57 +02:00
This is the first step (the hardest part): * repo file list last commit message lazy load * admin server status monitor * watch/unwatch (normal page, watchers page) * star/unstar (normal page, watchers page) * project view, delete column * workflow dispatch, switch the branch * commit page: load branches and tags referencing this commit The legacy "data-redirect" attribute is removed, it only makes the page reload (sometimes using an incorrect link). Also did cleanup for some devtest pages.
139 lines
7.0 KiB
TypeScript
139 lines
7.0 KiB
TypeScript
import {
|
|
dirname, basename, extname, isObject, stripTags, parseIssueHref,
|
|
translateMonth, translateDay, blobToDataURI,
|
|
toAbsoluteUrl, encodeURLEncodedBase64, decodeURLEncodedBase64, isImageFile, isVideoFile, parseRepoOwnerPathInfo,
|
|
urlQueryEscape,
|
|
} from './utils.ts';
|
|
|
|
test('dirname', () => {
|
|
expect(dirname('/path/to/file.js')).toEqual('/path/to');
|
|
expect(dirname('/path/to')).toEqual('/path');
|
|
expect(dirname('file.js')).toEqual('');
|
|
});
|
|
|
|
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');
|
|
expect(extname('/my.path/file')).toEqual('');
|
|
});
|
|
|
|
test('isObject', () => {
|
|
expect(isObject({})).toBeTruthy();
|
|
expect(isObject([])).toBeFalsy();
|
|
});
|
|
|
|
test('stripTags', () => {
|
|
expect(stripTags('<a>test</a>')).toEqual('test');
|
|
});
|
|
|
|
test('urlQueryEscape', () => {
|
|
const input = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
|
|
const expected = '%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E_%60%7B%7C%7D~';
|
|
expect(urlQueryEscape(input)).toEqual(expected);
|
|
});
|
|
|
|
test('parseIssueHref', () => {
|
|
expect(parseIssueHref('/owner/repo/issues/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('/owner/repo/pulls/1?query')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'pulls', indexString: '1'});
|
|
expect(parseIssueHref('/owner/repo/issues/1#hash')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('/sub/owner/repo/issues/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('/sub/sub2/owner/repo/pulls/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'pulls', indexString: '1'});
|
|
expect(parseIssueHref('/sub/sub2/owner/repo/issues/1?query')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('/sub/sub2/owner/repo/issues/1#hash')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/owner/repo/issues/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/owner/repo/pulls/1?query')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'pulls', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/owner/repo/issues/1#hash')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/sub/owner/repo/issues/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/pulls/1')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'pulls', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/issues/1?query')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('https://example.com/sub/sub2/owner/repo/issues/1#hash')).toEqual({ownerName: 'owner', repoName: 'repo', pathType: 'issues', indexString: '1'});
|
|
expect(parseIssueHref('')).toEqual({ownerName: undefined, repoName: undefined, type: undefined, index: undefined});
|
|
});
|
|
|
|
test('parseRepoOwnerPathInfo', () => {
|
|
expect(parseRepoOwnerPathInfo('/owner/repo/issues/new')).toEqual({ownerName: 'owner', repoName: 'repo'});
|
|
expect(parseRepoOwnerPathInfo('/owner/repo/releases')).toEqual({ownerName: 'owner', repoName: 'repo'});
|
|
expect(parseRepoOwnerPathInfo('/other')).toEqual({});
|
|
window.config.appSubUrl = '/sub';
|
|
expect(parseRepoOwnerPathInfo('/sub/owner/repo/issues/new')).toEqual({ownerName: 'owner', repoName: 'repo'});
|
|
expect(parseRepoOwnerPathInfo('/sub/owner/repo/compare/feature/branch-1...fix/branch-2')).toEqual({ownerName: 'owner', repoName: 'repo'});
|
|
window.config.appSubUrl = '';
|
|
});
|
|
|
|
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')).toThrow('unsupported');
|
|
});
|
|
|
|
test('encodeURLEncodedBase64, decodeURLEncodedBase64', () => {
|
|
const encoder = new TextEncoder();
|
|
const uint8array = encoder.encode.bind(encoder);
|
|
|
|
expect(encodeURLEncodedBase64(uint8array('AA?'))).toEqual('QUE_'); // standard base64: "QUE/"
|
|
expect(encodeURLEncodedBase64(uint8array('AA~'))).toEqual('QUF-'); // standard base64: "QUF+"
|
|
|
|
expect(new Uint8Array(decodeURLEncodedBase64('QUE/'))).toEqual(uint8array('AA?'));
|
|
expect(new Uint8Array(decodeURLEncodedBase64('QUF+'))).toEqual(uint8array('AA~'));
|
|
expect(new Uint8Array(decodeURLEncodedBase64('QUE_'))).toEqual(uint8array('AA?'));
|
|
expect(new Uint8Array(decodeURLEncodedBase64('QUF-'))).toEqual(uint8array('AA~'));
|
|
|
|
expect(encodeURLEncodedBase64(uint8array('a'))).toEqual('YQ'); // standard base64: "YQ=="
|
|
expect(new Uint8Array(decodeURLEncodedBase64('YQ'))).toEqual(uint8array('a'));
|
|
expect(new Uint8Array(decodeURLEncodedBase64('YQ=='))).toEqual(uint8array('a'));
|
|
});
|
|
|
|
test('file detection', () => {
|
|
for (const name of ['a.avif', 'a.jpg', '/a.jpeg', '.file.png', '.webp', 'file.svg']) {
|
|
expect(isImageFile({name})).toBeTruthy();
|
|
}
|
|
for (const name of ['', 'a.jpg.x', '/path.png/x', 'webp']) {
|
|
expect(isImageFile({name})).toBeFalsy();
|
|
}
|
|
for (const name of ['a.mpg', '/a.mpeg', '.file.mp4', '.webm', 'file.mkv']) {
|
|
expect(isVideoFile({name})).toBeTruthy();
|
|
}
|
|
for (const name of ['', 'a.mpg.x', '/path.mp4/x', 'webm']) {
|
|
expect(isVideoFile({name})).toBeFalsy();
|
|
}
|
|
});
|