diff --git a/src/shared/GlobalTopBanners/GlobalTopBanners.test.tsx b/src/shared/GlobalTopBanners/GlobalTopBanners.test.tsx index 16f05a19cc..ddb65b22a3 100644 --- a/src/shared/GlobalTopBanners/GlobalTopBanners.test.tsx +++ b/src/shared/GlobalTopBanners/GlobalTopBanners.test.tsx @@ -5,12 +5,6 @@ import GlobalTopBanners from './GlobalTopBanners' vi.mock('./TrialBanner', () => ({ default: () => 'TrialBanner', })) -vi.mock('./TeamPlanFeedbackBanner', () => ({ - default: () => 'TeamPlanFeedbackBanner', -})) -vi.mock('./ProPlanFeedbackBanner', () => ({ - default: () => 'ProPlanFeedbackBanner', -})) vi.mock('./BundleFeedbackBanner', () => ({ default: () => 'BundleFeedbackBanner', })) @@ -32,24 +26,10 @@ describe('GlobalTopBanners', () => { expect(banner).toBeInTheDocument() }) - it('renders team plan feedback banner', async () => { - render() - - const banner = await screen.findByText(/TeamPlanFeedbackBanner/) - expect(banner).toBeInTheDocument() - }) - - it('renders pro plan feedback banner', async () => { - render() - - const banner = await screen.findByText(/ProPlanFeedbackBanner/) - expect(banner).toBeInTheDocument() - }) - it('renders bundle feedback banner', async () => { render() - const banner = await screen.findByText(/ProPlanFeedbackBanner/) + const banner = await screen.findByText(/BundleFeedbackBanner/) expect(banner).toBeInTheDocument() }) diff --git a/src/shared/GlobalTopBanners/GlobalTopBanners.tsx b/src/shared/GlobalTopBanners/GlobalTopBanners.tsx index 49d4c7d2f1..fa14ed1e7c 100644 --- a/src/shared/GlobalTopBanners/GlobalTopBanners.tsx +++ b/src/shared/GlobalTopBanners/GlobalTopBanners.tsx @@ -3,8 +3,6 @@ import SilentNetworkErrorWrapper from 'layouts/shared/SilentNetworkErrorWrapper' import AnnouncementBanner from './AnnouncementBanner' import BundleFeedbackBanner from './BundleFeedbackBanner' import OktaBanners from './OktaBanners' -import ProPlanFeedbackBanner from './ProPlanFeedbackBanner' -import TeamPlanFeedbackBanner from './TeamPlanFeedbackBanner' import TokenlessBanner from './TokenlessBanner' import TrialBanner from './TrialBanner' @@ -24,14 +22,6 @@ const GlobalTopBanners: React.FC = () => { - - - - - - - - diff --git a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.test.tsx b/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.test.tsx deleted file mode 100644 index 551cd98ea2..0000000000 --- a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.test.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { render, screen, waitFor } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import { graphql, HttpResponse } from 'msw' -import { setupServer } from 'msw/node' -import React from 'react' -import { MemoryRouter, Route } from 'react-router-dom' - -import { TrialStatuses } from 'services/account/usePlanData' -import { BillingRate, Plans } from 'shared/utils/billing' - -import ProPlanFeedbackBanner from './ProPlanFeedbackBanner' - -const mockTrialData = { - hasPrivateRepos: true, - plan: { - isEnterprisePlan: false, - isFreePlan: false, - isProPlan: true, - isSentryPlan: false, - isTeamPlan: false, - isTrialPlan: false, - baseUnitPrice: 10, - benefits: [], - billingRate: BillingRate.MONTHLY, - marketingName: 'Users Developer', - monthlyUploadLimit: 250, - value: Plans.USERS_PR_INAPPM, - trialStatus: TrialStatuses.EXPIRED, - trialStartDate: '2023-01-01T08:55:25', - trialEndDate: '2023-01-10T08:55:25', - trialTotalDays: 0, - pretrialUsersCount: 0, - planUserCount: 1, - freeSeatCount: 0, - hasSeatsLeft: true, - }, - pretrialPlan: { - baseUnitPrice: 10, - benefits: [], - billingRate: BillingRate.MONTHLY, - marketingName: 'Users Developer', - monthlyUploadLimit: 250, - value: Plans.USERS_DEVELOPER, - }, -} - -const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false } }, -}) - -const server = setupServer() - -beforeAll(() => server.listen()) -afterEach(() => { - queryClient.clear() - server.resetHandlers() - vi.resetAllMocks() -}) -afterAll(() => server.close()) - -const wrapper = - (initialEntries = ''): React.FC => - ({ children }) => ( - - - {children} - - - ) - -describe('ProPlanFeedbackBanner', () => { - function setup() { - const user = userEvent.setup() - const mockSetItem = vi.spyOn(window.localStorage.__proto__, 'setItem') - const mockGetItem = vi.spyOn(window.localStorage.__proto__, 'getItem') - - server.use( - graphql.query('GetPlanData', () => { - return HttpResponse.json({ data: { owner: { ...mockTrialData } } }) - }) - ) - - return { - user, - mockSetItem, - mockGetItem, - } - } - - describe('rendering banner', () => { - it('renders left side text', async () => { - setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - const leftText = await screen.findByText( - /We'd love your thoughts and feedback in this/ - ) - expect(leftText).toBeInTheDocument() - }) - - it('renders the link to the survey', async () => { - setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - const link = await screen.findByRole('link') - expect(link).toBeInTheDocument() - expect(link).toHaveAttribute( - 'href', - 'https://forms.gle/nf37sRAtyQeXVTdr8' - ) - }) - }) - - describe('user dismisses banner', () => { - it('calls local storage', async () => { - const { user, mockGetItem, mockSetItem } = setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - mockGetItem.mockReturnValue(null) - - const dismissBtn = await screen.findByText(/Dismiss/) - expect(dismissBtn).toBeInTheDocument() - await user.click(dismissBtn) - - await waitFor(() => - expect(mockSetItem).toHaveBeenCalledWith( - 'dismissed-top-banners', - JSON.stringify({ 'pro-feedback-banner': 'true' }) - ) - ) - }) - - it('hides the banner', async () => { - const { user, mockGetItem } = setup() - const { container } = render(, { - wrapper: wrapper('/gh/codecov'), - }) - - mockGetItem.mockReturnValue(null) - - const dismissBtn = await screen.findByText(/Dismiss/) - expect(dismissBtn).toBeInTheDocument() - await user.click(dismissBtn) - - await waitFor(() => expect(container).toBeEmptyDOMElement()) - }) - }) - - describe('user is not on pro plan', () => { - it('does not render banner', async () => { - const { container } = render(, { - wrapper: wrapper('/gh/codecov'), - }) - expect(container).toBeEmptyDOMElement() - }) - }) -}) diff --git a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.tsx b/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.tsx deleted file mode 100644 index c7c4e3a43e..0000000000 --- a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/ProPlanFeedbackBanner.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useParams } from 'react-router-dom' - -import { TrialStatuses, usePlanData } from 'services/account/usePlanData' -import A from 'ui/A' -import TopBanner from 'ui/TopBanner' - -const PRO_PLAN_FEEDBACK_BANNER_KEY = 'pro-feedback-banner' - -interface URLParams { - provider: string - owner: string -} - -const ProPlanFeedbackBanner = () => { - const { provider, owner } = useParams() - const { data: planData } = usePlanData({ provider, owner }) - const isProPlan = planData?.plan?.isProPlan - const isTrialing = planData?.plan?.trialStatus === TrialStatuses.ONGOING - - if (!isProPlan || isTrialing) { - return null - } - - return ( - - - - 🌟 We'd love your thoughts and feedback in this - - 1 minute survey. - - - - - - Dismiss - - - - ) -} - -export default ProPlanFeedbackBanner diff --git a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/index.ts b/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/index.ts deleted file mode 100644 index 51905d97e2..0000000000 --- a/src/shared/GlobalTopBanners/ProPlanFeedbackBanner/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './ProPlanFeedbackBanner' diff --git a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.test.tsx b/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.test.tsx deleted file mode 100644 index fe79997063..0000000000 --- a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.test.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { render, screen, waitFor } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import { graphql, HttpResponse } from 'msw' -import { setupServer } from 'msw/node' -import React from 'react' -import { MemoryRouter, Route } from 'react-router-dom' - -import TeamPlanFeedbackBanner from './TeamPlanFeedbackBanner' - -console.error = () => {} - -const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false } }, -}) - -const server = setupServer() - -beforeAll(() => { - server.listen() -}) - -afterEach(() => { - queryClient.clear() - server.resetHandlers() - vi.resetAllMocks() -}) - -afterAll(() => { - server.close() -}) - -const wrapper = - (initialEntries = ''): React.FC => - ({ children }) => ( - - - {children} - - - ) - -describe('TeamPlanFeedbackBanner', () => { - function setup({ isTeamPlan = true } = {}) { - const user = userEvent.setup() - const mockSetItem = vi.spyOn(window.localStorage.__proto__, 'setItem') - const mockGetItem = vi.spyOn(window.localStorage.__proto__, 'getItem') - - server.use( - graphql.query('IsTeamPlan', () => { - return HttpResponse.json({ - data: { - owner: { - plan: { - isTeamPlan, - }, - }, - }, - }) - }) - ) - - return { - user, - mockSetItem, - mockGetItem, - } - } - - describe('rendering banner', () => { - it('renders left side text', async () => { - setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - const leftText = await screen.findByText(/about Codecov in this/) - expect(leftText).toBeInTheDocument() - }) - - it('renders the link to the survey', async () => { - setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - const link = await screen.findByRole('link') - expect(link).toBeInTheDocument() - expect(link).toHaveAttribute( - 'href', - 'https://docs.google.com/forms/d/e/1FAIpQLSeoMHPyECewV7X3UaT-uUxZCmYy1T6hEX_aecCD2ppPHGSvUw/viewform' - ) - }) - }) - - describe('user dismisses banner', () => { - it('calls local storage', async () => { - const { user, mockGetItem, mockSetItem } = setup() - render(, { wrapper: wrapper('/gh/codecov') }) - - mockGetItem.mockReturnValue(null) - - const dismissBtn = await screen.findByText(/Dismiss/) - expect(dismissBtn).toBeInTheDocument() - await user.click(dismissBtn) - - await waitFor(() => - expect(mockSetItem).toHaveBeenCalledWith( - 'dismissed-top-banners', - JSON.stringify({ 'team-feedback-banner': 'true' }) - ) - ) - }) - - it('hides the banner', async () => { - const { user, mockGetItem } = setup() - const { container } = render(, { - wrapper: wrapper('/gh/codecov'), - }) - - mockGetItem.mockReturnValue(null) - - const dismissBtn = await screen.findByText(/Dismiss/) - expect(dismissBtn).toBeInTheDocument() - await user.click(dismissBtn) - - await waitFor(() => expect(container).toBeEmptyDOMElement()) - }) - }) - - describe('user is not on team plan', () => { - it('does not render banner', async () => { - setup({ isTeamPlan: false }) - const { container } = render(, { - wrapper: wrapper('/gh/codecov'), - }) - expect(container).toBeEmptyDOMElement() - }) - }) -}) diff --git a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.tsx b/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.tsx deleted file mode 100644 index 07ba9eb98f..0000000000 --- a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/TeamPlanFeedbackBanner.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useParams } from 'react-router-dom' - -import { useIsTeamPlan } from 'services/useIsTeamPlan' -import A from 'ui/A' -import TopBanner from 'ui/TopBanner' - -const TEAM_PLAN_FEEDBACK_BANNER_KEY = 'team-feedback-banner' - -interface URLParams { - provider: string - owner: string -} - -const TeamPlanFeedbackBanner = () => { - const { provider, owner } = useParams() - const { data: isTeamPlan } = useIsTeamPlan({ provider, owner }) - - if (!isTeamPlan) { - return null - } - - return ( - - - - 🌟 We'd love your thoughts and feedback about Codecov in - this - - 1 minute survey. - - - - - - Dismiss - - - - ) -} - -export default TeamPlanFeedbackBanner diff --git a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/index.ts b/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/index.ts deleted file mode 100644 index c847de0b7e..0000000000 --- a/src/shared/GlobalTopBanners/TeamPlanFeedbackBanner/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './TeamPlanFeedbackBanner'
- 🌟 We'd love your thoughts and feedback in this - - 1 minute survey. - -
- 🌟 We'd love your thoughts and feedback about Codecov in - this - - 1 minute survey. - -