Skip to content

Commit c673731

Browse files
committed
feat: adjust codecov time selector to use codecov context
1 parent 0d5a55d commit c673731

File tree

8 files changed

+115
-349
lines changed

8 files changed

+115
-349
lines changed
Lines changed: 28 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,53 @@
1-
import {initializeOrg} from 'sentry-test/initializeOrg';
21
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
32

4-
import {initializeUrlState} from 'sentry/actionCreators/pageFilters';
3+
import CodecovQueryParamsProvider from 'sentry/components/codecov/container/codecovParamsProvider';
54
import {DatePicker} from 'sentry/components/codecov/datePicker/datePicker';
6-
import OrganizationStore from 'sentry/stores/organizationStore';
7-
import PageFiltersStore from 'sentry/stores/pageFiltersStore';
8-
9-
const {organization, router} = initializeOrg({
10-
router: {
11-
location: {
12-
query: {},
13-
pathname: '/codecov/tests',
14-
},
15-
params: {},
16-
},
17-
});
185

196
describe('DatePicker', function () {
20-
beforeEach(() => {
21-
PageFiltersStore.init();
22-
OrganizationStore.init();
23-
24-
OrganizationStore.onUpdate(organization, {replace: true});
25-
PageFiltersStore.onInitializeUrlState(
7+
it('can change period', async function () {
8+
const {router} = render(
9+
<CodecovQueryParamsProvider>
10+
<DatePicker />
11+
</CodecovQueryParamsProvider>,
2612
{
27-
projects: [],
28-
environments: [],
29-
datetime: {
30-
period: '7d',
31-
start: null,
32-
end: null,
33-
utc: false,
13+
initialRouterConfig: {
14+
location: {
15+
pathname: '/codecov/tests',
16+
query: {codecovPeriod: '7d'},
17+
},
3418
},
35-
},
36-
new Set(['datetime'])
19+
}
3720
);
38-
});
39-
40-
it('can change period', async function () {
41-
render(<DatePicker />, {
42-
router,
43-
deprecatedRouterMocks: true,
44-
});
4521

4622
await userEvent.click(screen.getByRole('button', {name: '7D', expanded: false}));
4723
await userEvent.click(screen.getByRole('option', {name: 'Last 30 days'}));
4824

25+
expect(router.location.search).toBe('?codecovPeriod=30d');
26+
4927
expect(
5028
screen.getByRole('button', {name: '30D', expanded: false})
5129
).toBeInTheDocument();
52-
expect(router.push).toHaveBeenCalledWith(
53-
expect.objectContaining({query: {statsPeriod: '30d'}})
54-
);
55-
expect(PageFiltersStore.getState()).toEqual({
56-
isReady: true,
57-
shouldPersist: true,
58-
desyncedFilters: new Set(),
59-
pinnedFilters: new Set(['datetime']),
60-
selection: {
61-
datetime: {
62-
period: '30d',
63-
end: null,
64-
start: null,
65-
utc: false,
66-
},
67-
environments: [],
68-
projects: [],
69-
},
70-
});
7130
});
7231

73-
it('adjusts period if invalid', async function () {
74-
PageFiltersStore.reset();
75-
PageFiltersStore.onInitializeUrlState(
32+
it('displays invalid button for invalid values', async function () {
33+
render(
34+
<CodecovQueryParamsProvider>
35+
<DatePicker />
36+
</CodecovQueryParamsProvider>,
7637
{
77-
projects: [],
78-
environments: [],
79-
datetime: {
80-
period: '123d',
81-
start: null,
82-
end: null,
83-
utc: false,
38+
initialRouterConfig: {
39+
location: {
40+
pathname: '/codecov/tests',
41+
query: {codecovPeriod: '123Dd12'},
42+
},
8443
},
85-
},
86-
new Set(['datetime'])
44+
}
8745
);
8846

89-
render(<DatePicker />, {
90-
router,
91-
deprecatedRouterMocks: true,
47+
const button = await screen.findByRole('button', {
48+
name: 'Invalid Period',
49+
expanded: false,
9250
});
93-
94-
// Confirm selection changed to default Codecov period
95-
const button = await screen.findByRole('button', {name: '24H', expanded: false});
9651
expect(button).toBeInTheDocument();
97-
expect(router.push).toHaveBeenCalledWith(
98-
expect.objectContaining({query: {statsPeriod: '24h'}})
99-
);
100-
expect(PageFiltersStore.getState()).toEqual({
101-
isReady: true,
102-
shouldPersist: true,
103-
desyncedFilters: new Set(),
104-
pinnedFilters: new Set(['datetime']),
105-
selection: {
106-
datetime: {
107-
period: '24h',
108-
end: null,
109-
start: null,
110-
utc: false,
111-
},
112-
environments: [],
113-
projects: [],
114-
},
115-
});
116-
});
117-
118-
it('displays a desynced state message', async function () {
119-
const {organization: desyncOrganization, router: desyncRouter} = initializeOrg({
120-
router: {
121-
location: {
122-
query: {statsPeriod: '7d'},
123-
pathname: '/codecov/test',
124-
},
125-
params: {},
126-
},
127-
});
128-
129-
PageFiltersStore.reset();
130-
initializeUrlState({
131-
memberProjects: [],
132-
nonMemberProjects: [],
133-
organization: desyncOrganization,
134-
queryParams: {statsPeriod: '30d'},
135-
router: desyncRouter,
136-
shouldEnforceSingleProject: false,
137-
});
138-
139-
render(<DatePicker />, {
140-
router: desyncRouter,
141-
organization: desyncOrganization,
142-
deprecatedRouterMocks: true,
143-
});
144-
145-
await userEvent.click(screen.getByRole('button', {name: '30D', expanded: false}));
146-
expect(screen.getByText('Filters Updated')).toBeInTheDocument();
147-
expect(
148-
screen.getByRole('button', {name: 'Restore Previous Values'})
149-
).toBeInTheDocument();
150-
expect(screen.getByRole('button', {name: 'Got It'})).toBeInTheDocument();
15152
});
15253
});
Lines changed: 13 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,23 @@
1-
import {useEffect} from 'react';
1+
import {useSearchParams} from 'react-router-dom';
22

3-
import {updateDateTime} from 'sentry/actionCreators/pageFilters';
4-
import type {DateSelectorProps} from 'sentry/components/codecov/datePicker/dateSelector';
3+
import {useCodecovContext} from 'sentry/components/codecov/context/codecovContext';
54
import {DateSelector} from 'sentry/components/codecov/datePicker/dateSelector';
6-
import {isValidCodecovRelativePeriod} from 'sentry/components/codecov/utils';
7-
import {DesyncedFilterMessage} from 'sentry/components/organizations/pageFilters/desyncedFilter';
8-
import {t} from 'sentry/locale';
9-
import usePageFilters from 'sentry/utils/usePageFilters';
10-
import useRouter from 'sentry/utils/useRouter';
115

12-
const CODECOV_DEFAULT_RELATIVE_PERIOD = '24h';
13-
export const CODECOV_DEFAULT_RELATIVE_PERIODS = {
14-
'24h': t('Last 24 hours'),
15-
'7d': t('Last 7 days'),
16-
'30d': t('Last 30 days'),
17-
};
18-
19-
interface DatePickerProps
20-
extends Partial<Partial<Omit<DateSelectorProps, 'relative' | 'menuBody'>>> {}
21-
22-
export function DatePicker({
23-
onChange,
24-
menuTitle,
25-
menuWidth,
26-
triggerProps = {},
27-
...selectProps
28-
}: DatePickerProps) {
29-
const router = useRouter();
30-
const {selection, desyncedFilters} = usePageFilters();
31-
const desynced = desyncedFilters.has('datetime');
32-
const period = selection.datetime?.period;
33-
34-
// Adjusts to valid Codecov relative period since Codecov only accepts a subset of dates other components accept, defined in CODECOV_DEFAULT_RELATIVE_PERIODS
35-
useEffect(() => {
36-
if (!isValidCodecovRelativePeriod(period)) {
37-
const newTimePeriod = {period: CODECOV_DEFAULT_RELATIVE_PERIOD};
38-
updateDateTime(newTimePeriod, router, {
39-
save: true,
40-
});
41-
}
42-
}, [period, router]);
6+
export function DatePicker() {
7+
const {codecovPeriod} = useCodecovContext();
8+
const [searchParams, setSearchParams] = useSearchParams();
439

4410
return (
4511
<DateSelector
46-
{...selectProps}
47-
relative={period}
48-
desynced={desynced}
49-
onChange={timePeriodUpdate => {
50-
const {relative} = timePeriodUpdate;
51-
const newTimePeriod = {period: relative};
52-
53-
onChange?.(timePeriodUpdate);
54-
updateDateTime(newTimePeriod, router, {
55-
save: true,
56-
});
12+
relativeDate={codecovPeriod}
13+
onChange={newCodecovPeriod => {
14+
const currentParams = Object.fromEntries(searchParams.entries());
15+
const updatedParams = {
16+
...currentParams,
17+
codecovPeriod: newCodecovPeriod,
18+
};
19+
setSearchParams(updatedParams);
5720
}}
58-
menuTitle={menuTitle ?? t('Filter Time Range')}
59-
menuWidth={(menuWidth ?? desynced) ? '22em' : undefined}
60-
menuBody={desynced && <DesyncedFilterMessage />}
61-
triggerProps={triggerProps}
6221
/>
6322
);
6423
}

static/app/components/codecov/datePicker/dateSelector.spec.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import {DateSelector} from 'sentry/components/codecov/datePicker/dateSelector';
44

55
describe('DateSelector', function () {
66
it('renders when given relative period', async function () {
7-
render(<DateSelector relative="7d" />);
7+
render(<DateSelector relativeDate="7d" onChange={() => {}} />);
88
expect(await screen.findByRole('button', {name: '7D'})).toBeInTheDocument();
99
});
1010

1111
it('renders when given an invalid relative period', async function () {
12-
render(<DateSelector relative="1y" />);
12+
render(<DateSelector relativeDate="1y" onChange={() => {}} />);
1313
expect(
1414
await screen.findByRole('button', {name: 'Invalid Period'})
1515
).toBeInTheDocument();

0 commit comments

Comments
 (0)