Skip to content

Commit a7def11

Browse files
author
Konstantinos Familonidis
committed
Fixes #36106: PF5 Refactor - EditorNavbar, EditorOption
Upgrade NavBar (Alert, Button), Options (RadioButton, View), Settings. Remove enzyme in tests including DiffView. Keep store integration tests.
1 parent bf88926 commit a7def11

23 files changed

+526
-1528
lines changed

webpack/assets/javascripts/react_app/common/IntegrationTestHelper.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import { mount } from 'enzyme';
3+
import { render } from '@testing-library/react';
34
import { Provider } from 'react-redux';
45
import { applyMiddleware, combineReducers, createStore } from 'redux';
56
import thunk from 'redux-thunk';
@@ -35,6 +36,15 @@ export default class IntegrationTestHelper {
3536
mount(component) {
3637
return mount(<Provider store={this.store}>{component}</Provider>);
3738
}
39+
40+
/**
41+
* Render a component with the store
42+
* @param {ReactNode} component A react node to render
43+
* @return {RTLRender} Rendered component with RTL and redux store
44+
*/
45+
render(component) {
46+
return render(<Provider store={this.store}>{component}</Provider>);
47+
}
3848
/**
3949
* Get the current state object
4050
* @return {Object} Current state

webpack/assets/javascripts/react_app/components/DiffView/Diff.fixtures.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export const patchMock = {
3030
};
3131

3232
export const fixtures = {
33-
'render DiffView w/oldText & newText': diffMock,
34-
'render DiffView w/Patch': patchMock,
33+
diffMock,
34+
patchMock,
3535
};
3636

3737
export const PF_SELECTED = 'pf-m-selected';
Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
1+
import React from 'react';
12
import { fixtures } from './Diff.fixtures';
2-
import { testComponentSnapshotsWithFixtures } from '../../common/testHelpers';
3+
import { render, screen } from '@testing-library/react';
4+
import '@testing-library/jest-dom/extend-expect';
35

46
import DiffView from './DiffView';
57

68
describe('DiffView', () => {
7-
describe('rendering', () =>
8-
testComponentSnapshotsWithFixtures(DiffView, fixtures));
9+
describe('rendering', () => {
10+
it('render DiffView w/oldText & newText', () => {
11+
render(<DiffView {...fixtures.diffMock} />)
12+
const table = screen.getByRole('table')
13+
14+
expect(table).toHaveClass("diff-split")
15+
})
16+
17+
it('render DiffView w/Patch', () => {
18+
render(<DiffView {...fixtures.patchMock} />)
19+
const table = screen.getByRole('table')
20+
21+
expect(table).toHaveClass("diff-unified")
22+
})
23+
})
924
});

webpack/assets/javascripts/react_app/components/DiffView/__snapshots__/DiffView.test.js.snap

Lines changed: 0 additions & 90 deletions
This file was deleted.
Lines changed: 82 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
2-
import { act } from '@testing-library/react';
3-
import { mount } from 'enzyme';
4-
import { testComponentSnapshotsWithFixtures } from '../../../common/testHelpers';
2+
import { render, screen, act, fireEvent } from '@testing-library/react';
3+
import '@testing-library/jest-dom/extend-expect';
4+
55
import Editor from '../Editor';
66
import { editorOptions } from '../Editor.fixtures';
77

@@ -14,50 +14,73 @@ const didMountStubs = () => ({
1414
});
1515

1616
const fixtures = {
17-
'renders editor': editorOptions,
17+
renders: editorOptions,
1818
};
1919

20+
const renderEditor = (props = fixtures.renders) => render(<Editor {...props} />);
21+
2022
describe('Editor', () => {
2123
jest.useFakeTimers();
22-
describe('rendering', () =>
23-
testComponentSnapshotsWithFixtures(Editor, fixtures));
24+
25+
describe('rendering', () => {
26+
const getAceEditors = () => screen.getAllByRole('textbox', { name: 'Cursor at row 1' })
27+
28+
it('renders', () => {
29+
renderEditor();
30+
31+
expect(screen.getByText('<? />')).toBeInTheDocument();
32+
expect(getAceEditors().length).toBe(2);
33+
});
34+
it('re-renders', () => {
35+
const { rerender } = renderEditor();
36+
const props = { ...editorOptions, ...didMountStubs() };
37+
rerender(<Editor {...props} />);
38+
39+
expect(getAceEditors().length).toBe(2);
40+
});
41+
});
2442

2543
describe('triggering', () => {
44+
const getTabById = id =>
45+
screen.getAllByRole('presentation', { current: "page" })
46+
.find(tab => tab.getAttribute('id') === id)
47+
2648
it('should trigger input view', async () => {
2749
const props = { ...editorOptions, ...didMountStubs() };
28-
const component = mount(<Editor {...props} />);
29-
await act(async () => jest.advanceTimersByTime(1000));
30-
expect(
31-
component
32-
.find('li[role="presentation"]')
33-
.at(0)
34-
.hasClass('active')
35-
).toBe(true);
50+
renderEditor(props);
51+
await act(async () => jest.advanceTimersByTime(1));
52+
const inputTab = getTabById('input-navitem');
53+
54+
expect(inputTab).toBeInTheDocument();
55+
expect(inputTab).toHaveClass('pf-m-current');
56+
expect(inputTab).toHaveTextContent('Editor');
3657
});
3758
it('should trigger input view with no template', async () => {
3859
const props = {
3960
...editorOptions,
4061
...didMountStubs(),
4162
data: { ...editorOptions.data, template: null },
4263
};
43-
const component = mount(<Editor {...props} />);
44-
await act(async () => jest.advanceTimersByTime(1000));
45-
expect(component.props().template).toBe('<? />');
64+
renderEditor(props);
65+
await act(async () => jest.advanceTimersByTime(1));
66+
const aceEditors = document.querySelectorAll('.ace_editor_form');
67+
const hasTemplateText = Array.from(aceEditors).some(container => container.textContent.includes('<? />'));
68+
69+
expect(hasTemplateText).toBe(false);
4670
});
4771
it('should trigger diff view', async () => {
4872
const props = {
4973
...editorOptions,
5074
...didMountStubs(),
5175
selectedView: 'diff',
5276
};
53-
const component = mount(<Editor {...props} />);
54-
await act(async () => jest.advanceTimersByTime(1000));
55-
expect(
56-
component
57-
.find('li[role="presentation"]')
58-
.at(1)
59-
.hasClass('active')
60-
).toBe(true);
77+
renderEditor(props);
78+
await act(async () => jest.advanceTimersByTime(1));
79+
const diffTab = getTabById('diff-navitem');
80+
81+
expect(diffTab).toBeInTheDocument();
82+
expect(diffTab).toHaveClass('pf-m-current');
83+
expect(diffTab).toHaveTextContent('Changes');
6184
});
6285
it('should trigger preview view', async () => {
6386
const props = {
@@ -66,18 +89,20 @@ describe('Editor', () => {
6689
selectedView: 'preview',
6790
isRendering: true,
6891
};
69-
const wrapper = mount(<Editor {...props} />);
70-
wrapper.find('button.close').simulate('click');
71-
await act(async () => jest.advanceTimersByTime(1000));
72-
const component = mount(<Editor {...props} />);
73-
await act(async () => jest.advanceTimersByTime(1000));
74-
75-
expect(
76-
component
77-
.find('li[role="presentation"]')
78-
.at(2)
79-
.hasClass('active')
80-
).toBe(true);
92+
renderEditor(props);
93+
const closeButton = screen.queryByLabelText(/close danger alert/i);
94+
95+
if (closeButton)
96+
await act(async () => {
97+
await fireEvent.click(closeButton);
98+
99+
jest.advanceTimersByTime(500);
100+
});
101+
await act(async () => jest.advanceTimersByTime(1));
102+
const previewTab = getTabById('preview-navitem');
103+
104+
expect(previewTab).toBeInTheDocument();
105+
expect(previewTab).toHaveClass('pf-m-current');
81106
});
82107
});
83108
it('should trigger hidden value editor', async () => {
@@ -88,20 +113,32 @@ describe('Editor', () => {
88113
isRendering: true,
89114
isMasked: true,
90115
};
91-
const wrapper = mount(<Editor {...props} />);
92-
await act(async () => jest.advanceTimersByTime(1000));
93-
expect(wrapper.find('.mask-editor').exists()).toBe(true);
116+
renderEditor(props);
117+
await act(async () => jest.advanceTimersByTime(1));
118+
const maskedEditor = document.querySelector('.mask-editor');
119+
120+
expect(maskedEditor).toBeInTheDocument();
94121
});
95122
it('textarea disappears if readOnly', async () => {
123+
const getTextAreasHidden = () => document.querySelectorAll('textarea.hidden')
96124
const props = {
97125
...editorOptions,
98126
...didMountStubs(),
99127
selectedView: 'input',
128+
readOnly: false,
100129
};
101-
const wrapper = mount(<Editor {...props} />);
102-
await act(async () => jest.advanceTimersByTime(1000));
103-
expect(wrapper.find('textarea.hidden').exists()).toBe(true);
104-
wrapper.setProps({ readOnly: true });
105-
expect(wrapper.find('textarea.hidden').exists()).toBe(false);
130+
const { rerender } = renderEditor(props);
131+
await act(async () => jest.advanceTimersByTime(1));
132+
133+
expect(getTextAreasHidden().length).toBe(1);
134+
135+
const newProps = {
136+
...props,
137+
readOnly: true,
138+
};
139+
rerender(<Editor {...newProps} />);
140+
await act(async () => jest.advanceTimersByTime(1));
141+
142+
expect(getTextAreasHidden().length).toBe(0);
106143
});
107144
});

0 commit comments

Comments
 (0)