11import 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+
55import Editor from '../Editor' ;
66import { editorOptions } from '../Editor.fixtures' ;
77
@@ -14,50 +14,73 @@ const didMountStubs = () => ({
1414} ) ;
1515
1616const fixtures = {
17- ' renders editor' : editorOptions ,
17+ renders : editorOptions ,
1818} ;
1919
20+ const renderEditor = ( props = fixtures . renders ) => render ( < Editor { ...props } /> ) ;
21+
2022describe ( '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 ( / c l o s e d a n g e r a l e r t / 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