Skip to content

Commit ef1d10b

Browse files
fix: Hide tokenless banner for signed out user
1 parent 02d5b6b commit ef1d10b

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

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

+63-4
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,12 +124,15 @@ 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 })
135+
setup({ tokenlessSection: false, currentUser: mockSignedInUser })
83136
const { container } = render(<TokenlessBanner />, { wrapper: wrapper() })
84137
expect(container).toBeEmptyDOMElement()
85138
})
@@ -93,7 +146,7 @@ describe('TokenlessBanner', () => {
93146
})
94147

95148
it('renders TokenRequiredBanner when uploadTokenRequired is true', async () => {
96-
setup({ uploadTokenRequired: true })
149+
setup({ uploadTokenRequired: true, currentUser: mockSignedInUser })
97150
render(<TokenlessBanner />, { wrapper: wrapper() })
98151

99152
await waitFor(() => {
@@ -102,13 +155,19 @@ describe('TokenlessBanner', () => {
102155
})
103156
})
104157

105-
it('renders TokenNotRequiredBanner when uploadTokenRequired is false', async () => {
106-
setup({ uploadTokenRequired: false })
158+
it.only('renders TokenNotRequiredBanner when uploadTokenRequired is false', async () => {
159+
setup({ uploadTokenRequired: false, currentUser: mockSignedInUser })
107160
render(<TokenlessBanner />, { wrapper: wrapper() })
108161

109162
await waitFor(() => {
110163
const banner = screen.getByText('TokenNotRequiredBanner')
111164
expect(banner).toBeInTheDocument()
112165
})
113166
})
167+
168+
it.only('renders nothing when currentUser is not provided', () => {
169+
setup({ uploadTokenRequired: false, currentUser: mockSignedInUser })
170+
const { container } = render(<TokenlessBanner />, { wrapper: wrapper() })
171+
expect(container).toBeEmptyDOMElement()
172+
})
114173
})

src/shared/GlobalTopBanners/TokenlessBanner/TokenlessBanner.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { lazy } from 'react'
22
import { useParams } from 'react-router-dom'
33

44
import { useUploadTokenRequired } from 'services/uploadTokenRequired'
5+
import { useUser } from 'services/user'
56
import { useFlags } from 'shared/featureFlags'
67

78
const TokenRequiredBanner = lazy(() => import('./TokenRequiredBanner'))
@@ -18,8 +19,9 @@ const TokenlessBanner: React.FC = () => {
1819
})
1920
const { provider, owner } = useParams<UseParams>()
2021
const { data } = useUploadTokenRequired({ provider, owner, enabled: !!owner })
22+
const { data: currentUser } = useUser()
2123

22-
if (!tokenlessSection || !owner || !data) return null
24+
if (!tokenlessSection || !owner || !data || !currentUser?.user) return null
2325

2426
return data?.uploadTokenRequired ? (
2527
<TokenRequiredBanner />

0 commit comments

Comments
 (0)