/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ApplicationRef, Component, ViewChild } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { skip } from 'rxjs/operators';
import { NbCalendarRange, NbDatepickerDirective, NbTimepickerModule, NbDateTimePickerComponent } from '@nebular/theme';
import { NbDatepickerModule } from './datepicker.module';
import { NbThemeModule } from '../../theme.module';
import { NbLayoutModule } from '../layout/layout.module';
import { NbDatepickerComponent, NbRangepickerComponent } from './datepicker.component';
@Component({
selector: 'nb-datepicker-test',
template: `
`,
})
export class NbDatepickerTestComponent {
@ViewChild(NbDatepickerComponent) datepicker: NbDatepickerComponent;
@ViewChild(NbDatepickerDirective) datepickerDirective: NbDatepickerDirective;
}
@Component({
selector: 'nb-rangepicker-test',
template: `
`,
})
export class NbRangepickerTestComponent {
@ViewChild(NbRangepickerComponent) rangepicker: NbRangepickerComponent;
@ViewChild(NbDatepickerDirective) datepickerDirective: NbDatepickerDirective;
}
@Component({
selector: 'nb-date-timepicker-test',
template: `
`,
})
export class NbDateTimepickerTestComponent {
@ViewChild(NbDateTimePickerComponent) dateTimepicker: NbDateTimePickerComponent;
@ViewChild(NbDatepickerDirective) datepickerDirective: NbDatepickerDirective;
}
describe('nb-datepicker', () => {
let fixture: ComponentFixture;
let appRef: ApplicationRef;
let datepicker: NbDatepickerComponent;
let datepickerDirective: NbDatepickerDirective;
let overlay: HTMLElement;
let input: HTMLInputElement;
const showDatepicker = () => {
datepicker.show();
appRef.tick();
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([]),
NbThemeModule.forRoot(),
NbLayoutModule,
NbDatepickerModule.forRoot(),
],
declarations: [NbDatepickerTestComponent],
});
fixture = TestBed.createComponent(NbDatepickerTestComponent);
appRef = TestBed.inject(ApplicationRef);
fixture.detectChanges();
});
beforeEach(() => {
datepicker = fixture.componentInstance.datepicker;
datepickerDirective = fixture.componentInstance.datepickerDirective;
overlay = fixture.nativeElement.querySelector('nb-layout');
input = fixture.nativeElement.querySelector('input');
});
it('should not throw when destroyed right after creation', () => {
const picker = TestBed.createComponent(NbDatepickerComponent).componentInstance;
expect(picker.ngOnDestroy.bind(picker)).not.toThrow();
});
it('should render calendar', () => {
showDatepicker();
const calendar = overlay.querySelector('nb-calendar');
expect(calendar).toBeTruthy();
});
it('should not render overlay on load', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
});
it('should render overlay lazily', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
showDatepicker();
const calendar = overlay.querySelector('nb-calendar');
expect(calendar).toBeTruthy();
});
it('should write selected date in the input', () => {
const date = new Date(2018, 8, 17);
datepicker.visibleDate = date;
showDatepicker();
datepicker.dateChange.subscribe(e => {
expect(e).toEqual(date);
expect(input.value).toEqual('Sep 17, 2018');
});
const cell = overlay.querySelectorAll('.day-cell')[22]; // it's visible date cell
cell.dispatchEvent(new Event('click'));
});
it('should start from date typed into the input', () => {
input.value = 'Sep 17, 2018';
input.dispatchEvent(new Event('input'));
showDatepicker();
appRef.tick();
const cell = overlay.querySelector('.day-cell.selected'); // it's input value date cell
expect(cell.textContent).toContain('17');
});
it('should start from current date if input is empty', () => {
showDatepicker();
appRef.tick();
expect(overlay.querySelector('.day-cell.today')).toBeDefined();
});
it('should start from current date if input value is invalid', () => {
input.value = 'definitely not a date';
input.dispatchEvent(new Event('input'));
showDatepicker();
appRef.tick();
expect(overlay.querySelector('.day-cell.today')).toBeDefined();
});
it('should update visible date if input value changed', () => {
const initialDate = new Date(2000, 0, 1);
datepicker.visibleDate = initialDate;
const date = 17;
const month = 8;
const year = 2018;
input.value = 'Sep 17, 2018';
input.dispatchEvent(new Event('input'));
showDatepicker();
appRef.tick();
expect(datepicker.visibleDate.getDate()).toEqual(date);
expect(datepicker.visibleDate.getMonth()).toEqual(month);
expect(datepicker.visibleDate.getFullYear()).toEqual(year);
});
it('should be valid if empty', () => {
expect(datepickerDirective.validate()).toBe(null);
});
it('should not be valid if empty contain incorrectly formatted date', () => {
input.value = 'somecurruptedinput';
input.dispatchEvent(new Event('input'));
showDatepicker();
expect(datepickerDirective.validate()).not.toBe(null);
});
});
describe('nb-rangepicker', () => {
let fixture: ComponentFixture;
let appRef: ApplicationRef;
let rangepicker: NbRangepickerComponent;
let datepickerDirective: NbDatepickerDirective;
let overlay: HTMLElement;
let input: HTMLInputElement;
const showRangepicker = () => {
rangepicker.show();
appRef.tick();
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([]),
NbThemeModule.forRoot(),
NbLayoutModule,
NbDatepickerModule.forRoot(),
],
declarations: [NbRangepickerTestComponent],
});
fixture = TestBed.createComponent(NbRangepickerTestComponent);
appRef = TestBed.inject(ApplicationRef);
fixture.detectChanges();
});
beforeEach(() => {
rangepicker = fixture.componentInstance.rangepicker;
datepickerDirective = fixture.componentInstance.datepickerDirective;
overlay = fixture.nativeElement.querySelector('nb-layout');
input = fixture.nativeElement.querySelector('input');
});
it('should render calendar', () => {
showRangepicker();
const calendar = overlay.querySelector('nb-calendar-range');
expect(calendar).toBeTruthy();
});
it('should not render overlay on load', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
});
it('should render overlay lazily', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
showRangepicker();
const calendar = overlay.querySelector('nb-calendar-range');
expect(calendar).toBeTruthy();
});
it('should emit rangeChange when selected start date', (done) => {
rangepicker.visibleDate = new Date(2018, 8, 17);
showRangepicker();
rangepicker.rangeChange.subscribe((range: NbCalendarRange) => {
expect(range.start.getFullYear()).toEqual(2018);
expect(range.start.getMonth()).toEqual(8);
expect(range.start.getDate()).toEqual(1);
expect(range.end).not.toBeDefined();
done();
});
// click on Sep 1
const startCell = overlay.querySelectorAll('.day-cell')[6];
(startCell as HTMLElement).click();
fixture.detectChanges();
}, 5000);
it('should emit rangeChange when selected start and end dates', (done) => {
rangepicker.visibleDate = new Date(2018, 8, 17);
showRangepicker();
rangepicker.rangeChange
.pipe(skip(1))
.subscribe((range: NbCalendarRange) => {
expect(range.start.getFullYear()).toEqual(2018);
expect(range.end.getFullYear()).toEqual(2018);
expect(range.start.getMonth()).toEqual(8);
expect(range.end.getMonth()).toEqual(8);
expect(range.start.getDate()).toEqual(1);
expect(range.end.getDate()).toEqual(3);
done();
});
// click on Sep 1
const startCell = overlay.querySelectorAll('.day-cell')[6];
(startCell as HTMLElement).click();
// click on Sep 3
const endCell = overlay.querySelectorAll('.day-cell')[8];
(endCell as HTMLElement).click();
fixture.detectChanges();
}, 5000);
it('should start from date typed into the input', () => {
input.value = 'Sep 17, 2018 - Sep 19, 2018';
input.dispatchEvent(new Event('input'));
showRangepicker();
appRef.tick();
const startCell = overlay.querySelector('.day-cell.in-range.start');
const endCell = overlay.querySelector('.day-cell.in-range.end');
expect(startCell.textContent).toContain('17');
expect(endCell.textContent).toContain('19');
});
it('should start from current date if input is empty', () => {
showRangepicker();
appRef.tick();
expect(overlay.querySelector('.day-cell.today')).toBeDefined();
});
it('should start from current date if input value is invalid', () => {
input.value = 'definitely not a date';
input.dispatchEvent(new Event('input'));
showRangepicker();
appRef.tick();
expect(overlay.querySelector('.day-cell.today')).toBeDefined();
});
it('should set visible date to start date if input value changed', () => {
const initialDate = new Date(2000, 0, 1);
rangepicker.visibleDate = initialDate;
const date = 17;
const month = 8;
const year = 2018;
input.value = 'Sep 17, 2018 - Sep 19, 2018';
input.dispatchEvent(new Event('input'));
appRef.tick();
showRangepicker();
expect(rangepicker.visibleDate.getDate()).toEqual(date);
expect(rangepicker.visibleDate.getMonth()).toEqual(month);
expect(rangepicker.visibleDate.getFullYear()).toEqual(year);
});
it('should be valid if empty', () => {
expect(datepickerDirective.validate()).toBe(null);
});
it('should not be valid if empty contain incorrectly formatted date', () => {
input.value = 'somecurruptedinput';
input.dispatchEvent(new Event('input'));
showRangepicker();
expect(datepickerDirective.validate()).not.toBe(null);
});
});
describe('nb-date-timepicker', () => {
let fixture: ComponentFixture;
let appRef: ApplicationRef;
let dateTimepicker: NbDateTimePickerComponent;
let datepickerDirective: NbDatepickerDirective;
let overlay: HTMLElement;
let input: HTMLInputElement;
const showDatTimepicker = () => {
dateTimepicker.show();
appRef.tick();
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([]),
NbThemeModule.forRoot(),
NbLayoutModule,
NbTimepickerModule.forRoot(),
NbDatepickerModule.forRoot(),
],
declarations: [NbDateTimepickerTestComponent],
});
fixture = TestBed.createComponent(NbDateTimepickerTestComponent);
appRef = TestBed.inject(ApplicationRef);
fixture.detectChanges();
});
beforeEach(() => {
dateTimepicker = fixture.componentInstance.dateTimepicker;
datepickerDirective = fixture.componentInstance.datepickerDirective;
overlay = fixture.nativeElement.querySelector('nb-layout');
input = fixture.nativeElement.querySelector('input');
});
it('should render calendar', () => {
showDatTimepicker();
const calendar = overlay.querySelector('nb-calendar-with-time');
expect(calendar).toBeTruthy();
});
it('should not render overlay on load', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
});
it('should render overlay lazily', () => {
const datepickerContainer = overlay.querySelector('nb-datepicker-container');
expect(datepickerContainer).toBeNull();
showDatTimepicker();
const calendar = overlay.querySelector('nb-calendar-with-time');
expect(calendar).toBeTruthy();
});
});