import { Component, ViewChild } from '@angular/core'; import { async, TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { DebounceClickDirective } from './debounce-click.directive'; interface TestComponent { clickHandler: () => void; } @Component({ selector: 'app-default-test', template: '' }) class DefaultDebounceTimeTestComponent { @ViewChild(DebounceClickDirective) directive!: DebounceClickDirective; clickHandler: () => void = () => { }; } @Component({ selector: 'app-default-test', template: '' }) class CustomDebounceTimeTestComponent { debounceTime: number | undefined; @ViewChild(DebounceClickDirective) directive!: DebounceClickDirective; clickHandler: () => void = () => { }; } describe('DebounceClickDirective', () => { let counter: number; function initComponent(component: TestComponent) { component.clickHandler = () => counter++; } beforeEach(() => { counter = 0; }); describe('default debounce time', () => { let component: DefaultDebounceTimeTestComponent; let componentFixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DebounceClickDirective, DefaultDebounceTimeTestComponent] }).compileComponents(); })); beforeEach(() => { componentFixture = TestBed.createComponent(DefaultDebounceTimeTestComponent); component = componentFixture.componentInstance; initComponent(component); }); it('should create an instance', () => { componentFixture.detectChanges(); expect(component.directive).toBeTruthy(); }); it('should work well', fakeAsync(() => { function click() { (componentFixture.debugElement.query(By.css('button')).nativeElement).dispatchEvent(new MouseEvent('click')); } componentFixture.detectChanges(); expect(counter).toBe(0); click(); tick(300); expect(counter).toBe(0); click(); tick(); expect(counter).toBe(0); tick(500); expect(counter).toBe(1); })); }); describe('custom debounce time', () => { let component: CustomDebounceTimeTestComponent; let componentFixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DebounceClickDirective, CustomDebounceTimeTestComponent] }).compileComponents(); })); beforeEach(() => { componentFixture = TestBed.createComponent(CustomDebounceTimeTestComponent); component = componentFixture.componentInstance; initComponent(component); component.debounceTime = 600; }); it('should create an instance', () => { componentFixture.detectChanges(); expect(component.directive).toBeTruthy(); }); it('should work well', fakeAsync(() => { function click() { (componentFixture.debugElement.query(By.css('button')).nativeElement).dispatchEvent(new MouseEvent('click')); } componentFixture.detectChanges(); expect(counter).toBe(0); click(); tick(300); expect(counter).toBe(0); click(); tick(); expect(counter).toBe(0); tick(600); expect(counter).toBe(1); })); }); });