2021-04-08 13:41:57 +03:00
import {
2023-08-31 05:46:44 +03:00
basename , extname , isObject , stripTags , parseIssueHref ,
2023-04-03 19:58:09 +03:00
parseUrl , translateMonth , translateDay , blobToDataURI ,
2023-06-06 08:29:37 +03:00
toAbsoluteUrl , encodeURLEncodedBase64 , decodeURLEncodedBase64 ,
2024-06-27 18:46:46 +03:00
isDarkTheme , getCurrentLocale , parseDom , serializeXml , sleep ,
2021-04-08 13:41:57 +03:00
} from './utils.js' ;
2024-06-27 18:46:46 +03:00
afterEach ( ( ) => {
// Reset head and body sections of the document
document . documentElement . innerHTML = '<head></head><body></body>' ;
// Remove 'lang' and 'style' attributes of html tag
document . documentElement . removeAttribute ( 'lang' ) ;
document . documentElement . removeAttribute ( 'style' ) ;
} ) ;
2021-04-08 13:41:57 +03:00
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 ( 'isObject' , ( ) => {
2022-10-14 16:36:16 +03:00
expect ( isObject ( { } ) ) . toBeTruthy ( ) ;
expect ( isObject ( [ ] ) ) . toBeFalsy ( ) ;
2021-04-08 13:41:57 +03:00
} ) ;
2024-06-27 18:46:46 +03:00
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 ( ) ;
} ) ;
2021-04-08 13:41:57 +03:00
test ( 'stripTags' , ( ) => {
expect ( stripTags ( '<a>test</a>' ) ) . toEqual ( 'test' ) ;
} ) ;
2021-10-22 17:34:01 +03:00
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 } ) ;
} ) ;
2022-06-09 14:15:08 +03:00
2022-08-23 15:58:04 +03:00
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' ) ;
} ) ;
2022-10-28 16:48:24 +03:00
2024-06-27 18:46:46 +03:00
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' ) ;
} ) ;
2022-10-28 16:48:24 +03:00
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 ;
} ) ;
2022-11-21 12:59:42 +03:00
test ( 'blobToDataURI' , async ( ) => {
const blob = new Blob ( [ JSON . stringify ( { test : true } ) ] , { type : 'application/json' } ) ;
expect ( await blobToDataURI ( blob ) ) . toEqual ( 'data:application/json;base64,eyJ0ZXN0Ijp0cnVlfQ==' ) ;
} ) ;
2023-02-06 21:09:18 +03:00
test ( 'toAbsoluteUrl' , ( ) => {
2023-02-07 19:08:44 +03:00
expect ( toAbsoluteUrl ( '//host/dir' ) ) . toEqual ( 'http://host/dir' ) ;
expect ( toAbsoluteUrl ( 'https://host/dir' ) ) . toEqual ( 'https://host/dir' ) ;
2024-06-27 18:46:46 +03:00
expect ( toAbsoluteUrl ( 'http://host/dir' ) ) . toEqual ( 'http://host/dir' ) ;
2023-02-06 21:09:18 +03:00
expect ( toAbsoluteUrl ( '' ) ) . toEqual ( 'http://localhost:3000' ) ;
expect ( toAbsoluteUrl ( '/user/repo' ) ) . toEqual ( 'http://localhost:3000/user/repo' ) ;
2023-02-07 19:08:44 +03:00
expect ( ( ) => toAbsoluteUrl ( 'path' ) ) . toThrowError ( 'unsupported' ) ;
2023-02-06 21:09:18 +03:00
} ) ;
2023-06-06 08:29:37 +03:00
test ( 'encodeURLEncodedBase64, decodeURLEncodedBase64' , ( ) => {
2023-08-30 04:56:44 +03:00
// TextEncoder is Node.js API while Uint8Array is jsdom API and their outputs are not
// structurally comparable, so we convert to array to compare. The conversion can be
// removed once https://github.com/jsdom/jsdom/issues/2524 is resolved.
const encoder = new TextEncoder ( ) ;
const uint8array = encoder . encode . bind ( encoder ) ;
2023-06-07 14:20:18 +03:00
expect ( encodeURLEncodedBase64 ( uint8array ( 'AA?' ) ) ) . toEqual ( 'QUE_' ) ; // standard base64: "QUE/"
expect ( encodeURLEncodedBase64 ( uint8array ( 'AA~' ) ) ) . toEqual ( 'QUF-' ) ; // standard base64: "QUF+"
2023-08-30 04:56:44 +03:00
expect ( Array . from ( decodeURLEncodedBase64 ( 'QUE/' ) ) ) . toEqual ( Array . from ( uint8array ( 'AA?' ) ) ) ;
expect ( Array . from ( decodeURLEncodedBase64 ( 'QUF+' ) ) ) . toEqual ( Array . from ( uint8array ( 'AA~' ) ) ) ;
expect ( Array . from ( decodeURLEncodedBase64 ( 'QUE_' ) ) ) . toEqual ( Array . from ( uint8array ( 'AA?' ) ) ) ;
expect ( Array . from ( decodeURLEncodedBase64 ( 'QUF-' ) ) ) . toEqual ( Array . from ( uint8array ( 'AA~' ) ) ) ;
2023-06-07 14:20:18 +03:00
expect ( encodeURLEncodedBase64 ( uint8array ( 'a' ) ) ) . toEqual ( 'YQ' ) ; // standard base64: "YQ=="
2023-08-30 04:56:44 +03:00
expect ( Array . from ( decodeURLEncodedBase64 ( 'YQ' ) ) ) . toEqual ( Array . from ( uint8array ( 'a' ) ) ) ;
expect ( Array . from ( decodeURLEncodedBase64 ( 'YQ==' ) ) ) . toEqual ( Array . from ( uint8array ( 'a' ) ) ) ;
2023-06-06 08:29:37 +03:00
} ) ;
2024-06-27 18:46:46 +03:00
test ( 'parseDom' , ( ) => {
const paragraphStr = 'This is sample paragraph' ;
const paragraphTagStr = ` <p> ${ paragraphStr } </p> ` ;
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 } </ ${ tagName } > ` ) ;
} ) ;
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 ( ) ;
}