sass-references/angular-material/material/datepicker/testing/datepicker-input-harness.sp...

223 lines
8.2 KiB
TypeScript

import {HarnessLoader, parallel} from '@angular/cdk/testing';
import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed';
import {Component} from '@angular/core';
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {FormsModule} from '@angular/forms';
import {DateAdapter, MatNativeDateModule} from '@angular/material/core';
import {MatDatepickerModule} from '@angular/material/datepicker';
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
import {MatCalendarHarness} from './calendar-harness';
import {MatDatepickerInputHarness} from './datepicker-input-harness';
describe('MatDatepickerInputHarness', () => {
let fixture: ComponentFixture<DatepickerInputHarnessTest>;
let loader: HarnessLoader;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
MatNativeDateModule,
MatDatepickerModule,
FormsModule,
DatepickerInputHarnessTest,
],
});
fixture = TestBed.createComponent(DatepickerInputHarnessTest);
fixture.detectChanges();
loader = TestbedHarnessEnvironment.loader(fixture);
});
it('should load all datepicker input harnesses', async () => {
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness);
expect(inputs.length).toBe(2);
});
it('should filter inputs based on their value', async () => {
fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0);
fixture.changeDetectorRef.markForCheck();
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness.with({value: /2020/}));
expect(inputs.length).toBe(1);
});
it('should filter inputs based on their placeholder', async () => {
const inputs = await loader.getAllHarnesses(
MatDatepickerInputHarness.with({
placeholder: /^Type/,
}),
);
expect(inputs.length).toBe(1);
});
it('should get whether the input has an associated calendar', async () => {
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness);
expect(await parallel(() => inputs.map(input => input.hasCalendar()))).toEqual([true, false]);
});
it('should get whether the input is disabled', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.isDisabled()).toBe(false);
fixture.componentInstance.disabled = true;
fixture.changeDetectorRef.markForCheck();
expect(await input.isDisabled()).toBe(true);
});
it('should get whether the input is required', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.isRequired()).toBe(false);
fixture.componentInstance.required = true;
fixture.changeDetectorRef.markForCheck();
expect(await input.isRequired()).toBe(true);
});
it('should get the input value', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0);
fixture.changeDetectorRef.markForCheck();
expect(await input.getValue()).toBe('1/1/2020');
});
it('should set the input value', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.getValue()).toBeFalsy();
await input.setValue('1/1/2020');
expect(await input.getValue()).toBe('1/1/2020');
});
it('should set the input value based on date adapter validation and formatting', async () => {
const adapter = fixture.debugElement.injector.get(DateAdapter);
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
const validValues: any[] = [new Date(0), '', 0, false];
const invalidValues: any[] = [null, undefined];
spyOn(adapter, 'format').and.returnValue('FORMATTED_VALUE');
spyOn(adapter, 'isValid').and.callFake(value => validValues.includes(value));
spyOn(adapter, 'deserialize').and.callFake(value =>
validValues.includes(value) ? value : null,
);
spyOn(adapter, 'getValidDateOrNull').and.callFake(value =>
adapter.isValid(value) ? value : null,
);
for (let value of validValues) {
fixture.componentInstance.date = value;
fixture.changeDetectorRef.markForCheck();
expect(await input.getValue()).toBe('FORMATTED_VALUE');
}
for (let value of invalidValues) {
fixture.componentInstance.date = value;
fixture.changeDetectorRef.markForCheck();
expect(await input.getValue()).toBe('');
}
});
it('should get the input placeholder', async () => {
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness);
expect(
await parallel(() =>
inputs.map(input => {
return input.getPlaceholder();
}),
),
).toEqual(['Type a date', '']);
});
it('should be able to change the input focused state', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.isFocused()).toBe(false);
await input.focus();
expect(await input.isFocused()).toBe(true);
await input.blur();
expect(await input.isFocused()).toBe(false);
});
it('should get the minimum date of the input', async () => {
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness);
fixture.componentInstance.minDate = new Date(2020, 0, 1, 12, 0, 0);
fixture.changeDetectorRef.markForCheck();
expect(await parallel(() => inputs.map(input => input.getMin()))).toEqual(['2020-01-01', null]);
});
it('should get the maximum date of the input', async () => {
const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness);
fixture.componentInstance.maxDate = new Date(2020, 0, 1, 12, 0, 0);
fixture.changeDetectorRef.markForCheck();
expect(await parallel(() => inputs.map(input => input.getMax()))).toEqual(['2020-01-01', null]);
});
it('should be able to open and close a calendar in popup mode', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.isCalendarOpen()).toBe(false);
await input.openCalendar();
expect(await input.isCalendarOpen()).toBe(true);
await input.closeCalendar();
expect(await input.isCalendarOpen()).toBe(false);
});
it('should be able to open and close a calendar in touch mode', async () => {
fixture.componentInstance.touchUi = true;
fixture.changeDetectorRef.markForCheck();
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(await input.isCalendarOpen()).toBe(false);
await input.openCalendar();
expect(await input.isCalendarOpen()).toBe(true);
await input.closeCalendar();
expect(await input.isCalendarOpen()).toBe(false);
});
it('should be able to get the harness for the associated calendar', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
await input.openCalendar();
expect(await input.getCalendar()).toBeInstanceOf(MatCalendarHarness);
});
it('should emit the `dateChange` event when the value is changed', async () => {
const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'}));
expect(fixture.componentInstance.dateChangeCount).toBe(0);
await input.setValue('1/1/2020');
expect(fixture.componentInstance.dateChangeCount).toBe(1);
});
});
@Component({
template: `
<input
id="basic"
matInput
[matDatepicker]="picker"
(dateChange)="dateChangeCount = dateChangeCount + 1"
[(ngModel)]="date"
[min]="minDate"
[max]="maxDate"
[disabled]="disabled"
[required]="required"
placeholder="Type a date">
<mat-datepicker #picker [touchUi]="touchUi"></mat-datepicker>
<input id="no-datepicker" matDatepicker>
`,
standalone: true,
imports: [MatNativeDateModule, MatDatepickerModule, FormsModule],
})
class DatepickerInputHarnessTest {
date: Date | null = null;
minDate: Date | null = null;
maxDate: Date | null = null;
touchUi = false;
disabled = false;
required = false;
dateChangeCount = 0;
}