@@ -178,6 +178,86 @@ describe('collapse', () => {
178178 } ) ;
179179 } ) ;
180180
181+ describe ( 'collapse collapsible' , ( ) => {
182+ let fixture : ComponentFixture < NzTestCollapseCollapsibleComponent > ;
183+ let panel : DebugElement ;
184+
185+ beforeEach ( ( ) => {
186+ fixture = TestBed . createComponent ( NzTestCollapseCollapsibleComponent ) ;
187+ fixture . detectChanges ( ) ;
188+ panel = fixture . debugElement . query ( By . directive ( NzCollapsePanelComponent ) ) ;
189+ } ) ;
190+
191+ it ( 'should only toggle by icon when nzCollapsible is "icon"' , ( ) => {
192+ const headerEl = panel . nativeElement . querySelector ( '.ant-collapse-header' ) as HTMLElement ;
193+ expect ( headerEl . classList ) . toContain ( 'ant-collapse-icon-collapsible-only' ) ;
194+ // initial state
195+ expect ( panel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
196+
197+ // click header text should NOT toggle
198+ ( panel . nativeElement . querySelector ( '.ant-collapse-header-text' ) as HTMLElement ) . click ( ) ;
199+ fixture . detectChanges ( ) ;
200+ expect ( panel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
201+
202+ // click icon should toggle open
203+ ( panel . nativeElement . querySelector ( '.ant-collapse-expand-icon' ) as HTMLElement ) . click ( ) ;
204+ fixture . detectChanges ( ) ;
205+ expect ( panel . nativeElement . classList ) . toContain ( 'ant-collapse-item-active' ) ;
206+
207+ // click header text again should NOT toggle
208+ ( panel . nativeElement . querySelector ( '.ant-collapse-header-text' ) as HTMLElement ) . click ( ) ;
209+ fixture . detectChanges ( ) ;
210+ expect ( panel . nativeElement . classList ) . toContain ( 'ant-collapse-item-active' ) ;
211+
212+ // click icon should toggle close
213+ ( panel . nativeElement . querySelector ( '.ant-collapse-expand-icon' ) as HTMLElement ) . click ( ) ;
214+ fixture . detectChanges ( ) ;
215+ expect ( panel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
216+ } ) ;
217+
218+ it ( 'should not toggle when nzCollapsible is "disabled"' , ( ) => {
219+ fixture . componentInstance . collapsible = 'disabled' ;
220+ fixture . detectChanges ( ) ;
221+
222+ const header = panel . nativeElement . querySelector ( '.ant-collapse-header' ) as HTMLElement ;
223+ header . click ( ) ;
224+ fixture . detectChanges ( ) ;
225+ expect ( panel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
226+
227+ const icon = panel . nativeElement . querySelector ( '.ant-collapse-expand-icon' ) as HTMLElement ;
228+ icon . click ( ) ;
229+ fixture . detectChanges ( ) ;
230+ expect ( panel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
231+ } ) ;
232+
233+ it ( 'should toggle by header when nzCollapsible is "header"' , ( ) => {
234+ // Recreate fixture and set mode BEFORE first detectChanges so listeners bind to header
235+ const localFixture = TestBed . createComponent ( NzTestCollapseCollapsibleComponent ) ;
236+ localFixture . componentInstance . collapsible = 'header' ;
237+ localFixture . detectChanges ( ) ;
238+ const localPanel = localFixture . debugElement . query ( By . directive ( NzCollapsePanelComponent ) ) ;
239+
240+ const header = localPanel . nativeElement . querySelector ( '.ant-collapse-header' ) as HTMLElement ;
241+ expect ( header . classList ) . toContain ( 'ant-collapse-header-collapsible-only' ) ;
242+ expect ( localPanel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
243+
244+ // click header toggles
245+ ( localPanel . nativeElement . querySelector ( '.ant-collapse-header-text' ) as HTMLElement ) . click ( ) ;
246+ localFixture . detectChanges ( ) ;
247+ expect ( localPanel . nativeElement . classList ) . toContain ( 'ant-collapse-item-active' ) ;
248+
249+ // click header toggles again (close)
250+ ( localPanel . nativeElement . querySelector ( '.ant-collapse-header-text' ) as HTMLElement ) . click ( ) ;
251+ localFixture . detectChanges ( ) ;
252+ expect ( localPanel . nativeElement . classList ) . not . toContain ( 'ant-collapse-item-active' ) ;
253+
254+ // clicking icon (which is inside header) should also toggle because header listens
255+ ( localPanel . nativeElement . querySelector ( '.ant-collapse-expand-icon' ) as HTMLElement ) . click ( ) ;
256+ localFixture . detectChanges ( ) ;
257+ expect ( localPanel . nativeElement . classList ) . toContain ( 'ant-collapse-item-active' ) ;
258+ } ) ;
259+ } ) ;
260+
181261 describe ( 'RTL' , ( ) => {
182262 it ( 'should className correct on dir change' , ( ) => {
183263 const fixture = TestBed . createComponent ( NzTestCollapseRtlComponent ) ;
@@ -290,6 +370,27 @@ export class NzTestCollapseTemplateComponent {}
290370} )
291371export class NzTestCollapseIconComponent { }
292372
373+ @Component ( {
374+ imports : [ NzCollapseModule ] ,
375+ template : `
376+ <nz-collapse>
377+ <nz-collapse-panel
378+ [(nzActive)]="active"
379+ [nzCollapsible]="collapsible"
380+ [nzShowArrow]="showArrow"
381+ nzHeader="Header"
382+ >
383+ <p>Content</p>
384+ </nz-collapse-panel>
385+ </nz-collapse>
386+ `
387+ } )
388+ export class NzTestCollapseCollapsibleComponent {
389+ active = false ;
390+ collapsible : 'disabled' | 'header' | 'icon' = 'icon' ;
391+ showArrow = true ;
392+ }
393+
293394@Component ( {
294395 imports : [ BidiModule , NzTestCollapseBasicComponent ] ,
295396 template : `
0 commit comments