PartnerManagedResource.test.tsx110 lines · main
| 1 | import { screen } from '@testing-library/react' |
| 2 | import { beforeEach, describe, expect, it, vi } from 'vitest' |
| 3 | |
| 4 | import PartnerManagedResource from './PartnerManagedResource' |
| 5 | import { MANAGED_BY } from '@/lib/constants/infrastructure' |
| 6 | import { render } from '@/tests/helpers' |
| 7 | |
| 8 | const { mockUseAwsRedirectQuery, mockUseVercelRedirectQuery } = vi.hoisted(() => ({ |
| 9 | mockUseAwsRedirectQuery: vi.fn(), |
| 10 | mockUseVercelRedirectQuery: vi.fn(), |
| 11 | })) |
| 12 | |
| 13 | vi.mock('@/data/integrations/vercel-redirect-query', () => ({ |
| 14 | useVercelRedirectQuery: mockUseVercelRedirectQuery, |
| 15 | })) |
| 16 | |
| 17 | vi.mock('@/data/integrations/aws-redirect-query', () => ({ |
| 18 | useAwsRedirectQuery: mockUseAwsRedirectQuery, |
| 19 | })) |
| 20 | |
| 21 | vi.mock('./PartnerIcon', () => ({ |
| 22 | default: () => <div data-testid="partner-icon" />, |
| 23 | })) |
| 24 | |
| 25 | describe('PartnerManagedResource', () => { |
| 26 | beforeEach(() => { |
| 27 | vi.clearAllMocks() |
| 28 | |
| 29 | mockUseVercelRedirectQuery.mockReturnValue({ |
| 30 | data: undefined, |
| 31 | isLoading: false, |
| 32 | isError: false, |
| 33 | }) |
| 34 | mockUseAwsRedirectQuery.mockReturnValue({ |
| 35 | data: undefined, |
| 36 | isLoading: false, |
| 37 | isError: false, |
| 38 | }) |
| 39 | }) |
| 40 | |
| 41 | it('renders Stripe connected copy and never shows CTA even when cta prop exists', () => { |
| 42 | render( |
| 43 | <PartnerManagedResource |
| 44 | managedBy={MANAGED_BY.STRIPE_PROJECTS} |
| 45 | resource="Payment Methods" |
| 46 | details={ |
| 47 | <> |
| 48 | Run <code>stripe projects upgrade briven/free</code> |
| 49 | </> |
| 50 | } |
| 51 | cta={{ installationId: 'vercel-installation-id', organizationSlug: 'aws-org' }} |
| 52 | /> |
| 53 | ) |
| 54 | |
| 55 | expect(screen.getByText('Payment Methods are connected to Stripe')).toBeInTheDocument() |
| 56 | expect(screen.getByText('stripe projects upgrade briven/free')).toBeInTheDocument() |
| 57 | expect(screen.queryByRole('link')).toBeNull() |
| 58 | expect(mockUseVercelRedirectQuery).toHaveBeenCalledWith( |
| 59 | { installationId: 'vercel-installation-id' }, |
| 60 | expect.objectContaining({ enabled: false }) |
| 61 | ) |
| 62 | expect(mockUseAwsRedirectQuery).toHaveBeenCalledWith( |
| 63 | { organizationSlug: 'aws-org' }, |
| 64 | expect.objectContaining({ enabled: false }) |
| 65 | ) |
| 66 | }) |
| 67 | |
| 68 | it('renders AWS CTA only when a redirect URL is available', () => { |
| 69 | mockUseAwsRedirectQuery.mockReturnValue({ |
| 70 | data: { url: 'https://console.aws.amazon.com/billing/home#/' }, |
| 71 | isLoading: false, |
| 72 | isError: false, |
| 73 | }) |
| 74 | |
| 75 | render( |
| 76 | <PartnerManagedResource |
| 77 | managedBy={MANAGED_BY.AWS_MARKETPLACE} |
| 78 | resource="Invoices" |
| 79 | cta={{ organizationSlug: 'aws-org', path: 'bills' }} |
| 80 | /> |
| 81 | ) |
| 82 | |
| 83 | expect(screen.getByText('Invoices are managed by AWS Marketplace')).toBeInTheDocument() |
| 84 | expect(screen.getByRole('link', { name: 'View Invoices on AWS Marketplace' })).toHaveAttribute( |
| 85 | 'href', |
| 86 | 'https://console.aws.amazon.com/billing/home#/bills' |
| 87 | ) |
| 88 | }) |
| 89 | |
| 90 | it('does not render Vercel CTA when redirect URL is unavailable', () => { |
| 91 | mockUseVercelRedirectQuery.mockReturnValue({ |
| 92 | data: undefined, |
| 93 | isLoading: false, |
| 94 | isError: false, |
| 95 | }) |
| 96 | |
| 97 | render( |
| 98 | <PartnerManagedResource |
| 99 | managedBy={MANAGED_BY.VERCEL_MARKETPLACE} |
| 100 | resource="Organization plans" |
| 101 | cta={{ installationId: 'vercel-installation-id', path: '/settings' }} |
| 102 | /> |
| 103 | ) |
| 104 | |
| 105 | expect( |
| 106 | screen.getByText('Organization plans are managed by Vercel Marketplace') |
| 107 | ).toBeInTheDocument() |
| 108 | expect(screen.queryByRole('link', { name: /view organization plans/i })).toBeNull() |
| 109 | }) |
| 110 | }) |