diff --git a/src/pages/CommitDetailPage/CommitCoverage/CommitCoverage.spec.jsx b/src/pages/CommitDetailPage/CommitCoverage/CommitCoverage.spec.jsx index 82669ae73a..7f2057242f 100644 --- a/src/pages/CommitDetailPage/CommitCoverage/CommitCoverage.spec.jsx +++ b/src/pages/CommitDetailPage/CommitCoverage/CommitCoverage.spec.jsx @@ -165,6 +165,7 @@ const mockErroredUploads = { const mockRepoSettingsTeamData = (isPrivate = false) => ({ owner: { + isCurrentUserPartOfOrg: null, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/CommitDetailPage/CommitCoverage/CommitCoverageTabs/CommitCoverageTabs.spec.jsx b/src/pages/CommitDetailPage/CommitCoverage/CommitCoverageTabs/CommitCoverageTabs.spec.jsx index 792524c71b..1c6800aedc 100644 --- a/src/pages/CommitDetailPage/CommitCoverage/CommitCoverageTabs/CommitCoverageTabs.spec.jsx +++ b/src/pages/CommitDetailPage/CommitCoverage/CommitCoverageTabs/CommitCoverageTabs.spec.jsx @@ -12,6 +12,7 @@ import CommitCoverageTabs from './CommitCoverageTabs' const mockRepoSettings = (isPrivate) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'main', diff --git a/src/pages/CommitDetailPage/CommitCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx b/src/pages/CommitDetailPage/CommitCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx index 28ab360f41..9dd224f159 100644 --- a/src/pages/CommitDetailPage/CommitCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx +++ b/src/pages/CommitDetailPage/CommitCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx @@ -33,6 +33,7 @@ const mockProTier = { const mockRepoSettings = (isPrivate: boolean) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/CommitDetailPage/Header/Header.spec.tsx b/src/pages/CommitDetailPage/Header/Header.spec.tsx index 990ae15168..3270330ed3 100644 --- a/src/pages/CommitDetailPage/Header/Header.spec.tsx +++ b/src/pages/CommitDetailPage/Header/Header.spec.tsx @@ -17,6 +17,7 @@ const mockedUseFlags = useFlags as jest.Mock<{ multipleTiers: boolean }> const mockRepoSettings = (isPrivate = false) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/PullRequestPage/Header/Header.spec.tsx b/src/pages/PullRequestPage/Header/Header.spec.tsx index 990ae15168..3270330ed3 100644 --- a/src/pages/PullRequestPage/Header/Header.spec.tsx +++ b/src/pages/PullRequestPage/Header/Header.spec.tsx @@ -17,6 +17,7 @@ const mockedUseFlags = useFlags as jest.Mock<{ multipleTiers: boolean }> const mockRepoSettings = (isPrivate = false) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/PullRequestPage/PullCoverage/Summary/Summary.spec.tsx b/src/pages/PullRequestPage/PullCoverage/Summary/Summary.spec.tsx index d938921787..83b604c1b9 100644 --- a/src/pages/PullRequestPage/PullCoverage/Summary/Summary.spec.tsx +++ b/src/pages/PullRequestPage/PullCoverage/Summary/Summary.spec.tsx @@ -81,6 +81,7 @@ describe('Summary', () => { ctx.status(200), ctx.data({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/PullRequestPage/PullCoverage/routes/FileExplorer/FileExplorer.spec.tsx b/src/pages/PullRequestPage/PullCoverage/routes/FileExplorer/FileExplorer.spec.tsx index be54dfd55a..35106f57a9 100644 --- a/src/pages/PullRequestPage/PullCoverage/routes/FileExplorer/FileExplorer.spec.tsx +++ b/src/pages/PullRequestPage/PullCoverage/routes/FileExplorer/FileExplorer.spec.tsx @@ -159,6 +159,7 @@ const mockTreeData = { const mockRepoSettings = { owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx b/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx index 6598bf00a6..d1cb2f86d1 100644 --- a/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx +++ b/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChangedTab.spec.tsx @@ -128,6 +128,7 @@ describe('FilesChangedTab', () => { ctx.status(200), ctx.data({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/pages/RepoPage/CommitsTab/CommitsTab.spec.jsx b/src/pages/RepoPage/CommitsTab/CommitsTab.spec.jsx index d26b93dd47..e48ef5be67 100644 --- a/src/pages/RepoPage/CommitsTab/CommitsTab.spec.jsx +++ b/src/pages/RepoPage/CommitsTab/CommitsTab.spec.jsx @@ -137,6 +137,7 @@ const mockBranch = (branchName) => ({ const mockRepoSettings = (isPrivate = false) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/pages/RepoPage/ConfigTab/tabs/GeneralTab/Tokens/TokensTeam/TokensTeam.spec.js b/src/pages/RepoPage/ConfigTab/tabs/GeneralTab/Tokens/TokensTeam/TokensTeam.spec.js index 7fa6b8c602..d4d1f937c0 100644 --- a/src/pages/RepoPage/ConfigTab/tabs/GeneralTab/Tokens/TokensTeam/TokensTeam.spec.js +++ b/src/pages/RepoPage/ConfigTab/tabs/GeneralTab/Tokens/TokensTeam/TokensTeam.spec.js @@ -37,6 +37,7 @@ describe('TokensTeam', () => { ctx.status(200), ctx.data({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.spec.tsx b/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.spec.tsx index ded84b8d65..1b4071caa5 100644 --- a/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.spec.tsx +++ b/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.spec.tsx @@ -28,8 +28,12 @@ jest.mock('./Header', () => ({ children }: { children: React.ReactNode }) => (

Components Header Component {children}

)) -const mockRepoSettings = (isPrivate = false) => ({ +const mockRepoSettings = ( + isPrivate = false, + isCurrentUserPartOfOrg = true +) => ({ owner: { + isCurrentUserPartOfOrg, repository: { __typename: 'Repository', activated: true, @@ -154,11 +158,13 @@ describe('Components Tab', () => { flags = [nextPageFlagData, initialFlagData], tierValue = TierNames.PRO, isPrivate = false, + isCurrentUserPartOfOrg = true, }: { data?: object flags?: any[] tierValue?: TTierNames isPrivate?: boolean + isCurrentUserPartOfOrg?: boolean }) { server.use( graphql.query('OwnerTier', (req, res, ctx) => { @@ -174,7 +180,10 @@ describe('Components Tab', () => { ) }), graphql.query('GetRepoSettingsTeam', (req, res, ctx) => { - return res(ctx.status(200), ctx.data(mockRepoSettings(isPrivate))) + return res( + ctx.status(200), + ctx.data(mockRepoSettings(isPrivate, isCurrentUserPartOfOrg)) + ) }), graphql.query('BackfillComponentMemberships', (req, res, ctx) => res(ctx.status(200), ctx.data(data)) @@ -328,4 +337,32 @@ describe('Components Tab', () => { expect(enableText).toBeInTheDocument() }) }) + + describe('when current user is not part of org and data is not enabled', () => { + beforeEach(() => { + setup({ + data: { + config: { + isTimescaleEnabled: true, + }, + owner: { + repository: { + __typename: 'Repository', + componentsMeasurementsActive: false, + componentsMeasurementsBackfilled: false, + }, + }, + }, + isCurrentUserPartOfOrg: false, + }) + }) + + it('renders empty state message', async () => { + render(, { wrapper }) + const componentsText = await screen.findByText( + /Component analytics is disabled./ + ) + expect(componentsText).toBeInTheDocument() + }) + }) }) diff --git a/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.tsx b/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.tsx index e530a44800..25780a3a43 100644 --- a/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.tsx +++ b/src/pages/RepoPage/CoverageTab/ComponentsTab/ComponentsTab.tsx @@ -66,7 +66,14 @@ function ComponentsTab() { }) } > - + {repoSettings?.isCurrentUserPartOfOrg ? ( + + ) : ( +
+
+

Component analytics is disabled.

+
+ )}
{showComponentsTable({ diff --git a/src/pages/RepoPage/CoverageTab/CoverageTab.spec.tsx b/src/pages/RepoPage/CoverageTab/CoverageTab.spec.tsx index da54a4b817..68228d31fc 100644 --- a/src/pages/RepoPage/CoverageTab/CoverageTab.spec.tsx +++ b/src/pages/RepoPage/CoverageTab/CoverageTab.spec.tsx @@ -12,6 +12,7 @@ import CoverageTab from './CoverageTab' const mockRepoSettingsTeam = { owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', diff --git a/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.jsx b/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.jsx index 579a0bc675..3f436ca64b 100644 --- a/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.jsx +++ b/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.jsx @@ -61,7 +61,14 @@ function FlagsTab() { isRepoBackfilling, })} > - + {repoSettings?.isCurrentUserPartOfOrg ? ( + + ) : ( +
+
+

Flag analytics is disabled.

+
+ )}
{showFlagsTable({ diff --git a/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.spec.jsx b/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.spec.jsx index c205faf556..672941a20d 100644 --- a/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.spec.jsx +++ b/src/pages/RepoPage/CoverageTab/FlagsTab/FlagsTab.spec.jsx @@ -36,8 +36,12 @@ const flagsData = [ }, ] -const mockRepoSettings = (isPrivate = false) => ({ +const mockRepoSettings = ( + isPrivate = false, + isCurrentUserPartOfOrg = true +) => ({ owner: { + isCurrentUserPartOfOrg, repository: { __typename: 'Repository', activated: true, @@ -94,6 +98,7 @@ describe('Flags Tab', () => { flags = flagsData, tierValue = TierNames.PRO, isPrivate = false, + isCurrentUserPartOfOrg = true, }) { useRepoFlagsSelect.mockReturnValue({ data: flags }) useRepoBackfilled.mockReturnValue(data) @@ -112,7 +117,10 @@ describe('Flags Tab', () => { ) }), graphql.query('GetRepoSettingsTeam', (req, res, ctx) => { - return res(ctx.status(200), ctx.data(mockRepoSettings(isPrivate))) + return res( + ctx.status(200), + ctx.data(mockRepoSettings(isPrivate, isCurrentUserPartOfOrg)) + ) }) ) } @@ -321,4 +329,33 @@ describe('Flags Tab', () => { expect(enableText).toBeInTheDocument() }) }) + + describe('when current user is not part of org and data is not enabled', () => { + beforeEach(() => { + setup({ + data: { + data: { + flagsMeasurementsActive: true, + flagsMeasurementsBackfilled: true, + isTimescaleEnabled: true, + }, + }, + flags: [ + { + name: 'flag1', + }, + { + name: 'flag2', + }, + ], + isCurrentUserPartOfOrg: false, + }) + }) + + it('renders empty state message', async () => { + render(, { wrapper }) + const flagsText = await screen.findByText(/Flag analytics is disabled./) + expect(flagsText).toBeInTheDocument() + }) + }) }) diff --git a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.spec.tsx b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.spec.tsx index 82a925f69e..2309afb86e 100644 --- a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.spec.tsx +++ b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.spec.tsx @@ -19,6 +19,7 @@ jest.mock('./subroute/Fileviewer', () => () => 'FileViewer') const mockRepoSettings = (isPrivate = false) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { defaultBranch: 'master', private: isPrivate, diff --git a/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/FileExplorer/FlagMultiSelect.spec.jsx b/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/FileExplorer/FlagMultiSelect.spec.jsx index e86233cc74..f88d133fce 100644 --- a/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/FileExplorer/FlagMultiSelect.spec.jsx +++ b/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/FileExplorer/FlagMultiSelect.spec.jsx @@ -14,6 +14,7 @@ jest.mock('react-use/lib/useIntersection') const mockRepoSettings = (isPrivate) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/Fileviewer/Fileviewer.spec.jsx b/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/Fileviewer/Fileviewer.spec.jsx index 1825cfbde3..4da863a971 100644 --- a/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/Fileviewer/Fileviewer.spec.jsx +++ b/src/pages/RepoPage/CoverageTab/OverviewTab/subroute/Fileviewer/Fileviewer.spec.jsx @@ -13,6 +13,7 @@ jest.mock('ui/CodeRenderer/hooks/useScrollToLine') const mockRepoSettings = (isPrivate) => ({ owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', activated: true, diff --git a/src/services/repo/useRepoSettingsTeam.spec.tsx b/src/services/repo/useRepoSettingsTeam.spec.tsx index a32fd14ce4..78bd4c2bc3 100644 --- a/src/services/repo/useRepoSettingsTeam.spec.tsx +++ b/src/services/repo/useRepoSettingsTeam.spec.tsx @@ -31,6 +31,7 @@ afterAll(() => server.close()) const mockNotFoundError = { owner: { + isCurrentUserPartOfOrg: null, repository: { __typename: 'NotFoundError', message: 'repo not found', @@ -38,17 +39,9 @@ const mockNotFoundError = { }, } -const mockOwnerNotActivatedError = { - owner: { - repository: { - __typename: 'OwnerNotActivatedError', - message: 'owner not activated', - }, - }, -} - const mockIncorrectResponse = { owner: { + isCurrentUserPartOfOrg: false, repository: { invalid: 'invalid', }, @@ -57,6 +50,7 @@ const mockIncorrectResponse = { const mockResponse = { owner: { + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', @@ -75,15 +69,12 @@ const mockResponse = { describe('useRepoSettingsTeam', () => { function setup({ isNotFoundError = false, - isOwnerNotActivatedError = false, isUnsuccessfulParseError = false, }) { server.use( graphql.query('GetRepoSettingsTeam', (req, res, ctx) => { if (isNotFoundError) { return res(ctx.status(200), ctx.data(mockNotFoundError)) - } else if (isOwnerNotActivatedError) { - return res(ctx.status(200), ctx.data(mockOwnerNotActivatedError)) } else if (isUnsuccessfulParseError) { return res(ctx.status(200), ctx.data(mockIncorrectResponse)) } @@ -109,6 +100,7 @@ describe('useRepoSettingsTeam', () => { await waitFor(() => expect(result.current.data).toEqual({ + isCurrentUserPartOfOrg: true, repository: { __typename: 'Repository', defaultBranch: 'master', @@ -162,21 +154,4 @@ describe('useRepoSettingsTeam', () => { ) }) }) - - describe('when owner is not activated', () => { - it('returns an owner not activated error', async () => { - setup({ isOwnerNotActivatedError: true }) - const { result } = renderHook(() => useRepoSettingsTeam(), { - wrapper, - }) - await waitFor(() => expect(result.current.isError).toBeTruthy()) - await waitFor(() => - expect(result.current.error).toEqual( - expect.objectContaining({ - status: 403, - }) - ) - ) - }) - }) }) diff --git a/src/services/repo/useRepoSettingsTeam.tsx b/src/services/repo/useRepoSettingsTeam.tsx index 0cbe5218d3..590d49bd06 100644 --- a/src/services/repo/useRepoSettingsTeam.tsx +++ b/src/services/repo/useRepoSettingsTeam.tsx @@ -4,10 +4,8 @@ import { z } from 'zod' import Api from 'shared/api' import { NetworkErrorObject } from 'shared/api/helpers' -import A from 'ui/A' import { RepoNotFoundErrorSchema } from './schemas/RepoNotFoundError' -import { RepoOwnerNotActivatedErrorSchema } from './schemas/RepoOwnerNotActivatedError' const RepositorySchema = z.object({ __typename: z.literal('Repository'), @@ -34,11 +32,11 @@ interface FetchRepoSettingsTeamArgs { const RequestSchema = z.object({ owner: z .object({ + isCurrentUserPartOfOrg: z.boolean().nullable(), repository: z .discriminatedUnion('__typename', [ RepositorySchema, RepoNotFoundErrorSchema, - RepoOwnerNotActivatedErrorSchema, ]) .nullable(), }) @@ -48,6 +46,7 @@ const RequestSchema = z.object({ const query = ` query GetRepoSettingsTeam($name: String!, $repo: String!) { owner(username:$name) { + isCurrentUserPartOfOrg repository(name:$repo) { __typename ... on Repository { @@ -64,9 +63,6 @@ query GetRepoSettingsTeam($name: String!, $repo: String!) { ... on NotFoundError { message } - ... on OwnerNotActivatedError { - message - } } } }` @@ -106,27 +102,11 @@ function fetchRepoSettingsDetails({ }) } - if (data?.owner?.repository?.__typename === 'OwnerNotActivatedError') { - return Promise.reject({ - status: 403, - data: { - detail: ( -

- Activation is required to view this repo, please{' '} - {/* @ts-expect-error */} - click here to activate - your account. -

- ), - }, - dev: 'useRepoSettingsTeam - 403 owner not activated error', - }) - } - const repository = data.owner?.repository return { repository, + isCurrentUserPartOfOrg: data?.owner?.isCurrentUserPartOfOrg, } }) }