import {OrganizationFixture} from 'sentry-fixture/organization'; import {BillingConfigFixture} from 'getsentry-test/fixtures/billingConfig'; import {PlanDetailsLookupFixture} from 'getsentry-test/fixtures/planDetailsLookup'; import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription'; import {render, waitFor} from 'sentry-test/reactTestingLibrary'; import PlanFeature from 'getsentry/components/features/planFeature'; import SubscriptionStore from 'getsentry/stores/subscriptionStore'; import {PlanTier} from 'getsentry/types'; describe('PlanFeature', function () { const organization = OrganizationFixture(); beforeEach(() => { SubscriptionStore.init(); MockApiClient.addMockResponse({ url: `/customers/${organization.slug}/billing-config/`, query: {tier: 'am2'}, body: BillingConfigFixture(PlanTier.AM2), }); }); it('provides the plan required for a feature', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({organization, planTier: PlanTier.MM2}); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am2_team'), tierChange: 'am2', }); }); }); it('provides the business plan', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({organization, planTier: PlanTier.MM2}); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am2_business'), tierChange: 'am2', }); }); }); it('provides no plan if the feature is not on a plan', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({organization, planTier: PlanTier.MM2}); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({plan: null, tierChange: null}); }); }); it('provides a plan when the tiers mismatch', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({ organization, contractInterval: 'annual', planTier: PlanTier.MM2, }); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am2_business'), tierChange: 'am2', }); }); }); it('reports tier change as null when no tier change is required', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({organization, planTier: 'am2'}); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am2_business'), tierChange: null, }); }); }); it('provides the business plan for am3', async function () { const mockFn = jest.fn(() => null); MockApiClient.addMockResponse({ url: `/customers/${organization.slug}/billing-config/`, query: {tier: 'am3'}, body: BillingConfigFixture(PlanTier.AM3), }); const sub = SubscriptionFixture({organization, plan: 'am3_team'}); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am3_business'), tierChange: 'am3', }); }); }); it('offers business upgrade if on sponsored plan', async function () { const mockFn = jest.fn(() => null); const sub = SubscriptionFixture({ organization, plan: 'am2_sponsored', isSponsored: true, }); SubscriptionStore.set(organization.slug, sub); render( {mockFn} ); await waitFor(() => { expect(mockFn).toHaveBeenCalledWith({ plan: PlanDetailsLookupFixture('am2_business'), tierChange: 'am2', }); }); }); });