import range from 'lodash/range';
import {OrganizationFixture} from 'sentry-fixture/organization';
import {ProjectFixture} from 'sentry-fixture/project';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {
render,
screen,
userEvent,
waitForElementToBeRemoved,
} from 'sentry-test/reactTestingLibrary';
import TeamMisery from 'sentry/views/organizationStats/teamInsights/teamMisery';
describe('TeamMisery', () => {
const {routerProps} = initializeOrg();
it('should render misery from projects and expand hidden items', async () => {
const project = ProjectFixture();
const meta = {
fields: {
transaction: 'string',
project: 'string',
tpm: 'number',
'count_unique(user)': 'number',
'count_miserable(user)': 'number',
'user_misery()': 'number',
},
};
const extraData = {
project: project.slug,
tpm: 30,
count_unique_user: 1000,
count_miserable_user: 122,
project_threshold_config: ['duration', 300],
};
const noChangeItems = 10;
const noChange = range(0, noChangeItems).map(x => ({
transaction: `/apple/${x}`,
'user_misery()': 0.1,
...extraData,
}));
const weekMisery = MockApiClient.addMockResponse({
url: `/organizations/org-slug/events/`,
body: {
meta,
data: [
{
transaction: '/apple/cart',
'user_misery()': 0.5,
...extraData,
},
{
transaction: '/apple/checkout',
'user_misery()': 0.1,
...extraData,
},
...noChange,
],
},
match: [MockApiClient.matchQuery({statsPeriod: '7d'})],
});
const periodMisery = MockApiClient.addMockResponse({
url: `/organizations/org-slug/events/`,
body: {
meta,
data: [
{
transaction: '/apple/cart',
'user_misery()': 0.25,
...extraData,
},
{
transaction: '/apple/checkout',
'user_misery()': 0.2,
...extraData,
},
...noChange,
],
},
match: [MockApiClient.matchQuery({statsPeriod: '8w'})],
});
render(
);
await waitForElementToBeRemoved(() => screen.queryByTestId('loading-indicator'));
expect(weekMisery).toHaveBeenCalledTimes(1);
expect(periodMisery).toHaveBeenCalledTimes(1);
// Should have 8 items, the rest are collapsed.
expect(screen.getAllByText(project.slug)).toHaveLength(5);
expect(screen.getByText('10% better')).toBeInTheDocument();
expect(screen.getByText('25% worse')).toBeInTheDocument();
expect(screen.getAllByText('0% change')).toHaveLength(3);
expect(screen.getByText('Show 7 More')).toBeInTheDocument();
await userEvent.click(screen.getByText('Show 7 More'));
expect(screen.getAllByText('0% change')).toHaveLength(noChangeItems);
});
it('should render empty state', () => {
render(
);
expect(
screen.getByText('No key transactions starred by this team')
).toBeInTheDocument();
});
it('should render empty state on error', async () => {
MockApiClient.addMockResponse({
url: `/organizations/org-slug/events/`,
statusCode: 500,
body: {},
});
render(
);
await waitForElementToBeRemoved(screen.queryByTestId('loading-indicator'));
expect(screen.getByText('There was an error loading data.')).toBeInTheDocument();
});
});