Skip to content

Commit 205f7c5

Browse files
fix: Hide tokenless banner for signed out user
1 parent c763e30 commit 205f7c5

File tree

2 files changed

+67
-8
lines changed

2 files changed

+67
-8
lines changed

src/shared/GlobalTopBanners/TokenlessBanner/TokenlessBanner.test.tsx

+64-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { setupServer } from 'msw/node'
55
import { Suspense } from 'react'
66
import { MemoryRouter, Route } from 'react-router-dom'
77

8+
import { Plans } from 'shared/utils/billing'
9+
810
import TokenlessBanner from './TokenlessBanner'
911

1012
const mocks = vi.hoisted(() => ({
@@ -15,6 +17,8 @@ vi.mock('shared/featureFlags', () => ({
1517
useFlags: mocks.useFlags,
1618
}))
1719

20+
vi.mock('services/users')
21+
1822
vi.mock('./TokenRequiredBanner', () => ({
1923
default: () => 'TokenRequiredBanner',
2024
}))
@@ -41,6 +45,50 @@ afterAll(() => {
4145
server.close()
4246
})
4347

48+
const mockSignedInUser = {
49+
me: {
50+
owner: {
51+
defaultOrgUsername: 'codecov',
52+
},
53+
54+
privateAccess: true,
55+
onboardingCompleted: true,
56+
businessEmail: '[email protected]',
57+
termsAgreement: true,
58+
user: {
59+
name: 'Jane Doe',
60+
username: 'janedoe',
61+
avatarUrl: 'http://127.0.0.1/avatar-url',
62+
avatar: 'http://127.0.0.1/avatar-url',
63+
student: false,
64+
studentCreatedAt: null,
65+
studentUpdatedAt: null,
66+
customerIntent: 'PERSONAL',
67+
},
68+
trackingMetadata: {
69+
service: 'github',
70+
ownerid: 123,
71+
serviceId: '123',
72+
plan: Plans.USERS_BASIC,
73+
staff: false,
74+
hasYaml: false,
75+
bot: null,
76+
delinquent: null,
77+
didTrial: null,
78+
planProvider: null,
79+
planUserCount: 1,
80+
createdAt: 'timestamp',
81+
updatedAt: 'timestamp',
82+
profile: {
83+
createdAt: 'timestamp',
84+
otherGoal: null,
85+
typeProjects: [],
86+
goals: [],
87+
},
88+
},
89+
},
90+
}
91+
4492
const wrapper =
4593
(initialEntries = ['/gh/codecov']): React.FC<React.PropsWithChildren> =>
4694
({ children }) => (
@@ -57,9 +105,11 @@ describe('TokenlessBanner', () => {
57105
function setup({
58106
tokenlessSection = true,
59107
uploadTokenRequired = false,
108+
currentUser,
60109
}: {
61110
tokenlessSection?: boolean
62111
uploadTokenRequired?: boolean
112+
currentUser?: any
63113
} = {}) {
64114
mocks.useFlags.mockReturnValue({ tokenlessSection })
65115

@@ -74,15 +124,16 @@ describe('TokenlessBanner', () => {
74124
},
75125
},
76126
})
127+
}),
128+
graphql.query('CurrentUser', () => {
129+
return HttpResponse.json({ data: currentUser })
77130
})
78131
)
79132
}
80133

81134
it('renders nothing when tokenlessSection flag is false', () => {
82-
setup({ tokenlessSection: false })
83-
const { container } = render(<TokenlessBanner />, {
84-
wrapper: wrapper(['/gh/codecov']),
85-
})
135+
setup({ tokenlessSection: false, currentUser: mockSignedInUser })
136+
const { container } = render(<TokenlessBanner />, { wrapper: wrapper(['/gh/codecov']) })
86137
expect(container).toBeEmptyDOMElement()
87138
})
88139

@@ -95,7 +146,7 @@ describe('TokenlessBanner', () => {
95146
})
96147

97148
it('renders TokenRequiredBanner when uploadTokenRequired is true', async () => {
98-
setup({ uploadTokenRequired: true })
149+
setup({ uploadTokenRequired: true, currentUser: mockSignedInUser })
99150
render(<TokenlessBanner />, { wrapper: wrapper(['/gh/codecov']) })
100151

101152
await waitFor(() => {
@@ -105,7 +156,7 @@ describe('TokenlessBanner', () => {
105156
})
106157

107158
it('renders TokenNotRequiredBanner when uploadTokenRequired is false', async () => {
108-
setup({ uploadTokenRequired: false })
159+
setup({ uploadTokenRequired: false, currentUser: mockSignedInUser })
109160
render(<TokenlessBanner />, { wrapper: wrapper(['/gh/codecov']) })
110161

111162
await waitFor(() => {
@@ -115,7 +166,7 @@ describe('TokenlessBanner', () => {
115166
})
116167

117168
it('renders nothing if coming from onboarding', async () => {
118-
setup({ uploadTokenRequired: true })
169+
setup({ uploadTokenRequired: true, currentUser: mockSignedInUser })
119170
render(<TokenlessBanner />, {
120171
wrapper: wrapper(['/gh/codecov?source=onboarding']),
121172
})
@@ -128,4 +179,10 @@ describe('TokenlessBanner', () => {
128179
).not.toBeInTheDocument()
129180
})
130181
})
182+
183+
it('renders nothing when currentUser is not provided', () => {
184+
setup({ uploadTokenRequired: false, currentUser: mockSignedInUser })
185+
const { container } = render(<TokenlessBanner />, { wrapper: wrapper() })
186+
expect(container).toBeEmptyDOMElement()
187+
})
131188
})

src/shared/GlobalTopBanners/TokenlessBanner/TokenlessBanner.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useParams } from 'react-router-dom'
44
import { ONBOARDING_SOURCE } from 'pages/TermsOfService/constants'
55
import { useLocationParams } from 'services/navigation'
66
import { useUploadTokenRequired } from 'services/uploadTokenRequired'
7+
import { useUser } from 'services/user'
78
import { useFlags } from 'shared/featureFlags'
89

910
const TokenRequiredBanner = lazy(() => import('./TokenRequiredBanner'))
@@ -20,11 +21,12 @@ const TokenlessBanner: React.FC = () => {
2021
})
2122
const { provider, owner } = useParams<UseParams>()
2223
const { data } = useUploadTokenRequired({ provider, owner, enabled: !!owner })
24+
const { data: currentUser } = useUser()
2325
const { params } = useLocationParams()
2426
// @ts-expect-error useLocationParams needs to be typed
2527
const cameFromOnboarding = params['source'] === ONBOARDING_SOURCE
2628

27-
if (!tokenlessSection || !owner || !data || cameFromOnboarding) return null
29+
if (!tokenlessSection || !owner || !data || !currentUser?.user || cameFromOnboarding) return null
2830

2931
return data?.uploadTokenRequired ? (
3032
<TokenRequiredBanner />

0 commit comments

Comments
 (0)