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

206 lines
6.0 KiB
TypeScript

import {Directionality} from '@angular/cdk/bidi';
import {Component, DebugElement, ViewChild} from '@angular/core';
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
import {By} from '@angular/platform-browser';
import {Subject} from 'rxjs';
import {MatChip, MatChipEvent, MatChipSet, MatChipsModule} from './index';
describe('MatChip', () => {
let fixture: ComponentFixture<any>;
let chipDebugElement: DebugElement;
let chipNativeElement: HTMLElement;
let chipInstance: MatChip;
let dir = 'ltr';
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
MatChipsModule,
BasicChip,
SingleChip,
BasicChipWithStaticTabindex,
BasicChipWithBoundTabindex,
],
providers: [
{
provide: Directionality,
useFactory: () => ({
value: dir,
change: new Subject(),
}),
},
],
});
}));
describe('MatBasicChip', () => {
it('adds a class to indicate that it is a basic chip', () => {
fixture = TestBed.createComponent(BasicChip);
fixture.detectChanges();
const chip = fixture.nativeElement.querySelector('mat-basic-chip');
expect(chip.classList).toContain('mat-mdc-basic-chip');
});
it('should be able to set a static tabindex', () => {
fixture = TestBed.createComponent(BasicChipWithStaticTabindex);
fixture.detectChanges();
const chip = fixture.nativeElement.querySelector('mat-basic-chip');
expect(chip.getAttribute('tabindex')).toBe('3');
});
it('should be able to set a dynamic tabindex', () => {
fixture = TestBed.createComponent(BasicChipWithBoundTabindex);
fixture.detectChanges();
const chip = fixture.nativeElement.querySelector('mat-basic-chip');
expect(chip.getAttribute('tabindex')).toBe('12');
fixture.componentInstance.tabindex = 15;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(chip.getAttribute('tabindex')).toBe('15');
});
});
describe('MatChip', () => {
let testComponent: SingleChip;
let primaryAction: HTMLElement;
beforeEach(() => {
fixture = TestBed.createComponent(SingleChip);
fixture.detectChanges();
chipDebugElement = fixture.debugElement.query(By.directive(MatChip))!;
chipNativeElement = chipDebugElement.nativeElement;
chipInstance = chipDebugElement.injector.get<MatChip>(MatChip);
testComponent = fixture.debugElement.componentInstance;
primaryAction = chipNativeElement.querySelector('.mdc-evolution-chip__action--primary')!;
});
it('adds the `mat-chip` class', () => {
expect(chipNativeElement.classList).toContain('mat-mdc-chip');
});
it('does not add the `mat-basic-chip` class', () => {
expect(chipNativeElement.classList).not.toContain('mat-mdc-basic-chip');
});
it('emits destroy on destruction', () => {
spyOn(testComponent, 'chipDestroy').and.callThrough();
// Force a destroy callback
testComponent.shouldShow = false;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(testComponent.chipDestroy).toHaveBeenCalledTimes(1);
});
it('allows color customization', () => {
expect(chipNativeElement.classList).toContain('mat-primary');
testComponent.color = 'warn';
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(chipNativeElement.classList).not.toContain('mat-primary');
expect(chipNativeElement.classList).toContain('mat-warn');
});
it('allows removal', () => {
spyOn(testComponent, 'chipRemove');
chipInstance.remove();
fixture.detectChanges();
expect(testComponent.chipRemove).toHaveBeenCalledWith({chip: chipInstance});
});
it('should make disabled chips non-focusable', () => {
testComponent.disabled = true;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(primaryAction.hasAttribute('tabindex')).toBe(false);
});
it('should return the chip text if value is undefined', () => {
expect(chipInstance.value.trim()).toBe(fixture.componentInstance.name);
});
it('should return the chip value if defined', () => {
fixture.componentInstance.value = 123;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(chipInstance.value).toBe(123);
});
it('should return the chip value if set to null', () => {
fixture.componentInstance.value = null;
fixture.changeDetectorRef.markForCheck();
fixture.detectChanges();
expect(chipInstance.value).toBeNull();
});
});
});
@Component({
template: `
<mat-chip-set>
@if (shouldShow) {
<div>
<mat-chip [removable]="removable"
[color]="color" [disabled]="disabled"
(destroyed)="chipDestroy($event)"
(removed)="chipRemove($event)" [value]="value" [disableRipple]="rippleDisabled">
{{name}}
</mat-chip>
</div>
}
</mat-chip-set>`,
standalone: true,
imports: [MatChipsModule],
})
class SingleChip {
@ViewChild(MatChipSet) chipList: MatChipSet;
disabled: boolean = false;
name: string = 'Test';
color: string = 'primary';
removable: boolean = true;
shouldShow: boolean = true;
value: any;
rippleDisabled: boolean = false;
chipDestroy: (event?: MatChipEvent) => void = () => {};
chipRemove: (event?: MatChipEvent) => void = () => {};
}
@Component({
template: `<mat-basic-chip>Hello</mat-basic-chip>`,
standalone: true,
imports: [MatChipsModule],
})
class BasicChip {}
@Component({
template: `<mat-basic-chip role="button" tabindex="3">Hello</mat-basic-chip>`,
standalone: true,
imports: [MatChipsModule],
})
class BasicChipWithStaticTabindex {}
@Component({
template: `<mat-basic-chip role="button" [tabIndex]="tabindex">Hello</mat-basic-chip>`,
standalone: true,
imports: [MatChipsModule],
})
class BasicChipWithBoundTabindex {
tabindex = 12;
}