Skip to content

Commit 83f8989

Browse files
committed
editor tests
1 parent 6ffd631 commit 83f8989

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

src/editor.test.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { getBackendSrv } from '@grafana/runtime';
2+
import { Button, Collapse, Field } from '@grafana/ui';
3+
import { mount, shallow } from 'enzyme';
4+
import React from 'react';
5+
import { Editor, EditorProps } from './editor';
6+
jest.mock('@grafana/runtime');
7+
8+
describe('editor', () => {
9+
test('add button', () => {
10+
const mockOnChange = jest.fn();
11+
const props: EditorProps = {
12+
buttons: [],
13+
onChange: mockOnChange,
14+
};
15+
const wrapper = shallow(<Editor {...props} />);
16+
expect(wrapper.find(Collapse)).toHaveLength(0);
17+
const field = wrapper.find(Field);
18+
expect(field).toHaveLength(1);
19+
expect(field.children).toHaveLength(1);
20+
const button = field.find(Button);
21+
expect(button).toHaveLength(1);
22+
expect(button.prop('variant')).toBe('secondary');
23+
expect(button.text()).toBe('Add Button');
24+
expect(button.prop('icon')).toBe('plus');
25+
expect(button.prop('size')).toBe('sm');
26+
button.simulate('click');
27+
expect(mockOnChange).toHaveBeenCalledWith([
28+
{ text: '', datasource: '', query: '' },
29+
]);
30+
});
31+
32+
test('button collapse', () => {
33+
const mockOnChange = jest.fn();
34+
const props: EditorProps = {
35+
buttons: [{ text: 'a' }, { text: 'b' }],
36+
onChange: mockOnChange,
37+
};
38+
39+
const mockGet = jest.fn().mockReturnValue([{ name: 'a' }]);
40+
getBackendSrv.mockImplementation(() => ({ get: mockGet }));
41+
42+
const wrapper = mount(<Editor {...props} />);
43+
expect(wrapper.children()).toHaveLength(3);
44+
const collapse = wrapper.find(Collapse);
45+
expect(collapse).toHaveLength(2);
46+
47+
collapse.forEach((c, i) => {
48+
expect(c.key()).toBe(i.toString());
49+
expect(c.prop('label')).toBe('Button ' + (i + 1).toString());
50+
expect(c.prop('collapsible')).toBeTruthy();
51+
expect(c.prop('isOpen')).toBeFalsy();
52+
// c.simulate('toggle');
53+
// expect(c.prop('isOpen')).toBeTruthy();
54+
});
55+
});
56+
});

src/editor.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ import {
1212
import React from 'react';
1313
import { ButtonOptions, Options } from 'types';
1414

15-
interface EditorProps {
15+
export interface EditorProps {
1616
buttons: ButtonOptions[];
1717
onChange: (buttons: ButtonOptions[]) => void;
1818
}
1919

20-
const Editor: React.FC<EditorProps> = ({ buttons, onChange }) => {
20+
export const Editor: React.FC<EditorProps> = ({ buttons, onChange }) => {
2121
const [elems, setElems] = React.useState<SelectableValue<string>[]>();
22-
const [isOpen, setOpen] = React.useState<boolean[]>([true]);
22+
const [isOpen, setOpen] = React.useState<boolean[]>(buttons.map(e => false));
2323
React.useEffect(() => {
2424
let cancel = false;
2525
const fetchData = async () => {
@@ -53,12 +53,19 @@ const Editor: React.FC<EditorProps> = ({ buttons, onChange }) => {
5353
<React.Fragment>
5454
{buttons.map((b: ButtonOptions, i: number) => (
5555
<Collapse
56+
key={i}
5657
label={'Button ' + (i + 1).toString()}
5758
isOpen={isOpen[i]}
5859
collapsible
59-
onToggle={() =>
60-
setOpen([...isOpen.slice(0, i), !isOpen[i], ...isOpen.slice(i + 1)])
61-
}
60+
onToggle={() => {
61+
console.log('before', isOpen[i], i);
62+
setOpen([
63+
...isOpen.slice(0, i),
64+
!isOpen[i],
65+
...isOpen.slice(i + 1),
66+
]);
67+
console.log('after', isOpen[i], i);
68+
}}
6269
>
6370
<Field label="Text" description="Text to be displayed on the button">
6471
<Input

0 commit comments

Comments
 (0)