import { screen } from '@testing-library/react' import type { ReactNode } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { BillingCustomerData } from './BillingCustomerData' import { MANAGED_BY } from '@/lib/constants/infrastructure' import { createMockOrganization, render } from '@/tests/helpers' const mockSelectedOrganization = vi.hoisted(() => vi.fn()) vi.mock('common', async (importOriginal) => { const original = (await importOriginal()) as typeof import('common') return { ...original, useParams: () => ({ slug: 'stripe-org' }), } }) vi.mock('next-themes', () => ({ useTheme: () => ({ resolvedTheme: 'dark' }), })) vi.mock('@stripe/react-stripe-js', () => ({ Elements: ({ children }: { children: ReactNode }) =>
{children}
, })) vi.mock('@stripe/stripe-js', () => ({ loadStripe: vi.fn(() => Promise.resolve(null)), })) vi.mock('ui', async (importOriginal) => { const original = (await importOriginal()) as typeof import('ui') return { ...original, Form: ({ children }: { children: ReactNode }) =>
{children}
, } }) vi.mock('@/hooks/misc/useSelectedOrganization', () => ({ useSelectedOrganizationQuery: () => ({ data: mockSelectedOrganization() }), })) vi.mock('@/hooks/misc/useCheckPermissions', () => ({ useAsyncCheckPermissions: () => ({ can: true, isSuccess: true }), })) vi.mock('@/data/organizations/organization-customer-profile-query', () => ({ useOrganizationCustomerProfileQuery: () => ({ data: { address: { line1: '', line2: '', city: '', state: '', postal_code: '', country: 'US', }, billing_name: 'Toolshed', }, error: null, isPending: false, isSuccess: true, }), })) vi.mock('@/data/organizations/organization-tax-id-query', () => ({ useOrganizationTaxIdQuery: () => ({ data: null, error: null, isPending: false, isSuccess: true, }), })) vi.mock('@/data/organizations/organization-customer-profile-update-mutation', () => ({ useOrganizationCustomerProfileUpdateMutation: () => ({ mutateAsync: vi.fn(), }), })) vi.mock('./useBillingCustomerDataForm', () => ({ useBillingCustomerDataForm: () => ({ form: {}, handleSubmit: vi.fn(), handleReset: vi.fn(), isDirty: false, resetKey: 0, onAddressChange: vi.fn(), applyAddressElementValue: vi.fn(), markCurrentValuesAsSaved: vi.fn(), addressCountry: 'US', addressOptions: {}, }), })) vi.mock('./BillingCustomerDataForm', () => ({ BillingCustomerDataForm: () =>
, })) vi.mock('@/components/ui/PartnerManagedResource', () => ({ default: () =>
, })) describe('BillingCustomerData', () => { beforeEach(() => { vi.clearAllMocks() mockSelectedOrganization.mockReturnValue( createMockOrganization({ slug: 'stripe-org', billing_partner: null, integration_source: 'stripe_projects', managed_by: MANAGED_BY.STRIPE_PROJECTS, }) ) }) it('keeps Stripe-connected orgs editable in Studio', () => { render() expect(screen.queryByTestId('partner-managed-resource')).not.toBeInTheDocument() expect(screen.getByTestId('billing-customer-data-form')).toBeInTheDocument() }) it('still blocks billing-partner orgs behind the partner-managed resource', () => { mockSelectedOrganization.mockReturnValue( createMockOrganization({ slug: 'vercel-org', billing_partner: 'vercel_marketplace', managed_by: MANAGED_BY.VERCEL_MARKETPLACE, }) ) render() expect(screen.getByTestId('partner-managed-resource')).toBeInTheDocument() }) })