diff --git a/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx b/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx index 779f170443..87e530152a 100644 --- a/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx +++ b/src/pages/DefaultOrgSelector/DefaultOrgSelector.jsx @@ -47,7 +47,7 @@ const renderItem = ({ item }) => { if (item?.isProvider) { return (
- + Install Codecov GitHub app diff --git a/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx b/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx index 469240b794..c7ece2209f 100644 --- a/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx +++ b/src/pages/DefaultOrgSelector/DefaultOrgSelector.spec.jsx @@ -330,8 +330,8 @@ describe('DefaultOrgSelector', () => { const selfOrg = screen.getByRole('option', { name: 'Rula' }) expect(selfOrg).toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -378,8 +378,8 @@ describe('DefaultOrgSelector', () => { const selfOrg = screen.queryByRole('option', { name: 'janedoe' }) expect(selfOrg).not.toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -417,8 +417,8 @@ describe('DefaultOrgSelector', () => { const noOrgsFound = screen.getByText(/No organizations found/) expect(noOrgsFound).toBeInTheDocument() - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).toBeInTheDocument() }) @@ -458,8 +458,8 @@ describe('DefaultOrgSelector', () => { const orgInList = screen.getByRole('option', { name: 'criticalRole' }) expect(orgInList).toBeInTheDocument() - const addNewOrg = screen.queryByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.queryByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) expect(addNewOrg).not.toBeInTheDocument() }) @@ -496,8 +496,8 @@ describe('DefaultOrgSelector', () => { await user.click(selectOrg) - const addNewOrg = screen.getByRole('option', { - name: 'plus-circle.svg Install Codecov GitHub app', + const addNewOrg = screen.getByRole('link', { + name: 'plus-circle.svg Install Codecov GitHub app external-link.svg', }) await user.click(addNewOrg) diff --git a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx index 02ab86fe3a..5cef080431 100644 --- a/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx +++ b/src/pages/RepoPage/CoverageTab/OverviewTab/OverviewTab.tsx @@ -20,6 +20,8 @@ const FileExplorer = lazy(() => import('./subroute/FileExplorer')) const CoverageChart = lazy(() => import('./subroute/CoverageChart')) const Sunburst = lazy(() => import('./subroute/Sunburst')) +const MAX_FILE_COUNT = 200_000 + const Loader = () => (
@@ -50,9 +52,12 @@ function CoverageOverviewTab() { branch: branch, }) - let displaySunburst = false const fileCount = data?.branch?.head?.totals?.fileCount - if (typeof fileCount === 'number' && fileCount <= 200_000) { + const withinFileCount = + typeof fileCount === 'number' && fileCount <= MAX_FILE_COUNT + + let displaySunburst = false + if (withinFileCount) { displaySunburst = true } diff --git a/src/ui/A/A.jsx b/src/ui/A/A.jsx index 601083b65c..058eca5c08 100644 --- a/src/ui/A/A.jsx +++ b/src/ui/A/A.jsx @@ -30,7 +30,10 @@ const variantClasses = { configure: `rounded bg-ds-blue-default px-4 py-1 font-semibold text-ds-gray-primary dark:text-white dark:bg-ds-blue-nonary`, } -const getHostnameFromRegex = (url) => { +export const getHostnameFromRegex = (url) => { + if (!url) { + return 'app.codecov.io' + } // run against regex const matches = url.match(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i) // extract hostname (will be null if no match is found) diff --git a/src/ui/A/A.spec.jsx b/src/ui/A/A.spec.jsx index bb618d4893..57ee13164e 100644 --- a/src/ui/A/A.spec.jsx +++ b/src/ui/A/A.spec.jsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import A from '.' +import A, { getHostnameFromRegex } from './A' describe('A', () => { function setup(props = {}) { @@ -10,6 +10,17 @@ describe('A', () => { }) } + describe('hostnameWithoutRegex', () => { + it('returns to home if no url passed', () => { + expect(getHostnameFromRegex(undefined)).toBe('app.codecov.io') + }) + it('scrubs URL if one exists', () => { + expect(getHostnameFromRegex('https://app.codecov.io')).toBe( + 'app.codecov.io' + ) + }) + }) + describe('when rendered with the prop `to`', () => { beforeEach(() => { setup({ diff --git a/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx b/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx index c68be21885..6fba3bf725 100644 --- a/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx +++ b/src/ui/CodeRenderer/CodeRendererProgressHeader/CodeRendererProgressHeader.jsx @@ -12,7 +12,7 @@ function CodeRendererProgressHeader({ path, fileCoverage, change }) { * Header component that shows progress bar for the Code Renderer component. * @param {[String]} treePaths path of file from root directory. Only used in standalone file viewer * @param {Float} fileCoverage total coverage of current file - * @param {Float} change difference between head and base coverage. Only used in commmit based file viewer + * @param {Float} change difference between head and base coverage. Only used in commit based file viewer */ const isUnsupportedFileType = unsupportedExtensionsMapper({ path }) diff --git a/src/ui/SunburstChart/SunburstChart.jsx b/src/ui/SunburstChart/SunburstChart.jsx index 75dfd446ee..fc00e39c3f 100644 --- a/src/ui/SunburstChart/SunburstChart.jsx +++ b/src/ui/SunburstChart/SunburstChart.jsx @@ -48,15 +48,39 @@ function SunburstChart({ // Tracks previous location for rendering .. in the breadcrumb. let previous - const selectorMutate = (node) => { - if (Array.isArray(node.children)) { - return { - ...node, - value: selectorHandler.current(node), - children: node.children.map((child) => selectorMutate(child)), + // const selectorMutate = (node) => { + // if (Array.isArray(node.children)) { + // return { + // ...node, + // value: selectorHandler.current(node), + // children: node.children.map((child) => selectorMutate(child)), + // } + // } + + // return { ...node, value: selectorHandler.current(node) } + // } + + const selectorMutate = (rootNode) => { + const stack = [rootNode] + const result = { ...rootNode, value: selectorHandler.current(rootNode) } + const nodeMap = new Map() + nodeMap.set(rootNode, result) + + while (stack.length > 0) { + const node = stack.pop() + const currentNode = nodeMap.get(node) + + if (Array.isArray(node.children)) { + currentNode.children = node.children.map((child) => { + const newChild = { ...child, value: selectorHandler.current(child) } + nodeMap.set(child, newChild) + stack.push(child) + return newChild + }) } } - return { ...node, value: selectorHandler.current(node) } + + return result } // Process data for use in D3