From 56570a7035d49a071e31476182e9663ab22d49b5 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 10 Dec 2024 15:58:14 +0700 Subject: [PATCH 01/23] fix: Hmm it's not here in RHP is displayed after deleting a workspace --- src/libs/PolicyUtils.ts | 15 +++++++++ src/libs/ReportUtils.ts | 4 +-- tests/unit/PolicyUtilsTest.ts | 63 +++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index f6b277d69d6b..28027303007f 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -62,6 +62,14 @@ Onyx.connect({ callback: (value) => (allPolicies = value), }); +let currentUserEmail: string; +Onyx.connect({ + key: ONYXKEYS.SESSION, + callback: (val) => { + currentUserEmail = val?.email ?? ''; + }, +}); + Onyx.connect({ key: ONYXKEYS.NVP_ACTIVE_POLICY_ID, callback: (value) => (activePolicyId = value), @@ -1131,6 +1139,12 @@ function areAllGroupPoliciesExpenseChatDisabled(policies = allPolicies) { return !groupPolicies.some((policy) => !!policy?.isPolicyExpenseChatEnabled); } +function getFilteredPolicies(policies: OnyxCollection) { + return Object.values(policies ?? {}).filter( + (policy) => policy && policy.type !== CONST.POLICY.TYPE.PERSONAL && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && !!getPolicyRole(policy, currentUserEmail), + ); +} + export { canEditTaxRate, extractPolicyIDFromPath, @@ -1254,6 +1268,7 @@ export { getActivePolicy, isPolicyAccessible, areAllGroupPoliciesExpenseChatDisabled, + getFilteredPolicies, }; export type {MemberEmailsToAccountIDs}; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 9fff3ade23f9..0398ba048d85 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -8212,9 +8212,7 @@ function createDraftTransactionAndNavigateToParticipantSelector(transactionID: s mccGroup, } as Transaction); - const filteredPolicies = Object.values(allPolicies ?? {}).filter( - (policy) => policy && policy.type !== CONST.POLICY.TYPE.PERSONAL && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, - ); + const filteredPolicies = PolicyUtils.getFilteredPolicies(allPolicies); if (actionName === CONST.IOU.ACTION.CATEGORIZE) { const activePolicy = getPolicy(activePolicyID); diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 71830443063a..d63ea8cdd565 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -1,5 +1,15 @@ +import Onyx from 'react-native-onyx'; +import type {OnyxCollection} from 'react-native-onyx'; import * as PolicyUtils from '@libs/PolicyUtils'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import {Policy} from '@src/types/onyx'; +import createRandomPolicy from '../utils/collections/policies'; +import * as TestHelper from '../utils/TestHelper'; +import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; +const CARLOS_EMAIL = 'cmartins@expensifail.com'; +const CARLOS_ACCOUNT_ID = 1; function toLocaleDigitMock(dot: string): string { return dot; } @@ -81,4 +91,57 @@ describe('PolicyUtils', () => { }); }); }); + describe('getFilteredPolicies', () => { + beforeAll(() => { + Onyx.init({ + keys: ONYXKEYS, + initialKeyStates: { + // Given mock data for session + [ONYXKEYS.SESSION]: {accountID: CARLOS_ACCOUNT_ID, email: CARLOS_EMAIL}, + }, + }); + }); + + beforeEach(() => { + global.fetch = TestHelper.getGlobalFetchMock(); + return Onyx.clear().then(waitForBatchedUpdates); + }); + it('should return empty array', () => { + // Given mock data for policies + const policies = { + 1: { + ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), + role: '', + }, + }; + // When calling getFilteredPolicies with policies + const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + // The result should be empty array since the policies contains only one policy which does not have role field. + expect(result.length).toBe(0); + }); + it('should return array contains policy which has id = 1', () => { + // Given mock data for policies + const randomPolicy1 = createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE); + const policies = { + 1: randomPolicy1, + }; + // When calling getFilteredPolicies with policies + const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + // The result should contains the policy which has id = 1 since it is a valid policy. + expect(result).toContainEqual(randomPolicy1); + }); + it('should return empty array', () => { + // Given mock data for policies + const policies = { + 1: { + ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + }, + }; + // When calling getFilteredPolicies with policies + const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete' . + expect(result).toEqual([]); + }); + }); }); From a01d0cbea604204d28db04cb2563424119cf55ae Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 10 Dec 2024 16:14:40 +0700 Subject: [PATCH 02/23] fix: remove space end line --- tests/unit/PolicyUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index d63ea8cdd565..26cda5ac4036 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -140,7 +140,7 @@ describe('PolicyUtils', () => { }; // When calling getFilteredPolicies with policies const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); - // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete' . + // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete'. expect(result).toEqual([]); }); }); From 8d50fecc65f5b195ffbbd98fff836f79dd49497a Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 10 Dec 2024 16:18:24 +0700 Subject: [PATCH 03/23] fix: lint --- tests/unit/PolicyUtilsTest.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 26cda5ac4036..8d0945c629bb 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -3,7 +3,7 @@ import type {OnyxCollection} from 'react-native-onyx'; import * as PolicyUtils from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import {Policy} from '@src/types/onyx'; +import type {Policy} from '@src/types/onyx'; import createRandomPolicy from '../utils/collections/policies'; import * as TestHelper from '../utils/TestHelper'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; @@ -109,6 +109,7 @@ describe('PolicyUtils', () => { it('should return empty array', () => { // Given mock data for policies const policies = { + // eslint-disable-next-line @typescript-eslint/naming-convention 1: { ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), role: '', @@ -123,6 +124,7 @@ describe('PolicyUtils', () => { // Given mock data for policies const randomPolicy1 = createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE); const policies = { + // eslint-disable-next-line @typescript-eslint/naming-convention 1: randomPolicy1, }; // When calling getFilteredPolicies with policies @@ -133,6 +135,7 @@ describe('PolicyUtils', () => { it('should return empty array', () => { // Given mock data for policies const policies = { + // eslint-disable-next-line @typescript-eslint/naming-convention 1: { ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, From 57bbc2aacb84b79224964b81b2b2583b935642e7 Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 11 Dec 2024 18:10:36 +0700 Subject: [PATCH 04/23] fix: reuse getActivePolicies --- src/libs/PolicyUtils.ts | 17 ++++++++--------- src/libs/ReportUtils.ts | 2 +- src/pages/workspace/WorkspaceNewRoomPage.tsx | 3 +-- tests/unit/PolicyUtilsTest.ts | 16 +++++++--------- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 28027303007f..2dc436a4d76c 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -79,9 +79,15 @@ Onyx.connect({ * Filter out the active policies, which will exclude policies with pending deletion * These are policies that we can use to create reports with in NewDot. */ -function getActivePolicies(policies: OnyxCollection | null): Policy[] { +function getActivePolicies(policies: OnyxCollection | null, excludePersonalPolicy = false): Policy[] { return Object.values(policies ?? {}).filter( - (policy): policy is Policy => !!policy && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && !!policy.name && !!policy.id, + (policy): policy is Policy => + !!policy && + policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && + !!policy.name && + !!policy.id && + (!excludePersonalPolicy || policy.type !== CONST.POLICY.TYPE.PERSONAL) && + !!getPolicyRole(policy, currentUserEmail), ); } /** @@ -1139,12 +1145,6 @@ function areAllGroupPoliciesExpenseChatDisabled(policies = allPolicies) { return !groupPolicies.some((policy) => !!policy?.isPolicyExpenseChatEnabled); } -function getFilteredPolicies(policies: OnyxCollection) { - return Object.values(policies ?? {}).filter( - (policy) => policy && policy.type !== CONST.POLICY.TYPE.PERSONAL && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && !!getPolicyRole(policy, currentUserEmail), - ); -} - export { canEditTaxRate, extractPolicyIDFromPath, @@ -1268,7 +1268,6 @@ export { getActivePolicy, isPolicyAccessible, areAllGroupPoliciesExpenseChatDisabled, - getFilteredPolicies, }; export type {MemberEmailsToAccountIDs}; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index be97bbb1e5e8..026d55966943 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -8216,7 +8216,7 @@ function createDraftTransactionAndNavigateToParticipantSelector(transactionID: s mccGroup, } as Transaction); - const filteredPolicies = PolicyUtils.getFilteredPolicies(allPolicies); + const filteredPolicies = PolicyUtils.getActivePolicies(allPolicies, true); if (actionName === CONST.IOU.ACTION.CATEGORIZE) { const activePolicy = getPolicy(activePolicyID); diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index 37686ba1c3a7..a23d35d955a2 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -64,8 +64,7 @@ function WorkspaceNewRoomPage() { const workspaceOptions = useMemo( () => - PolicyUtils.getActivePolicies(policies) - ?.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL) + PolicyUtils.getActivePolicies(policies, true) .map((policy) => ({ label: policy.name, value: policy.id, diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 8d0945c629bb..927f1171d7c2 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -91,7 +91,7 @@ describe('PolicyUtils', () => { }); }); }); - describe('getFilteredPolicies', () => { + describe('getActivePolicies', () => { beforeAll(() => { Onyx.init({ keys: ONYXKEYS, @@ -107,7 +107,7 @@ describe('PolicyUtils', () => { return Onyx.clear().then(waitForBatchedUpdates); }); it('should return empty array', () => { - // Given mock data for policies + // Given mock data for policies, contains only one workspace does not has role prop. const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: { @@ -115,25 +115,23 @@ describe('PolicyUtils', () => { role: '', }, }; - // When calling getFilteredPolicies with policies - const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); // The result should be empty array since the policies contains only one policy which does not have role field. expect(result.length).toBe(0); }); it('should return array contains policy which has id = 1', () => { - // Given mock data for policies + // Given mock data for policies, contains only one control workspace const randomPolicy1 = createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE); const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: randomPolicy1, }; - // When calling getFilteredPolicies with policies - const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); // The result should contains the policy which has id = 1 since it is a valid policy. expect(result).toContainEqual(randomPolicy1); }); it('should return empty array', () => { - // Given mock data for policies + // Given mock data for policies, contains only one control workspace which is pending delete. const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: { @@ -142,7 +140,7 @@ describe('PolicyUtils', () => { }, }; // When calling getFilteredPolicies with policies - const result = PolicyUtils.getFilteredPolicies(policies as OnyxCollection); + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete'. expect(result).toEqual([]); }); From 9f17db9785029a406661985d97a59aac8ebbd3f3 Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 11 Dec 2024 18:27:10 +0700 Subject: [PATCH 05/23] fix: unit test --- tests/unit/PolicyUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 927f1171d7c2..b8c2e562b21e 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -121,7 +121,7 @@ describe('PolicyUtils', () => { }); it('should return array contains policy which has id = 1', () => { // Given mock data for policies, contains only one control workspace - const randomPolicy1 = createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE); + const randomPolicy1 = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: randomPolicy1, From 0382872a89f4d058bf38c3377ecdb1a51e12cdc8 Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 11 Dec 2024 18:42:56 +0700 Subject: [PATCH 06/23] fix: remove comment --- tests/unit/PolicyUtilsTest.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index b8c2e562b21e..880e21ea0aca 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -139,7 +139,6 @@ describe('PolicyUtils', () => { pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, }, }; - // When calling getFilteredPolicies with policies const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete'. expect(result).toEqual([]); From 1e6ee20d898833b668bb08f84b4958467f49c1df Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 12 Dec 2024 03:08:36 +0700 Subject: [PATCH 07/23] fix: update comments --- tests/unit/PolicyUtilsTest.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 880e21ea0aca..e13db0f3a04b 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -96,7 +96,6 @@ describe('PolicyUtils', () => { Onyx.init({ keys: ONYXKEYS, initialKeyStates: { - // Given mock data for session [ONYXKEYS.SESSION]: {accountID: CARLOS_ACCOUNT_ID, email: CARLOS_EMAIL}, }, }); @@ -107,7 +106,7 @@ describe('PolicyUtils', () => { return Onyx.clear().then(waitForBatchedUpdates); }); it('should return empty array', () => { - // Given mock data for policies, contains only one workspace does not has role prop. + // Given a user with a single archived paid policy. const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: { @@ -115,23 +114,23 @@ describe('PolicyUtils', () => { role: '', }, }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); - // The result should be empty array since the policies contains only one policy which does not have role field. + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); + // The result should be empty array since the policies contains only archived paid policy. expect(result.length).toBe(0); }); it('should return array contains policy which has id = 1', () => { - // Given mock data for policies, contains only one control workspace + // Given a user with only a paid policy. const randomPolicy1 = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: randomPolicy1, }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); - // The result should contains the policy which has id = 1 since it is a valid policy. + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); + // The result should contain the mock paid policy. expect(result).toContainEqual(randomPolicy1); }); it('should return empty array', () => { - // Given mock data for policies, contains only one control workspace which is pending delete. + // Given a user with only one control workspace which is pending delete. const policies = { // eslint-disable-next-line @typescript-eslint/naming-convention 1: { @@ -139,8 +138,8 @@ describe('PolicyUtils', () => { pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, }, }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection); - // The result should be empty array since the policies contains only one policy which has pendingAction is 'delete'. + const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); + // The result should be empty array since there is only one policy which has pendingAction is 'delete'. expect(result).toEqual([]); }); }); From 2f27b87127add2731072639e790f1d57b75cc3d5 Mon Sep 17 00:00:00 2001 From: truph01 Date: Fri, 13 Dec 2024 16:33:24 +0700 Subject: [PATCH 08/23] Update tests/unit/PolicyUtilsTest.ts Co-authored-by: Joel Davies --- tests/unit/PolicyUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index e13db0f3a04b..11497f87f8a8 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -115,7 +115,7 @@ describe('PolicyUtils', () => { }, }; const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); - // The result should be empty array since the policies contains only archived paid policy. + // The result should be an empty array since we have no active policies. expect(result.length).toBe(0); }); it('should return array contains policy which has id = 1', () => { From 814bb3da28a9543b2dc0f5fb2a539660fe9b5e28 Mon Sep 17 00:00:00 2001 From: truph01 Date: Fri, 13 Dec 2024 16:33:40 +0700 Subject: [PATCH 09/23] Update tests/unit/PolicyUtilsTest.ts Co-authored-by: Joel Davies --- tests/unit/PolicyUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 11497f87f8a8..b1560da49aa5 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -126,7 +126,7 @@ describe('PolicyUtils', () => { 1: randomPolicy1, }; const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); - // The result should contain the mock paid policy. + // The result should contain the mock paid policy, since it is our only active paid policy. expect(result).toContainEqual(randomPolicy1); }); it('should return empty array', () => { From 73cfbfa593a521560090a5008fbb91f5202c9e2d Mon Sep 17 00:00:00 2001 From: truph01 Date: Fri, 13 Dec 2024 16:33:59 +0700 Subject: [PATCH 10/23] Update tests/unit/PolicyUtilsTest.ts Co-authored-by: Joel Davies --- tests/unit/PolicyUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index b1560da49aa5..488b7f797f0d 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -139,7 +139,7 @@ describe('PolicyUtils', () => { }, }; const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, true); - // The result should be empty array since there is only one policy which has pendingAction is 'delete'. + // The result should be an empty array since there is only one policy which is pending deletion, so we have no active paid policies. expect(result).toEqual([]); }); }); From 906d01077ac7417f5103c736e0b0ff4d256d7fc5 Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 19 Dec 2024 10:05:15 +0700 Subject: [PATCH 11/23] fix: lint --- src/libs/PolicyUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index e5fb39c1954c..94364cfae72f 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -651,7 +651,7 @@ function getPolicy(policyID: string | undefined): OnyxEntry { /** Return active policies where current user is an admin */ function getActiveAdminWorkspaces(policies: OnyxCollection | null, currentUserLogin: string | undefined): Policy[] { - const activePolicies = getActivePolicies(policies, currentUserLogin,); + const activePolicies = getActivePolicies(policies, currentUserLogin, false); return activePolicies.filter((policy) => shouldShowPolicy(policy, NetworkStore.isOffline(), currentUserLogin) && isPolicyAdmin(policy, currentUserLogin)); } From df457d4fbea241509795954daab84a0fbebbbc61 Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 19 Dec 2024 10:06:00 +0700 Subject: [PATCH 12/23] fix: remove redundant logic --- src/libs/PolicyUtils.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 94364cfae72f..335f3a13453c 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -62,14 +62,6 @@ Onyx.connect({ callback: (value) => (allPolicies = value), }); -let currentUserEmail: string; -Onyx.connect({ - key: ONYXKEYS.SESSION, - callback: (val) => { - currentUserEmail = val?.email ?? ''; - }, -}); - Onyx.connect({ key: ONYXKEYS.NVP_ACTIVE_POLICY_ID, callback: (value) => (activePolicyId = value), From 10d0c58f9f9218682790f2441797600178b6c85b Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 19 Dec 2024 10:07:59 +0700 Subject: [PATCH 13/23] fix: lint --- src/libs/ReportUtils.ts | 2 +- src/pages/workspace/WorkspaceNewRoomPage.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3f69d66846c5..6b0441223b4b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -8241,7 +8241,7 @@ function createDraftTransactionAndNavigateToParticipantSelector(transactionID: s mccGroup, } as Transaction); - const filteredPolicies = PolicyUtils.getActivePolicies(allPolicies, true); + const filteredPolicies = PolicyUtils.getActivePolicies(allPolicies, currentUserEmail, true); if (actionName === CONST.IOU.ACTION.CATEGORIZE) { const activePolicy = getPolicy(activePolicyID); diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index c2e36de22a41..e2b26b419956 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -65,7 +65,6 @@ function WorkspaceNewRoomPage() { const workspaceOptions = useMemo( () => PolicyUtils.getActivePolicies(policies, session?.email, true) - ?.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL) .map((policy) => ({ label: policy.name, value: policy.id, From 2ceac5053c4fd1bcec1d82a2b0905fcf5c852b55 Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 19 Dec 2024 10:11:42 +0700 Subject: [PATCH 14/23] fix: type --- src/libs/PolicyUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 335f3a13453c..b9927050767e 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -659,7 +659,7 @@ function canSendInvoice(policies: OnyxCollection | null, currentUserLogi } function hasWorkspaceWithInvoices(currentUserLogin: string | undefined): boolean { - const activePolicies = getActivePolicies(allPolicies, currentUserLogin); + const activePolicies = getActivePolicies(allPolicies, currentUserLogin, false); return activePolicies.some((policy) => shouldShowPolicy(policy, NetworkStore.isOffline(), currentUserLogin) && policy.areInvoicesEnabled); } From 9c44bf0618055361994b0820fa25ae6fe7dba4b1 Mon Sep 17 00:00:00 2001 From: truph01 Date: Thu, 19 Dec 2024 11:06:40 +0700 Subject: [PATCH 15/23] fix: default IDs lint --- src/libs/PolicyUtils.ts | 16 ++++++++-------- src/pages/workspace/WorkspaceNewRoomPage.tsx | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index b9927050767e..caadc5deecff 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -202,7 +202,7 @@ function getPolicyBrickRoadIndicatorStatus(policy: OnyxEntry, isConnecti } function getPolicyRole(policy: OnyxInputOrEntry | SearchPolicy, currentUserLogin: string | undefined) { - return policy?.role ?? policy?.employeeList?.[currentUserLogin ?? '-1']?.role; + return policy?.role ?? (currentUserLogin ? policy?.employeeList?.[currentUserLogin]?.role : undefined); } /** @@ -396,7 +396,7 @@ function isPaidGroupPolicy(policy: OnyxEntry | SearchPolicy): boolean { } function getOwnedPaidPolicies(policies: OnyxCollection | null, currentUserAccountID: number): Policy[] { - return Object.values(policies ?? {}).filter((policy): policy is Policy => isPolicyOwner(policy, currentUserAccountID ?? -1) && isPaidGroupPolicy(policy)); + return Object.values(policies ?? {}).filter((policy): policy is Policy => isPolicyOwner(policy, currentUserAccountID ?? CONST.DEFAULT_NUMBER_ID) && isPaidGroupPolicy(policy)); } function isControlPolicy(policy: OnyxEntry): boolean { @@ -405,7 +405,7 @@ function isControlPolicy(policy: OnyxEntry): boolean { function isTaxTrackingEnabled(isPolicyExpenseChat: boolean, policy: OnyxEntry, isDistanceRequest: boolean): boolean { const distanceUnit = getDistanceRateCustomUnit(policy); - const customUnitID = distanceUnit?.customUnitID ?? 0; + const customUnitID = distanceUnit?.customUnitID ?? CONST.DEFAULT_NUMBER_ID; const isPolicyTaxTrackingEnabled = isPolicyExpenseChat && policy?.tax?.trackingEnabled; const isTaxEnabledForDistance = isPolicyTaxTrackingEnabled && policy?.customUnits?.[customUnitID]?.attributes?.taxEnabled; @@ -543,7 +543,7 @@ function getDefaultApprover(policy: OnyxEntry | SearchPolicy): string { * Returns the accountID to whom the given expenseReport submits reports to in the given Policy. */ function getSubmitToAccountID(policy: OnyxEntry | SearchPolicy, expenseReport: OnyxEntry): number { - const employeeAccountID = expenseReport?.ownerAccountID ?? -1; + const employeeAccountID = expenseReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID; const employeeLogin = getLoginsByAccountIDs([employeeAccountID]).at(0) ?? ''; const defaultApprover = getDefaultApprover(policy); @@ -562,8 +562,8 @@ function getSubmitToAccountID(policy: OnyxEntry | SearchPolicy, expenseR return getAccountIDsByLogins([categoryAppover]).at(0) ?? -1; } - if (!tagApprover && getTagApproverRule(policy ?? '-1', tag)?.approver) { - tagApprover = getTagApproverRule(policy ?? '-1', tag)?.approver; + if (policy && !tagApprover && getTagApproverRule(policy, tag)?.approver) { + tagApprover = getTagApproverRule(policy, tag)?.approver; } } @@ -714,7 +714,7 @@ function settingsPendingAction(settings?: string[], pendingFields?: PendingField } const key = Object.keys(pendingFields).find((setting) => settings.includes(setting)); - return pendingFields[key ?? '-1']; + return key ? pendingFields[key] : undefined; } function findSelectedVendorWithDefaultSelect(vendors: NetSuiteVendor[] | undefined, selectedVendorId: string | undefined) { @@ -1083,7 +1083,7 @@ function getWorkspaceAccountID(policyID: string) { if (!policy) { return 0; } - return policy.workspaceAccountID ?? 0; + return policy.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID; } function hasVBBA(policyID: string) { diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index e2b26b419956..f7398cfa574d 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -91,7 +91,7 @@ function WorkspaceNewRoomPage() { * @param values - form input values passed by the Form component */ const submit = (values: FormOnyxValues) => { - const participants = [session?.accountID ?? -1]; + const participants = [session?.accountID ?? CONST.DEFAULT_NUMBER_ID]; const parsedDescription = ReportUtils.getParsedComment(values.reportDescription ?? '', {policyID}); const policyReport = ReportUtils.buildOptimisticChatReport( participants, @@ -163,7 +163,7 @@ function WorkspaceNewRoomPage() { } else if (ValidationUtils.isReservedRoomName(values.roomName)) { // Certain names are reserved for default rooms and should not be used for policy rooms. ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName})); - } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID ?? '-1')) { + } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID)) { // Certain names are reserved for default rooms and should not be used for policy rooms. ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError')); } else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) { From 6c80a97074c939165effb21ec670e138b3a3ff2d Mon Sep 17 00:00:00 2001 From: truph01 Date: Fri, 3 Jan 2025 04:31:23 +0700 Subject: [PATCH 16/23] fix: revert lint fix --- src/libs/PolicyUtils.ts | 16 ++++++++-------- src/pages/workspace/WorkspaceNewRoomPage.tsx | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index caadc5deecff..b9927050767e 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -202,7 +202,7 @@ function getPolicyBrickRoadIndicatorStatus(policy: OnyxEntry, isConnecti } function getPolicyRole(policy: OnyxInputOrEntry | SearchPolicy, currentUserLogin: string | undefined) { - return policy?.role ?? (currentUserLogin ? policy?.employeeList?.[currentUserLogin]?.role : undefined); + return policy?.role ?? policy?.employeeList?.[currentUserLogin ?? '-1']?.role; } /** @@ -396,7 +396,7 @@ function isPaidGroupPolicy(policy: OnyxEntry | SearchPolicy): boolean { } function getOwnedPaidPolicies(policies: OnyxCollection | null, currentUserAccountID: number): Policy[] { - return Object.values(policies ?? {}).filter((policy): policy is Policy => isPolicyOwner(policy, currentUserAccountID ?? CONST.DEFAULT_NUMBER_ID) && isPaidGroupPolicy(policy)); + return Object.values(policies ?? {}).filter((policy): policy is Policy => isPolicyOwner(policy, currentUserAccountID ?? -1) && isPaidGroupPolicy(policy)); } function isControlPolicy(policy: OnyxEntry): boolean { @@ -405,7 +405,7 @@ function isControlPolicy(policy: OnyxEntry): boolean { function isTaxTrackingEnabled(isPolicyExpenseChat: boolean, policy: OnyxEntry, isDistanceRequest: boolean): boolean { const distanceUnit = getDistanceRateCustomUnit(policy); - const customUnitID = distanceUnit?.customUnitID ?? CONST.DEFAULT_NUMBER_ID; + const customUnitID = distanceUnit?.customUnitID ?? 0; const isPolicyTaxTrackingEnabled = isPolicyExpenseChat && policy?.tax?.trackingEnabled; const isTaxEnabledForDistance = isPolicyTaxTrackingEnabled && policy?.customUnits?.[customUnitID]?.attributes?.taxEnabled; @@ -543,7 +543,7 @@ function getDefaultApprover(policy: OnyxEntry | SearchPolicy): string { * Returns the accountID to whom the given expenseReport submits reports to in the given Policy. */ function getSubmitToAccountID(policy: OnyxEntry | SearchPolicy, expenseReport: OnyxEntry): number { - const employeeAccountID = expenseReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID; + const employeeAccountID = expenseReport?.ownerAccountID ?? -1; const employeeLogin = getLoginsByAccountIDs([employeeAccountID]).at(0) ?? ''; const defaultApprover = getDefaultApprover(policy); @@ -562,8 +562,8 @@ function getSubmitToAccountID(policy: OnyxEntry | SearchPolicy, expenseR return getAccountIDsByLogins([categoryAppover]).at(0) ?? -1; } - if (policy && !tagApprover && getTagApproverRule(policy, tag)?.approver) { - tagApprover = getTagApproverRule(policy, tag)?.approver; + if (!tagApprover && getTagApproverRule(policy ?? '-1', tag)?.approver) { + tagApprover = getTagApproverRule(policy ?? '-1', tag)?.approver; } } @@ -714,7 +714,7 @@ function settingsPendingAction(settings?: string[], pendingFields?: PendingField } const key = Object.keys(pendingFields).find((setting) => settings.includes(setting)); - return key ? pendingFields[key] : undefined; + return pendingFields[key ?? '-1']; } function findSelectedVendorWithDefaultSelect(vendors: NetSuiteVendor[] | undefined, selectedVendorId: string | undefined) { @@ -1083,7 +1083,7 @@ function getWorkspaceAccountID(policyID: string) { if (!policy) { return 0; } - return policy.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID; + return policy.workspaceAccountID ?? 0; } function hasVBBA(policyID: string) { diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index f7398cfa574d..e2b26b419956 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -91,7 +91,7 @@ function WorkspaceNewRoomPage() { * @param values - form input values passed by the Form component */ const submit = (values: FormOnyxValues) => { - const participants = [session?.accountID ?? CONST.DEFAULT_NUMBER_ID]; + const participants = [session?.accountID ?? -1]; const parsedDescription = ReportUtils.getParsedComment(values.reportDescription ?? '', {policyID}); const policyReport = ReportUtils.buildOptimisticChatReport( participants, @@ -163,7 +163,7 @@ function WorkspaceNewRoomPage() { } else if (ValidationUtils.isReservedRoomName(values.roomName)) { // Certain names are reserved for default rooms and should not be used for policy rooms. ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomNameReservedError', {reservedName: values.roomName})); - } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID)) { + } else if (ValidationUtils.isExistingRoomName(values.roomName, reports, values.policyID ?? '-1')) { // Certain names are reserved for default rooms and should not be used for policy rooms. ErrorUtils.addErrorMessage(errors, 'roomName', translate('newRoomPage.roomAlreadyExistsError')); } else if (values.roomName.length > CONST.TITLE_CHARACTER_LIMIT) { From 3e6a2f2966c8eda2ee7430595948bf85a4e556d3 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 7 Jan 2025 14:34:44 +0700 Subject: [PATCH 17/23] fix: ts --- src/pages/iou/request/IOURequestStartPage.tsx | 2 +- src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 0c3b0022c89a..f5dcac58d85e 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -100,7 +100,7 @@ function IOURequestStartPage({ return [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement].filter((element) => !!element) as HTMLElement[]; }, [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement]); - const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email) + const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email, false) .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: PolicyUtils.getPerDiemCustomUnit(mappedPolicy)})) .filter(({customUnit}) => !isEmptyObject(customUnit) && !!customUnit.enabled); diff --git a/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx b/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx index 812b71f0a8eb..2c53fe53bd90 100644 --- a/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx +++ b/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx @@ -39,7 +39,7 @@ function IOURequestStepPerDiemWorkspace({ const selectedWorkspace = useMemo(() => transaction?.participants?.[0], [transaction]); const workspaceOptions: WorkspaceListItem[] = useMemo(() => { - const availableWorkspaces = PolicyUtils.getActivePolicies(allPolicies, currentUserLogin).filter((policy) => PolicyUtils.canSubmitPerDiemExpenseFromWorkspace(policy)); + const availableWorkspaces = PolicyUtils.getActivePolicies(allPolicies, currentUserLogin, false).filter((policy) => PolicyUtils.canSubmitPerDiemExpenseFromWorkspace(policy)); return availableWorkspaces .sort((policy1, policy2) => sortWorkspacesBySelected({policyID: policy1.id, name: policy1.name}, {policyID: policy2.id, name: policy2.name}, selectedWorkspace?.policyID)) From 71d3ecb9a18ec404b281427fa2999b718e6b5ce1 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:29:07 +0700 Subject: [PATCH 18/23] fix: merge main --- src/libs/PolicyUtils.ts | 11 +++-------- src/pages/workspace/WorkspaceNewRoomPage.tsx | 3 ++- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index bf71120a29d3..672e79ff335f 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -73,15 +73,10 @@ Onyx.connect({ * and policies the current user doesn't belong to. * These are policies that we can use to create reports with in NewDot. */ -function getActivePolicies(policies: OnyxCollection | null, currentUserLogin: string | undefined, excludePersonalPolicy: boolean): Policy[] { +function getActivePolicies(policies: OnyxCollection | null, currentUserLogin: string | undefined): Policy[] { return Object.values(policies ?? {}).filter( (policy): policy is Policy => - !!policy && - policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && - !!policy.name && - !!policy.id && - !!getPolicyRole(policy, currentUserLogin) && - (!excludePersonalPolicy || policy.type !== CONST.POLICY.TYPE.PERSONAL), + !!policy && policy.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && !!policy.name && !!policy.id && !!getPolicyRole(policy, currentUserLogin), ); } /** @@ -672,7 +667,7 @@ function getPolicy(policyID: string | undefined, policies: OnyxCollection | null, currentUserLogin: string | undefined): Policy[] { - const activePolicies = getActivePolicies(policies, currentUserLogin, false); + const activePolicies = getActivePolicies(policies, currentUserLogin); return activePolicies.filter((policy) => shouldShowPolicy(policy, NetworkStore.isOffline(), currentUserLogin) && isPolicyAdmin(policy, currentUserLogin)); } diff --git a/src/pages/workspace/WorkspaceNewRoomPage.tsx b/src/pages/workspace/WorkspaceNewRoomPage.tsx index e2b26b419956..c64c53306a1f 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.tsx +++ b/src/pages/workspace/WorkspaceNewRoomPage.tsx @@ -64,7 +64,8 @@ function WorkspaceNewRoomPage() { const workspaceOptions = useMemo( () => - PolicyUtils.getActivePolicies(policies, session?.email, true) + PolicyUtils.getActivePolicies(policies, session?.email) + ?.filter((policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL) .map((policy) => ({ label: policy.name, value: policy.id, From 9cc424dcbc217adea9e352a297aaba95c7836412 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:30:06 +0700 Subject: [PATCH 19/23] fix: remove unused changes --- src/pages/iou/request/IOURequestStartPage.tsx | 2 +- src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index f5dcac58d85e..0c3b0022c89a 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -100,7 +100,7 @@ function IOURequestStartPage({ return [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement].filter((element) => !!element) as HTMLElement[]; }, [headerWithBackBtnContainerElement, tabBarContainerElement, activeTabContainerElement]); - const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email, false) + const perDiemCustomUnits = PolicyUtils.getActivePolicies(allPolicies, session?.email) .map((mappedPolicy) => ({policyID: mappedPolicy.id, customUnit: PolicyUtils.getPerDiemCustomUnit(mappedPolicy)})) .filter(({customUnit}) => !isEmptyObject(customUnit) && !!customUnit.enabled); diff --git a/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx b/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx index 2c53fe53bd90..812b71f0a8eb 100644 --- a/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx +++ b/src/pages/iou/request/step/IOURequestStepPerDiemWorkspace.tsx @@ -39,7 +39,7 @@ function IOURequestStepPerDiemWorkspace({ const selectedWorkspace = useMemo(() => transaction?.participants?.[0], [transaction]); const workspaceOptions: WorkspaceListItem[] = useMemo(() => { - const availableWorkspaces = PolicyUtils.getActivePolicies(allPolicies, currentUserLogin, false).filter((policy) => PolicyUtils.canSubmitPerDiemExpenseFromWorkspace(policy)); + const availableWorkspaces = PolicyUtils.getActivePolicies(allPolicies, currentUserLogin).filter((policy) => PolicyUtils.canSubmitPerDiemExpenseFromWorkspace(policy)); return availableWorkspaces .sort((policy1, policy2) => sortWorkspacesBySelected({policyID: policy1.id, name: policy1.name}, {policyID: policy2.id, name: policy2.name}, selectedWorkspace?.policyID)) From b818323456523cd547811cd67e52ada833321a21 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:42:46 +0700 Subject: [PATCH 20/23] fix: test --- tests/unit/PolicyUtilsTest.ts | 58 +++++++++++++++-------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index d3f090eb6eb4..96db20f31d16 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -1,5 +1,5 @@ import Onyx from 'react-native-onyx'; -import type {OnyxCollection} from 'react-native-onyx'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import * as PolicyUtils from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -102,7 +102,7 @@ describe('PolicyUtils', () => { }); }); }); - describe('getActivePolicies', () => { + describe('shouldShowPolicy', () => { beforeAll(() => { Onyx.init({ keys: ONYXKEYS, @@ -116,42 +116,32 @@ describe('PolicyUtils', () => { global.fetch = TestHelper.getGlobalFetchMock(); return Onyx.clear().then(waitForBatchedUpdates); }); - it('should return empty array', () => { - // Given a user with a single archived paid policy. - const policies = { - // eslint-disable-next-line @typescript-eslint/naming-convention - 1: { - ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), - role: '', - }, + it('should return false', () => { + // Given a archived paid policy. + const policy = { + ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), + role: '', }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, CARLOS_EMAIL, true); - // The result should be an empty array since we have no active policies. - expect(result.length).toBe(0); + const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + // The result should be false since it is an archived paid policy. + expect(result).toBe(false); }); - it('should return array contains policy which has id = 1', () => { - // Given a user with only a paid policy. - const randomPolicy1 = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; - const policies = { - // eslint-disable-next-line @typescript-eslint/naming-convention - 1: randomPolicy1, - }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, CARLOS_EMAIL, true); - // The result should contain the mock paid policy, since it is our only active paid policy. - expect(result).toContainEqual(randomPolicy1); + it('should return true', () => { + // Given a paid policy. + const policy = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; + const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + // The result should be true, since it is active paid policy. + expect(result).toBe(true); }); - it('should return empty array', () => { - // Given a user with only one control workspace which is pending delete. - const policies = { - // eslint-disable-next-line @typescript-eslint/naming-convention - 1: { - ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, - }, + it('should returnfalse', () => { + // Given a control workspace which is pending delete. + const policy = { + ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, }; - const result = PolicyUtils.getActivePolicies(policies as OnyxCollection, CARLOS_EMAIL, true); - // The result should be an empty array since there is only one policy which is pending deletion, so we have no active paid policies. - expect(result).toEqual([]); + const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + // The result should be false since it is a policy which is pending deletion. + expect(result).toEqual(false); }); }); }); From 0a007d13fbf336aa63339bfbc842bc955776eea7 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:46:53 +0700 Subject: [PATCH 21/23] Fix: type --- tests/unit/PolicyUtilsTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 96db20f31d16..ee261c51f6fe 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -117,7 +117,7 @@ describe('PolicyUtils', () => { return Onyx.clear().then(waitForBatchedUpdates); }); it('should return false', () => { - // Given a archived paid policy. + // Given an archived paid policy. const policy = { ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), role: '', @@ -130,7 +130,7 @@ describe('PolicyUtils', () => { // Given a paid policy. const policy = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); - // The result should be true, since it is active paid policy. + // The result should be true, since it is an active paid policy. expect(result).toBe(true); }); it('should returnfalse', () => { From 2c40dc0e085342d2a072f2e3e595ac287df0428b Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:48:40 +0700 Subject: [PATCH 22/23] fix: lint --- tests/unit/PolicyUtilsTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index ee261c51f6fe..7b4b7b984f5c 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -1,5 +1,5 @@ import Onyx from 'react-native-onyx'; -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; import * as PolicyUtils from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -23,7 +23,7 @@ describe('PolicyUtils', () => { (index) => ({...createRandomPolicy(index + 1), name: 'workspace', pendingAction: null, ...(!index && {role: null})} as Policy), 2, ); - expect(PolicyUtils.getActivePolicies(policies, undefined, false)).toHaveLength(1); + expect(PolicyUtils.getActivePolicies(policies, undefined)).toHaveLength(1); }); }); describe('getRateDisplayValue', () => { From 6308eb2b41791e8815162e47554195ef4d1598dd Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 14 Jan 2025 03:52:03 +0700 Subject: [PATCH 23/23] fix: lint --- tests/unit/PolicyUtilsTest.ts | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/unit/PolicyUtilsTest.ts b/tests/unit/PolicyUtilsTest.ts index 7b4b7b984f5c..b9bfa2356749 100644 --- a/tests/unit/PolicyUtilsTest.ts +++ b/tests/unit/PolicyUtilsTest.ts @@ -1,6 +1,6 @@ import Onyx from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; -import * as PolicyUtils from '@libs/PolicyUtils'; +import {getActivePolicies, getRateDisplayValue, getUnitRateValue, shouldShowPolicy} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy} from '@src/types/onyx'; @@ -23,50 +23,50 @@ describe('PolicyUtils', () => { (index) => ({...createRandomPolicy(index + 1), name: 'workspace', pendingAction: null, ...(!index && {role: null})} as Policy), 2, ); - expect(PolicyUtils.getActivePolicies(policies, undefined)).toHaveLength(1); + expect(getActivePolicies(policies, undefined)).toHaveLength(1); }); }); describe('getRateDisplayValue', () => { it('should return an empty string for NaN', () => { - const rate = PolicyUtils.getRateDisplayValue('invalid' as unknown as number, toLocaleDigitMock); + const rate = getRateDisplayValue('invalid' as unknown as number, toLocaleDigitMock); expect(rate).toEqual(''); }); describe('withDecimals = false', () => { it('should return integer value as is', () => { - const rate = PolicyUtils.getRateDisplayValue(100, toLocaleDigitMock); + const rate = getRateDisplayValue(100, toLocaleDigitMock); expect(rate).toEqual('100'); }); it('should return non-integer value as is', () => { - const rate = PolicyUtils.getRateDisplayValue(10.5, toLocaleDigitMock); + const rate = getRateDisplayValue(10.5, toLocaleDigitMock); expect(rate).toEqual('10.5'); }); }); describe('withDecimals = true', () => { it('should return integer value with 2 trailing zeros', () => { - const rate = PolicyUtils.getRateDisplayValue(10, toLocaleDigitMock, true); + const rate = getRateDisplayValue(10, toLocaleDigitMock, true); expect(rate).toEqual('10.00'); }); it('should return non-integer value with up to 2 trailing zeros', () => { - const rate = PolicyUtils.getRateDisplayValue(10.5, toLocaleDigitMock, true); + const rate = getRateDisplayValue(10.5, toLocaleDigitMock, true); expect(rate).toEqual('10.50'); }); it('should return non-integer value with 4 decimals as is', () => { - const rate = PolicyUtils.getRateDisplayValue(10.5312, toLocaleDigitMock, true); + const rate = getRateDisplayValue(10.5312, toLocaleDigitMock, true); expect(rate).toEqual('10.5312'); }); it('should return non-integer value with 3 decimals as is', () => { - const rate = PolicyUtils.getRateDisplayValue(10.531, toLocaleDigitMock, true); + const rate = getRateDisplayValue(10.531, toLocaleDigitMock, true); expect(rate).toEqual('10.531'); }); it('should return non-integer value with 4+ decimals cut to 4', () => { - const rate = PolicyUtils.getRateDisplayValue(10.53135, toLocaleDigitMock, true); + const rate = getRateDisplayValue(10.53135, toLocaleDigitMock, true); expect(rate).toEqual('10.5313'); }); }); @@ -74,30 +74,30 @@ describe('PolicyUtils', () => { describe('getUnitRateValue', () => { it('should return an empty string for NaN', () => { - const rate = PolicyUtils.getUnitRateValue(toLocaleDigitMock, {rate: 'invalid' as unknown as number}); + const rate = getUnitRateValue(toLocaleDigitMock, {rate: 'invalid' as unknown as number}); expect(rate).toEqual(''); }); describe('withDecimals = false', () => { it('should return value divisible by 100 with no decimal places', () => { - const rate = PolicyUtils.getUnitRateValue(toLocaleDigitMock, {rate: 100}); + const rate = getUnitRateValue(toLocaleDigitMock, {rate: 100}); expect(rate).toEqual('1'); }); it('should return non-integer value as is divided by 100', () => { - const rate = PolicyUtils.getUnitRateValue(toLocaleDigitMock, {rate: 11.11}); + const rate = getUnitRateValue(toLocaleDigitMock, {rate: 11.11}); expect(rate).toEqual('0.1111'); }); }); describe('withDecimals = true', () => { it('should return value divisible by 100 with 2 decimal places', () => { - const rate = PolicyUtils.getUnitRateValue(toLocaleDigitMock, {rate: 100}, true); + const rate = getUnitRateValue(toLocaleDigitMock, {rate: 100}, true); expect(rate).toEqual('1.00'); }); it('should return non-integer value as is divided by 100', () => { - const rate = PolicyUtils.getUnitRateValue(toLocaleDigitMock, {rate: 11.11}, true); + const rate = getUnitRateValue(toLocaleDigitMock, {rate: 11.11}, true); expect(rate).toEqual('0.1111'); }); }); @@ -122,14 +122,14 @@ describe('PolicyUtils', () => { ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), role: '', }; - const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + const result = shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); // The result should be false since it is an archived paid policy. expect(result).toBe(false); }); it('should return true', () => { // Given a paid policy. const policy = {...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: null}; - const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + const result = shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); // The result should be true, since it is an active paid policy. expect(result).toBe(true); }); @@ -139,7 +139,7 @@ describe('PolicyUtils', () => { ...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, }; - const result = PolicyUtils.shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); + const result = shouldShowPolicy(policy as OnyxEntry, false, CARLOS_EMAIL); // The result should be false since it is a policy which is pending deletion. expect(result).toEqual(false); });