diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js index 2754e41c43..b7691b8d31 100644 --- a/web_src/js/utils.test.js +++ b/web_src/js/utils.test.js @@ -2,8 +2,18 @@ import { basename, extname, isObject, stripTags, parseIssueHref, parseUrl, translateMonth, translateDay, blobToDataURI, toAbsoluteUrl, encodeURLEncodedBase64, decodeURLEncodedBase64, + isDarkTheme, getCurrentLocale, parseDom, serializeXml, sleep, } from './utils.js'; +afterEach(() => { + // Reset head and body sections of the document + document.documentElement.innerHTML = ''; + + // Remove 'lang' and 'style' attributes of html tag + document.documentElement.removeAttribute('lang'); + document.documentElement.removeAttribute('style'); +}); + test('basename', () => { expect(basename('/path/to/file.js')).toEqual('file.js'); expect(basename('/path/to/file')).toEqual('file'); @@ -22,6 +32,31 @@ test('isObject', () => { expect(isObject([])).toBeFalsy(); }); +test('should return true if dark theme is enabled', () => { + // When --is-dark-theme var is defined with value true + document.documentElement.style.setProperty('--is-dark-theme', 'true'); + expect(isDarkTheme()).toBeTruthy(); + + // when --is-dark-theme var is defined with value TRUE + document.documentElement.style.setProperty('--is-dark-theme', 'TRUE'); + expect(isDarkTheme()).toBeTruthy(); +}); + +test('should return false if dark theme is disabled', () => { + // when --is-dark-theme var is defined with value false + document.documentElement.style.setProperty('--is-dark-theme', 'false'); + expect(isDarkTheme()).toBeFalsy(); + + // when --is-dark-theme var is defined with value FALSE + document.documentElement.style.setProperty('--is-dark-theme', 'FALSE'); + expect(isDarkTheme()).toBeFalsy(); +}); + +test('should return false if dark theme is not defined', () => { + // when --is-dark-theme var is not exist + expect(isDarkTheme()).toBeFalsy(); +}); + test('stripTags', () => { expect(stripTags('test')).toEqual('test'); }); @@ -56,6 +91,15 @@ test('parseUrl', () => { expect(parseUrl('https://localhost/path?search#hash').hash).toEqual('#hash'); }); +test('getCurrentLocale', () => { + // HTML document without explicit lang + expect(getCurrentLocale()).toEqual(''); + + // HTML document with explicit lang + document.documentElement.setAttribute('lang', 'en-US'); + expect(getCurrentLocale()).toEqual('en-US'); +}); + test('translateMonth', () => { const originalLang = document.documentElement.lang; document.documentElement.lang = 'en-US'; @@ -86,10 +130,9 @@ test('blobToDataURI', async () => { test('toAbsoluteUrl', () => { expect(toAbsoluteUrl('//host/dir')).toEqual('http://host/dir'); expect(toAbsoluteUrl('https://host/dir')).toEqual('https://host/dir'); - + expect(toAbsoluteUrl('http://host/dir')).toEqual('http://host/dir'); expect(toAbsoluteUrl('')).toEqual('http://localhost:3000'); expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo'); - expect(() => toAbsoluteUrl('path')).toThrowError('unsupported'); }); @@ -112,3 +155,39 @@ test('encodeURLEncodedBase64, decodeURLEncodedBase64', () => { expect(Array.from(decodeURLEncodedBase64('YQ'))).toEqual(Array.from(uint8array('a'))); expect(Array.from(decodeURLEncodedBase64('YQ=='))).toEqual(Array.from(uint8array('a'))); }); + +test('parseDom', () => { + const paragraphStr = 'This is sample paragraph'; + const paragraphTagStr = `

${paragraphStr}

`; + const content = parseDom(paragraphTagStr, 'text/html'); + expect(content.body.innerHTML).toEqual(paragraphTagStr); + + // Content should have only one paragraph + const paragraphs = content.getElementsByTagName('p'); + expect(paragraphs.length).toEqual(1); + expect(paragraphs[0].textContent).toEqual(paragraphStr); +}); + +test('serializeXml', () => { + const textStr = 'This is a sample text'; + const tagName = 'item'; + const node = document.createElement(tagName); + node.textContent = textStr; + expect(serializeXml(node)).toEqual(`<${tagName}>${textStr}`); +}); + +test('sleep', async () => { + // Test 500 ms sleep + await testSleep(500); + + // Test 2000 ms sleep + await testSleep(2000); +}); + +async function testSleep(ms) { + const startTime = Date.now(); // Record the start time + await sleep(ms); + const endTime = Date.now(); // Record the end time + const actualSleepTime = endTime - startTime; + expect(Math.abs(actualSleepTime - ms) <= 15).toBeTruthy(); +}