import { Component } from '@angular/core'; import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import '../../../scripts/jest/toHaveCssClass'; import { CollapseModule } from '../index'; // in jsdom elements has zero size by default const template = `
collapse directive
dynamic content
`; @Component({ selector: 'collapse-test', template }) class TestCollapseComponent {} // TODO: - add animate // - check callbacks have been called or not called (expanding, expanded, collapsing, collapsed) describe('Directive: Collapse', () => { let fixture: ComponentFixture; let element; let context; beforeEach(() => { TestBed.configureTestingModule({ declarations: [TestCollapseComponent], imports: [ CollapseModule, BrowserAnimationsModule ] }); fixture = TestBed.createComponent(TestCollapseComponent); fixture.detectChanges(); context = fixture.componentInstance; element = fixture.nativeElement.querySelector('.collapse'); }); afterAll(async () => { await new Promise(resolve => setTimeout(() => resolve(), 500)); // avoid jest open handle error }); it('should have collapse class', () => { const div = fixture.nativeElement.querySelector('div'); expect(div.classList).toContain('collapse'); }); it('should add/remove in class on toggle', () => { expect(element.classList).toContain('in'); context.isCollapsed = true; fixture.detectChanges(); expect(element.classList).not.toContain('in'); }); it('should be hidden on initialization if isCollapsed = true', () => { context.isCollapsed = true; fixture.detectChanges(); expect(element.offsetHeight).toBe(0); }); xit( 'should not trigger any animation on initialization if isCollapsed = true', () => { expect(true); } ); it('should collapse if isCollapsed = true on subsequent use', () => { context.isCollapsed = false; fixture.detectChanges(); context.isCollapsed = true; fixture.detectChanges(); expect(element.offsetHeight).toBe(0); }); // in jsdom offsetHeight is always zero it('should show after toggled from collapsed', fakeAsync(() => { context.isCollapsed = true; fixture.detectChanges(); // expect(element.offsetHeight).toBe(0); expect(element).not.toHaveCssClass('show'); context.isCollapsed = false; fixture.detectChanges(); // expect(element.offsetHeight).not.toBe(0); expect(element).toHaveCssClass('show'); })); xit( 'should not trigger any animation on initialization if isCollapsed = false', () => { expect(true); } ); // in jsdom offsetHeight is always zero it('should expand if isCollapsed = false on subsequent use', () => { context.isCollapsed = false; fixture.detectChanges(); context.isCollapsed = true; fixture.detectChanges(); context.isCollapsed = false; fixture.detectChanges(); // expect(element.offsetHeight).not.toBe(0); expect(element).toHaveCssClass('show'); }); it('should collapse if isCollapsed = true on subsequent uses', () => { context.isCollapsed = false; fixture.detectChanges(); context.isCollapsed = true; fixture.detectChanges(); context.isCollapsed = false; fixture.detectChanges(); context.isCollapsed = true; fixture.detectChanges(); expect(element.offsetHeight).toBe(0); }); it('should change aria-hidden attribute', () => { expect(element.getAttribute('aria-hidden')).toBe('false'); context.isCollapsed = true; fixture.detectChanges(); expect(element.getAttribute('aria-hidden')).toBe('true'); }); describe('dynamic content', () => { it('should grow accordingly when content size inside collapse increases', () => { context.isCollapsed = false; context.isHidden = true; fixture.detectChanges(); const heightWithoutDynamic = element.offsetHeight; context.isHidden = false; fixture.detectChanges(); const heightWithDynamic = element.offsetHeight; expect(heightWithDynamic).toBeGreaterThanOrEqual(heightWithoutDynamic); }); it('should shrink accordingly when content size inside collapse decreases', () => { context.isCollapsed = false; context.isHidden = false; fixture.detectChanges(); const heightWithDynamic = element.offsetHeight; context.isHidden = true; fixture.detectChanges(); const heightWithoutDynamic = element.offsetHeight; expect(heightWithoutDynamic).toBeLessThanOrEqual(heightWithDynamic); }); }); describe('expanding callback returning a promise', () => { xit('should wait for it to resolve before animating', () => { expect(true); }); xit('should not animate if it rejects', () => { expect(true); }); }); describe('collapsing callback returning a promise', () => { xit('should wait for it to resolve before animating', () => { expect(true); }); xit('should not animate if it rejects', () => { expect(true); }); }); });