@@ -6,15 +6,36 @@ import CONST from '@src/CONST';
66
77jest . mock ( '@libs/API' ) ;
88
9- const mockAPI = API as jest . Mocked < typeof API > ;
9+ const mockWrite = jest . mocked ( API . write ) ;
1010
1111const LAYOUT_OPTION_NVP_NAME = 'expensify_layoutOption' ;
1212const GROUP_BY_OPTION_NVP_NAME = 'expensify_groupByOption' ;
1313
14+ function isRecord ( value : unknown ) : value is Record < PropertyKey , unknown > {
15+ return typeof value === 'object' && value !== null ;
16+ }
17+
18+ function isSetNameValuePairsParams ( value : unknown ) : value is SetNameValuePairsParams {
19+ return isRecord ( value ) && 'nameValuePairs' in value && typeof value . nameValuePairs === 'string' ;
20+ }
21+
22+ function isStringRecord ( value : unknown ) : value is Record < string , string > {
23+ return isRecord ( value ) && Object . values ( value ) . every ( ( entry ) => typeof entry === 'string' ) ;
24+ }
25+
1426const getWrittenNameValuePairs = ( callIndex = 0 ) => {
15- const call = mockAPI . write . mock . calls . at ( callIndex ) ;
16- const params = call ?. [ 1 ] as SetNameValuePairsParams | undefined ;
17- return params ? ( JSON . parse ( params . nameValuePairs ) as Record < string , string > ) : { } ;
27+ const call = mockWrite . mock . calls . at ( callIndex ) ;
28+ const params = call ?. [ 1 ] ;
29+ if ( ! isSetNameValuePairsParams ( params ) ) {
30+ return { } ;
31+ }
32+
33+ const parsed : unknown = JSON . parse ( params . nameValuePairs ) ;
34+ if ( ! isStringRecord ( parsed ) ) {
35+ return { } ;
36+ }
37+
38+ return parsed ;
1839} ;
1940
2041describe ( 'getReportLayoutGroupBy' , ( ) => {
@@ -45,14 +66,14 @@ describe('getReportLayoutGroupBy', () => {
4566
4667describe ( 'setReportLayout' , ( ) => {
4768 beforeEach ( ( ) => {
48- mockAPI . write . mockClear ( ) ;
69+ mockWrite . mockClear ( ) ;
4970 } ) ;
5071
5172 it ( 'writes layoutOption=matrix and clears groupByOption atomically when None is selected' , ( ) => {
5273 setReportLayout ( CONST . REPORT_LAYOUT . LAYOUT_OPTION . MATRIX , null , CONST . REPORT_LAYOUT . GROUP_BY . TAG ) ;
5374
54- expect ( mockAPI . write ) . toHaveBeenCalledTimes ( 1 ) ;
55- expect ( mockAPI . write . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
75+ expect ( mockWrite ) . toHaveBeenCalledTimes ( 1 ) ;
76+ expect ( mockWrite . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
5677 expect ( getWrittenNameValuePairs ( ) ) . toEqual ( {
5778 [ LAYOUT_OPTION_NVP_NAME ] : CONST . REPORT_LAYOUT . LAYOUT_OPTION . MATRIX ,
5879 [ GROUP_BY_OPTION_NVP_NAME ] : '' ,
@@ -62,16 +83,16 @@ describe('setReportLayout', () => {
6283 it ( 'writes only groupByOption when Category or Tag is selected without a prior matrix layout' , ( ) => {
6384 setReportLayout ( CONST . REPORT_LAYOUT . GROUP_BY . TAG , null , null ) ;
6485
65- expect ( mockAPI . write ) . toHaveBeenCalledTimes ( 1 ) ;
66- expect ( mockAPI . write . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
86+ expect ( mockWrite ) . toHaveBeenCalledTimes ( 1 ) ;
87+ expect ( mockWrite . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
6788 expect ( getWrittenNameValuePairs ( ) ) . toEqual ( { [ GROUP_BY_OPTION_NVP_NAME ] : CONST . REPORT_LAYOUT . GROUP_BY . TAG } ) ;
6889 } ) ;
6990
7091 it ( 'clears the matrix layout atomically when switching from None back to Category or Tag' , ( ) => {
7192 setReportLayout ( CONST . REPORT_LAYOUT . GROUP_BY . CATEGORY , CONST . REPORT_LAYOUT . LAYOUT_OPTION . MATRIX , null ) ;
7293
73- expect ( mockAPI . write ) . toHaveBeenCalledTimes ( 1 ) ;
74- expect ( mockAPI . write . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
94+ expect ( mockWrite ) . toHaveBeenCalledTimes ( 1 ) ;
95+ expect ( mockWrite . mock . calls . at ( 0 ) ?. [ 0 ] ) . toBe ( WRITE_COMMANDS . SET_NAME_VALUE_PAIRS ) ;
7596 expect ( getWrittenNameValuePairs ( ) ) . toEqual ( {
7697 [ GROUP_BY_OPTION_NVP_NAME ] : CONST . REPORT_LAYOUT . GROUP_BY . CATEGORY ,
7798 [ LAYOUT_OPTION_NVP_NAME ] : '' ,
@@ -81,7 +102,7 @@ describe('setReportLayout', () => {
81102 it ( 'never falls back to the singular SetNameValuePair command' , ( ) => {
82103 setReportLayout ( CONST . REPORT_LAYOUT . GROUP_BY . TAG , null , null ) ;
83104
84- expect ( mockAPI . write ) . not . toHaveBeenCalledWith ( WRITE_COMMANDS . SET_NAME_VALUE_PAIR , expect . any ( Object ) , expect . any ( Object ) ) ;
105+ expect ( mockWrite ) . not . toHaveBeenCalledWith ( WRITE_COMMANDS . SET_NAME_VALUE_PAIR , expect . any ( Object ) , expect . any ( Object ) ) ;
85106 } ) ;
86107} ) ;
87108
0 commit comments