mirror of
https://github.com/Unleash/unleash.git
synced 2025-07-31 13:47:02 +02:00
test: insights filtering (#7612)
This commit is contained in:
parent
d397819fd3
commit
06f5073fce
55
frontend/src/component/insights/Insights.test.tsx
Normal file
55
frontend/src/component/insights/Insights.test.tsx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { render } from '../../utils/testRenderer';
|
||||||
|
import { fireEvent, screen } from '@testing-library/react';
|
||||||
|
import { NewInsights } from './Insights';
|
||||||
|
import { testServerRoute, testServerSetup } from '../../utils/testServer';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
const server = testServerSetup();
|
||||||
|
|
||||||
|
const setupApi = () => {
|
||||||
|
testServerRoute(server, '/api/admin/insights', {
|
||||||
|
users: { total: 0, active: 0, inactive: 0 },
|
||||||
|
userTrends: [],
|
||||||
|
projectFlagTrends: [],
|
||||||
|
metricsSummaryTrends: [],
|
||||||
|
flags: { total: 0 },
|
||||||
|
flagTrends: [],
|
||||||
|
environmentTypeTrends: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
testServerRoute(server, '/api/admin/projects', {
|
||||||
|
projects: [
|
||||||
|
{ name: 'Project A Name', id: 'projectA' },
|
||||||
|
{ name: 'Project B Name', id: 'projectB' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentTime = '2024-04-25T08:05:00.000Z';
|
||||||
|
|
||||||
|
test('Filter insights by project and date', async () => {
|
||||||
|
vi.setSystemTime(currentTime);
|
||||||
|
setupApi();
|
||||||
|
render(<NewInsights ChartComponent={undefined} />);
|
||||||
|
const addFilter = await screen.findByText('Add Filter');
|
||||||
|
fireEvent.click(addFilter);
|
||||||
|
|
||||||
|
const dateFromFilter = await screen.findByText('Date From');
|
||||||
|
await screen.findByText('Date To');
|
||||||
|
const projectFilter = await screen.findByText('Project');
|
||||||
|
|
||||||
|
// filter by project
|
||||||
|
fireEvent.click(projectFilter);
|
||||||
|
await screen.findByText('Project A Name');
|
||||||
|
const projectName = await screen.findByText('Project B Name');
|
||||||
|
await fireEvent.click(projectName);
|
||||||
|
expect(window.location.href).toContain('project=IS%3AprojectB');
|
||||||
|
|
||||||
|
// filter by from date
|
||||||
|
fireEvent.click(dateFromFilter);
|
||||||
|
const day = await screen.findByText('25');
|
||||||
|
fireEvent.click(day);
|
||||||
|
expect(window.location.href).toContain(
|
||||||
|
'project=IS%3AprojectB&from=IS%3A2024-04-25',
|
||||||
|
);
|
||||||
|
});
|
@ -9,7 +9,7 @@ import {
|
|||||||
import { useInsights } from 'hooks/api/getters/useInsights/useInsights';
|
import { useInsights } from 'hooks/api/getters/useInsights/useInsights';
|
||||||
import { InsightsHeader } from './components/InsightsHeader/InsightsHeader';
|
import { InsightsHeader } from './components/InsightsHeader/InsightsHeader';
|
||||||
import { useInsightsData } from './hooks/useInsightsData';
|
import { useInsightsData } from './hooks/useInsightsData';
|
||||||
import { InsightsCharts } from './InsightsCharts';
|
import { type IChartsProps, InsightsCharts } from './InsightsCharts';
|
||||||
import { LegacyInsightsCharts } from './LegacyInsightsCharts';
|
import { LegacyInsightsCharts } from './LegacyInsightsCharts';
|
||||||
import { useUiFlag } from 'hooks/useUiFlag';
|
import { useUiFlag } from 'hooks/useUiFlag';
|
||||||
import { Sticky } from 'component/common/Sticky/Sticky';
|
import { Sticky } from 'component/common/Sticky/Sticky';
|
||||||
@ -105,11 +105,15 @@ const LegacyInsights: FC = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const NewInsights = () => {
|
interface InsightsProps {
|
||||||
|
ChartComponent?: FC<IChartsProps>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const NewInsights: FC<InsightsProps> = ({ ChartComponent }) => {
|
||||||
const [scrolled, setScrolled] = useState(false);
|
const [scrolled, setScrolled] = useState(false);
|
||||||
|
|
||||||
const stateConfig = {
|
const stateConfig = {
|
||||||
projects: FilterItemParam,
|
project: FilterItemParam,
|
||||||
from: FilterItemParam,
|
from: FilterItemParam,
|
||||||
to: FilterItemParam,
|
to: FilterItemParam,
|
||||||
};
|
};
|
||||||
@ -119,7 +123,7 @@ const NewInsights = () => {
|
|||||||
state.to?.values[0],
|
state.to?.values[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
const projects = state.projects?.values ?? [allOption.id];
|
const projects = state.project?.values ?? [allOption.id];
|
||||||
|
|
||||||
const insightsData = useInsightsData(insights, projects);
|
const insightsData = useInsightsData(insights, projects);
|
||||||
|
|
||||||
@ -137,18 +141,20 @@ const NewInsights = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledWrapper>
|
<StyledWrapper>
|
||||||
<StickyWrapper>
|
<StickyContainer>
|
||||||
<InsightsHeader
|
<InsightsHeader
|
||||||
actions={
|
actions={
|
||||||
<InsightsFilters state={state} onChange={setState} />
|
<InsightsFilters state={state} onChange={setState} />
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</StickyWrapper>
|
</StickyContainer>
|
||||||
<InsightsCharts
|
{ChartComponent && (
|
||||||
|
<ChartComponent
|
||||||
loading={loading}
|
loading={loading}
|
||||||
projects={projects}
|
projects={projects}
|
||||||
{...insightsData}
|
{...insightsData}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</StyledWrapper>
|
</StyledWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@ -156,7 +162,8 @@ const NewInsights = () => {
|
|||||||
export const Insights: FC = () => {
|
export const Insights: FC = () => {
|
||||||
const isInsightsV2Enabled = useUiFlag('insightsV2');
|
const isInsightsV2Enabled = useUiFlag('insightsV2');
|
||||||
|
|
||||||
if (isInsightsV2Enabled) return <NewInsights />;
|
if (isInsightsV2Enabled)
|
||||||
|
return <NewInsights ChartComponent={InsightsCharts} />;
|
||||||
|
|
||||||
return <LegacyInsights />;
|
return <LegacyInsights />;
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ import { allOption } from 'component/common/ProjectSelect/ProjectSelect';
|
|||||||
import { chartInfo } from './chart-info';
|
import { chartInfo } from './chart-info';
|
||||||
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
||||||
|
|
||||||
interface IChartsProps {
|
export interface IChartsProps {
|
||||||
flags: InstanceInsightsSchema['flags'];
|
flags: InstanceInsightsSchema['flags'];
|
||||||
flagTrends: InstanceInsightsSchema['flagTrends'];
|
flagTrends: InstanceInsightsSchema['flagTrends'];
|
||||||
projectsData: InstanceInsightsSchema['projectFlagTrends'];
|
projectsData: InstanceInsightsSchema['projectFlagTrends'];
|
||||||
|
@ -48,7 +48,7 @@ export const InsightsFilters: FC<IFeatureToggleFiltersProps> = ({
|
|||||||
label: 'Project',
|
label: 'Project',
|
||||||
icon: 'topic',
|
icon: 'topic',
|
||||||
options: projectsOptions,
|
options: projectsOptions,
|
||||||
filterKey: 'projects',
|
filterKey: 'project',
|
||||||
singularOperators: ['IS'],
|
singularOperators: ['IS'],
|
||||||
pluralOperators: ['IS_ANY_OF'],
|
pluralOperators: ['IS_ANY_OF'],
|
||||||
},
|
},
|
||||||
|
@ -13,6 +13,7 @@ import { UIProviderContainer } from '../component/providers/UIProvider/UIProvide
|
|||||||
import { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';
|
import { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';
|
||||||
import { QueryParamProvider } from 'use-query-params';
|
import { QueryParamProvider } from 'use-query-params';
|
||||||
import { FeedbackProvider } from 'component/feedbackNew/FeedbackProvider';
|
import { FeedbackProvider } from 'component/feedbackNew/FeedbackProvider';
|
||||||
|
import { StickyProvider } from 'component/common/Sticky/StickyProvider';
|
||||||
|
|
||||||
export const render = (
|
export const render = (
|
||||||
ui: JSX.Element,
|
ui: JSX.Element,
|
||||||
@ -48,7 +49,9 @@ export const render = (
|
|||||||
<QueryParamProvider adapter={ReactRouter6Adapter}>
|
<QueryParamProvider adapter={ReactRouter6Adapter}>
|
||||||
<ThemeProvider>
|
<ThemeProvider>
|
||||||
<AnnouncerProvider>
|
<AnnouncerProvider>
|
||||||
|
<StickyProvider>
|
||||||
{children}
|
{children}
|
||||||
|
</StickyProvider>
|
||||||
</AnnouncerProvider>
|
</AnnouncerProvider>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</QueryParamProvider>
|
</QueryParamProvider>
|
||||||
|
Loading…
Reference in New Issue
Block a user