From 7eb781253bd3773ec5c4ccbb1ad570551f408e6f Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 13 Nov 2024 14:33:43 +0700 Subject: [PATCH 1/6] fix: The shortcut CTRL + K does not work with a user as employee in a WS --- src/libs/onboardingSelectors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/onboardingSelectors.ts b/src/libs/onboardingSelectors.ts index bdbb3ff142f44..c62e4bea746d9 100644 --- a/src/libs/onboardingSelectors.ts +++ b/src/libs/onboardingSelectors.ts @@ -15,7 +15,7 @@ function hasCompletedGuidedSetupFlowSelector(onboarding: OnyxValue Date: Wed, 13 Nov 2024 15:05:13 +0700 Subject: [PATCH 2/6] refactor function --- src/libs/onboardingSelectors.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/onboardingSelectors.ts b/src/libs/onboardingSelectors.ts index c62e4bea746d9..8efd520eebd4b 100644 --- a/src/libs/onboardingSelectors.ts +++ b/src/libs/onboardingSelectors.ts @@ -11,11 +11,11 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; */ function hasCompletedGuidedSetupFlowSelector(onboarding: OnyxValue): boolean | undefined { // Onboarding is an array or an empty object for old accounts and accounts created from OldDot - if (Array.isArray(onboarding) || isEmptyObject(onboarding)) { + if (Array.isArray(onboarding) || (!isEmptyObject(onboarding) && onboarding?.hasCompletedGuidedSetupFlow === undefined)) { return true; } - return onboarding?.hasCompletedGuidedSetupFlow ?? true; + return onboarding?.hasCompletedGuidedSetupFlow; } /** From 7b6fb60751ce04ddad5321ca8c9275306d937629 Mon Sep 17 00:00:00 2001 From: truph01 Date: Wed, 13 Nov 2024 15:10:02 +0700 Subject: [PATCH 3/6] fix: refactor hasCompletedGuidedSetupFlowSelector --- src/libs/onboardingSelectors.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libs/onboardingSelectors.ts b/src/libs/onboardingSelectors.ts index 8efd520eebd4b..35b1f1b4208c7 100644 --- a/src/libs/onboardingSelectors.ts +++ b/src/libs/onboardingSelectors.ts @@ -11,7 +11,11 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; */ function hasCompletedGuidedSetupFlowSelector(onboarding: OnyxValue): boolean | undefined { // Onboarding is an array or an empty object for old accounts and accounts created from OldDot - if (Array.isArray(onboarding) || (!isEmptyObject(onboarding) && onboarding?.hasCompletedGuidedSetupFlow === undefined)) { + if (Array.isArray(onboarding) || isEmptyObject(onboarding)) { + return true; + } + + if (!isEmptyObject(onboarding) && onboarding?.hasCompletedGuidedSetupFlow === undefined) { return true; } From 495e9a35c93f5478fcb4ab39a9896aa4cf744a18 Mon Sep 17 00:00:00 2001 From: truph01 Date: Mon, 18 Nov 2024 16:33:18 +0700 Subject: [PATCH 4/6] fix: Add unit test --- tests/unit/OnboardingSelectorsTest.ts | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/unit/OnboardingSelectorsTest.ts diff --git a/tests/unit/OnboardingSelectorsTest.ts b/tests/unit/OnboardingSelectorsTest.ts new file mode 100644 index 0000000000000..8a078416914ae --- /dev/null +++ b/tests/unit/OnboardingSelectorsTest.ts @@ -0,0 +1,33 @@ +import type {OnyxValue} from 'react-native-onyx'; +import {hasCompletedGuidedSetupFlowSelector} from '@libs/onboardingSelectors'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; + +describe('onboardingSelectors', () => { + describe('hasCompletedGuidedSetupFlowSelector', () => { + it('Should return true if onboarding nvp is array ', async () => { + const onboarding = [] as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); + }); + it('Should return true if onboarding nvp is {}', async () => { + const onboarding = {} as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); + }); + it('Should return true if onboarding nvp contains only signupQualifier', async () => { + const onboarding = {signupQualifier: CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB} as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); + }); + it('Should return true if onboarding nvp contains hasCompletedGuidedSetupFlow = true', async () => { + const onboarding = {hasCompletedGuidedSetupFlow: true} as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); + }); + it('Should return false if onboarding nvp contains hasCompletedGuidedSetupFlow = false', async () => { + const onboarding = {hasCompletedGuidedSetupFlow: false} as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(false); + }); + it('Should return true if onboarding nvp contains only selfTourViewed', async () => { + const onboarding = {selfTourViewed: true} as OnyxValue; + expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); + }); + }); +}); From 5c3fa8ecc5830ad766129a4aba88c1273e101a21 Mon Sep 17 00:00:00 2001 From: truph01 Date: Mon, 18 Nov 2024 16:36:18 +0700 Subject: [PATCH 5/6] fix: lint --- tests/unit/OnboardingSelectorsTest.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/unit/OnboardingSelectorsTest.ts b/tests/unit/OnboardingSelectorsTest.ts index 8a078416914ae..2f81f7a8071dc 100644 --- a/tests/unit/OnboardingSelectorsTest.ts +++ b/tests/unit/OnboardingSelectorsTest.ts @@ -1,31 +1,31 @@ import type {OnyxValue} from 'react-native-onyx'; import {hasCompletedGuidedSetupFlowSelector} from '@libs/onboardingSelectors'; import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; +import type ONYXKEYS from '@src/ONYXKEYS'; describe('onboardingSelectors', () => { describe('hasCompletedGuidedSetupFlowSelector', () => { - it('Should return true if onboarding nvp is array ', async () => { + it('Should return true if onboarding nvp is array ', () => { const onboarding = [] as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp is {}', async () => { + it('Should return true if onboarding nvp is {}', () => { const onboarding = {} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp contains only signupQualifier', async () => { + it('Should return true if onboarding nvp contains only signupQualifier', () => { const onboarding = {signupQualifier: CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp contains hasCompletedGuidedSetupFlow = true', async () => { + it('Should return true if onboarding nvp contains hasCompletedGuidedSetupFlow = true', () => { const onboarding = {hasCompletedGuidedSetupFlow: true} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return false if onboarding nvp contains hasCompletedGuidedSetupFlow = false', async () => { + it('Should return false if onboarding nvp contains hasCompletedGuidedSetupFlow = false', () => { const onboarding = {hasCompletedGuidedSetupFlow: false} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(false); }); - it('Should return true if onboarding nvp contains only selfTourViewed', async () => { + it('Should return true if onboarding nvp contains only selfTourViewed', () => { const onboarding = {selfTourViewed: true} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); From 6da0b81e9bea7929914aaaeb5ca72ab20aeca513 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 19 Nov 2024 01:09:02 +0700 Subject: [PATCH 6/6] fix: update comments --- tests/unit/OnboardingSelectorsTest.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/unit/OnboardingSelectorsTest.ts b/tests/unit/OnboardingSelectorsTest.ts index 2f81f7a8071dc..1fc5846b24727 100644 --- a/tests/unit/OnboardingSelectorsTest.ts +++ b/tests/unit/OnboardingSelectorsTest.ts @@ -4,28 +4,31 @@ import CONST from '@src/CONST'; import type ONYXKEYS from '@src/ONYXKEYS'; describe('onboardingSelectors', () => { + // Not all users have this NVP defined as we did not run a migration to backfill it for existing accounts, hence we need to make sure + // the onboarding flow is only showed to the users with `hasCompletedGuidedSetupFlow` set to false describe('hasCompletedGuidedSetupFlowSelector', () => { - it('Should return true if onboarding nvp is array ', () => { + // It might be the case that backend returns an empty array if the NVP is not defined on this particular account + it('Should return true if onboarding NVP is an array', () => { const onboarding = [] as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp is {}', () => { + it('Should return true if onboarding NVP is an empty object', () => { const onboarding = {} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp contains only signupQualifier', () => { + it('Should return true if onboarding NVP contains only signupQualifier', () => { const onboarding = {signupQualifier: CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return true if onboarding nvp contains hasCompletedGuidedSetupFlow = true', () => { + it('Should return true if onboarding NVP contains hasCompletedGuidedSetupFlow = true', () => { const onboarding = {hasCompletedGuidedSetupFlow: true} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); }); - it('Should return false if onboarding nvp contains hasCompletedGuidedSetupFlow = false', () => { + it('Should return false if onboarding NVP contains hasCompletedGuidedSetupFlow = false', () => { const onboarding = {hasCompletedGuidedSetupFlow: false} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(false); }); - it('Should return true if onboarding nvp contains only selfTourViewed', () => { + it('Should return true if onboarding NVP contains only selfTourViewed', () => { const onboarding = {selfTourViewed: true} as OnyxValue; expect(hasCompletedGuidedSetupFlowSelector(onboarding)).toBe(true); });