Skip to content

Commit 3079d7f

Browse files
committed
Split variant analysis header component
1 parent 1b0077a commit 3079d7f

File tree

7 files changed

+172
-56
lines changed

7 files changed

+172
-56
lines changed

extensions/ql-vscode/package-lock.json

Lines changed: 36 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/ql-vscode/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,7 @@
12521252
"@storybook/testing-library": "^0.0.13",
12531253
"@testing-library/jest-dom": "^5.16.5",
12541254
"@testing-library/react": "^12.1.5",
1255+
"@testing-library/user-event": "^14.4.3",
12551256
"@types/chai": "^4.1.7",
12561257
"@types/chai-as-promised": "~7.1.2",
12571258
"@types/child-process-promise": "^2.2.1",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as React from 'react';
2+
import styled from 'styled-components';
3+
import ViewTitle from '../remote-queries/ViewTitle';
4+
import { LinkIconButton } from './LinkIconButton';
5+
6+
type Props = {
7+
queryName: string;
8+
queryFileName: string;
9+
10+
onOpenQueryFileClick: () => void;
11+
onViewQueryTextClick: () => void;
12+
};
13+
14+
const Container = styled.div`
15+
max-width: 100%;
16+
`;
17+
18+
const QueryActions = styled.div`
19+
display: flex;
20+
gap: 1em;
21+
`;
22+
23+
export const QueryDetails = ({
24+
queryName,
25+
queryFileName,
26+
onOpenQueryFileClick,
27+
onViewQueryTextClick,
28+
}: Props) => {
29+
return (
30+
<Container>
31+
<ViewTitle>{queryName}</ViewTitle>
32+
<QueryActions>
33+
<LinkIconButton onClick={onOpenQueryFileClick}>
34+
<span slot="start" className="codicon codicon-file-code"></span>
35+
{queryFileName}
36+
</LinkIconButton>
37+
<LinkIconButton onClick={onViewQueryTextClick}>
38+
<span slot="start" className="codicon codicon-code"></span>
39+
View query
40+
</LinkIconButton>
41+
</QueryActions>
42+
</Container>
43+
);
44+
};

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisHeaderActions.tsx renamed to extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisActions.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import styled from 'styled-components';
33
import { VSCodeButton } from '@vscode/webview-ui-toolkit/react';
44
import { VariantAnalysisStatus } from '../../remote-queries/shared/variant-analysis';
55

6-
export type Props = {
6+
type Props = {
77
variantAnalysisStatus: VariantAnalysisStatus;
88

99
onStopQueryClick: () => void;
@@ -22,7 +22,7 @@ const Button = styled(VSCodeButton)`
2222
white-space: nowrap;
2323
`;
2424

25-
export const VariantAnalysisHeaderActions = ({
25+
export const VariantAnalysisActions = ({
2626
variantAnalysisStatus,
2727
onStopQueryClick,
2828
onCopyRepositoryListClick,
@@ -31,9 +31,9 @@ export const VariantAnalysisHeaderActions = ({
3131
return (
3232
<Container>
3333
{variantAnalysisStatus === VariantAnalysisStatus.InProgress && (
34-
<VSCodeButton appearance="secondary" onClick={onStopQueryClick}>
34+
<Button appearance="secondary" onClick={onStopQueryClick}>
3535
Stop query
36-
</VSCodeButton>
36+
</Button>
3737
)}
3838
{variantAnalysisStatus === VariantAnalysisStatus.Succeeded && (
3939
<>

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisHeader.tsx

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import * as React from 'react';
22
import styled from 'styled-components';
33
import { VariantAnalysisStatus } from '../../remote-queries/shared/variant-analysis';
4-
import ViewTitle from '../remote-queries/ViewTitle';
5-
import { LinkIconButton } from './LinkIconButton';
6-
import { VariantAnalysisHeaderActions } from './VariantAnalysisHeaderActions';
4+
import { QueryDetails } from './QueryDetails';
5+
import { VariantAnalysisActions } from './VariantAnalysisActions';
76

87
export type VariantAnalysisHeaderProps = {
98
queryName: string;
@@ -24,15 +23,6 @@ const Container = styled.div`
2423
align-items: center;
2524
`;
2625

27-
const QueryDetails = styled.div`
28-
max-width: 100%;
29-
`;
30-
31-
const QueryActions = styled.div`
32-
display: flex;
33-
gap: 1em;
34-
`;
35-
3626
export const VariantAnalysisHeader = ({
3727
queryName,
3828
queryFileName,
@@ -45,20 +35,13 @@ export const VariantAnalysisHeader = ({
4535
}: VariantAnalysisHeaderProps) => {
4636
return (
4737
<Container>
48-
<QueryDetails>
49-
<ViewTitle>{queryName}</ViewTitle>
50-
<QueryActions>
51-
<LinkIconButton onClick={onOpenQueryFileClick}>
52-
<span slot="start" className="codicon codicon-file-code"></span>
53-
{queryFileName}
54-
</LinkIconButton>
55-
<LinkIconButton onClick={onViewQueryTextClick}>
56-
<span slot="start" className="codicon codicon-code"></span>
57-
View query
58-
</LinkIconButton>
59-
</QueryActions>
60-
</QueryDetails>
61-
<VariantAnalysisHeaderActions
38+
<QueryDetails
39+
queryName={queryName}
40+
queryFileName={queryFileName}
41+
onOpenQueryFileClick={onOpenQueryFileClick}
42+
onViewQueryTextClick={onViewQueryTextClick}
43+
/>
44+
<VariantAnalysisActions
6245
variantAnalysisStatus={variantAnalysisStatus}
6346
onStopQueryClick={onStopQueryClick}
6447
onCopyRepositoryListClick={onCopyRepositoryListClick}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import * as React from 'react';
2+
import { render as reactRender, screen } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import { VariantAnalysisStatus } from '../../../remote-queries/shared/variant-analysis';
5+
import { VariantAnalysisActions } from '../VariantAnalysisActions';
6+
7+
describe(VariantAnalysisActions.name, () => {
8+
const onStopQueryClick = jest.fn();
9+
const onCopyRepositoryListClick = jest.fn();
10+
const onExportResultsClick = jest.fn();
11+
12+
afterEach(() => {
13+
onStopQueryClick.mockReset();
14+
onCopyRepositoryListClick.mockReset();
15+
onExportResultsClick.mockReset();
16+
});
17+
18+
const render = (variantAnalysisStatus: VariantAnalysisStatus) =>
19+
reactRender(
20+
<VariantAnalysisActions
21+
variantAnalysisStatus={variantAnalysisStatus}
22+
onStopQueryClick={onStopQueryClick}
23+
onCopyRepositoryListClick={onCopyRepositoryListClick}
24+
onExportResultsClick={onExportResultsClick}
25+
/>
26+
);
27+
28+
it('renders 1 button when in progress', async () => {
29+
const { container } = render(VariantAnalysisStatus.InProgress);
30+
31+
expect(container.querySelectorAll('vscode-button').length).toEqual(1);
32+
});
33+
34+
it('renders the stop query button when in progress', async () => {
35+
render(VariantAnalysisStatus.InProgress);
36+
37+
await userEvent.click(screen.getByText('Stop query'));
38+
expect(onStopQueryClick).toHaveBeenCalledTimes(1);
39+
});
40+
41+
it('renders 2 buttons when succeeded', async () => {
42+
const { container } = render(VariantAnalysisStatus.Succeeded);
43+
44+
expect(container.querySelectorAll('vscode-button').length).toEqual(2);
45+
});
46+
47+
it('renders the copy repository list button when succeeded', async () => {
48+
render(VariantAnalysisStatus.Succeeded);
49+
50+
await userEvent.click(screen.getByText('Copy repository list'));
51+
expect(onCopyRepositoryListClick).toHaveBeenCalledTimes(1);
52+
});
53+
54+
it('renders the export results button when succeeded', async () => {
55+
render(VariantAnalysisStatus.Succeeded);
56+
57+
await userEvent.click(screen.getByText('Export results'));
58+
expect(onExportResultsClick).toHaveBeenCalledTimes(1);
59+
});
60+
61+
it('does not render any buttons when failed', () => {
62+
const { container } = render(VariantAnalysisStatus.Failed);
63+
64+
expect(container.querySelectorAll('vscode-button').length).toEqual(0);
65+
});
66+
});

extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisHeader.spec.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as React from 'react';
22
import { VariantAnalysisHeader, VariantAnalysisHeaderProps } from '../VariantAnalysisHeader';
33
import { render as reactRender, screen } from '@testing-library/react';
4+
import userEvent from '@testing-library/user-event';
45
import { VariantAnalysisStatus } from '../../../remote-queries/shared/variant-analysis';
5-
import { userEvent } from '@storybook/testing-library';
66

77
describe(VariantAnalysisHeader.name, () => {
88
const onOpenQueryFileClick = jest.fn();
@@ -40,42 +40,42 @@ describe(VariantAnalysisHeader.name, () => {
4040
expect(screen.getByText('Query name')).toBeInTheDocument();
4141
});
4242

43-
it('renders the query file name as a button', () => {
43+
it('renders the query file name as a button', async () => {
4444
render();
4545

46-
userEvent.click(screen.getByText('example.ql'));
46+
await userEvent.click(screen.getByText('example.ql'));
4747
expect(onOpenQueryFileClick).toHaveBeenCalledTimes(1);
4848
});
4949

50-
it('renders a view query button', () => {
50+
it('renders a view query button', async () => {
5151
render();
5252

53-
userEvent.click(screen.getByText('View query'));
53+
await userEvent.click(screen.getByText('View query'));
5454
expect(onViewQueryTextClick).toHaveBeenCalledTimes(1);
5555
});
5656

57-
it('renders the stop query button when in progress', () => {
57+
it('renders the stop query button when in progress', async () => {
5858
render({ variantAnalysisStatus: VariantAnalysisStatus.InProgress });
5959

60-
userEvent.click(screen.getByText('Stop query'));
60+
await userEvent.click(screen.getByText('Stop query'));
6161
expect(onStopQueryClick).toHaveBeenCalledTimes(1);
6262
});
6363

64-
it('renders the copy repository list button when succeeded', () => {
64+
it('renders the copy repository list button when succeeded', async () => {
6565
render({ variantAnalysisStatus: VariantAnalysisStatus.Succeeded });
6666

67-
userEvent.click(screen.getByText('Copy repository list'));
67+
await userEvent.click(screen.getByText('Copy repository list'));
6868
expect(onCopyRepositoryListClick).toHaveBeenCalledTimes(1);
6969
});
7070

71-
it('renders the export results button when succeeded', () => {
71+
it('renders the export results button when succeeded', async () => {
7272
render({ variantAnalysisStatus: VariantAnalysisStatus.Succeeded });
7373

74-
userEvent.click(screen.getByText('Export results'));
74+
await userEvent.click(screen.getByText('Export results'));
7575
expect(onExportResultsClick).toHaveBeenCalledTimes(1);
7676
});
7777

78-
it('does not render any buttons when failed', () => {
78+
it('does not render any buttons when failed', async () => {
7979
const { container } = render({ variantAnalysisStatus: VariantAnalysisStatus.Failed });
8080

8181
expect(container.querySelectorAll('vscode-button').length).toEqual(0);

0 commit comments

Comments
 (0)