11import 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+
36import { mount } from 'enzyme' ;
47import { testComponentSnapshotsWithFixtures } from '../../../common/testHelpers' ;
58import Editor from '../Editor' ;
@@ -14,50 +17,73 @@ const didMountStubs = () => ({
1417} ) ;
1518
1619const fixtures = {
17- ' renders editor' : editorOptions ,
20+ renders : editorOptions ,
1821} ;
1922
23+ const renderEditor = ( props = fixtures . renders ) => render ( < Editor { ...props } /> ) ;
24+
2025describe ( '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 ( / c l o s e d a n g e r a l e r t / 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