PartnerManagedResource.test.tsx110 lines · main
1import { screen } from '@testing-library/react'
2import { beforeEach, describe, expect, it, vi } from 'vitest'
3
4import PartnerManagedResource from './PartnerManagedResource'
5import { MANAGED_BY } from '@/lib/constants/infrastructure'
6import { render } from '@/tests/helpers'
7
8const { mockUseAwsRedirectQuery, mockUseVercelRedirectQuery } = vi.hoisted(() => ({
9 mockUseAwsRedirectQuery: vi.fn(),
10 mockUseVercelRedirectQuery: vi.fn(),
11}))
12
13vi.mock('@/data/integrations/vercel-redirect-query', () => ({
14 useVercelRedirectQuery: mockUseVercelRedirectQuery,
15}))
16
17vi.mock('@/data/integrations/aws-redirect-query', () => ({
18 useAwsRedirectQuery: mockUseAwsRedirectQuery,
19}))
20
21vi.mock('./PartnerIcon', () => ({
22 default: () => <div data-testid="partner-icon" />,
23}))
24
25describe('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})