import moment from 'moment-timezone';
import {OrganizationFixture} from 'sentry-fixture/organization';
import {BillingConfigFixture} from 'getsentry-test/fixtures/billingConfig';
import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription';
import {render, screen, within} from 'sentry-test/reactTestingLibrary';
import {PendingChangesFixture} from 'getsentry/__fixtures__/pendingChanges';
import {PlanFixture} from 'getsentry/__fixtures__/plan';
import SubscriptionStore from 'getsentry/stores/subscriptionStore';
import {PlanTier} from 'getsentry/types';
import SubscriptionHeader from 'getsentry/views/subscriptionPage/subscriptionHeader';
describe('SubscriptionHeader', function () {
beforeEach(() => {
MockApiClient.clearMockResponses();
MockApiClient.addMockResponse({
url: `/customers/org-slug/billing-config/`,
method: 'GET',
body: BillingConfigFixture(PlanTier.AM1),
});
MockApiClient.addMockResponse({
url: `/subscriptions/org-slug/`,
method: 'GET',
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/promotions/trigger-check/`,
method: 'POST',
});
MockApiClient.addMockResponse({
url: `/customers/org-slug/plan-migrations/`,
query: {scheduled: 1, applied: 0},
method: 'GET',
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/prompts-activity/`,
body: {},
});
});
it('does not render editable sections for YY partnership', async function () {
const organization = OrganizationFixture({
features: ['usage-log'],
access: ['org:billing'],
});
const subscription = SubscriptionFixture({
plan: 'am2_business',
planTier: 'am2',
partner: {
externalId: 'x123x',
name: 'YY Org',
partnership: {
id: 'YY',
displayName: 'YY',
supportNote: 'foo',
},
isActive: true,
},
organization,
canSelfServe: false,
});
SubscriptionStore.set(organization.slug, subscription);
render(
);
expect(await screen.findByTestId('partnership-note')).toBeInTheDocument();
expect(
screen.queryByRole('button', {name: 'Manage subscription'})
).not.toBeInTheDocument();
expect(screen.queryByText('Billing Details')).not.toBeInTheDocument();
});
it('renders partner plan ending banner for partner orgs with flag and ending contract', function () {
const organization = OrganizationFixture({
features: ['usage-log', 'partner-billing-migration'],
access: ['org:billing'],
});
const now = moment();
const subscription = SubscriptionFixture({
plan: 'am2_sponsored_team_auf',
planDetails: PlanFixture({}),
planTier: 'am2',
partner: {
externalId: 'x123x',
name: 'FOO Org',
partnership: {
id: 'FOO',
displayName: 'FOO',
supportNote: '',
},
isActive: true,
},
organization,
canSelfServe: true,
contractPeriodEnd: now.add(30, 'days').toString(),
});
SubscriptionStore.set(organization.slug, subscription);
render(
);
expect(screen.getByTestId('partner-plan-ending-banner')).toBeInTheDocument();
});
it('does not render partner plan ending banner for partner orgs with flag and ending contract greater than 30 days', function () {
const organization = OrganizationFixture({
features: ['usage-log', 'partner-billing-migration'],
access: ['org:billing'],
});
const now = moment();
const subscription = SubscriptionFixture({
plan: 'am2_sponsored_team_auf',
planDetails: PlanFixture({}),
planTier: 'am2',
partner: {
externalId: 'x123x',
name: 'FOO Org',
partnership: {
id: 'FOO',
displayName: 'FOO',
supportNote: '',
},
isActive: true,
},
organization,
canSelfServe: true,
contractPeriodEnd: now.add(50, 'days').toString(),
});
SubscriptionStore.set(organization.slug, subscription);
render(
);
expect(screen.queryByTestId('partner-plan-ending-banner')).not.toBeInTheDocument();
});
it('does not render partner plan ending banner for orgs with pending upgrade', function () {
const organization = OrganizationFixture({
features: ['usage-log', 'partner-billing-migration'],
access: ['org:billing'],
});
const now = moment();
const subscription = SubscriptionFixture({
plan: 'am2_sponsored_team_auf',
planDetails: PlanFixture({}),
planTier: 'am2',
partner: {
externalId: 'x123x',
name: 'FOO Org',
partnership: {
id: 'FOO',
displayName: 'FOO',
supportNote: '',
},
isActive: true,
},
pendingChanges: PendingChangesFixture({
plan: 'am3_business',
planDetails: PlanFixture({
name: 'Business',
price: 100,
}),
}),
organization,
canSelfServe: true,
contractPeriodEnd: now.add(30, 'days').toString(),
});
SubscriptionStore.set(organization.slug, subscription);
render(
);
expect(screen.queryByTestId('partner-plan-ending-banner')).not.toBeInTheDocument();
});
it('renders partner plan ending banner for orgs with pending downgrade', function () {
const organization = OrganizationFixture({
features: ['usage-log', 'partner-billing-migration'],
access: ['org:billing'],
});
const now = moment();
const subscription = SubscriptionFixture({
plan: 'am2_sponsored_team_auf',
planDetails: PlanFixture({}),
planTier: 'am2',
partner: {
externalId: 'x123x',
name: 'FOO Org',
partnership: {
id: 'FOO',
displayName: 'FOO',
supportNote: '',
},
isActive: true,
},
pendingChanges: PendingChangesFixture({
plan: 'am3_f',
planDetails: PlanFixture({
name: 'Developer',
price: 0,
}),
}),
organization,
canSelfServe: true,
contractPeriodEnd: now.add(30, 'days').toString(),
});
SubscriptionStore.set(organization.slug, subscription);
render(
);
expect(screen.getByTestId('partner-plan-ending-banner')).toBeInTheDocument();
});
it('renders usage log tab for owners and billing users', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
const sub = SubscriptionFixture({organization});
render();
expect(screen.getByText(/Usage Log/i)).toBeInTheDocument();
});
it('renders usage log tab for managers', function () {
const organization = OrganizationFixture({
access: ['org:write'],
});
const sub = SubscriptionFixture({organization});
render();
expect(screen.getByText(/Usage Log/i)).toBeInTheDocument();
});
it('renders usage tab for admin and member users', function () {
const organization = OrganizationFixture({access: ['org:read']});
const sub = SubscriptionFixture({organization});
render();
expect(screen.getByText(/Usage Log/i)).toBeInTheDocument();
});
it('renders notifications tab for owners and billing users with flag', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
organization.features.push('spend-visibility-notifications');
const sub = SubscriptionFixture({organization});
render();
expect(screen.getByText(/Notifications/i)).toBeInTheDocument();
});
it('does not render notifications tab for owners and billing users without flag', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
const sub = SubscriptionFixture({organization});
render();
expect(screen.queryByText(/Notifications/i)).not.toBeInTheDocument();
});
it('does not render Billing Details tab for self serve partner', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
const sub = SubscriptionFixture({
organization,
isSelfServePartner: true,
});
render();
expect(screen.queryByText(/Billing Details/i)).not.toBeInTheDocument();
});
it('renders managed note for non-self-serve subscriptions', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
const subscription = SubscriptionFixture({
organization,
canSelfServe: false,
});
render(
);
const managedNote = screen.getByTestId('managed-note');
expect(managedNote).toBeInTheDocument();
expect(within(managedNote).getByRole('link')).toHaveAttribute(
'href',
'mailto:support@sentry.io'
);
expect(managedNote).toHaveTextContent(
'Contact us at support@sentry.io to make changes to your subscription.'
);
});
it('does not render managed note for self-serve subscriptions', function () {
const organization = OrganizationFixture({
access: ['org:billing'],
});
const subscription = SubscriptionFixture({
organization,
canSelfServe: true,
});
render(
);
expect(screen.queryByTestId('managed-note')).not.toBeInTheDocument();
});
});