ng2-bootstrap-base-modified
Version:
Native Angular Bootstrap Components Typeahead modified
159 lines (128 loc) • 5.07 kB
text/typescript
import { Component } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AccordionModule } from '../accordion/accordion.module';
import { AccordionConfig } from '../accordion/accordion.config';
const html = `
<accordion [closeOthers]="oneAtATime">
<accordion-group heading="Panel 1"
[isOpen]="panels[0].isOpen"
[isDisabled]="panels[0].isDisabled">
Content of panel 1
</accordion-group>
<accordion-group heading="Panel 2"
[isOpen]="panels[1].isOpen"
[isDisabled]="panels[1].isDisabled">
Content of panel 2
</accordion-group>
<accordion-group heading="Panel 3"
[isOpen]="panels[2].isOpen"
[isDisabled]="panels[2].isDisabled">
Content of panel 3
</accordion-group>
</accordion>
`;
function getPanels(element:HTMLElement):Element[] {
return Array.from(element.querySelectorAll('accordion-group'));
}
function expectOpenPanels(nativeEl:HTMLElement, openPanelsDef:boolean[]):void {
const panels = getPanels(nativeEl);
expect(panels.length).toBe(openPanelsDef.length);
for (let i = 0; i < panels.length; i++) {
if (openPanelsDef[i]) {
expect(panels[i].classList).toContain('panel-open');
} else {
expect(panels[i].classList).not.toContain('panel-open');
}
}
}
function hasTitle(element:HTMLElement, str:string):boolean {
return element.textContent === str;
}
describe('Component: Accordion', () => {
let fixture:ComponentFixture<TestAccordionComponent>;
let context:any;
let element:any;
beforeEach(() => {
TestBed.configureTestingModule({declarations: [TestAccordionComponent], imports: [AccordionModule.forRoot()]});
TestBed.overrideComponent(TestAccordionComponent, {set: {template: html}});
fixture = TestBed.createComponent(TestAccordionComponent);
context = fixture.componentInstance;
element = fixture.nativeElement;
fixture.detectChanges();
});
it('should have no open panels', () => {
expectOpenPanels(element, [false, false, false]);
});
it('should have open panel based on binding', () => {
context.panels[0].isOpen = true;
fixture.detectChanges();
expectOpenPanels(element, [true, false, false]);
});
it('should toggle panels independently', () => {
context.oneAtATime = false;
context.panels[1].isOpen = true;
fixture.detectChanges();
expectOpenPanels(element, [false, true, false]);
context.panels[0].isOpen = true;
fixture.detectChanges();
expectOpenPanels(element, [true, true, false]);
context.panels[1].isOpen = false;
fixture.detectChanges();
expectOpenPanels(element, [true, false, false]);
context.panels[2].isOpen = true;
fixture.detectChanges();
expectOpenPanels(element, [true, false, true]);
context.panels[0].isOpen = false;
fixture.detectChanges();
expectOpenPanels(element, [false, false, true]);
context.panels[2].isOpen = false;
fixture.detectChanges();
expectOpenPanels(element, [false, false, false]);
});
it('should have the appropriate heading', () => {
const titles = Array.from(element.querySelectorAll('.panel-heading .accordion-toggle span'));
titles.forEach((title:HTMLElement, idx:number) => expect(hasTitle(title, `Panel ${idx + 1}`)).toBe(true));
});
it('should only open one at a time', () => {
const headingLinks = element.querySelectorAll('.accordion-toggle');
headingLinks[0].click();
fixture.detectChanges();
expectOpenPanels(element, [true, false, false]);
headingLinks[2].click();
fixture.detectChanges();
expectOpenPanels(element, [false, false, true]);
headingLinks[2].click();
fixture.detectChanges();
expectOpenPanels(element, [false, false, false]);
});
it('should have only one open panel even if binding says otherwise', () => {
context.panels[0].isOpen = true;
context.panels[1].isOpen = true;
// which of panels should be opened there? the first or the last one? (now - last)
fixture.detectChanges();
expectOpenPanels(element, [false, true, false]);
});
it('should not open disabled panels from click', () => {
context.panels[0].isDisabled = true;
fixture.detectChanges();
const headingLinks = element.querySelectorAll('.panel-title .accordion-toggle');
headingLinks[0].click();
fixture.detectChanges();
expectOpenPanels(element, [false, false, false]);
});
});
({
selector: 'accordion-test',
template: ''
})
class TestAccordionComponent {
public oneAtATime:boolean = true;
public panels:any[] = [
{isOpen: false, isDisabled: false},
{isOpen: false, isDisabled: false},
{isOpen: false, isDisabled: false}
];
public constructor(config: AccordionConfig) {
Object.assign(this, config);
}
}