Skip to content

Commit

Permalink
Merge pull request apex-enterprise-patterns#10 from OrtooApps/feature…
Browse files Browse the repository at this point in the history
…/tweaks-to-error-renderer

Feature/tweaks to error renderer
  • Loading branch information
rob-baillie-ortoo committed Jan 26, 2022
2 parents ae97c73 + a2c351c commit 4a2e1d4
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,22 @@ describe( 'configureSortableFields', () => {
expect( call ).toThrow( 'configureSortableFields called with a property (columnsProperty) that is not an Array of Objects.' );
});

// given an error, will dispatch it
// throws an exception - e.g. the object is immutable, will dispatch an error
it( 'when given an error, will report that error and return', () => {

const columns = [
{}
];

const objectToRunAgainst = {
columnsProperty: columns
};
const sortableColumns = [ 'field1', 'field2' ];

const error = 'This is an error';

DatatableHelper.configureSortableFields.call( objectToRunAgainst, 'columnsProperty', sortableColumns, error );

expect( displayError.mock.calls[0][0] ).toBe( 'This is an error' );
expect( displayError.mock.calls[0][1]?.title ).toBe( 'Sorting configuration error' );
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const configureSortableFields = function( columnsPropertyName, fields, error ) {

if ( error ) {

displayError.call( this, error, errorTitle );
displayError.call( this, error, { title: errorTitle } );

} else if ( fields ) {

Expand All @@ -48,7 +48,7 @@ const configureSortableFields = function( columnsPropertyName, fields, error ) {
);
refreshConfiguration.call( this, columnsPropertyName );
} catch ( e ) {
displayError.call( this, e, errorTitle );
displayError.call( this, e, { title: errorTitle } );
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ describe('displayError', () => {
expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( error );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];
Expand Down Expand Up @@ -59,6 +60,7 @@ describe('displayError', () => {
expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( 'javascript error format' );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];
Expand Down Expand Up @@ -89,6 +91,127 @@ describe('displayError', () => {
expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( 'An error message in the body' );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];

expect( reportedError ).toBe( error );
});

it( 'When given an options with a messagePrefix set, will use that to prefix the message and the rest defaulted', () => {

console.error = jest.fn();

const objectToRunAgainst = {
dispatchEvent: jest.fn()
};

const error = 'An error string';
const options = {
messagePrefix: 'Prefix'
};

displayError.call( objectToRunAgainst, error, options );

expect( objectToRunAgainst.dispatchEvent ).toBeCalled();

const dispatchedEvent = objectToRunAgainst.dispatchEvent.mock.calls[0][0];

expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( 'Prefix: An error string' );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];

expect( reportedError ).toBe( error );
});

it( 'When given an options with a variant set, will use that variant and the rest defaulted', () => {

console.error = jest.fn();

const objectToRunAgainst = {
dispatchEvent: jest.fn()
};

const error = 'An error string';
const options = {
variant: 'warning'
};

displayError.call( objectToRunAgainst, error, options );

expect( objectToRunAgainst.dispatchEvent ).toBeCalled();

const dispatchedEvent = objectToRunAgainst.dispatchEvent.mock.calls[0][0];

expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( 'An error string' );
expect( dispatchedEvent.detail.variant ).toBe( 'warning' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];

expect( reportedError ).toBe( error );
});

it( 'When given an options with title set, will use that as the title and the rest defaulted', () => {

console.error = jest.fn();

const objectToRunAgainst = {
dispatchEvent: jest.fn()
};

const error = 'An error string';
const options = {
title: 'replacement title'
};

displayError.call( objectToRunAgainst, error, options );

expect( objectToRunAgainst.dispatchEvent ).toBeCalled();

const dispatchedEvent = objectToRunAgainst.dispatchEvent.mock.calls[0][0];

expect( dispatchedEvent.detail.title ).toBe( options.title );
expect( dispatchedEvent.detail.message ).toBe( error );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'sticky' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];

expect( reportedError ).toBe( error );
});

it( 'When given an options with a mode set, will use that mode and the rest defaulted', () => {

console.error = jest.fn();

const objectToRunAgainst = {
dispatchEvent: jest.fn()
};

const error = 'An error string';
const options = {
mode: 'pester'
};

displayError.call( objectToRunAgainst, error, options );

expect( objectToRunAgainst.dispatchEvent ).toBeCalled();

const dispatchedEvent = objectToRunAgainst.dispatchEvent.mock.calls[0][0];

expect( dispatchedEvent.detail.title ).toBe( 'c.ortoo_core_error_title' );
expect( dispatchedEvent.detail.message ).toBe( 'An error string' );
expect( dispatchedEvent.detail.variant ).toBe( 'error' );
expect( dispatchedEvent.detail.mode ).toBe( 'pester' );

expect( console.error ).toHaveBeenCalledTimes( 1 );
const reportedError = console.error.mock.calls[0][0];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ import ERROR_TITLE from '@salesforce/label/c.ortoo_core_error_title';
/**
* When bound to a Lightning Web Component, will render the given error object.
*/
const displayError = function( error, title ) {
const displayError = function( error, options ) {

title = title ? title : ERROR_TITLE;
const title = options?.title ? options.title : ERROR_TITLE;
const messagePrefix = options?.messagePrefix ? options.messagePrefix + ': ' : '';
const mode = options?.mode ? options.mode : 'sticky';
const variant = options?.variant ? options.variant : 'error';

// By default we assume we have a string for the error
let message = error;
Expand All @@ -30,8 +33,9 @@ const displayError = function( error, title ) {

const toastEvent = new ShowToastEvent({
title: title,
message: message,
variant: 'error',
message: messagePrefix + message,
variant: variant,
mode: mode,
});
this.dispatchEvent( toastEvent );
}
Expand Down

0 comments on commit 4a2e1d4

Please sign in to comment.