@@ -4,7 +4,9 @@ import CONST from '@src/CONST';
44import IntlStore from '@src/languages/IntlStore' ;
55import ONYXKEYS from '@src/ONYXKEYS' ;
66import type { Attendee } from '@src/types/onyx/IOU' ;
7+ import type { CustomUnit , Rate } from '@src/types/onyx/Policy' ;
78import type { ReportCollectionDataSet } from '@src/types/onyx/Report' ;
9+ import type { TransactionCustomUnit } from '@src/types/onyx/Transaction' ;
810import * as TransactionUtils from '../../src/libs/TransactionUtils' ;
911import type { Policy , Transaction } from '../../src/types/onyx' ;
1012import createRandomPolicy , { createCategoryTaxExpenseRules } from '../utils/collections/policies' ;
@@ -69,6 +71,40 @@ const reportCollectionDataSet: ReportCollectionDataSet = {
6971 [ `${ ONYXKEYS . COLLECTION . REPORT } ${ FAKE_APPROVED_REPORT_ID } ` ] : approvedReport ,
7072 [ `${ ONYXKEYS . COLLECTION . REPORT } ${ FAKE_OPEN_REPORT_SECOND_USER_ID } ` ] : secondUserOpenReport ,
7173} ;
74+ const defaultDistanceRatePolicyID1 : Record < string , Rate > = {
75+ customUnitRateID1 : {
76+ currency : 'USD' ,
77+ customUnitRateID : 'customUnitRateID1' ,
78+ enabled : true ,
79+ name : 'Default Rate' ,
80+ rate : 70 ,
81+ subRates : [ ] ,
82+ } ,
83+ } ;
84+ const distanceRateTransactionID1 : TransactionCustomUnit = {
85+ customUnitID : 'customUnitID1' ,
86+ customUnitRateID : 'customUnitRateID1' ,
87+ distanceUnit : 'mi' ,
88+ name : 'Distance' ,
89+ } ;
90+ const distanceRateTransactionID2 : TransactionCustomUnit = {
91+ customUnitID : 'customUnitID2' ,
92+ customUnitRateID : 'customUnitRateID2' ,
93+ distanceUnit : 'mi' ,
94+ name : 'Distance' ,
95+ } ;
96+ const defaultCustomUnitPolicyID1 : Record < string , CustomUnit > = {
97+ customUnitID1 : {
98+ attributes : {
99+ unit : 'mi' ,
100+ } ,
101+ customUnitID : 'customUnitID1' ,
102+ defaultCategory : 'Car' ,
103+ enabled : true ,
104+ name : 'Distance' ,
105+ rates : defaultDistanceRatePolicyID1 ,
106+ } ,
107+ } ;
72108
73109describe ( 'TransactionUtils' , ( ) => {
74110 beforeAll ( ( ) => {
@@ -520,4 +556,94 @@ describe('TransactionUtils', () => {
520556 expect ( result ) . toEqual ( expected ) ;
521557 } ) ;
522558 } ) ;
559+
560+ describe ( 'isUnreportedAndHasInvalidDistanceRateTransaction' , ( ) => {
561+ it ( 'should be false when transaction is null' , ( ) => {
562+ const fakePolicy : Policy = {
563+ ...createRandomPolicy ( 0 ) ,
564+ customUnits : defaultCustomUnitPolicyID1 ,
565+ } ;
566+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( null , fakePolicy ) ;
567+ expect ( result ) . toBe ( false ) ;
568+ } ) ;
569+ it ( 'should be false when transaction is not distance type transaction' , ( ) => {
570+ const fakePolicy : Policy = {
571+ ...createRandomPolicy ( 0 ) ,
572+ customUnits : defaultCustomUnitPolicyID1 ,
573+ } ;
574+ const transaction : Transaction = {
575+ ...generateTransaction ( ) ,
576+ iouRequestType : CONST . IOU . REQUEST_TYPE . MANUAL ,
577+ } ;
578+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( transaction , fakePolicy ) ;
579+ expect ( result ) . toBe ( false ) ;
580+ } ) ;
581+ it ( 'should be false when transaction is reported' , ( ) => {
582+ const fakePolicy : Policy = {
583+ ...createRandomPolicy ( 0 ) ,
584+ customUnits : defaultCustomUnitPolicyID1 ,
585+ } ;
586+ const transaction : Transaction = {
587+ ...generateTransaction ( ) ,
588+ iouRequestType : CONST . IOU . REQUEST_TYPE . DISTANCE ,
589+ reportID : '1' ,
590+ } ;
591+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( transaction , fakePolicy ) ;
592+ expect ( result ) . toBe ( false ) ;
593+ } ) ;
594+ it ( 'should be false when transaction is unreported and has valid rate' , ( ) => {
595+ const fakePolicy : Policy = {
596+ ...createRandomPolicy ( 0 ) ,
597+ customUnits : defaultCustomUnitPolicyID1 ,
598+ } ;
599+ const transaction : Transaction = {
600+ ...generateTransaction ( ) ,
601+ iouRequestType : CONST . IOU . REQUEST_TYPE . DISTANCE ,
602+ reportID : '0' ,
603+ comment : {
604+ customUnit : distanceRateTransactionID1 ,
605+ type : 'customUnit' ,
606+ } ,
607+ } ;
608+
609+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( transaction , fakePolicy ) ;
610+ expect ( result ) . toBe ( false ) ;
611+ } ) ;
612+ it ( 'should be false when transaction is unreported, has invalid rate but policy has default rate' , ( ) => {
613+ const fakePolicy : Policy = {
614+ ...createRandomPolicy ( 0 ) ,
615+ customUnits : defaultCustomUnitPolicyID1 ,
616+ } ;
617+ const transaction : Transaction = {
618+ ...generateTransaction ( ) ,
619+ iouRequestType : CONST . IOU . REQUEST_TYPE . DISTANCE ,
620+ reportID : '0' ,
621+ comment : {
622+ customUnit : distanceRateTransactionID2 ,
623+ type : 'customUnit' ,
624+ } ,
625+ } ;
626+
627+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( transaction , fakePolicy ) ;
628+ expect ( result ) . toBe ( false ) ;
629+ } ) ;
630+ it ( 'should be true when transaction is unreported, has invalid rate and policy has no default rate' , ( ) => {
631+ const fakePolicy : Policy = {
632+ ...createRandomPolicy ( 0 ) ,
633+ customUnits : { } ,
634+ } ;
635+ const transaction : Transaction = {
636+ ...generateTransaction ( ) ,
637+ iouRequestType : CONST . IOU . REQUEST_TYPE . DISTANCE ,
638+ reportID : '0' ,
639+ comment : {
640+ customUnit : distanceRateTransactionID2 ,
641+ type : 'customUnit' ,
642+ } ,
643+ } ;
644+
645+ const result = TransactionUtils . isUnreportedAndHasInvalidDistanceRateTransaction ( transaction , fakePolicy ) ;
646+ expect ( result ) . toBe ( true ) ;
647+ } ) ;
648+ } ) ;
523649} ) ;
0 commit comments