From cb080ac2b6b3244a00fe33b8cc518fcd0819e67f Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:22:02 +0530 Subject: [PATCH 01/13] Exclude all-held reports from Submit to-do count --- src/libs/actions/OnyxDerived/configs/todos.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/OnyxDerived/configs/todos.ts b/src/libs/actions/OnyxDerived/configs/todos.ts index 4c7489c1ef99..11d5942e1388 100644 --- a/src/libs/actions/OnyxDerived/configs/todos.ts +++ b/src/libs/actions/OnyxDerived/configs/todos.ts @@ -1,6 +1,6 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {isApproveAction, isExportAction, isPrimaryPayAction, isSubmitAction} from '@libs/ReportPrimaryActionUtils'; -import {hasOnlyNonReimbursableTransactions} from '@libs/ReportUtils'; +import {hasOnlyHeldExpenses, hasOnlyNonReimbursableTransactions} from '@libs/ReportUtils'; import createOnyxDerivedValueConfig from '@userActions/OnyxDerived/createOnyxDerivedValueConfig'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -58,7 +58,7 @@ const createTodosReportsAndTransactions = ({ const reportActions = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`] ?? []); const reportTransactions = transactionsByReportID[report.reportID] ?? []; const reportMetadata = allReportMetadata?.[`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`]; - if (isSubmitAction(report, reportTransactions, reportMetadata, policy, reportNameValuePair, undefined, login, currentUserAccountID)) { + if (isSubmitAction(report, reportTransactions, reportMetadata, policy, reportNameValuePair, undefined, login, currentUserAccountID) && !hasOnlyHeldExpenses(reportTransactions)) { reportsToSubmit.push(report); } if (isApproveAction(report, reportTransactions, currentUserAccountID, reportMetadata, policy)) { From fe670be5644487df9281286ced37a18e881c30a2 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:22:14 +0530 Subject: [PATCH 02/13] Exclude all-held reports from Approve to-do count --- src/libs/actions/OnyxDerived/configs/todos.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/OnyxDerived/configs/todos.ts b/src/libs/actions/OnyxDerived/configs/todos.ts index 11d5942e1388..1366196feffd 100644 --- a/src/libs/actions/OnyxDerived/configs/todos.ts +++ b/src/libs/actions/OnyxDerived/configs/todos.ts @@ -61,7 +61,7 @@ const createTodosReportsAndTransactions = ({ if (isSubmitAction(report, reportTransactions, reportMetadata, policy, reportNameValuePair, undefined, login, currentUserAccountID) && !hasOnlyHeldExpenses(reportTransactions)) { reportsToSubmit.push(report); } - if (isApproveAction(report, reportTransactions, currentUserAccountID, reportMetadata, policy)) { + if (isApproveAction(report, reportTransactions, currentUserAccountID, reportMetadata, policy) && !hasOnlyHeldExpenses(reportTransactions)) { reportsToApprove.push(report); } if ( From d2fa40e9d37c4454fa5e9bf94cc4bffd9f1a76f8 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:22:26 +0530 Subject: [PATCH 03/13] Exclude all-held reports from Pay to-do count --- src/libs/actions/OnyxDerived/configs/todos.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/OnyxDerived/configs/todos.ts b/src/libs/actions/OnyxDerived/configs/todos.ts index 1366196feffd..3403a568f75b 100644 --- a/src/libs/actions/OnyxDerived/configs/todos.ts +++ b/src/libs/actions/OnyxDerived/configs/todos.ts @@ -74,7 +74,8 @@ const createTodosReportsAndTransactions = ({ policy, reportNameValuePairs: reportNameValuePair, }) && - !hasOnlyNonReimbursableTransactions(report.reportID, reportTransactions) + !hasOnlyNonReimbursableTransactions(report.reportID, reportTransactions) && + !hasOnlyHeldExpenses(reportTransactions) ) { reportsToPay.push(report); } From b5f4b70d2fbaa70c8decef5b3f834e76ef9b95d5 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:23:02 +0530 Subject: [PATCH 04/13] Surface Remove Hold over Approve/Submit for all-held reports on report header --- src/libs/ReportPrimaryActionUtils.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index 9191a4e8d2c9..6f04bcb820e4 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -481,7 +481,12 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf Date: Wed, 3 Jun 2026 14:25:41 +0530 Subject: [PATCH 05/13] Add test: all-held report excluded from Submit to-do --- tests/unit/OnyxDerivedTest.tsx | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/unit/OnyxDerivedTest.tsx b/tests/unit/OnyxDerivedTest.tsx index e04d5c7f2544..ca58b426ded5 100644 --- a/tests/unit/OnyxDerivedTest.tsx +++ b/tests/unit/OnyxDerivedTest.tsx @@ -660,6 +660,63 @@ describe('OnyxDerived', () => { }); }); + describe('excludes reports with all expenses on hold', () => { + const HELD_SUBMIT_REPORT_ID = 'held_submit_1'; + const HELD_APPROVE_REPORT_ID = 'held_approve_1'; + const HELD_PAY_REPORT_ID = 'held_pay_1'; + + beforeEach(async () => { + const submitReport = createMockReport(HELD_SUBMIT_REPORT_ID, { + stateNum: CONST.REPORT.STATE_NUM.OPEN, + statusNum: CONST.REPORT.STATUS_NUM.OPEN, + ownerAccountID: CURRENT_USER_ACCOUNT_ID, + }); + const approveReport = createMockReport(HELD_APPROVE_REPORT_ID, { + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, + ownerAccountID: OTHER_USER_ACCOUNT_ID, + managerID: CURRENT_USER_ACCOUNT_ID, + }); + const payReport = createMockReport(HELD_PAY_REPORT_ID, { + stateNum: CONST.REPORT.STATE_NUM.APPROVED, + statusNum: CONST.REPORT.STATUS_NUM.APPROVED, + ownerAccountID: OTHER_USER_ACCOUNT_ID, + managerID: CURRENT_USER_ACCOUNT_ID, + total: -100, + }); + + const policy = createMockPolicy(POLICY_ID, { + approvalMode: CONST.POLICY.APPROVAL_MODE.BASIC, + role: CONST.POLICY.ROLE.ADMIN, + ownerAccountID: CURRENT_USER_ACCOUNT_ID, + reimbursementChoice: CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES, + }); + + const heldOverride: Partial = {comment: {hold: 'HOLD_ACTION_ID'}}; + + await Onyx.multiSet({ + [ONYXKEYS.SESSION]: { + email: CURRENT_USER_EMAIL, + accountID: CURRENT_USER_ACCOUNT_ID, + }, + [`${ONYXKEYS.COLLECTION.POLICY}${POLICY_ID}`]: policy, + [`${ONYXKEYS.COLLECTION.REPORT}${HELD_SUBMIT_REPORT_ID}`]: submitReport, + [`${ONYXKEYS.COLLECTION.REPORT}${HELD_APPROVE_REPORT_ID}`]: approveReport, + [`${ONYXKEYS.COLLECTION.REPORT}${HELD_PAY_REPORT_ID}`]: payReport, + [`${ONYXKEYS.COLLECTION.TRANSACTION}trans_${HELD_SUBMIT_REPORT_ID}`]: createMockTransaction(`trans_${HELD_SUBMIT_REPORT_ID}`, HELD_SUBMIT_REPORT_ID, heldOverride), + [`${ONYXKEYS.COLLECTION.TRANSACTION}trans_${HELD_APPROVE_REPORT_ID}`]: createMockTransaction(`trans_${HELD_APPROVE_REPORT_ID}`, HELD_APPROVE_REPORT_ID, heldOverride), + [`${ONYXKEYS.COLLECTION.TRANSACTION}trans_${HELD_PAY_REPORT_ID}`]: createMockTransaction(`trans_${HELD_PAY_REPORT_ID}`, HELD_PAY_REPORT_ID, heldOverride), + } as OnyxMultiSetInput); + + await waitForBatchedUpdates(); + }); + + it('excludes an all-held report from reportsToSubmit', async () => { + const todos = await OnyxUtils.get(ONYXKEYS.DERIVED.TODOS); + expect(todos?.reportsToSubmit.map((r) => r.reportID)).not.toContain(HELD_SUBMIT_REPORT_ID); + }); + }); + describe('categorizes reports correctly', () => { const SUBMIT_REPORT_IDS = ['submit_1', 'submit_2', 'submit_3', 'submit_4']; const APPROVE_REPORT_IDS = ['approve_1', 'approve_2', 'approve_3']; From 23f86b0aecfd710bb510a1c14661ef64b8ba0272 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:26:27 +0530 Subject: [PATCH 06/13] Add test: all-held report excluded from Approve to-do --- tests/unit/OnyxDerivedTest.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/unit/OnyxDerivedTest.tsx b/tests/unit/OnyxDerivedTest.tsx index ca58b426ded5..2444a8387d28 100644 --- a/tests/unit/OnyxDerivedTest.tsx +++ b/tests/unit/OnyxDerivedTest.tsx @@ -715,6 +715,11 @@ describe('OnyxDerived', () => { const todos = await OnyxUtils.get(ONYXKEYS.DERIVED.TODOS); expect(todos?.reportsToSubmit.map((r) => r.reportID)).not.toContain(HELD_SUBMIT_REPORT_ID); }); + + it('excludes an all-held report from reportsToApprove', async () => { + const todos = await OnyxUtils.get(ONYXKEYS.DERIVED.TODOS); + expect(todos?.reportsToApprove.map((r) => r.reportID)).not.toContain(HELD_APPROVE_REPORT_ID); + }); }); describe('categorizes reports correctly', () => { From b7cfffd15d13f5664d5aaa382e0b540e9849740c Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 14:26:50 +0530 Subject: [PATCH 07/13] Add test: all-held report excluded from Pay to-do --- tests/unit/OnyxDerivedTest.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/unit/OnyxDerivedTest.tsx b/tests/unit/OnyxDerivedTest.tsx index 2444a8387d28..63311c1e21b8 100644 --- a/tests/unit/OnyxDerivedTest.tsx +++ b/tests/unit/OnyxDerivedTest.tsx @@ -720,6 +720,11 @@ describe('OnyxDerived', () => { const todos = await OnyxUtils.get(ONYXKEYS.DERIVED.TODOS); expect(todos?.reportsToApprove.map((r) => r.reportID)).not.toContain(HELD_APPROVE_REPORT_ID); }); + + it('excludes an all-held report from reportsToPay', async () => { + const todos = await OnyxUtils.get(ONYXKEYS.DERIVED.TODOS); + expect(todos?.reportsToPay.map((r) => r.reportID)).not.toContain(HELD_PAY_REPORT_ID); + }); }); describe('categorizes reports correctly', () => { From 1692b25c91aeecd9a73593ce87a7c64c0a4059b1 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Wed, 3 Jun 2026 17:28:01 +0530 Subject: [PATCH 08/13] Guard approve and submit header actions when all expenses are held --- src/libs/ReportPrimaryActionUtils.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index 6f04bcb820e4..5f1a20c7d14e 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -481,12 +481,8 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf Date: Wed, 3 Jun 2026 17:28:01 +0530 Subject: [PATCH 09/13] Add test: report header returns Remove Hold for all-held approvable report --- tests/unit/ReportPrimaryActionUtilsTest.ts | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/tests/unit/ReportPrimaryActionUtilsTest.ts b/tests/unit/ReportPrimaryActionUtilsTest.ts index 580201428de1..06e692e49418 100644 --- a/tests/unit/ReportPrimaryActionUtilsTest.ts +++ b/tests/unit/ReportPrimaryActionUtilsTest.ts @@ -887,6 +887,80 @@ describe('getPrimaryAction', () => { ).toBe(CONST.REPORT.PRIMARY_ACTIONS.REMOVE_HOLD); }); + it('should return REMOVE HOLD over APPROVE when all expenses are held and the manager can unhold', async () => { + const MEMBER_ACCOUNT_ID = 2; + const HOLD_ACTION_ID = 'HOLD_ACTION_ID'; + const REPORT_ACTION_ID = 'REPORT_ACTION_ID'; + const TRANSACTION_ID = 'TRANSACTION_ID'; + const CHILD_REPORT_ID = 'CHILD_REPORT_ID'; + + const report = { + reportID: REPORT_ID, + type: CONST.REPORT.TYPE.EXPENSE, + ownerAccountID: MEMBER_ACCOUNT_ID, + managerID: CURRENT_USER_ACCOUNT_ID, + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, + } as unknown as Report; + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report); + + const policy = { + approver: CURRENT_USER_EMAIL, + approvalMode: CONST.POLICY.APPROVAL_MODE.BASIC, + } as unknown as Policy; + + const transaction = { + transactionID: TRANSACTION_ID, + reportID: `${REPORT_ID}`, + comment: { + hold: HOLD_ACTION_ID, + }, + } as unknown as Transaction; + + const reportAction = { + actionName: CONST.REPORT.ACTIONS.TYPE.IOU, + type: CONST.REPORT.ACTIONS.TYPE.IOU, + reportActionID: REPORT_ACTION_ID, + actorAccountID: MEMBER_ACCOUNT_ID, + childReportID: CHILD_REPORT_ID, + childType: CONST.REPORT.TYPE.CHAT, + message: [ + { + html: 'html', + }, + ], + originalMessage: { + type: CONST.IOU.REPORT_ACTION_TYPE.CREATE, + IOUTransactionID: TRANSACTION_ID, + }, + } as unknown as ReportAction; + + // The member created the hold, not the approver, so isRemoveHoldAction is false and the result depends on the all-held redirect + const holdAction = { + reportActionID: HOLD_ACTION_ID, + reportID: CHILD_REPORT_ID, + actorAccountID: MEMBER_ACCOUNT_ID, + }; + + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${REPORT_ID}`, {[REPORT_ACTION_ID]: reportAction}); + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${CHILD_REPORT_ID}`, {[HOLD_ACTION_ID]: holdAction}); + + expect( + getReportPrimaryAction({ + currentUserLogin: CURRENT_USER_EMAIL, + currentUserAccountID: CURRENT_USER_ACCOUNT_ID, + report, + chatReport, + reportTransactions: [transaction], + violations: {}, + bankAccountList: {}, + policy, + reportActions: [reportAction], + isChatReportArchived: false, + }), + ).toBe(CONST.REPORT.PRIMARY_ACTIONS.REMOVE_HOLD); + }); + it('should not return REMOVE HOLD for closed reports with transactions on hold', async () => { const report = { reportID: REPORT_ID, From d62e5d6ec12c96d46f9b0da449183cd20a82071b Mon Sep 17 00:00:00 2001 From: allgandaf Date: Thu, 11 Jun 2026 13:05:50 +0530 Subject: [PATCH 10/13] Compute hasOnlyHeldExpenses once per report in the todos derivation --- src/libs/actions/OnyxDerived/configs/todos.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/OnyxDerived/configs/todos.ts b/src/libs/actions/OnyxDerived/configs/todos.ts index 3403a568f75b..edc9f0a61d9a 100644 --- a/src/libs/actions/OnyxDerived/configs/todos.ts +++ b/src/libs/actions/OnyxDerived/configs/todos.ts @@ -58,10 +58,11 @@ const createTodosReportsAndTransactions = ({ const reportActions = Object.values(allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`] ?? []); const reportTransactions = transactionsByReportID[report.reportID] ?? []; const reportMetadata = allReportMetadata?.[`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`]; - if (isSubmitAction(report, reportTransactions, reportMetadata, policy, reportNameValuePair, undefined, login, currentUserAccountID) && !hasOnlyHeldExpenses(reportTransactions)) { + const allExpensesHeld = hasOnlyHeldExpenses(reportTransactions); + if (isSubmitAction(report, reportTransactions, reportMetadata, policy, reportNameValuePair, undefined, login, currentUserAccountID) && !allExpensesHeld) { reportsToSubmit.push(report); } - if (isApproveAction(report, reportTransactions, currentUserAccountID, reportMetadata, policy) && !hasOnlyHeldExpenses(reportTransactions)) { + if (isApproveAction(report, reportTransactions, currentUserAccountID, reportMetadata, policy) && !allExpensesHeld) { reportsToApprove.push(report); } if ( @@ -75,7 +76,7 @@ const createTodosReportsAndTransactions = ({ reportNameValuePairs: reportNameValuePair, }) && !hasOnlyNonReimbursableTransactions(report.reportID, reportTransactions) && - !hasOnlyHeldExpenses(reportTransactions) + !allExpensesHeld ) { reportsToPay.push(report); } From 36823128f69798c8819e32654e678985f840af93 Mon Sep 17 00:00:00 2001 From: allgandaf Date: Thu, 11 Jun 2026 13:09:58 +0530 Subject: [PATCH 11/13] Suppress Pay on the report header when every expense is held and reuse the all-held check --- src/libs/ReportPrimaryActionUtils.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libs/ReportPrimaryActionUtils.ts b/src/libs/ReportPrimaryActionUtils.ts index df0e6101cbe5..dc1146203cf6 100644 --- a/src/libs/ReportPrimaryActionUtils.ts +++ b/src/libs/ReportPrimaryActionUtils.ts @@ -469,6 +469,7 @@ function getReportPrimaryAction(params: GetReportPrimaryActionParams): ValueOf Date: Thu, 11 Jun 2026 13:09:58 +0530 Subject: [PATCH 12/13] Update report header tests for the all-held Pay suppression --- tests/unit/ReportPrimaryActionUtilsTest.ts | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/tests/unit/ReportPrimaryActionUtilsTest.ts b/tests/unit/ReportPrimaryActionUtilsTest.ts index 639643e875a8..3108692fcdb3 100644 --- a/tests/unit/ReportPrimaryActionUtilsTest.ts +++ b/tests/unit/ReportPrimaryActionUtilsTest.ts @@ -306,9 +306,6 @@ describe('getPrimaryAction', () => { }; const transaction = { reportID: `${REPORT_ID}`, - comment: { - hold: 'Hold', - }, } as unknown as Transaction; expect( @@ -573,6 +570,40 @@ describe('getPrimaryAction', () => { ).toBe(CONST.REPORT.PRIMARY_ACTIONS.PAY); }); + it('should not return PAY for an expense report when every expense is held', async () => { + const report = { + reportID: REPORT_ID, + type: CONST.REPORT.TYPE.EXPENSE, + ownerAccountID: CURRENT_USER_ACCOUNT_ID, + statusNum: CONST.REPORT.STATUS_NUM.CLOSED, + total: -300, + } as unknown as Report; + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, report); + const policy = { + role: CONST.POLICY.ROLE.ADMIN, + }; + const transaction = { + reportID: `${REPORT_ID}`, + comment: { + hold: 'Hold', + }, + } as unknown as Transaction; + + expect( + getReportPrimaryAction({ + currentUserLogin: CURRENT_USER_EMAIL, + currentUserAccountID: CURRENT_USER_ACCOUNT_ID, + report, + chatReport, + reportTransactions: [transaction], + violations: {}, + bankAccountList: {}, + policy: policy as Policy, + isChatReportArchived: false, + }), + ).not.toBe(CONST.REPORT.PRIMARY_ACTIONS.PAY); + }); + it('should not return PAY for expense report with only non-reimbursable transactions when total is 0', async () => { const report = { reportID: REPORT_ID, From f1c94292729f51a7205a1113ff88ea951ede300a Mon Sep 17 00:00:00 2001 From: allgandaf Date: Thu, 11 Jun 2026 13:14:51 +0530 Subject: [PATCH 13/13] Bump eslint-seatbelt baseline for the added report header tests --- config/eslint/eslint.seatbelt.tsv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 0e9c799cec52..672eaa4f768a 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -1806,7 +1806,7 @@ "../../tests/unit/NextStepUtilsTest.ts" "@typescript-eslint/no-deprecated/buildNextStepNew" 23 "../../tests/unit/NextStepUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../tests/unit/OnboardingSelectorsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 10 -"../../tests/unit/OnyxDerivedTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 +"../../tests/unit/OnyxDerivedTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 8 "../../tests/unit/OnyxUpdateManagerTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../tests/unit/OptionListContextProviderTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 10 "../../tests/unit/OptionsListUtilsTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 50 @@ -1829,7 +1829,7 @@ "../../tests/unit/ReportActionsUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 35 "../../tests/unit/ReportLayoutUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../tests/unit/ReportNameUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 22 -"../../tests/unit/ReportPrimaryActionUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 168 +"../../tests/unit/ReportPrimaryActionUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 175 "../../tests/unit/ReportSecondaryActionUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 450 "../../tests/unit/ReportSubmitUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../tests/unit/ReportTitleUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 3