Skip to content

Commit 2fefd25

Browse files
author
Konstantinos Familonidis
committed
Fixes #36106: PF5 Refactor - EditorNavbar, EditorOption
Upgrade NavBar (Alert, Button), Options, Settings and remove enzyme in test, including DiffView.
1 parent bf88926 commit 2fefd25

File tree

17 files changed

+583
-988
lines changed

17 files changed

+583
-988
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', { class: '.diff.diff-unified'})
13+
14+
expect(table).toBeInTheDocument()
15+
})
16+
17+
it('render DiffView w/Patch', () => {
18+
render(<DiffView {...fixtures.patchMock} />)
19+
const table = screen.getByRole('table', { class: '.diff.diff-unified'})
20+
21+
expect(table).toBeInTheDocument()
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: 83 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import React from 'react';
2-
import { act } from '@testing-library/react';
2+
import { render, act, fireEvent } from '@testing-library/react';
3+
import { screen } from '@testing-library/dom'
4+
import '@testing-library/jest-dom/extend-expect';
5+
36
import { mount } from 'enzyme';
47
import { testComponentSnapshotsWithFixtures } from '../../../common/testHelpers';
58
import Editor from '../Editor';
@@ -14,50 +17,73 @@ const didMountStubs = () => ({
1417
});
1518

1619
const fixtures = {
17-
'renders editor': editorOptions,
20+
renders: editorOptions,
1821
};
1922

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

2546
describe('triggering', () => {
47+
const getTabById = id =>
48+
screen.getAllByRole('presentation', { current: "page" })
49+
.find(tab => tab.getAttribute('id') === id)
50+
2651
it('should trigger input view', async () => {
2752
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);
53+
renderEditor(props);
54+
await act(async () => jest.advanceTimersByTime(1));
55+
const inputTab = getTabById('input-navitem');
56+
57+
expect(inputTab).toBeInTheDocument();
58+
expect(inputTab).toHaveClass('pf-m-current');
59+
expect(inputTab).toHaveTextContent('Editor');
3660
});
3761
it('should trigger input view with no template', async () => {
3862
const props = {
3963
...editorOptions,
4064
...didMountStubs(),
4165
data: { ...editorOptions.data, template: null },
4266
};
43-
const component = mount(<Editor {...props} />);
44-
await act(async () => jest.advanceTimersByTime(1000));
45-
expect(component.props().template).toBe('<? />');
67+
renderEditor(props);
68+
await act(async () => jest.advanceTimersByTime(1));
69+
const aceEditors = document.querySelectorAll('.ace_editor_form');
70+
const hasTemplateText = Array.from(aceEditors).some(container => container.textContent.includes('<? />'));
71+
72+
expect(hasTemplateText).toBe(false);
4673
});
4774
it('should trigger diff view', async () => {
4875
const props = {
4976
...editorOptions,
5077
...didMountStubs(),
5178
selectedView: 'diff',
5279
};
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);
80+
renderEditor(props);
81+
await act(async () => jest.advanceTimersByTime(1));
82+
const diffTab = getTabById('diff-navitem');
83+
84+
expect(diffTab).toBeInTheDocument();
85+
expect(diffTab).toHaveClass('pf-m-current');
86+
expect(diffTab).toHaveTextContent('Changes');
6187
});
6288
it('should trigger preview view', async () => {
6389
const props = {
@@ -66,18 +92,20 @@ describe('Editor', () => {
6692
selectedView: 'preview',
6793
isRendering: true,
6894
};
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);
95+
renderEditor(props);
96+
const closeButton = screen.queryByLabelText(/close danger alert/i);
97+
98+
if (closeButton)
99+
await act(async () => {
100+
await fireEvent.click(closeButton);
101+
102+
jest.advanceTimersByTime(500);
103+
});
104+
await act(async () => jest.advanceTimersByTime(1));
105+
const previewTab = getTabById('preview-navitem');
106+
107+
expect(previewTab).toBeInTheDocument();
108+
expect(previewTab).toHaveClass('pf-m-current');
81109
});
82110
});
83111
it('should trigger hidden value editor', async () => {
@@ -88,20 +116,32 @@ describe('Editor', () => {
88116
isRendering: true,
89117
isMasked: true,
90118
};
91-
const wrapper = mount(<Editor {...props} />);
92-
await act(async () => jest.advanceTimersByTime(1000));
93-
expect(wrapper.find('.mask-editor').exists()).toBe(true);
119+
renderEditor(props);
120+
await act(async () => jest.advanceTimersByTime(1));
121+
const maskedEditor = document.querySelector('.mask-editor');
122+
123+
expect(maskedEditor).toBeInTheDocument();
94124
});
95125
it('textarea disappears if readOnly', async () => {
126+
const getTextAreasHidden = () => document.querySelectorAll('textarea.hidden')
96127
const props = {
97128
...editorOptions,
98129
...didMountStubs(),
99130
selectedView: 'input',
131+
readOnly: false,
100132
};
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);
133+
const { rerender } = renderEditor(props);
134+
await act(async () => jest.advanceTimersByTime(1));
135+
136+
expect(getTextAreasHidden().length).toBe(1);
137+
138+
const newProps = {
139+
...props,
140+
readOnly: true,
141+
};
142+
rerender(<Editor {...newProps} />);
143+
await act(async () => jest.advanceTimersByTime(1));
144+
145+
expect(getTextAreasHidden().length).toBe(0);
106146
});
107147
});

0 commit comments

Comments
 (0)