import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, waitFor} from 'sentry-test/reactTestingLibrary';
import {HealthStatsPeriodOption} from 'sentry/types';
import {ReleasesDisplayOption} from 'sentry/views/releases/list/releasesDisplayOptions';
import ReleasesRequest from 'sentry/views/releases/list/releasesRequest';
describe('ReleasesRequest', () => {
const {organization, router} = initializeOrg();
const projectId = 123;
const selection = {
projects: [projectId],
environments: [],
datetime: {
period: '14d',
start: null,
end: null,
utc: false,
},
};
MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SessionStatusCountByReleaseInPeriod(),
match: [
MockApiClient.matchQuery({
query:
'release:7a82c130be9143361f20bc77252df783cf91e4fc OR release:e102abb2c46e7fe8686441091005c12aed90da99',
interval: '1d',
statsPeriod: '14d',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project', 'release', 'session.status'],
}),
],
});
const requestForAutoHealthStatsPeriodSessionHistogram = MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SessionStatusCountByProjectInPeriod(),
match: [
MockApiClient.matchQuery({
query: undefined,
interval: '1d',
statsPeriod: '14d',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project', 'session.status'],
}),
],
});
const requestForAutoTotalCountByProjectInPeriod = MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SessionTotalCountByProjectIn24h(),
match: [
MockApiClient.matchQuery({
query: undefined,
interval: '1d',
statsPeriod: '14d',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project'],
}),
],
});
const requestForAutoTotalCountByReleaseInPeriod = MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SesssionTotalCountByReleaseIn24h(),
match: [
MockApiClient.matchQuery({
query:
'release:7a82c130be9143361f20bc77252df783cf91e4fc OR release:e102abb2c46e7fe8686441091005c12aed90da99',
interval: '1d',
statsPeriod: '14d',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project', 'release'],
}),
],
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/sessions/`,
body: TestStubs.SesssionTotalCountByReleaseIn24h(),
match: [
MockApiClient.matchQuery({
query:
'release:7a82c130be9143361f20bc77252df783cf91e4fc OR release:e102abb2c46e7fe8686441091005c12aed90da99',
interval: '1h',
statsPeriod: '24h',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project', 'release'],
}),
],
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SessionTotalCountByProjectIn24h(),
match: [
MockApiClient.matchQuery({
query: undefined,
interval: '1h',
statsPeriod: '24h',
project: [`${projectId}`],
field: ['sum(session)'],
groupBy: ['project'],
}),
],
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.SessionUserStatusCountByReleaseInPeriod(),
match: [
MockApiClient.matchQuery({
query:
'release:7a82c130be9143361f20bc77252df783cf91e4fc OR release:e102abb2c46e7fe8686441091005c12aed90da99',
interval: '1d',
statsPeriod: '14d',
project: [`${projectId}`],
field: ['count_unique(user)', 'sum(session)'],
groupBy: ['project', 'release', 'session.status'],
}),
],
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/sessions/`,
body: TestStubs.UserTotalCountByReleaseIn24h(),
match: [
MockApiClient.matchQuery({
query:
'release:7a82c130be9143361f20bc77252df783cf91e4fc OR release:e102abb2c46e7fe8686441091005c12aed90da99',
interval: '1h',
statsPeriod: '24h',
project: [`${projectId}`],
field: ['count_unique(user)'],
groupBy: ['project', 'release'],
}),
],
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/sessions/`,
body: TestStubs.UserTotalCountByProjectIn24h(),
match: [
MockApiClient.matchQuery({
query: undefined,
interval: '1h',
statsPeriod: '24h',
project: [`${projectId}`],
field: ['count_unique(user)'],
groupBy: ['project'],
}),
],
});
it('calculates correct session health data', async () => {
let healthData;
render(
{({getHealthData}) => {
healthData = getHealthData;
return null;
}}
);
await waitFor(() =>
expect(
healthData.getCrashCount(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(492)
);
expect(
healthData.getCrashFreeRate(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(99.76);
expect(
healthData.get24hCountByRelease(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(219826);
expect(
healthData.get24hCountByProject(projectId, ReleasesDisplayOption.SESSIONS)
).toBe(835965);
expect(
healthData.getTimeSeries(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toEqual([
{
data: [
{name: 1615975200000, value: 0},
{name: 1615978800000, value: 0},
{name: 1615982400000, value: 0},
{name: 1615986000000, value: 0},
{name: 1615989600000, value: 0},
{name: 1615993200000, value: 0},
{name: 1615996800000, value: 0},
{name: 1616000400000, value: 0},
{name: 1616004000000, value: 0},
{name: 1616007600000, value: 0},
{name: 1616011200000, value: 0},
{name: 1616014800000, value: 0},
{name: 1616018400000, value: 0},
{name: 1616022000000, value: 3444},
{name: 1616025600000, value: 14912},
{name: 1616029200000, value: 15649},
{name: 1616032800000, value: 18019},
{name: 1616036400000, value: 16726},
{name: 1616040000000, value: 17540},
{name: 1616043600000, value: 16970},
{name: 1616047200000, value: 25015},
{name: 1616050800000, value: 34686},
{name: 1616054400000, value: 46434},
{name: 1616058000000, value: 10431},
],
seriesName: 'This Release',
},
{
data: [
{name: 1615975200000, value: 51284},
{name: 1615978800000, value: 43820},
{name: 1615982400000, value: 46981},
{name: 1615986000000, value: 56929},
{name: 1615989600000, value: 59999},
{name: 1615993200000, value: 60476},
{name: 1615996800000, value: 54145},
{name: 1616000400000, value: 52642},
{name: 1616004000000, value: 42917},
{name: 1616007600000, value: 35787},
{name: 1616011200000, value: 35036},
{name: 1616014800000, value: 29287},
{name: 1616018400000, value: 24815},
{name: 1616022000000, value: 19815},
{name: 1616025600000, value: 16334},
{name: 1616029200000, value: 16415},
{name: 1616032800000, value: 18961},
{name: 1616036400000, value: 17512},
{name: 1616040000000, value: 18149},
{name: 1616043600000, value: 17585},
{name: 1616047200000, value: 25725},
{name: 1616050800000, value: 36365},
{name: 1616054400000, value: 48104},
{name: 1616058000000, value: 6882},
],
seriesName: 'Total Project',
z: 0,
},
]);
expect(
healthData.getAdoption(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(26.29607698886915);
expect(
healthData.getCrashCount(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(5);
expect(
healthData.getCrashFreeRate(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(99.921);
expect(
healthData.get24hCountByRelease(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(6320);
expect(
healthData.get24hCountByProject(projectId, ReleasesDisplayOption.SESSIONS)
).toBe(835965);
expect(
healthData.getTimeSeries(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toEqual([
{
data: [
{name: 1615975200000, value: 0},
{name: 1615978800000, value: 0},
{name: 1615982400000, value: 0},
{name: 1615986000000, value: 0},
{name: 1615989600000, value: 0},
{name: 1615993200000, value: 0},
{name: 1615996800000, value: 0},
{name: 1616000400000, value: 0},
{name: 1616004000000, value: 0},
{name: 1616007600000, value: 0},
{name: 1616011200000, value: 0},
{name: 1616014800000, value: 0},
{name: 1616018400000, value: 0},
{name: 1616022000000, value: 5809},
{name: 1616025600000, value: 400},
{name: 1616029200000, value: 22},
{name: 1616032800000, value: 26},
{name: 1616036400000, value: 12},
{name: 1616040000000, value: 19},
{name: 1616043600000, value: 8},
{name: 1616047200000, value: 0},
{name: 1616050800000, value: 19},
{name: 1616054400000, value: 5},
{name: 1616058000000, value: 0},
],
seriesName: 'This Release',
},
{
data: [
{name: 1615975200000, value: 51284},
{name: 1615978800000, value: 43820},
{name: 1615982400000, value: 46981},
{name: 1615986000000, value: 56929},
{name: 1615989600000, value: 59999},
{name: 1615993200000, value: 60476},
{name: 1615996800000, value: 54145},
{name: 1616000400000, value: 52642},
{name: 1616004000000, value: 42917},
{name: 1616007600000, value: 35787},
{name: 1616011200000, value: 35036},
{name: 1616014800000, value: 29287},
{name: 1616018400000, value: 24815},
{name: 1616022000000, value: 19815},
{name: 1616025600000, value: 16334},
{name: 1616029200000, value: 16415},
{name: 1616032800000, value: 18961},
{name: 1616036400000, value: 17512},
{name: 1616040000000, value: 18149},
{name: 1616043600000, value: 17585},
{name: 1616047200000, value: 25725},
{name: 1616050800000, value: 36365},
{name: 1616054400000, value: 48104},
{name: 1616058000000, value: 6882},
],
seriesName: 'Total Project',
z: 0,
},
]);
expect(
healthData.getAdoption(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(0.7560125124855706);
expect(requestForAutoHealthStatsPeriodSessionHistogram).toHaveBeenCalledTimes(0);
});
it('calculates correct user health data', async () => {
let healthData;
render(
{({getHealthData}) => {
healthData = getHealthData;
return null;
}}
);
await waitFor(() =>
expect(
healthData.getCrashCount(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(492)
);
expect(
healthData.getCrashFreeRate(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(99.908);
expect(
healthData.get24hCountByRelease(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(56826);
expect(healthData.get24hCountByProject(projectId, ReleasesDisplayOption.USERS)).toBe(
140965
);
expect(
healthData.getTimeSeries(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.USERS
)
).toEqual([
{
data: [
{name: 1615975200000, value: 0},
{name: 1615978800000, value: 0},
{name: 1615982400000, value: 0},
{name: 1615986000000, value: 0},
{name: 1615989600000, value: 0},
{name: 1615993200000, value: 0},
{name: 1615996800000, value: 0},
{name: 1616000400000, value: 0},
{name: 1616004000000, value: 0},
{name: 1616007600000, value: 0},
{name: 1616011200000, value: 0},
{name: 1616014800000, value: 0},
{name: 1616018400000, value: 0},
{name: 1616022000000, value: 444},
{name: 1616025600000, value: 4912},
{name: 1616029200000, value: 5649},
{name: 1616032800000, value: 8019},
{name: 1616036400000, value: 6726},
{name: 1616040000000, value: 7540},
{name: 1616043600000, value: 6970},
{name: 1616047200000, value: 5015},
{name: 1616050800000, value: 4686},
{name: 1616054400000, value: 6434},
{name: 1616058000000, value: 431},
],
seriesName: 'This Release',
},
{
data: [
{name: 1615975200000, value: 1284},
{name: 1615978800000, value: 3820},
{name: 1615982400000, value: 6981},
{name: 1615986000000, value: 6929},
{name: 1615989600000, value: 9999},
{name: 1615993200000, value: 1476},
{name: 1615996800000, value: 4145},
{name: 1616000400000, value: 2642},
{name: 1616004000000, value: 2917},
{name: 1616007600000, value: 5787},
{name: 1616011200000, value: 5036},
{name: 1616014800000, value: 9287},
{name: 1616018400000, value: 4815},
{name: 1616022000000, value: 9815},
{name: 1616025600000, value: 6334},
{name: 1616029200000, value: 6415},
{name: 1616032800000, value: 8961},
{name: 1616036400000, value: 7512},
{name: 1616040000000, value: 8149},
{name: 1616043600000, value: 7585},
{name: 1616047200000, value: 5725},
{name: 1616050800000, value: 6365},
{name: 1616054400000, value: 8104},
{name: 1616058000000, value: 882},
],
seriesName: 'Total Project',
z: 0,
},
]);
expect(
healthData.getAdoption(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(40.31213421771362);
expect(
healthData.getCrashCount(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(5);
expect(
healthData.getCrashFreeRate(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(99.87);
expect(
healthData.get24hCountByRelease(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(850);
expect(healthData.get24hCountByProject(projectId, ReleasesDisplayOption.USERS)).toBe(
140965
);
expect(
healthData.getTimeSeries(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.USERS
)
).toEqual([
{
data: [
{name: 1615975200000, value: 0},
{name: 1615978800000, value: 0},
{name: 1615982400000, value: 0},
{name: 1615986000000, value: 0},
{name: 1615989600000, value: 0},
{name: 1615993200000, value: 0},
{name: 1615996800000, value: 0},
{name: 1616000400000, value: 0},
{name: 1616004000000, value: 0},
{name: 1616007600000, value: 0},
{name: 1616011200000, value: 0},
{name: 1616014800000, value: 0},
{name: 1616018400000, value: 0},
{name: 1616022000000, value: 809},
{name: 1616025600000, value: 0},
{name: 1616029200000, value: 2},
{name: 1616032800000, value: 6},
{name: 1616036400000, value: 2},
{name: 1616040000000, value: 9},
{name: 1616043600000, value: 8},
{name: 1616047200000, value: 0},
{name: 1616050800000, value: 9},
{name: 1616054400000, value: 5},
{name: 1616058000000, value: 0},
],
seriesName: 'This Release',
},
{
data: [
{name: 1615975200000, value: 1284},
{name: 1615978800000, value: 3820},
{name: 1615982400000, value: 6981},
{name: 1615986000000, value: 6929},
{name: 1615989600000, value: 9999},
{name: 1615993200000, value: 1476},
{name: 1615996800000, value: 4145},
{name: 1616000400000, value: 2642},
{name: 1616004000000, value: 2917},
{name: 1616007600000, value: 5787},
{name: 1616011200000, value: 5036},
{name: 1616014800000, value: 9287},
{name: 1616018400000, value: 4815},
{name: 1616022000000, value: 9815},
{name: 1616025600000, value: 6334},
{name: 1616029200000, value: 6415},
{name: 1616032800000, value: 8961},
{name: 1616036400000, value: 7512},
{name: 1616040000000, value: 8149},
{name: 1616043600000, value: 7585},
{name: 1616047200000, value: 5725},
{name: 1616050800000, value: 6365},
{name: 1616054400000, value: 8104},
{name: 1616058000000, value: 882},
],
seriesName: 'Total Project',
z: 0,
},
]);
expect(
healthData.getAdoption(
'e102abb2c46e7fe8686441091005c12aed90da99',
projectId,
ReleasesDisplayOption.USERS
)
).toBe(0.6029865569467598);
});
it('calculates correct session count histogram (auto period)', async () => {
let healthData;
render(
{({getHealthData}) => {
healthData = getHealthData;
return null;
}}
);
await waitFor(() =>
expect(
healthData.getAdoption(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toBe(26.29607698886915)
);
expect(
healthData.getTimeSeries(
'7a82c130be9143361f20bc77252df783cf91e4fc',
projectId,
ReleasesDisplayOption.SESSIONS
)
).toEqual([
{
data: [
{name: 1614902400000, value: 0},
{name: 1614988800000, value: 0},
{name: 1615075200000, value: 0},
{name: 1615161600000, value: 0},
{name: 1615248000000, value: 0},
{name: 1615334400000, value: 0},
{name: 1615420800000, value: 0},
{name: 1615507200000, value: 0},
{name: 1615593600000, value: 0},
{name: 1615680000000, value: 0},
{name: 1615766400000, value: 0},
{name: 1615852800000, value: 0},
{name: 1615939200000, value: 3446},
{name: 1616025600000, value: 201136},
],
seriesName: 'This Release',
},
{
data: [
{name: 1614902400000, value: 0},
{name: 1614988800000, value: 0},
{name: 1615075200000, value: 0},
{name: 1615161600000, value: 0},
{name: 1615248000000, value: 0},
{name: 1615334400000, value: 0},
{name: 1615420800000, value: 0},
{name: 1615507200000, value: 0},
{name: 1615593600000, value: 0},
{name: 1615680000000, value: 0},
{name: 1615766400000, value: 0},
{name: 1615852800000, value: 0},
{name: 1615939200000, value: 9268},
{name: 1616025600000, value: 1083},
],
seriesName: 'Total Project',
z: 0,
},
]);
expect(requestForAutoHealthStatsPeriodSessionHistogram).toHaveBeenCalledTimes(1);
expect(requestForAutoTotalCountByProjectInPeriod).toHaveBeenCalledTimes(1);
expect(requestForAutoTotalCountByReleaseInPeriod).toHaveBeenCalledTimes(1);
});
});