From 16d76398f372d8b5497a9bd69d1f25831460388e Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 18 Mar 2026 19:47:01 +0800 Subject: [PATCH 1/4] remove getAdminPolicies usage from createWorkspace --- src/components/SettlementButton/index.tsx | 1 + src/hooks/useHasActiveAdminPolicies.ts | 15 +++++ .../AppNavigator/AuthScreensInitHandler.tsx | 4 +- src/libs/actions/App.ts | 10 ++++ src/libs/actions/Policy/Policy.ts | 4 +- .../BaseOnboardingInterestedFeatures.tsx | 4 ++ .../BaseOnboardingWorkspaceConfirmation.tsx | 4 ++ .../BaseOnboardingWorkspaceOptional.tsx | 4 ++ .../WorkspaceConfirmationForTravelPage.tsx | 3 + .../request/step/IOURequestStepUpgrade.tsx | 4 ++ .../upgrade/PersonalCardUpgradePage.tsx | 3 + .../workspace/WorkspaceConfirmationPage.tsx | 4 ++ src/selectors/Policy.ts | 3 + tests/actions/IOUTest.ts | 15 +++++ tests/actions/IOUTest/SplitTest.ts | 14 +++++ tests/actions/PolicyTest.ts | 58 +++++++++++++++++++ tests/unit/GoogleTagManagerTest.tsx | 27 ++++++++- 17 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 src/hooks/useHasActiveAdminPolicies.ts diff --git a/src/components/SettlementButton/index.tsx b/src/components/SettlementButton/index.tsx index f2d876f455d8a..3b19488e6ad67 100644 --- a/src/components/SettlementButton/index.tsx +++ b/src/components/SettlementButton/index.tsx @@ -359,6 +359,7 @@ function SettlementButton({ currentUserEmailParam: currentUserPersonalDetails.email ?? '', betas, isSelfTourViewed, + hasActiveAdminPolicies: !!activeAdminPolicies.length, }).policyID; }; diff --git a/src/hooks/useHasActiveAdminPolicies.ts b/src/hooks/useHasActiveAdminPolicies.ts new file mode 100644 index 0000000000000..e8112b086425c --- /dev/null +++ b/src/hooks/useHasActiveAdminPolicies.ts @@ -0,0 +1,15 @@ +import type {OnyxCollection} from 'react-native-onyx'; +import ONYXKEYS from '@src/ONYXKEYS'; +import {hasActiveAdminPoliciesSelector} from '@src/selectors/Policy'; +import type {Policy} from '@src/types/onyx'; +import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; +import useOnyx from './useOnyx'; + +function useHasActiveAdminPolicies() { + const login = useCurrentUserPersonalDetails().login ?? ''; + const selector = (policies: OnyxCollection) => hasActiveAdminPoliciesSelector(policies, login); + const [hasActiveAdminPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector}); + return !!hasActiveAdminPolicies; +} + +export default useHasActiveAdminPolicies; diff --git a/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx b/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx index 0ab9fe8ec596d..cf70df6c456c6 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx @@ -1,6 +1,7 @@ import {hasSeenTourSelector} from '@selectors/Onboarding'; import {useEffect, useRef} from 'react'; import {useInitialURLActions, useInitialURLState} from '@components/InitialURLContextProvider'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useOnyx from '@hooks/useOnyx'; import {init, isClientTheLeader} from '@libs/ActiveClientManager'; import Log from '@libs/Log'; @@ -48,6 +49,7 @@ function AuthScreensInitHandler() { const delegatorEmail = getSearchParamFromUrl(currentUrl, 'delegatorEmail'); const {initialURL, isAuthenticatedAtStartup} = useInitialURLState(); const {setIsAuthenticatedAtStartup} = useInitialURLActions(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const [session] = useOnyx(ONYXKEYS.SESSION); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); @@ -133,7 +135,7 @@ function AuthScreensInitHandler() { App.reconnectApp(initialLastUpdateIDAppliedToClient); } - App.setUpPoliciesAndNavigate(session, introSelected, activePolicyID, isSelfTourViewed); + App.setUpPoliciesAndNavigate(session, introSelected, activePolicyID, isSelfTourViewed, hasActiveAdminPolicies); Download.clearDownloads(); diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts index de84e0220b6ed..0714e6464d2d0 100644 --- a/src/libs/actions/App.ts +++ b/src/libs/actions/App.ts @@ -569,6 +569,7 @@ type CreateWorkspaceWithPolicyDraftParams = { type?: PolicyType; // TODO: Remove optional (?) once allBetas Onyx.connect is removed (https://github.com/Expensify/App/issues/66417) betas?: OnyxEntry; + hasActiveAdminPolicies: boolean; }; /** @@ -594,6 +595,7 @@ function createWorkspaceWithPolicyDraftAndNavigateToIt(params: CreateWorkspaceWi type, isSelfTourViewed, betas, + hasActiveAdminPolicies, } = params; const policyIDWithDefault = policyID || generatePolicyID(); @@ -621,6 +623,7 @@ function createWorkspaceWithPolicyDraftAndNavigateToIt(params: CreateWorkspaceWi type, isSelfTourViewed, betas, + hasActiveAdminPolicies, }); Navigation.navigate(routeToNavigate, {forceReplace: !transitionFromOldDot}); }); @@ -642,6 +645,7 @@ function createWorkspaceWithPolicyDraft(params: CreateWorkspaceWithPolicyDraftPa shouldCreateControlPolicy, isSelfTourViewed, betas, + hasActiveAdminPolicies, } = params; createDraftInitialWorkspace(introSelected, policyOwnerEmail, policyName, policyID, makeMeAdmin, currency, file); @@ -661,6 +665,7 @@ function createWorkspaceWithPolicyDraft(params: CreateWorkspaceWithPolicyDraftPa shouldCreateControlPolicy, isSelfTourViewed, betas, + hasActiveAdminPolicies, }); } @@ -682,6 +687,7 @@ type SavePolicyDraftByNewWorkspaceParams = { type?: PolicyType; // TODO: Remove optional (?) once allBetas Onyx.connect is removed (https://github.com/Expensify/App/issues/66417) betas?: OnyxEntry; + hasActiveAdminPolicies: boolean; }; /** @@ -704,6 +710,7 @@ function savePolicyDraftByNewWorkspace({ type, isSelfTourViewed, betas, + hasActiveAdminPolicies, }: SavePolicyDraftByNewWorkspaceParams) { createWorkspace({ policyOwnerEmail, @@ -723,6 +730,7 @@ function savePolicyDraftByNewWorkspace({ type, isSelfTourViewed, betas, + hasActiveAdminPolicies, }); } @@ -746,6 +754,7 @@ function setUpPoliciesAndNavigate( introSelected: OnyxEntry, activePolicyID: string | undefined, isSelfTourViewed: boolean | undefined, + hasActiveAdminPolicies: boolean, ) { const currentUrl = getCurrentUrl(); if (!session || !currentUrl?.includes('exitTo')) { @@ -777,6 +786,7 @@ function setUpPoliciesAndNavigate( currentUserAccountIDParam: currentSessionData.accountID ?? CONST.DEFAULT_NUMBER_ID, currentUserEmailParam: currentSessionData.email ?? '', isSelfTourViewed, + hasActiveAdminPolicies, }); return; } diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index b462506f03a3c..350dabe332c6a 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -194,6 +194,7 @@ type BuildPolicyDataOptions = { onboardingPurposeSelected?: OnboardingPurpose; shouldAddGuideWelcomeMessage?: boolean; shouldCreateControlPolicy?: boolean; + hasActiveAdminPolicies: boolean; type?: typeof CONST.POLICY.TYPE.TEAM | typeof CONST.POLICY.TYPE.CORPORATE; // TODO: Make it required once we complete refactoring the buildPolicyData function to use isSelfTourViewed. Refactor issue: https://github.com/Expensify/App/issues/66424 isSelfTourViewed?: boolean; @@ -2904,7 +2905,7 @@ function createWorkspace(options: CreateWorkspaceDataOptions): CreateWorkspacePa API.write(WRITE_COMMANDS.CREATE_WORKSPACE, params, {optimisticData, successData, failureData}); // Publish a workspace created event if this is their first policy - if (getAdminPolicies().length === 0) { + if (!options.hasActiveAdminPolicies) { GoogleTagManager.publishEvent(CONST.ANALYTICS.EVENT.WORKSPACE_CREATED, options.currentUserAccountIDParam ?? CONST.DEFAULT_NUMBER_ID); } @@ -7155,7 +7156,6 @@ export { updateMemberCustomField, openPolicyEditCardLimitTypePage, requestExpensifyCardLimitIncrease, - getAdminPolicies, hasInvoicingDetails, clearAllPolicies, enablePolicyRules, diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index bc9d4f06abb85..23405b078a8dd 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -14,6 +14,7 @@ import isSidePanelReportSupported from '@components/SidePanel/isSidePanelReportS import Text from '@components/Text'; import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -60,6 +61,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin const [session] = useOnyx(ONYXKEYS.SESSION); const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const archivedReportsIdSet = useArchivedReportsIdSet(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const paidGroupPolicy = Object.values(allPolicies ?? {}).find((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, session?.email)); const {isOffline} = useNetwork(); @@ -205,6 +207,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin shouldAddGuideWelcomeMessage: false, betas, isSelfTourViewed, + hasActiveAdminPolicies, }) : {adminsChatReportID: onboardingAdminsChatReportID, policyID: onboardingPolicyID}; @@ -277,6 +280,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin isSelfTourViewed, conciergeReportID, betas, + hasActiveAdminPolicies, ]); // Create items for enabled features diff --git a/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx b/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx index 7131da9dbee77..4c73e97b0dae2 100644 --- a/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx +++ b/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx @@ -11,6 +11,7 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -49,6 +50,7 @@ function BaseOnboardingWorkspaceConfirmation({shouldUseNativeStyles}: BaseOnboar const [draftValues, draftValuesMetadata] = useOnyx(ONYXKEYS.FORMS.ONBOARDING_WORKSPACE_DETAILS_FORM_DRAFT); const [session, sessionMetadata] = useOnyx(ONYXKEYS.SESSION); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const paidGroupPolicy = Object.values(allPolicies ?? {}).find((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, session?.email)); @@ -87,6 +89,7 @@ function BaseOnboardingWorkspaceConfirmation({shouldUseNativeStyles}: BaseOnboar onboardingPurposeSelected, betas, isSelfTourViewed, + hasActiveAdminPolicies, }) : {adminsChatReportID: onboardingAdminsChatReportID, policyID: onboardingPolicyID}; @@ -108,6 +111,7 @@ function BaseOnboardingWorkspaceConfirmation({shouldUseNativeStyles}: BaseOnboar introSelected, betas, isSelfTourViewed, + hasActiveAdminPolicies, ], ); diff --git a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx index b4f4cad2b52b9..2695bae78e81a 100644 --- a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx +++ b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx @@ -9,6 +9,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useHasTeam2025Pricing from '@hooks/useHasTeam2025Pricing'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -64,6 +65,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth const {onboardingIsMediumOrLargerScreenWidth, isSmallScreenWidth} = useResponsiveLayout(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const {isBetaEnabled} = usePermissions(); const ICON_SIZE = 48; const illustrations = useMemoizedLazyIllustrations(['MoneyReceipts', 'Tag', 'ReportReceipt']); @@ -171,6 +173,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding onboardingPurposeSelected, betas, isSelfTourViewed, + hasActiveAdminPolicies, }) : {adminsChatReportID: onboardingAdminsChatReportID, policyID: onboardingPolicyID}; @@ -192,6 +195,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding activePolicyID, betas, isSelfTourViewed, + hasActiveAdminPolicies, completeOnboarding, ]); diff --git a/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx b/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx index 479511be66fba..ce46e17d99ca4 100644 --- a/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx +++ b/src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx @@ -5,6 +5,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import WorkspaceConfirmationForm from '@components/WorkspaceConfirmationForm'; import type {WorkspaceConfirmationSubmitFunctionParams} from '@components/WorkspaceConfirmationForm'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useOnyx from '@hooks/useOnyx'; import {createDraftWorkspace, createWorkspace} from '@libs/actions/Policy/Policy'; import Navigation from '@libs/Navigation/Navigation'; @@ -22,6 +23,7 @@ function WorkspaceConfirmationForTravelPage({route}: WorkspaceConfirmationForTra const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const goBack = () => { Navigation.goBack(route.params?.backTo ?? ROUTES.TRAVEL_UPGRADE.route); @@ -41,6 +43,7 @@ function WorkspaceConfirmationForTravelPage({route}: WorkspaceConfirmationForTra currentUserEmailParam: currentUserPersonalDetails.email ?? '', betas, isSelfTourViewed, + hasActiveAdminPolicies, }); goBack(); }; diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index 78e57f3bb1100..8337f6c716496 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -8,6 +8,7 @@ import ScrollView from '@components/ScrollView'; import WorkspaceConfirmationForm from '@components/WorkspaceConfirmationForm'; import type {WorkspaceConfirmationSubmitFunctionParams} from '@components/WorkspaceConfirmationForm'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -43,6 +44,7 @@ function IOURequestStepUpgrade({ const {isOffline} = useNetwork(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`); const [onboardingPurposeSelected] = useOnyx(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED); @@ -167,6 +169,7 @@ function IOURequestStepUpgrade({ onboardingPurposeSelected, betas, isSelfTourViewed, + hasActiveAdminPolicies, }); setIsUpgraded(true); policyDataRef.current = policyData; @@ -194,6 +197,7 @@ function IOURequestStepUpgrade({ onboardingPurposeSelected, betas, isSelfTourViewed, + hasActiveAdminPolicies, }); policyDataRef.current = policyData; setCreatedPolicyName(params.name); diff --git a/src/pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage.tsx b/src/pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage.tsx index 3a12d5a14c313..4b2ff3a591847 100644 --- a/src/pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage.tsx +++ b/src/pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage.tsx @@ -4,6 +4,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -31,6 +32,7 @@ function PersonalCardUpgradePage() { const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const onUpgrade = () => { createWorkspaceWithPolicyDraft({ @@ -46,6 +48,7 @@ function PersonalCardUpgradePage() { shouldCreateControlPolicy: false, isSelfTourViewed, betas, + hasActiveAdminPolicies, }); setIsUpgraded(true); }; diff --git a/src/pages/workspace/WorkspaceConfirmationPage.tsx b/src/pages/workspace/WorkspaceConfirmationPage.tsx index 5870f8439172c..d113d9a961bd7 100644 --- a/src/pages/workspace/WorkspaceConfirmationPage.tsx +++ b/src/pages/workspace/WorkspaceConfirmationPage.tsx @@ -4,6 +4,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import WorkspaceConfirmationForm from '@components/WorkspaceConfirmationForm'; import type {WorkspaceConfirmationSubmitFunctionParams} from '@components/WorkspaceConfirmationForm'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useOnyx from '@hooks/useOnyx'; import usePrivateSubscription from '@hooks/usePrivateSubscription'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -28,6 +29,8 @@ function WorkspaceConfirmationPage() { const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const privateSubscription = usePrivateSubscription(); + const hasActiveAdminPolicies = useHasActiveAdminPolicies(); + const onSubmit = (params: WorkspaceConfirmationSubmitFunctionParams) => { const policyID = params.policyID || generatePolicyID(); const routeToNavigate = isSmallScreenWidth ? ROUTES.WORKSPACE_INITIAL.getRoute(policyID) : ROUTES.WORKSPACE_OVERVIEW.getRoute(policyID); @@ -50,6 +53,7 @@ function WorkspaceConfirmationPage() { type: params.planType, isSelfTourViewed, betas, + hasActiveAdminPolicies, }); }; const currentUrl = getCurrentUrl(); diff --git a/src/selectors/Policy.ts b/src/selectors/Policy.ts index e5a606c68860c..efcad74a3c349 100644 --- a/src/selectors/Policy.ts +++ b/src/selectors/Policy.ts @@ -10,6 +10,8 @@ const ownerPoliciesSelector = (policies: OnyxCollection, currentUserAcco const activeAdminPoliciesSelector = (policies: OnyxCollection, currentUserAccountLogin: string) => getActiveAdminWorkspaces(policies, currentUserAccountLogin); +const hasActiveAdminPoliciesSelector = (policies: OnyxCollection, currentUserAccountLogin: string) => !!activeAdminPoliciesSelector(policies, currentUserAccountLogin); + /** * Creates a selector that aggregates all non-formula policy report fields from all policies, * sorted alphabetically by field key using the provided locale compare function @@ -137,6 +139,7 @@ export { createAllPolicyReportFieldsSelector, ownerPoliciesSelector, activeAdminPoliciesSelector, + hasActiveAdminPoliciesSelector, createPoliciesForDomainCardsSelector, policyTimeTrackingSelector, hasMultipleOutputCurrenciesSelector, diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 816f807addbc0..e91e8c1c3bd1b 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -6732,6 +6732,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates(); }) @@ -6891,6 +6892,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates(); }) @@ -7460,6 +7462,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates(); }) @@ -9462,6 +9465,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -9606,6 +9610,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); @@ -9685,6 +9690,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates(); }) @@ -9951,6 +9957,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates(); }) @@ -10168,6 +10175,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); return waitForBatchedUpdates() .then(() => { @@ -10392,6 +10400,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); @@ -12048,6 +12057,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -12149,6 +12159,7 @@ describe('actions/IOU', () => { currentUserEmailParam: CARLOS_EMAIL, activePolicyID: '123', isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -12593,6 +12604,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -12766,6 +12778,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: RORY_ACCOUNT_ID, currentUserEmailParam: RORY_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -12943,6 +12956,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); @@ -13129,6 +13143,7 @@ describe('actions/IOU', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close diff --git a/tests/actions/IOUTest/SplitTest.ts b/tests/actions/IOUTest/SplitTest.ts index 7a1c7c25bfa80..b8308fc3f9935 100644 --- a/tests/actions/IOUTest/SplitTest.ts +++ b/tests/actions/IOUTest/SplitTest.ts @@ -2065,6 +2065,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); await waitForBatchedUpdates(); @@ -2101,6 +2102,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, + hasActiveAdminPolicies: false, existingTransactionDraft: undefined, draftTransactionIDs: [], personalDetails: {}, @@ -2535,6 +2537,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -2572,6 +2575,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -2708,6 +2712,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { currentUserAccountIDParam: RORY_ACCOUNT_ID, currentUserEmailParam: RORY_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -2745,6 +2750,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -2885,6 +2891,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); @@ -2923,6 +2930,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -3071,6 +3079,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); // Change the approval mode for the policy since default is Submit and Close @@ -3111,6 +3120,7 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -3334,6 +3344,7 @@ describe('updateSplitTransactions', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); await waitForBatchedUpdates(); @@ -3362,6 +3373,7 @@ describe('updateSplitTransactions', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, existingTransactionDraft: undefined, @@ -3461,6 +3473,7 @@ describe('updateSplitTransactions', () => { currentUserAccountIDParam: CARLOS_ACCOUNT_ID, currentUserEmailParam: CARLOS_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); setWorkspaceApprovalMode(policyID, CARLOS_EMAIL, CONST.POLICY.APPROVAL_MODE.BASIC); await waitForBatchedUpdates(); @@ -3489,6 +3502,7 @@ describe('updateSplitTransactions', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, existingTransactionDraft: undefined, diff --git a/tests/actions/PolicyTest.ts b/tests/actions/PolicyTest.ts index 42b508d18425d..92d6c8b33b535 100644 --- a/tests/actions/PolicyTest.ts +++ b/tests/actions/PolicyTest.ts @@ -2,6 +2,7 @@ import {Str} from 'expensify-common'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import {WRITE_COMMANDS} from '@libs/API/types'; +import GoogleTagManager from '@libs/GoogleTagManager'; // eslint-disable-next-line no-restricted-syntax import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; // eslint-disable-next-line no-restricted-syntax -- this is needed to allow mocking @@ -35,6 +36,8 @@ const TEST_PHONE_NUMBER = '1234567890'; const TEST_NON_PUBLIC_DOMAIN_EMAIL = 'esh@example.com'; const TEST_SMS_DOMAIN_EMAIL = 'esh@expensify.sms'; +jest.mock('@libs/GoogleTagManager'); + OnyxUpdateManager(); describe('actions/Policy', () => { beforeAll(() => { @@ -48,6 +51,7 @@ describe('actions/Policy', () => { global.fetch = TestHelper.getGlobalFetchMock(); mockFetch = fetch as MockFetch; IntlStore.load(CONST.LOCALES.EN); + jest.clearAllMocks(); return Onyx.clear().then(waitForBatchedUpdates); }); @@ -81,6 +85,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -524,6 +529,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -553,6 +559,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, betas: [CONST.BETAS.SUGGESTED_FOLLOWUPS], }); await waitForBatchedUpdates(); @@ -585,6 +592,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -619,6 +627,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -649,6 +658,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -676,6 +686,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -704,6 +715,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -730,6 +742,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -756,6 +769,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -782,6 +796,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -808,6 +823,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -846,6 +862,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -879,6 +896,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: true, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -912,6 +930,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -947,6 +966,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: true, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -987,6 +1007,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -1028,6 +1049,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, adminParticipant: {login: adminEmail, accountID: adminAccountID}, }); await waitForBatchedUpdates(); @@ -1065,6 +1087,7 @@ describe('actions/Policy', () => { currentUserAccountIDParam: ESH_ACCOUNT_ID, currentUserEmailParam: ESH_EMAIL, isSelfTourViewed: false, + hasActiveAdminPolicies: false, }); await waitForBatchedUpdates(); @@ -1079,6 +1102,41 @@ describe('actions/Policy', () => { apiWriteSpy.mockRestore(); }); + + it('should publish a workspace created event if this is their first policy', () => { + Policy.createWorkspace({ + policyOwnerEmail: ESH_EMAIL, + makeMeAdmin: true, + policyName: WORKSPACE_NAME, + policyID: '1', + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM}, + currentUserAccountIDParam: ESH_ACCOUNT_ID, + currentUserEmailParam: ESH_EMAIL, + isSelfTourViewed: false, + hasActiveAdminPolicies: false, + }); + + expect(GoogleTagManager.publishEvent).toHaveBeenCalledTimes(1); + expect(GoogleTagManager.publishEvent).toHaveBeenCalledWith(CONST.ANALYTICS.EVENT.WORKSPACE_CREATED, ESH_ACCOUNT_ID); + }); + + it('should not publish a workspace created event if this is not their first policy', () => { + Policy.createWorkspace({ + policyOwnerEmail: ESH_EMAIL, + makeMeAdmin: true, + policyName: WORKSPACE_NAME, + policyID: '1', + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + introSelected: {choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM}, + currentUserAccountIDParam: ESH_ACCOUNT_ID, + currentUserEmailParam: ESH_EMAIL, + isSelfTourViewed: false, + hasActiveAdminPolicies: true, + }); + + expect(GoogleTagManager.publishEvent).not.toHaveBeenCalled(); + }); }); describe('updateWorkspaceAvatar', () => { diff --git a/tests/unit/GoogleTagManagerTest.tsx b/tests/unit/GoogleTagManagerTest.tsx index 77ea0d1d1c8d2..c2b234e543c14 100644 --- a/tests/unit/GoogleTagManagerTest.tsx +++ b/tests/unit/GoogleTagManagerTest.tsx @@ -157,11 +157,32 @@ describe('GoogleTagManagerTest', () => { test('workspace_created', async () => { // When we run the createWorkspace action a few times - createWorkspace({introSelected: undefined, currentUserAccountIDParam: 123456, activePolicyID: undefined, currentUserEmailParam: 'test@test.com', isSelfTourViewed: false}); + createWorkspace({ + introSelected: undefined, + currentUserAccountIDParam: 123456, + activePolicyID: undefined, + currentUserEmailParam: 'test@test.com', + isSelfTourViewed: false, + hasActiveAdminPolicies: false, + }); await waitForBatchedUpdatesWithAct(); - createWorkspace({currentUserAccountIDParam: 123456, activePolicyID: undefined, currentUserEmailParam: 'test@test.com', introSelected: undefined, isSelfTourViewed: false}); + createWorkspace({ + currentUserAccountIDParam: 123456, + activePolicyID: undefined, + currentUserEmailParam: 'test@test.com', + introSelected: undefined, + isSelfTourViewed: false, + hasActiveAdminPolicies: false, + }); await waitForBatchedUpdatesWithAct(); - createWorkspace({currentUserAccountIDParam: 123456, activePolicyID: undefined, currentUserEmailParam: 'test@test.com', introSelected: undefined, isSelfTourViewed: false}); + createWorkspace({ + currentUserAccountIDParam: 123456, + activePolicyID: undefined, + currentUserEmailParam: 'test@test.com', + introSelected: undefined, + isSelfTourViewed: false, + hasActiveAdminPolicies: false, + }); await waitForBatchedUpdatesWithAct(); // Then we publish a workspace_created event only once From ccc59bf39ea71440d320693393347d59c15452fc Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 18 Mar 2026 22:02:29 +0800 Subject: [PATCH 2/4] fix it returns true for empty array --- src/selectors/Policy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/selectors/Policy.ts b/src/selectors/Policy.ts index efcad74a3c349..aafe7542a4aa0 100644 --- a/src/selectors/Policy.ts +++ b/src/selectors/Policy.ts @@ -10,7 +10,7 @@ const ownerPoliciesSelector = (policies: OnyxCollection, currentUserAcco const activeAdminPoliciesSelector = (policies: OnyxCollection, currentUserAccountLogin: string) => getActiveAdminWorkspaces(policies, currentUserAccountLogin); -const hasActiveAdminPoliciesSelector = (policies: OnyxCollection, currentUserAccountLogin: string) => !!activeAdminPoliciesSelector(policies, currentUserAccountLogin); +const hasActiveAdminPoliciesSelector = (policies: OnyxCollection, currentUserAccountLogin: string) => !!activeAdminPoliciesSelector(policies, currentUserAccountLogin).length; /** * Creates a selector that aggregates all non-formula policy report fields from all policies, From 437186cacd6169fe767494a09f04eb1dd2c1a20a Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 18 Mar 2026 22:08:37 +0800 Subject: [PATCH 3/4] fix type --- src/libs/actions/Policy/Policy.ts | 2 +- tests/actions/IOUTest/SplitTest.ts | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 350dabe332c6a..0e1320955b225 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -194,7 +194,6 @@ type BuildPolicyDataOptions = { onboardingPurposeSelected?: OnboardingPurpose; shouldAddGuideWelcomeMessage?: boolean; shouldCreateControlPolicy?: boolean; - hasActiveAdminPolicies: boolean; type?: typeof CONST.POLICY.TYPE.TEAM | typeof CONST.POLICY.TYPE.CORPORATE; // TODO: Make it required once we complete refactoring the buildPolicyData function to use isSelfTourViewed. Refactor issue: https://github.com/Expensify/App/issues/66424 isSelfTourViewed?: boolean; @@ -205,6 +204,7 @@ type BuildPolicyDataOptions = { // TODO: Remove this type once we complete refactoring the buildPolicyData function to use isSelfTourViewed. Refactor issue: https://github.com/Expensify/App/issues/66424 type CreateWorkspaceDataOptions = Omit & { isSelfTourViewed: boolean | undefined; + hasActiveAdminPolicies: boolean; }; type DuplicatePolicyDataOptions = { diff --git a/tests/actions/IOUTest/SplitTest.ts b/tests/actions/IOUTest/SplitTest.ts index b8308fc3f9935..e7e34fbde6fb2 100644 --- a/tests/actions/IOUTest/SplitTest.ts +++ b/tests/actions/IOUTest/SplitTest.ts @@ -2102,7 +2102,6 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, - hasActiveAdminPolicies: false, existingTransactionDraft: undefined, draftTransactionIDs: [], personalDetails: {}, @@ -2575,7 +2574,6 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -2750,7 +2748,6 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -2930,7 +2927,6 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -3120,7 +3116,6 @@ describe('updateSplitTransactionsFromSplitExpensesFlow', () => { existingTransactionDraft: undefined, draftTransactionIDs: [], isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, }); @@ -3373,7 +3368,6 @@ describe('updateSplitTransactions', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, existingTransactionDraft: undefined, @@ -3502,7 +3496,6 @@ describe('updateSplitTransactions', () => { policyRecentlyUsedCurrencies: [], quickAction: undefined, isSelfTourViewed: false, - hasActiveAdminPolicies: false, betas: [CONST.BETAS.ALL], personalDetails: {}, existingTransactionDraft: undefined, From be060c2bc6fed7a0586738ea4259206065b700a4 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 18 Mar 2026 22:12:41 +0800 Subject: [PATCH 4/4] fix test --- tests/unit/GoogleTagManagerTest.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/GoogleTagManagerTest.tsx b/tests/unit/GoogleTagManagerTest.tsx index c2b234e543c14..60e41378021c3 100644 --- a/tests/unit/GoogleTagManagerTest.tsx +++ b/tests/unit/GoogleTagManagerTest.tsx @@ -172,7 +172,7 @@ describe('GoogleTagManagerTest', () => { currentUserEmailParam: 'test@test.com', introSelected: undefined, isSelfTourViewed: false, - hasActiveAdminPolicies: false, + hasActiveAdminPolicies: true, }); await waitForBatchedUpdatesWithAct(); createWorkspace({ @@ -181,7 +181,7 @@ describe('GoogleTagManagerTest', () => { currentUserEmailParam: 'test@test.com', introSelected: undefined, isSelfTourViewed: false, - hasActiveAdminPolicies: false, + hasActiveAdminPolicies: true, }); await waitForBatchedUpdatesWithAct();