sass-references/angular-material/material/chips/chip-remove.spec.ts

127 lines
4.2 KiB
TypeScript
Raw Normal View History

2024-12-06 10:42:08 +08:00
import {ENTER, SPACE} from '@angular/cdk/keycodes';
import {dispatchKeyboardEvent, dispatchMouseEvent} from '@angular/cdk/testing/private';
import {Component} from '@angular/core';
import {ComponentFixture, TestBed, fakeAsync, flush, waitForAsync} from '@angular/core/testing';
import {By} from '@angular/platform-browser';
import {MatChip, MatChipsModule} from './index';
describe('Chip Remove', () => {
let fixture: ComponentFixture<TestChip>;
let testChip: TestChip;
let chipNativeElement: HTMLElement;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [MatChipsModule, TestChip],
});
}));
beforeEach(waitForAsync(() => {
fixture = TestBed.createComponent(TestChip);
testChip = fixture.debugElement.componentInstance;
fixture.detectChanges();
const chipDebugElement = fixture.debugElement.query(By.directive(MatChip))!;
chipNativeElement = chipDebugElement.nativeElement;
}));
describe('basic behavior', () => {
it('should apply a CSS class to the remove icon', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('.mdc-evolution-chip__icon--trailing')!;
expect(buttonElement.classList).toContain('mat-mdc-chip-remove');
}));
it('should ensure that the button cannot submit its parent form', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('button')!;
expect(buttonElement.getAttribute('type')).toBe('button');
}));
it('should not set the `type` attribute on non-button elements', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('span.mat-mdc-chip-remove')!;
expect(buttonElement.hasAttribute('type')).toBe(false);
}));
it('should emit (removed) event when exit animation is complete', fakeAsync(() => {
testChip.removable = true;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
chipNativeElement.querySelector('button')!.click();
fixture.detectChanges();
flush();
expect(testChip.didRemove).toHaveBeenCalled();
}));
it('should not make the element aria-hidden when it is focusable', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('button')!;
expect(buttonElement.getAttribute('tabindex')).toBe('-1');
expect(buttonElement.hasAttribute('aria-hidden')).toBe(false);
}));
it('should prevent the default SPACE action', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('button')!;
testChip.removable = true;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
const event = dispatchKeyboardEvent(buttonElement, 'keydown', SPACE);
fixture.detectChanges();
flush();
expect(event.defaultPrevented).toBe(true);
}));
it('should prevent the default ENTER action', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('button')!;
testChip.removable = true;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
const event = dispatchKeyboardEvent(buttonElement, 'keydown', ENTER);
fixture.detectChanges();
flush();
expect(event.defaultPrevented).toBe(true);
}));
it('should have a focus indicator', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('.mdc-evolution-chip__icon--trailing')!;
expect(buttonElement.classList.contains('mat-focus-indicator')).toBe(true);
}));
it('should prevent the default click action', fakeAsync(() => {
const buttonElement = chipNativeElement.querySelector('button')!;
const event = dispatchMouseEvent(buttonElement, 'click');
fixture.detectChanges();
flush();
expect(event.defaultPrevented).toBe(true);
}));
});
});
@Component({
template: `
<mat-chip-set>
<mat-chip
[removable]="removable"
[disabled]="disabled"
(removed)="didRemove()">
<button matChipRemove></button>
<span matChipRemove></span>
</mat-chip>
</mat-chip-set>
`,
standalone: true,
imports: [MatChipsModule],
})
class TestChip {
removable: boolean;
disabled = false;
didRemove = jasmine.createSpy('didRemove spy');
}