2018-09-03 15:25:38 +00:00
|
|
|
/*
|
|
|
|
* @format
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
2018-10-11 18:45:01 +00:00
|
|
|
import { isReportDataEmpty, getReportChartData, getSummaryNumbers } from '../utils';
|
2018-09-03 15:25:38 +00:00
|
|
|
|
|
|
|
describe( 'isReportDataEmpty()', () => {
|
|
|
|
it( 'returns false if report is valid', () => {
|
|
|
|
const report = {
|
|
|
|
data: {
|
|
|
|
totals: {
|
|
|
|
orders_count: 10,
|
|
|
|
num_items_sold: 9,
|
|
|
|
},
|
|
|
|
intervals: [ 0, 1, 2 ],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
expect( isReportDataEmpty( report ) ).toEqual( false );
|
|
|
|
} );
|
|
|
|
it( 'returns true if report object is undefined', () => {
|
|
|
|
expect( isReportDataEmpty( undefined ) ).toEqual( true );
|
|
|
|
} );
|
|
|
|
it( 'returns true if data response object is missing', () => {
|
|
|
|
expect( isReportDataEmpty( {} ) ).toEqual( true );
|
|
|
|
} );
|
|
|
|
it( 'returns true if totals response object is missing', () => {
|
|
|
|
expect( isReportDataEmpty( { data: {} } ) ).toEqual( true );
|
|
|
|
} );
|
|
|
|
it( 'returns true if intervals response object is empty', () => {
|
|
|
|
expect( isReportDataEmpty( { data: { intervals: [], totals: 2 } } ) ).toEqual( true );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
2018-10-10 13:57:16 +00:00
|
|
|
describe( 'getReportChartData()', () => {
|
2018-09-03 15:25:38 +00:00
|
|
|
const select = jest.fn().mockReturnValue( {} );
|
|
|
|
const response = {
|
Add loading indicators, error state, and EmptyContent to the revenue report. (#347, woocommerce/woocommerce-admin#348)
* Add loading indiciators for the revenue report.
* Improve accessibility, and fix up some documentation comments.
* Fix top border on mobile
* Add EmptyContent Component and revenue error/empty states. (https://github.com/woocommerce/woocommerce-admin/pull/348)
* Add EmptyContent Component and revenue error/empty states.
* Move relative image handling to ImageAsset, combine secondary and primary action rendering, add some missing isRequired proptypes, add empty error handling.
* Handle PR Feedback: Clean up button css, set a default for illustration, fix deprecation typo, some code cleanup.
2018-09-05 16:45:49 +00:00
|
|
|
isEmpty: false,
|
2018-09-03 15:25:38 +00:00
|
|
|
isError: false,
|
|
|
|
isRequesting: false,
|
|
|
|
data: {
|
|
|
|
totals: null,
|
|
|
|
intervals: [],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
beforeAll( () => {
|
|
|
|
select( 'wc-admin' ).getReportStats = jest.fn().mockReturnValue( {} );
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting = jest.fn().mockReturnValue( false );
|
|
|
|
select( 'wc-admin' ).isReportStatsError = jest.fn().mockReturnValue( false );
|
|
|
|
} );
|
|
|
|
|
|
|
|
afterAll( () => {
|
|
|
|
select( 'wc-admin' ).getReportStats.mockRestore();
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting.mockRestore();
|
|
|
|
select( 'wc-admin' ).isReportStatsError.mockRestore();
|
|
|
|
} );
|
|
|
|
|
|
|
|
function setGetReportStats( func ) {
|
|
|
|
select( 'wc-admin' ).getReportStats.mockImplementation( ( ...args ) => func( ...args ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
function setIsReportStatsRequesting( func ) {
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting.mockImplementation( ( ...args ) =>
|
|
|
|
func( ...args )
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function setIsReportStatsError( func ) {
|
|
|
|
select( 'wc-admin' ).isReportStatsError.mockImplementation( ( ...args ) => func( ...args ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
it( 'returns isRequesting if first request is in progress', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return true;
|
|
|
|
} );
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
expect( result ).toEqual( { ...response, isRequesting: true } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns isError if first request errors', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return true;
|
|
|
|
} );
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
expect( result ).toEqual( { ...response, isError: true } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns results after single page of data', () => {
|
|
|
|
const data = {
|
|
|
|
totals: {
|
|
|
|
orders_count: 115,
|
|
|
|
gross_revenue: 13966.92,
|
|
|
|
},
|
|
|
|
intervals: [
|
|
|
|
{
|
|
|
|
interval: 'day',
|
|
|
|
date_start: '2018-07-01 00:00:00',
|
|
|
|
subtotals: {
|
|
|
|
orders_count: 115,
|
|
|
|
gross_revenue: 13966.92,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setGetReportStats( () => {
|
|
|
|
return {
|
|
|
|
totalResults: 1,
|
|
|
|
data,
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
expect( result ).toEqual( { ...response, data: { ...data } } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns combined results for multiple pages of data', () => {
|
|
|
|
const totalResults = 110;
|
|
|
|
const orders_count = 115;
|
|
|
|
const gross_revenue = 13966.92;
|
|
|
|
const intervals = [];
|
|
|
|
for ( let i = 0; i < totalResults; i++ ) {
|
|
|
|
intervals.push( {
|
|
|
|
interval: 'day',
|
|
|
|
date_start: '2018-07-01 00:00:00',
|
|
|
|
subtotals: { orders_count, gross_revenue },
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
const totals = {
|
|
|
|
orders_count: orders_count * totalResults,
|
|
|
|
gross_revenue: gross_revenue * totalResults,
|
|
|
|
};
|
|
|
|
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setGetReportStats( ( endpoint, query ) => {
|
|
|
|
if ( 2 === query.page ) {
|
|
|
|
return {
|
|
|
|
totalResults,
|
|
|
|
data: {
|
|
|
|
totals,
|
|
|
|
intervals: intervals.slice( 100, 110 ),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
totalResults,
|
|
|
|
data: {
|
|
|
|
totals,
|
|
|
|
intervals: intervals.slice( 0, 100 ),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const actualResponse = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
const expectedResponse = {
|
|
|
|
...response,
|
|
|
|
data: {
|
|
|
|
totals,
|
|
|
|
intervals,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
expect( actualResponse ).toEqual( expectedResponse );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns isRequesting if additional requests are in progress', () => {
|
|
|
|
setIsReportStatsRequesting( ( endpoint, query ) => {
|
|
|
|
if ( 2 === query.page ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
expect( result ).toEqual( { ...response, isRequesting: true } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns isError if additional requests return an error', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( ( endpoint, query ) => {
|
|
|
|
if ( 2 === query.page ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
} );
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
2018-09-03 15:25:38 +00:00
|
|
|
expect( result ).toEqual( { ...response, isError: true } );
|
|
|
|
} );
|
Add loading indicators, error state, and EmptyContent to the revenue report. (#347, woocommerce/woocommerce-admin#348)
* Add loading indiciators for the revenue report.
* Improve accessibility, and fix up some documentation comments.
* Fix top border on mobile
* Add EmptyContent Component and revenue error/empty states. (https://github.com/woocommerce/woocommerce-admin/pull/348)
* Add EmptyContent Component and revenue error/empty states.
* Move relative image handling to ImageAsset, combine secondary and primary action rendering, add some missing isRequired proptypes, add empty error handling.
* Handle PR Feedback: Clean up button css, set a default for illustration, fix deprecation typo, some code cleanup.
2018-09-05 16:45:49 +00:00
|
|
|
|
|
|
|
it( 'returns empty state if a query returns no data', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setGetReportStats( () => {
|
|
|
|
return {
|
|
|
|
totalResults: undefined,
|
|
|
|
data: {},
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getReportChartData( 'revenue', 'primary', {}, select );
|
Add loading indicators, error state, and EmptyContent to the revenue report. (#347, woocommerce/woocommerce-admin#348)
* Add loading indiciators for the revenue report.
* Improve accessibility, and fix up some documentation comments.
* Fix top border on mobile
* Add EmptyContent Component and revenue error/empty states. (https://github.com/woocommerce/woocommerce-admin/pull/348)
* Add EmptyContent Component and revenue error/empty states.
* Move relative image handling to ImageAsset, combine secondary and primary action rendering, add some missing isRequired proptypes, add empty error handling.
* Handle PR Feedback: Clean up button css, set a default for illustration, fix deprecation typo, some code cleanup.
2018-09-05 16:45:49 +00:00
|
|
|
expect( result ).toEqual( { ...response, isEmpty: true } );
|
|
|
|
} );
|
2018-09-03 15:25:38 +00:00
|
|
|
} );
|
2018-10-11 18:45:01 +00:00
|
|
|
|
|
|
|
describe( 'getSummaryNumbers()', () => {
|
|
|
|
const select = jest.fn().mockReturnValue( {} );
|
|
|
|
const response = {
|
|
|
|
isError: false,
|
|
|
|
isRequesting: false,
|
|
|
|
totals: {
|
|
|
|
primary: null,
|
|
|
|
secondary: null,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const query = {
|
|
|
|
after: '2018-10-10',
|
|
|
|
before: '2018-10-10',
|
|
|
|
period: 'custom',
|
|
|
|
compare: 'previous_period',
|
2018-10-11 18:45:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
beforeAll( () => {
|
|
|
|
select( 'wc-admin' ).getReportStats = jest.fn().mockReturnValue( {} );
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting = jest.fn().mockReturnValue( false );
|
|
|
|
select( 'wc-admin' ).isReportStatsError = jest.fn().mockReturnValue( false );
|
|
|
|
} );
|
|
|
|
|
|
|
|
afterAll( () => {
|
|
|
|
select( 'wc-admin' ).getReportStats.mockRestore();
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting.mockRestore();
|
|
|
|
select( 'wc-admin' ).isReportStatsError.mockRestore();
|
|
|
|
} );
|
|
|
|
|
|
|
|
function setGetReportStats( func ) {
|
|
|
|
select( 'wc-admin' ).getReportStats.mockImplementation( ( ...args ) => func( ...args ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
function setIsReportStatsRequesting( func ) {
|
|
|
|
select( 'wc-admin' ).isReportStatsRequesting.mockImplementation( ( ...args ) =>
|
|
|
|
func( ...args )
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function setIsReportStatsError( func ) {
|
|
|
|
select( 'wc-admin' ).isReportStatsError.mockImplementation( ( ...args ) => func( ...args ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
it( 'returns isRequesting if a request is in progress', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return true;
|
|
|
|
} );
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getSummaryNumbers( 'revenue', query, select );
|
2018-10-11 18:45:01 +00:00
|
|
|
expect( result ).toEqual( { ...response, isRequesting: true } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns isError if request errors', () => {
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return true;
|
|
|
|
} );
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getSummaryNumbers( 'revenue', query, select );
|
2018-10-11 18:45:01 +00:00
|
|
|
expect( result ).toEqual( { ...response, isError: true } );
|
|
|
|
} );
|
|
|
|
|
|
|
|
it( 'returns results after queries finish', () => {
|
|
|
|
const totals = {
|
|
|
|
primary: {
|
|
|
|
orders_count: 115,
|
|
|
|
gross_revenue: 13966.92,
|
|
|
|
},
|
|
|
|
secondary: {
|
|
|
|
orders_count: 85,
|
|
|
|
gross_revenue: 10406.1,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
setIsReportStatsRequesting( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setIsReportStatsError( () => {
|
|
|
|
return false;
|
|
|
|
} );
|
|
|
|
setGetReportStats( () => {
|
|
|
|
return {
|
|
|
|
totals,
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
setGetReportStats( ( endpoint, _query ) => {
|
|
|
|
if ( '2018-10-10T00:00:00+00:00' === _query.after ) {
|
2018-10-11 18:45:01 +00:00
|
|
|
return {
|
|
|
|
data: {
|
|
|
|
totals: totals.primary,
|
|
|
|
intervals: [],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
data: {
|
|
|
|
totals: totals.secondary,
|
|
|
|
intervals: [],
|
|
|
|
},
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
|
2018-10-17 23:24:36 +00:00
|
|
|
const result = getSummaryNumbers( 'revenue', query, select );
|
2018-10-11 18:45:01 +00:00
|
|
|
expect( result ).toEqual( { ...response, totals } );
|
|
|
|
} );
|
|
|
|
} );
|