diff --git a/src/shared/ListRepo/ReposTable/ReposTable.test.tsx b/src/shared/ListRepo/ReposTable/ReposTable.test.tsx index b3c64b4bde..0df200bfcc 100644 --- a/src/shared/ListRepo/ReposTable/ReposTable.test.tsx +++ b/src/shared/ListRepo/ReposTable/ReposTable.test.tsx @@ -913,53 +913,129 @@ describe('ReposTable', () => { name: 'Repo name 1', latestCommitAt: subDays(new Date(), 3).toISOString(), coverageAnalytics: { - percentCovered: 0, + percentCovered: 10, lines: 123, }, active: true, updatedAt: '2020-08-25T16:36:19.67986800:00', repositoryConfig: null, - coverageEnabled: false, + coverageEnabled: true, bundleAnalysisEnabled: false, }, }, + ] + + let reposToReturn = myRepos.filter( + (repo) => + !info.variables.filters.term || + repo.node.name.includes(info.variables.filters.term) + ) + + if (info.variables.owner === 'codecov') { + reposToReturn = demoRepo + } + + return HttpResponse.json({ + data: { + owner: { + repositories: { + edges: reposToReturn, + pageInfo: { + hasNextPage: false, + endCursor: '3', + }, + }, + }, + }, + }) + }) + ) + }) + + it('shows demo repo and your repos when on your owner page', async () => { + render(, { + wrapper: wrapper('', '/github/owner1', '/:provider/:owner'), + }) + const demoLink = await screen.findAllByText(/Codecov demo/) + expect(demoLink.length).toBe(1) + const links = await screen.findAllByText(/Repo name/) + expect(links.length).toBe(1) + }) + + it('shows demo repo when search term includes it', async () => { + render(, { + wrapper: wrapper('', '/github/owner1', '/:provider/:owner'), + }) + const repo = screen.queryByText(/Repo name/) + expect(repo).not.toBeInTheDocument() + const demoLink = await screen.findAllByText(/Codecov demo/) + expect(demoLink.length).toBe(1) + }) + + it('hides demo repo when user has 2 or more repos configured', async () => { + server.use( + graphql.query('ReposForOwner', async (info) => { + const demoRepo = [ { node: { - private: true, + private: false, activated: true, + author: { + username: 'codecov', + }, + name: 'gazebo', + latestCommitAt: subDays(new Date(), 3).toISOString(), + coverageAnalytics: { + percentCovered: 0, + lines: 123, + }, + active: true, + updatedAt: '2020-08-25T16:36:19.67986800:00', + repositoryConfig: null, + coverageEnabled: true, + bundleAnalysisEnabled: true, + }, + }, + ] + + const myRepos = [ + { + node: { + private: false, + activated: false, author: { username: 'owner1', }, - name: 'Repo name 2', - latestCommitAt: subDays(new Date(), 2).toISOString(), + name: 'Repo name 1', + latestCommitAt: subDays(new Date(), 3).toISOString(), coverageAnalytics: { - percentCovered: 100, + percentCovered: 10, lines: 123, }, active: true, updatedAt: '2020-08-25T16:36:19.67986800:00', repositoryConfig: null, - coverageEnabled: false, + coverageEnabled: true, bundleAnalysisEnabled: false, }, }, { node: { - private: true, + private: false, activated: false, author: { username: 'owner1', }, - name: 'Repo name 3', - latestCommitAt: subDays(new Date(), 5).toISOString(), + name: 'Repo name 1', + latestCommitAt: subDays(new Date(), 3).toISOString(), coverageAnalytics: { - percentCovered: null, + percentCovered: 0, lines: 123, }, - active: false, + active: true, updatedAt: '2020-08-25T16:36:19.67986800:00', repositoryConfig: null, - coverageEnabled: false, + coverageEnabled: true, bundleAnalysisEnabled: false, }, }, @@ -990,26 +1066,13 @@ describe('ReposTable', () => { }) }) ) - }) - - it('shows demo repo and your repos when on your owner page', async () => { render(, { wrapper: wrapper('', '/github/owner1', '/:provider/:owner'), }) const links = await screen.findAllByText(/Repo name/) - expect(links.length).toBe(3) - const demoLink = await screen.findAllByText(/Codecov demo/) - expect(demoLink.length).toBe(1) - }) - - it('shows demo repo when search term includes it', async () => { - render(, { - wrapper: wrapper('', '/github/owner1', '/:provider/:owner'), - }) - const repo = screen.queryByText(/Repo name/) - expect(repo).not.toBeInTheDocument() - const demoLink = await screen.findAllByText(/Codecov demo/) - expect(demoLink.length).toBe(1) + expect(links.length).toBe(2) + const demoLink = screen.queryAllByText(/Codecov demo/) + expect(demoLink.length).toBe(0) }) }) }) diff --git a/src/shared/ListRepo/ReposTable/ReposTable.tsx b/src/shared/ListRepo/ReposTable/ReposTable.tsx index 606d60bc9c..4a3ba962fa 100644 --- a/src/shared/ListRepo/ReposTable/ReposTable.tsx +++ b/src/shared/ListRepo/ReposTable/ReposTable.tsx @@ -153,18 +153,34 @@ const ReposTable = ({ }) const isMyOwnerPage = currentUser?.user?.username === owner - const includeDemo = mayIncludeDemo && !config.IS_SELF_HOSTED && isMyOwnerPage const tableData = useMemo(() => { const repos = reposData?.pages.flatMap((page) => page?.repos).filter(isNotNull) ?? [] + const configuredRepos = repos.reduce( + (acc, repo) => (repo.coverageEnabled ? acc + 1 : acc), + 0 + ) + + const includeDemo = + mayIncludeDemo && + !config.IS_SELF_HOSTED && + isMyOwnerPage && + configuredRepos < 2 + const demoRepos = includeDemo ? formatDemoRepos(demoReposData, searchValue) : [] return [...demoRepos, ...repos] - }, [reposData?.pages, demoReposData, includeDemo, searchValue]) + }, [ + reposData?.pages, + demoReposData, + searchValue, + isMyOwnerPage, + mayIncludeDemo, + ]) useEffect(() => { if (inView && hasNextPage) { @@ -186,6 +202,7 @@ const ReposTable = ({ onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), enableSortingRemoval: false, + manualSorting: true, }) if (!isReposLoading && isEmpty(tableData)) {