PartnerManagedResource.test.tsx 3.4 KB

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