@@ -26,6 +26,7 @@ import {
2626 getTagListByOrderWeight ,
2727 getUberConnectionErrorDirectlyFromPolicy ,
2828 getUnitRateValue ,
29+ hasConfiguredRules ,
2930 hasDependentTags ,
3031 hasDynamicExternalWorkflow ,
3132 hasIndependentTags ,
@@ -2449,4 +2450,195 @@ describe('PolicyUtils', () => {
24492450 expect ( hasIndependentTags ( policy , undefined ) ) . toBe ( false ) ;
24502451 } ) ;
24512452 } ) ;
2453+
2454+ describe ( 'hasConfiguredRules' , ( ) => {
2455+ it ( 'returns false when policy is undefined' , ( ) => {
2456+ expect ( hasConfiguredRules ( undefined ) ) . toBe ( false ) ;
2457+ } ) ;
2458+
2459+ it ( 'returns false when policy has no rules configured' , ( ) => {
2460+ expect ( hasConfiguredRules ( { } as Policy ) ) . toBe ( false ) ;
2461+ } ) ;
2462+
2463+ describe ( 'customRules' , ( ) => {
2464+ it ( 'returns true when customRules is non-empty' , ( ) => {
2465+ expect ( hasConfiguredRules ( { customRules : 'some rule' } as Policy ) ) . toBe ( true ) ;
2466+ } ) ;
2467+
2468+ it ( 'returns false when customRules is an empty string' , ( ) => {
2469+ expect ( hasConfiguredRules ( { customRules : '' } as Policy ) ) . toBe ( false ) ;
2470+ } ) ;
2471+
2472+ it ( 'returns false when customRules is only whitespace' , ( ) => {
2473+ expect ( hasConfiguredRules ( { customRules : ' ' } as Policy ) ) . toBe ( false ) ;
2474+ } ) ;
2475+ } ) ;
2476+
2477+ describe ( 'rules.approvalRules' , ( ) => {
2478+ it ( 'returns true when approvalRules has items' , ( ) => {
2479+ const policy = { rules : { approvalRules : [ { id : '1' , applyWhen : [ ] , approver : 'approver@test.com' } ] } } as unknown as Policy ;
2480+ expect ( hasConfiguredRules ( policy ) ) . toBe ( true ) ;
2481+ } ) ;
2482+
2483+ it ( 'returns false when approvalRules is empty' , ( ) => {
2484+ expect ( hasConfiguredRules ( { rules : { approvalRules : [ ] } } as unknown as Policy ) ) . toBe ( false ) ;
2485+ } ) ;
2486+ } ) ;
2487+
2488+ describe ( 'rules.expenseRules' , ( ) => {
2489+ it ( 'returns true when expenseRules has items' , ( ) => {
2490+ const policy = {
2491+ rules : {
2492+ expenseRules : [
2493+ {
2494+ id : '1' ,
2495+ applyWhen : [ ] ,
2496+ tax : { field_id_TAX : { externalID : 'TAX_US' } } ,
2497+ } ,
2498+ ] ,
2499+ } ,
2500+ } as unknown as Policy ;
2501+ expect ( hasConfiguredRules ( policy ) ) . toBe ( true ) ;
2502+ } ) ;
2503+
2504+ it ( 'returns false when expenseRules is empty' , ( ) => {
2505+ expect ( hasConfiguredRules ( { rules : { expenseRules : [ ] } } as unknown as Policy ) ) . toBe ( false ) ;
2506+ } ) ;
2507+ } ) ;
2508+
2509+ describe ( 'rules.codingRules' , ( ) => {
2510+ it ( 'returns true when codingRules has entries' , ( ) => {
2511+ const policy = {
2512+ rules : {
2513+ codingRules : {
2514+ rule1 : {
2515+ ruleID : 'rule1' ,
2516+ filters : { left : 'merchant' , operator : CONST . SEARCH . SYNTAX_OPERATORS . EQUAL_TO , right : 'Starbucks' } ,
2517+ } ,
2518+ } ,
2519+ } ,
2520+ } as unknown as Policy ;
2521+ expect ( hasConfiguredRules ( policy ) ) . toBe ( true ) ;
2522+ } ) ;
2523+
2524+ it ( 'returns false when codingRules is empty' , ( ) => {
2525+ expect ( hasConfiguredRules ( { rules : { codingRules : { } } } as unknown as Policy ) ) . toBe ( false ) ;
2526+ } ) ;
2527+ } ) ;
2528+
2529+ describe ( 'maxExpenseAmount' , ( ) => {
2530+ it ( 'returns true when maxExpenseAmount is set to a non-default value' , ( ) => {
2531+ expect ( hasConfiguredRules ( { maxExpenseAmount : 500000 } as Policy ) ) . toBe ( true ) ;
2532+ } ) ;
2533+
2534+ it ( 'returns false when maxExpenseAmount is the default value' , ( ) => {
2535+ expect ( hasConfiguredRules ( { maxExpenseAmount : CONST . POLICY . DEFAULT_MAX_EXPENSE_AMOUNT } as Policy ) ) . toBe ( false ) ;
2536+ } ) ;
2537+
2538+ it ( 'returns false when maxExpenseAmount is the disabled value' , ( ) => {
2539+ expect ( hasConfiguredRules ( { maxExpenseAmount : CONST . DISABLED_MAX_EXPENSE_VALUE } as Policy ) ) . toBe ( false ) ;
2540+ } ) ;
2541+ } ) ;
2542+
2543+ describe ( 'maxExpenseAge' , ( ) => {
2544+ it ( 'returns true when maxExpenseAge is set to a non-default value' , ( ) => {
2545+ expect ( hasConfiguredRules ( { maxExpenseAge : 30 } as Policy ) ) . toBe ( true ) ;
2546+ } ) ;
2547+
2548+ it ( 'returns false when maxExpenseAge is the default value' , ( ) => {
2549+ expect ( hasConfiguredRules ( { maxExpenseAge : CONST . POLICY . DEFAULT_MAX_EXPENSE_AGE } as Policy ) ) . toBe ( false ) ;
2550+ } ) ;
2551+
2552+ it ( 'returns false when maxExpenseAge is the disabled value' , ( ) => {
2553+ expect ( hasConfiguredRules ( { maxExpenseAge : CONST . DISABLED_MAX_EXPENSE_VALUE } as Policy ) ) . toBe ( false ) ;
2554+ } ) ;
2555+ } ) ;
2556+
2557+ describe ( 'maxExpenseAmountNoReceipt' , ( ) => {
2558+ it ( 'returns true when maxExpenseAmountNoReceipt is set to a non-default value' , ( ) => {
2559+ expect ( hasConfiguredRules ( { maxExpenseAmountNoReceipt : 5000 } as Policy ) ) . toBe ( true ) ;
2560+ } ) ;
2561+
2562+ it ( 'returns false when maxExpenseAmountNoReceipt is the default value' , ( ) => {
2563+ expect ( hasConfiguredRules ( { maxExpenseAmountNoReceipt : CONST . POLICY . DEFAULT_MAX_AMOUNT_NO_RECEIPT } as Policy ) ) . toBe ( false ) ;
2564+ } ) ;
2565+
2566+ it ( 'returns false when maxExpenseAmountNoReceipt is the disabled value' , ( ) => {
2567+ expect ( hasConfiguredRules ( { maxExpenseAmountNoReceipt : CONST . DISABLED_MAX_EXPENSE_VALUE } as Policy ) ) . toBe ( false ) ;
2568+ } ) ;
2569+ } ) ;
2570+
2571+ describe ( 'maxExpenseAmountNoItemizedReceipt' , ( ) => {
2572+ it ( 'returns true when maxExpenseAmountNoItemizedReceipt is set to a non-default value' , ( ) => {
2573+ expect ( hasConfiguredRules ( { maxExpenseAmountNoItemizedReceipt : 10000 } as Policy ) ) . toBe ( true ) ;
2574+ } ) ;
2575+
2576+ it ( 'returns false when maxExpenseAmountNoItemizedReceipt is the default value' , ( ) => {
2577+ expect ( hasConfiguredRules ( { maxExpenseAmountNoItemizedReceipt : CONST . POLICY . DEFAULT_MAX_AMOUNT_NO_ITEMIZED_RECEIPT } as Policy ) ) . toBe ( false ) ;
2578+ } ) ;
2579+
2580+ it ( 'returns false when maxExpenseAmountNoItemizedReceipt is the disabled value' , ( ) => {
2581+ expect ( hasConfiguredRules ( { maxExpenseAmountNoItemizedReceipt : CONST . DISABLED_MAX_EXPENSE_VALUE } as Policy ) ) . toBe ( false ) ;
2582+ } ) ;
2583+ } ) ;
2584+
2585+ describe ( 'defaultBillable' , ( ) => {
2586+ it ( 'returns true when defaultBillable is true' , ( ) => {
2587+ expect ( hasConfiguredRules ( { defaultBillable : true } as Policy ) ) . toBe ( true ) ;
2588+ } ) ;
2589+
2590+ it ( 'returns false when defaultBillable is false' , ( ) => {
2591+ expect ( hasConfiguredRules ( { defaultBillable : false } as Policy ) ) . toBe ( false ) ;
2592+ } ) ;
2593+ } ) ;
2594+
2595+ describe ( 'defaultReimbursable' , ( ) => {
2596+ it ( 'returns true when defaultReimbursable is false' , ( ) => {
2597+ expect ( hasConfiguredRules ( { defaultReimbursable : false } as Policy ) ) . toBe ( true ) ;
2598+ } ) ;
2599+
2600+ it ( 'returns false when defaultReimbursable is true' , ( ) => {
2601+ expect ( hasConfiguredRules ( { defaultReimbursable : true } as Policy ) ) . toBe ( false ) ;
2602+ } ) ;
2603+ } ) ;
2604+
2605+ describe ( 'eReceipts' , ( ) => {
2606+ it ( 'returns true when eReceipts is true' , ( ) => {
2607+ expect ( hasConfiguredRules ( { eReceipts : true } as Policy ) ) . toBe ( true ) ;
2608+ } ) ;
2609+
2610+ it ( 'returns false when eReceipts is false' , ( ) => {
2611+ expect ( hasConfiguredRules ( { eReceipts : false } as Policy ) ) . toBe ( false ) ;
2612+ } ) ;
2613+ } ) ;
2614+
2615+ describe ( 'requireCompanyCardsEnabled' , ( ) => {
2616+ it ( 'returns true when requireCompanyCardsEnabled is true' , ( ) => {
2617+ expect ( hasConfiguredRules ( { requireCompanyCardsEnabled : true } as Policy ) ) . toBe ( true ) ;
2618+ } ) ;
2619+
2620+ it ( 'returns false when requireCompanyCardsEnabled is false' , ( ) => {
2621+ expect ( hasConfiguredRules ( { requireCompanyCardsEnabled : false } as Policy ) ) . toBe ( false ) ;
2622+ } ) ;
2623+ } ) ;
2624+
2625+ describe ( 'prohibitedExpenses' , ( ) => {
2626+ it ( 'returns true when a prohibitedExpenses value differs from its default' , ( ) => {
2627+ // alcohol defaults to false — setting it to true triggers the rule
2628+ expect ( hasConfiguredRules ( { prohibitedExpenses : { alcohol : true } } as Policy ) ) . toBe ( true ) ;
2629+ } ) ;
2630+
2631+ it ( 'returns true when gambling is disabled (differs from default true)' , ( ) => {
2632+ expect ( hasConfiguredRules ( { prohibitedExpenses : { gambling : false } } as Policy ) ) . toBe ( true ) ;
2633+ } ) ;
2634+
2635+ it ( 'returns false when prohibitedExpenses matches all defaults' , ( ) => {
2636+ expect ( hasConfiguredRules ( { prohibitedExpenses : { ...CONST . POLICY . DEFAULT_PROHIBITED_EXPENSES } } as Policy ) ) . toBe ( false ) ;
2637+ } ) ;
2638+
2639+ it ( 'returns false when prohibitedExpenses is an empty object' , ( ) => {
2640+ expect ( hasConfiguredRules ( { prohibitedExpenses : { } } as Policy ) ) . toBe ( false ) ;
2641+ } ) ;
2642+ } ) ;
2643+ } ) ;
24522644} ) ;
0 commit comments