import {LocationFixture} from 'sentry-fixture/locationFixture';
import {BillingConfigFixture} from 'getsentry-test/fixtures/billingConfig';
import {PlanDetailsLookupFixture} from 'getsentry-test/fixtures/planDetailsLookup';
import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, waitForElementToBeRemoved} from 'sentry-test/reactTestingLibrary';
import SubscriptionStore from 'getsentry/stores/subscriptionStore';
import {OnDemandBudgetMode, PlanTier} from 'getsentry/types';
import AMCheckout from 'getsentry/views/amCheckout/';
import CheckoutOverview from 'getsentry/views/amCheckout/checkoutOverview';
import type {CheckoutFormData} from 'getsentry/views/amCheckout/types';
describe('CheckoutOverview', function () {
const api = new MockApiClient();
const {organization, routerProps} = initializeOrg();
const subscription = SubscriptionFixture({organization, plan: 'am1_f'});
const params = {};
const billingConfig = BillingConfigFixture(PlanTier.AM2);
const teamPlanAnnual = PlanDetailsLookupFixture('am1_team_auf')!;
const teamPlanMonthly = PlanDetailsLookupFixture('am2_team')!;
beforeEach(function () {
SubscriptionStore.set(organization.slug, subscription);
MockApiClient.addMockResponse({
url: `/customers/${organization.slug}/plan-migrations/?applied=0`,
method: 'GET',
body: {},
});
MockApiClient.addMockResponse({
url: `/subscriptions/${organization.slug}/`,
method: 'GET',
body: {},
});
MockApiClient.addMockResponse({
url: `/customers/${organization.slug}/billing-config/`,
method: 'GET',
body: BillingConfigFixture(PlanTier.AM2),
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/promotions/trigger-check/`,
method: 'POST',
});
});
it('renders with default plan', async function () {
render(
);
await waitForElementToBeRemoved(() => screen.queryByTestId('loading-indicator'));
});
it('renders breakdown for team annual plan', function () {
const formData = {
plan: 'am1_team_auf',
reserved: {errors: 100000, transactions: 500000, attachments: 25},
onDemandMaxSpend: 5000,
};
render(
);
});
it('changes initial step number based on url location.hash', async function () {
render(
);
await waitForElementToBeRemoved(() => screen.queryByTestId('loading-indicator'));
// Should show description for step 3 (on-demand max spend)
expect(
screen.getByText(/On-Demand spend allows you to pay for additional data/i)
).toBeInTheDocument();
});
it('renders On-Demand max along with team annual plan', () => {
const formData: CheckoutFormData = {
plan: 'am2_team',
reserved: {errors: 100000, transactions: 500000, attachments: 25},
onDemandBudget: {
budgetMode: OnDemandBudgetMode.SHARED,
sharedMaxBudget: 5000,
},
};
render(
);
expect(screen.getByTestId('on-demand-additional-cost')).toHaveTextContent(
'+ On-Demand charges up to $50/mo based on usage'
);
});
it('renders On-Demand with monthly total for annual plan', () => {
const formData: CheckoutFormData = {
plan: 'am2_team',
reserved: {errors: 100000, transactions: 500000, attachments: 25},
onDemandBudget: {
budgetMode: OnDemandBudgetMode.SHARED,
sharedMaxBudget: 5000,
},
};
render(
);
expect(screen.getByTestId('on-demand-additional-cost')).toHaveTextContent(
'+ On-Demand charges up to $50/mo based on usage'
);
});
it('hides On-Demand max when On-Demand is $0', () => {
const formData: CheckoutFormData = {
plan: 'am2_team',
reserved: {errors: 100000, transactions: 500000, attachments: 25},
onDemandBudget: {
budgetMode: OnDemandBudgetMode.SHARED,
sharedMaxBudget: 0,
},
};
render(
);
expect(screen.getByText('Team Plan')).toBeInTheDocument();
expect(screen.queryByTestId('on-demand-additional-cost')).not.toBeInTheDocument();
});
});