Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

Commit

Permalink
Fixes for jest transpilation issues. (#10788)
Browse files Browse the repository at this point in the history
* Fix bug where is-plain-obj is not transpiled by Jest, update lock.
* Update packages.
* Mock useSelect for a handful of RichText selectors in test.
* Resolve react to single version to avoid invalid hook errors.
* Patch trim-html locally to avoid a bug in the released npm source.
* Mock out resizeObserver to avoid FezVrasta/react-resize-aware#58
* Don't transpile config package: node-config/node-config#628
  • Loading branch information
samueljseay authored Sep 5, 2023
1 parent b8b5977 commit 22cfa90
Show file tree
Hide file tree
Showing 7 changed files with 34,830 additions and 75,975 deletions.
157 changes: 157 additions & 0 deletions assets/js/base/components/read-more/trim-html.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
// Copy-pasted from https://github.com/brankosekulic/trimHtml/blob/master/index.js
// the published npm version of this code contains a bug that causes it throw exceptions.
export function trimHtml( html, options ) {
options = options || {};

const limit = options.limit || 100,
preserveTags =
typeof options.preserveTags !== 'undefined'
? options.preserveTags
: true,
wordBreak =
typeof options.wordBreak !== 'undefined'
? options.wordBreak
: false,
suffix = options.suffix || '...',
moreLink = options.moreLink || '',
moreText = options.moreText || '»',
preserveWhiteSpace = options.preserveWhiteSpace || false;

const arr = html
.replace( /</g, '\n<' )
.replace( />/g, '>\n' )
.replace( /\n\n/g, '\n' )
.replace( /^\n/g, '' )
.replace( /\n$/g, '' )
.split( '\n' );

let sum = 0,
row,
cut,
add,
rowCut,
tagMatch,
tagName,
// eslint-disable-next-line prefer-const
tagStack = [],
more = false;

for ( let i = 0; i < arr.length; i++ ) {
row = arr[ i ];

// count multiple spaces as one character
if ( ! preserveWhiteSpace ) {
rowCut = row.replace( /[ ]+/g, ' ' );
} else {
rowCut = row;
}

if ( ! row.length ) {
continue;
}

const charArr = getCharArr( rowCut );

if ( row[ 0 ] !== '<' ) {
if ( sum >= limit ) {
row = '';
} else if ( sum + charArr.length >= limit ) {
cut = limit - sum;

if ( charArr[ cut - 1 ] === ' ' ) {
while ( cut ) {
cut -= 1;
if ( charArr[ cut - 1 ] !== ' ' ) {
break;
}
}
} else {
add = charArr.slice( cut ).indexOf( ' ' );

// break on halh of word
if ( ! wordBreak ) {
if ( add !== -1 ) {
cut += add;
} else {
cut = row.length;
}
}
}

row = charArr.slice( 0, cut ).join( '' ) + suffix;

if ( moreLink ) {
row +=
'<a href="' +
moreLink +
'" style="display:inline">' +
moreText +
'</a>';
}

sum = limit;
more = true;
} else {
sum += charArr.length;
}
} else if ( ! preserveTags ) {
row = '';
} else if ( sum >= limit ) {
tagMatch = row.match( /[a-zA-Z]+/ );
tagName = tagMatch ? tagMatch[ 0 ] : '';

if ( tagName ) {
if ( row.substring( 0, 2 ) !== '</' ) {
tagStack.push( tagName );
row = '';
} else {
while (
tagStack[ tagStack.length - 1 ] !== tagName &&
tagStack.length
) {
tagStack.pop();
}

if ( tagStack.length ) {
row = '';
}

tagStack.pop();
}
} else {
row = '';
}
}

arr[ i ] = row;
}

return {
html: arr.join( '\n' ).replace( /\n/g, '' ),
more,
};
}

// count symbols like one char
function getCharArr( rowCut ) {
// eslint-disable-next-line prefer-const
let charArr = [],
subRow,
match,
char;

for ( let i = 0; i < rowCut.length; i++ ) {
subRow = rowCut.substring( i );
match = subRow.match( /^&[a-z0-9#]+;/ );

if ( match ) {
char = match[ 0 ];
charArr.push( char );
i += char.length - 1;
} else {
charArr.push( rowCut[ i ] );
}
}

return charArr;
}
7 changes: 5 additions & 2 deletions assets/js/base/components/read-more/utils.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
/**
* External dependencies
* Internal dependencies
*/
import trimHtml from 'trim-html';
import { trimHtml } from './trim-html';

/**
* External dependencies
*/
type Markers = {
end: number;
middle: number;
Expand Down
5 changes: 5 additions & 0 deletions assets/js/blocks/cart/test/block.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ import OrderSummarySubtotalBlock from '../inner-blocks/cart-order-summary-subtot
import OrderSummaryShippingBlock from '../inner-blocks/cart-order-summary-shipping/frontend';
import OrderSummaryTaxesBlock from '../inner-blocks/cart-order-summary-taxes/frontend';

jest.mock( '@wordpress/compose', () => ( {
...jest.requireActual( '@wordpress/compose' ),
useResizeObserver: jest.fn().mockReturnValue( [ null, { width: 0 } ] ),
} ) );

const CartBlock = ( {
attributes = {
showRateAfterTaxName: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,31 @@ import { render, queryByText } from '@testing-library/react';
* Internal dependencies
*/
import { Edit } from '../edit';
const blockSettingsMock = jest.requireMock( '@woocommerce/block-settings' );

jest.mock( '@wordpress/data', () => ( {
...jest.requireActual( '@wordpress/data' ),
useSelect: jest.fn().mockImplementation( ( fn ) => {
const select = () => {
return {
getSelectionStart: () => ( {
clientId: null,
} ),
getSelectionEnd: () => ( {
clientId: null,
} ),
getFormatTypes: () => [],
};
};

if ( typeof fn === 'function' ) {
return fn( select );
}

return {
isCaretWithinFormattedText: () => false,
};
} ),
} ) );

jest.mock( '@wordpress/block-editor', () => ( {
...jest.requireActual( '@wordpress/block-editor' ),
Expand All @@ -21,6 +45,8 @@ jest.mock( '@woocommerce/block-settings', () => ( {
TERMS_URL: '/terms-and-conditions',
} ) );

const blockSettingsMock = jest.requireMock( '@woocommerce/block-settings' );

describe( 'Edit', () => {
it( 'Renders a checkbox if the checkbox attribute is true', async () => {
const { container } = render(
Expand Down
Loading

0 comments on commit 22cfa90

Please sign in to comment.