igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
187 lines (145 loc) • 7.48 kB
text/typescript
import { Component } from '@angular/core';
import { fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { IgxFocusTrapDirective } from './focus-trap.directive';
import { configureTestSuite } from '../../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { UIInteractions } from '../../test-utils/ui-interactions.spec';
import { NgIf } from '@angular/common';
describe('igxFocusTrap', () => {
configureTestSuite();
beforeAll(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [NoopAnimationsModule, TrapFocusTestComponent]
}).compileComponents();
}));
afterEach(() => {
UIInteractions.clearOverlay();
});
it('should focus focusable elements on Tab key pressed', () => {
const fix = TestBed.createComponent(TrapFocusTestComponent);
fix.detectChanges();
const focusTrap = fix.debugElement.query(By.directive(IgxFocusTrapDirective));
const button = fix.debugElement.query(By.css('button'));
const inputs = fix.debugElement.queryAll(By.css('input'));
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[0].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[1].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[0].nativeElement);
});
it('should focus focusable elements in reversed order on Shift + Tab key pressed', () => {
const fix = TestBed.createComponent(TrapFocusTestComponent);
fix.detectChanges();
const focusTrap = fix.debugElement.query(By.directive(IgxFocusTrapDirective));
const button = fix.debugElement.query(By.css('button'));
const inputs = fix.debugElement.queryAll(By.css('input'));
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[1].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[0].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
});
it('should trap focus on element when there is only one focusable element', () => {
const fix = TestBed.createComponent(TrapFocusTestComponent);
fix.detectChanges();
fix.componentInstance.showInput = false;
fix.detectChanges();
const focusTrap = fix.debugElement.query(By.directive(IgxFocusTrapDirective));
const button = fix.debugElement.query(By.css('button'));
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
});
it('should trap focus on element with non-focusable elements', fakeAsync(() => {
const fix = TestBed.createComponent(TrapFocusTestComponent);
fix.detectChanges();
fix.componentInstance.showInput = false;
fix.componentInstance.showButton = false;
fix.detectChanges();
const focusTrap = fix.debugElement.query(By.directive(IgxFocusTrapDirective));
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
tick();
fix.detectChanges();
expect(document.activeElement).toEqual(focusTrap.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
tick();
fix.detectChanges();
expect(document.activeElement).toEqual(focusTrap.nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
tick();
fix.detectChanges();
expect(document.activeElement).toEqual(focusTrap.nativeElement);
}));
it('should be able to set focusTrap dynamically', fakeAsync(() => {
const fix = TestBed.createComponent(TrapFocusTestComponent);
fix.detectChanges();
const focusTrap = fix.debugElement.query(By.directive(IgxFocusTrapDirective));
const button = fix.debugElement.query(By.css('button'));
const inputs = fix.debugElement.queryAll(By.css('input'));
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[0].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[1].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
button.nativeElement.blur();
fix.detectChanges();
fix.componentInstance.focusTrap = false;
fix.detectChanges();
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).not.toEqual(inputs[0].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).not.toEqual(inputs[1].nativeElement);
fix.componentInstance.focusTrap = true;
fix.detectChanges();
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap);
fix.detectChanges();
expect(document.activeElement).toEqual(inputs[0].nativeElement);
UIInteractions.triggerEventHandlerKeyDown('Tab', focusTrap, false, true);
fix.detectChanges();
expect(document.activeElement).toEqual(button.nativeElement);
}));
});
@Component({
template: `
<div #wrapper [igxFocusTrap]="focusTrap" tabindex="0">
<label for="uname"><b>Username</b></label><br>
<input type="text" *ngIf="showInput" placeholder="Enter Username" name="uname"><br>
<label for="psw"><b>Password</b></label><br>
<input type="password" *ngIf="showInput" placeholder="Enter Password" name="psw"><br>
<button *ngIf="showButton">SIGN IN</button>
</div>`,
standalone: true,
imports: [IgxFocusTrapDirective, NgIf]
})
class TrapFocusTestComponent {
public showInput = true;
public showButton = true;
public focusTrap = true;
}