@@ -23,16 +23,21 @@ const ctx = new Ctx({
2323 * render the app
2424 * @param {boolean } snapshot - if true then returns the element
2525 * @param {Object } props - {ctx,openTabIDs,selectedTabID}
26- * @param {Object } ins - ref.current
26+ * @param {Object } insProperties - ref.current
2727 * @param {Object } deps - { resizeDetectorIns, getInstance:(ctx, setHiddenTabIDs) => ins }
28+ * @param {Object } props2 - {ctx,openTabIDs,selectedTabID}
2829 */
2930let renderApp ;
3031beforeAll ( ( ) => {
3132 document . body . appendChild ( container ) ;
3233} ) ;
3334beforeEach ( ( ) => {
34- renderApp = ( snapshot , props = { } , api = { } , deps = { } ) => {
35- props . ins = props . ins || { } ;
35+ renderApp = ( snapshot , props , insProperties = { } , deps = { } , props2 ) => {
36+ props = props || {
37+ ctx,
38+ openTabIDs : [ '1' , '2' ] ,
39+ selectedTabID : '1' ,
40+ } ;
3641 const getInstance =
3742 deps . getInstance ||
3843 function ( ctx , setHiddenTabIDs ) {
@@ -45,7 +50,7 @@ beforeEach(() => {
4550 } ,
4651 ctx,
4752 } ) ,
48- api ,
53+ insProperties ,
4954 ) ;
5055 } ;
5156 const resizeDetectorIns = deps . resizeDetectorIns || { } ;
@@ -55,6 +60,7 @@ beforeEach(() => {
5560 }
5661 return act ( ( ) => {
5762 render ( < ShowMoreButton { ...props } > </ ShowMoreButton > , container ) ;
63+ props2 && render ( < ShowMoreButton { ...props2 } > </ ShowMoreButton > , container ) ;
5864 } ) ;
5965 } ;
6066} ) ;
@@ -73,7 +79,7 @@ describe('BUTTON CONTAINER STRUCTURE : ', () => {
7379 true ,
7480 { openTabIDs : [ '1' , '2' ] , selectedTabID : '1' , ctx} ,
7581 {
76- setEls : ( ) => { } ,
82+ setResizer : ( ) => { } ,
7783 installResizer : ( ) => { } ,
7884 uninstallResizer : ( ) => { } ,
7985 resize : ( ) => { } ,
@@ -90,7 +96,7 @@ describe('resize method should be called when tabs are changed : ', () => {
9096 false ,
9197 { openTabIDs : [ '1' , '2' ] , selectedTabID : '1' , ctx} ,
9298 {
93- setEls : ( ) => { } ,
99+ setResizer : ( ) => { } ,
94100 installResizer : ( ) => { } ,
95101 uninstallResizer : ( ) => { } ,
96102 resize,
@@ -101,129 +107,226 @@ describe('resize method should be called when tabs are changed : ', () => {
101107 test ( 'resize method should not be called when refreshing tabs.' , ( ) => {
102108 const resize = jest . fn ( ( ) => { } ) ;
103109 renderApp (
110+ false ,
104111 {
105- onLoad : function ( ) {
106- this . refresh ( ) ;
107- } ,
112+ openTabIDs : [ '1' , '2' ] ,
113+ selectedTabID : '1' ,
114+ ctx,
115+ } ,
116+ {
117+ setResizer : ( ) => { } ,
118+ installResizer : ( ) => { } ,
119+ uninstallResizer : ( ) => { } ,
120+ resize,
108121 } ,
109122 undefined ,
110- undefined ,
111- { resize} ,
123+ {
124+ openTabIDs : [ '1' , '2' ] ,
125+ selectedTabID : '1' ,
126+ ctx,
127+ } ,
112128 ) ;
113129 expect ( resize . mock . calls . length ) . toBe ( 1 ) ;
114130 } ) ;
115131 test ( 'resize method should be called when switching tabs.' , ( ) => {
116132 const resize = jest . fn ( ( ) => { } ) ;
117133 renderApp (
134+ false ,
118135 {
119- onLoad : function ( ) {
120- this . select ( '2' ) ;
121- } ,
136+ openTabIDs : [ '1' , '2' ] ,
137+ selectedTabID : '1' ,
138+ ctx,
139+ } ,
140+ {
141+ setResizer : ( ) => { } ,
142+ installResizer : ( ) => { } ,
143+ uninstallResizer : ( ) => { } ,
144+ resize,
122145 } ,
123146 undefined ,
124- undefined ,
125- { resize} ,
147+ {
148+ openTabIDs : [ '1' , '2' ] ,
149+ selectedTabID : '2' ,
150+ ctx,
151+ } ,
126152 ) ;
127153 expect ( resize . mock . calls . length ) . toBe ( 2 ) ;
128154 } ) ;
129155 test ( 'resize method should be called when opening a new tab.' , ( ) => {
130156 const resize = jest . fn ( ( ) => { } ) ;
131157 renderApp (
158+ false ,
132159 {
133- onLoad : function ( ) {
134- this . open ( { id : '3' } ) ;
135- } ,
160+ openTabIDs : [ '1' , '2' ] ,
161+ selectedTabID : '1' ,
162+ ctx,
163+ } ,
164+ {
165+ setResizer : ( ) => { } ,
166+ installResizer : ( ) => { } ,
167+ uninstallResizer : ( ) => { } ,
168+ resize,
136169 } ,
137170 undefined ,
138- undefined ,
139- { resize} ,
171+ {
172+ openTabIDs : [ '1' , '2' , '3' ] ,
173+ selectedTabID : '1' ,
174+ ctx,
175+ } ,
140176 ) ;
141177 expect ( resize . mock . calls . length ) . toBe ( 2 ) ;
142178 } ) ;
143179 test ( 'resize method should be called when closing a tab.' , ( ) => {
144180 const resize = jest . fn ( ( ) => { } ) ;
145- let ready ;
146181 renderApp (
147- { } ,
182+ false ,
183+ {
184+ openTabIDs : [ '1' , '2' ] ,
185+ selectedTabID : '1' ,
186+ ctx,
187+ } ,
188+ {
189+ setResizer : ( ) => { } ,
190+ installResizer : ( ) => { } ,
191+ uninstallResizer : ( ) => { } ,
192+ resize,
193+ } ,
148194 undefined ,
149- ( _ready ) => {
150- ready = _ready ;
195+ {
196+ openTabIDs : [ '1' ] ,
197+ selectedTabID : '1' ,
198+ ctx,
151199 } ,
152- { resize} ,
153200 ) ;
154- act ( ( ) => {
155- let ins ;
156- ready ( ( _ins ) => {
157- ins = _ins ;
158- } ) ;
159- ins . close ( '2' , false ) ;
160- } ) ;
161201 expect ( resize . mock . calls . length ) . toBe ( 2 ) ;
162202 } ) ;
163203 test ( 'resize method should be called when sorting tabs.' , ( ) => {
164204 const resize = jest . fn ( ( ) => { } ) ;
165- let ready ;
166205 renderApp (
167- { } ,
206+ false ,
207+ {
208+ openTabIDs : [ '1' , '2' ] ,
209+ selectedTabID : '1' ,
210+ ctx,
211+ } ,
212+ {
213+ setResizer : ( ) => { } ,
214+ installResizer : ( ) => { } ,
215+ uninstallResizer : ( ) => { } ,
216+ resize,
217+ } ,
168218 undefined ,
169- ( _ready ) => {
170- ready = _ready ;
219+ {
220+ openTabIDs : [ '2' , '1' ] ,
221+ selectedTabID : '1' ,
222+ ctx,
171223 } ,
172- { resize} ,
173224 ) ;
174- act ( ( ) => {
175- let ins ;
176- ready ( ( _ins ) => {
177- ins = _ins ;
178- } ) ;
179- ins . sort ( [ '2' , '1' ] ) ;
180- } ) ;
181225 expect ( resize . mock . calls . length ) . toBe ( 2 ) ;
182226 } ) ;
183227} ) ;
184228describe ( 'resize detector should be called correctly : ' , ( ) => {
185- test ( 'installResizer method should be called at mount.' , ( ) => {
229+ test ( 'installResizer and uninstallResizer methods should be called at mount.' , ( ) => {
186230 const installResizer = jest . fn ( ( ) => { } ) ;
187- renderApp ( { } , undefined , undefined , { installResizer} ) ;
188- expect ( installResizer . mock . calls . length ) . toBe ( 1 ) ;
189- } ) ;
190- test ( 'uninstallResizer method should be called at unmount.' , ( ) => {
191231 const uninstallResizer = jest . fn ( ( ) => { } ) ;
192- renderApp ( { } , undefined , undefined , { uninstallResizer} ) ;
193- expect ( uninstallResizer . mock . calls . length ) . toBe ( 0 ) ;
232+ renderApp ( false , undefined , {
233+ setResizer : ( ) => { } ,
234+ installResizer,
235+ uninstallResizer,
236+ resize : ( ) => { } ,
237+ } ) ;
238+ expect ( installResizer . mock . calls . length ) . toBe ( 1 ) ;
194239 act ( ( ) => {
195240 unmountComponentAtNode ( container ) ;
196241 } ) ;
197242 expect ( uninstallResizer . mock . calls . length ) . toBe ( 1 ) ;
198243 } ) ;
199244} ) ;
200245describe ( 'button component : ' , ( ) => {
201- test ( 'default button component should be rendered when moreButtonPlugin_buttonComponent option is not provided' , ( ) => {
202- renderApp ( { } ) ;
203- expect ( document . getElementById ( 'built-in-button' ) != null ) . toBe ( true ) ;
204- } ) ;
205- test ( 'user button component should be rendered when moreButtonPlugin_buttonComponent option is provided' , ( ) => {
206- renderApp ( { moreButtonPlugin_buttonComponent : ( ) => < button id = "user-button" /> } ) ;
207- expect ( document . getElementById ( 'built-in-button' ) != null ) . toBe ( false ) ;
208- expect ( document . getElementById ( 'user-button' ) != null ) . toBe ( true ) ;
246+ test ( 'button component should render moreButtonPlugin_buttonComponent option as a button' , ( ) => {
247+ renderApp (
248+ false ,
249+ {
250+ openTabIDs : [ '1' , '2' ] ,
251+ selectedTabID : '1' ,
252+ ctx,
253+ } ,
254+ {
255+ setResizer : ( ) => { } ,
256+ installResizer : ( ) => { } ,
257+ uninstallResizer : ( ) => { } ,
258+ resize : ( ) => { } ,
259+ } ,
260+ ) ;
261+ expect ( document . getElementById ( 'user-more-button' ) == null ) . toBe ( true ) ;
262+ const moreButtonPlugin_buttonComponent = ctx . getOption ( 'moreButtonPlugin_buttonComponent' ) ;
263+ ctx . setOption ( 'moreButtonPlugin_buttonComponent' , ( props ) => (
264+ < div { ...props } id = "user-more-button" >
265+ { props . children }
266+ </ div >
267+ ) ) ;
268+ renderApp (
269+ false ,
270+ {
271+ openTabIDs : [ '1' , '2' ] ,
272+ selectedTabID : '1' ,
273+ ctx,
274+ } ,
275+ {
276+ setResizer : ( ) => { } ,
277+ installResizer : ( ) => { } ,
278+ uninstallResizer : ( ) => { } ,
279+ resize : ( ) => { } ,
280+ } ,
281+ ) ;
282+ expect ( document . getElementById ( 'user-more-button' ) == null ) . toBe ( false ) ;
283+ ctx . setOption ( 'moreButtonPlugin_buttonComponent' , moreButtonPlugin_buttonComponent ) ;
209284 } ) ;
210285 test ( 'moreButtonPlugin_buttonComponent option should be a function component and not a React element' , ( ) => {
211- renderApp ( { moreButtonPlugin_buttonComponent : ( ) => < button id = "user-button" /> } ) ;
212- expect ( document . getElementById ( 'user-button' ) != null ) . toBe ( true ) ;
213- renderApp ( { moreButtonPlugin_buttonComponent : < button id = "user-button-element" /> } ) ;
214- expect ( document . getElementById ( 'user-button-element' ) != null ) . toBe ( false ) ;
215- expect ( document . getElementById ( 'built-in-button' ) != null ) . toBe ( true ) ;
286+ const moreButtonPlugin_buttonComponent = ctx . getOption ( 'moreButtonPlugin_buttonComponent' ) ;
287+ ctx . setOption ( 'moreButtonPlugin_buttonComponent' , < div id = "user-more-button" > </ div > ) ;
288+ try {
289+ renderApp (
290+ false ,
291+ {
292+ openTabIDs : [ '1' , '2' ] ,
293+ selectedTabID : '1' ,
294+ ctx,
295+ } ,
296+ {
297+ setResizer : ( ) => { } ,
298+ installResizer : ( ) => { } ,
299+ uninstallResizer : ( ) => { } ,
300+ resize : ( ) => { } ,
301+ } ,
302+ ) ;
303+ } catch ( e ) {
304+ expect ( document . getElementById ( 'user-more-button' ) == null ) . toBe ( true ) ;
305+ }
306+ ctx . setOption ( 'moreButtonPlugin_buttonComponent' , moreButtonPlugin_buttonComponent ) ;
216307 } ) ;
217308} ) ;
218309describe ( 'mounting : ' , ( ) => {
219- test ( 'at first the setEls method should be called then installResizer and then resize method' , ( ) => {
310+ test ( 'at first the setResizer method should be called then installResizer and then resize method' , ( ) => {
220311 const installResizer = jest . fn ( ( ) => { } ) ;
221312 const resize = jest . fn ( ( ) => { } ) ;
222- const setEls = jest . fn ( ( ) => { } ) ;
223- const api = { installResizer, resize, setEls} ;
224- renderApp ( { } , null , ( ins ) => { } , api ) ;
225- expect ( api . setEls ) . toHaveBeenCalledBefore ( api . installResizer ) ;
226- expect ( api . installResizer ) . toHaveBeenCalledBefore ( api . resize ) ;
227- expect ( api . resize . mock . calls . length ) . toBe ( 1 ) ;
313+ const setResizer = jest . fn ( ( ) => { } ) ;
314+ renderApp (
315+ false ,
316+ {
317+ openTabIDs : [ '1' , '2' ] ,
318+ selectedTabID : '1' ,
319+ ctx,
320+ } ,
321+ {
322+ setResizer,
323+ installResizer,
324+ uninstallResizer : ( ) => { } ,
325+ resize,
326+ } ,
327+ ) ;
328+ expect ( setResizer ) . toHaveBeenCalledBefore ( installResizer ) ;
329+ expect ( installResizer ) . toHaveBeenCalledBefore ( resize ) ;
330+ expect ( resize . mock . calls . length ) . toBe ( 1 ) ;
228331 } ) ;
229332} ) ;
0 commit comments