import { Component, ViewChild } from '@angular/core';
import { BsDaterangepickerDirective } from '../bs-daterangepicker.component';
import { BsDatepickerModule } from '../bs-datepicker.module';
import { BsDaterangepickerConfig } from '../bs-daterangepicker.config';
import { BsDaterangepickerContainerComponent } from '../themes/bs/bs-daterangepicker-container.component';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { By } from '@angular/platform-browser';
import { BsCustomDates } from '../themes/bs/bs-custom-dates-view.component';
@Component({
selector: 'test-cmp',
template: ``
})
class TestComponent {
@ViewChild(BsDaterangepickerDirective, { static: false }) daterangepicker: BsDaterangepickerDirective;
bsConfig: Partial = {
customTodayClass: 'custom-today-class'
};
}
type TestFixture = ComponentFixture;
function getDaterangepickerDirective(fixture: TestFixture): BsDaterangepickerDirective {
const daterangepicker: BsDaterangepickerDirective = fixture.componentInstance.daterangepicker;
return daterangepicker;
}
function showDatepicker(fixture: TestFixture): BsDaterangepickerDirective {
const daterangepicker = getDaterangepickerDirective(fixture);
daterangepicker.show();
fixture.detectChanges();
return daterangepicker;
}
function hideDatepicker(fixture: TestFixture): BsDaterangepickerDirective {
const daterangepicker = getDaterangepickerDirective(fixture);
daterangepicker.hide();
fixture.detectChanges();
return daterangepicker;
}
function getDaterangepickerContainer(daterangepicker: BsDaterangepickerDirective):
BsDaterangepickerContainerComponent | null {
return daterangepicker[`_datepickerRef`] ? daterangepicker[`_datepickerRef`].instance : null;
}
describe('daterangepicker:', () => {
let fixture: TestFixture;
beforeEach(
waitForAsync(() => TestBed.configureTestingModule({
declarations: [TestComponent],
imports: [
BsDatepickerModule.forRoot(),
BrowserAnimationsModule
]
}).compileComponents()
));
beforeEach(() => {
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
});
it('should display timepicker when withTimepicker is true', () => {
const directive = getDaterangepickerDirective(fixture);
directive.bsConfig = {
withTimepicker: true
};
showDatepicker(fixture);
const timepickerZone = document.querySelector('.bs-timepicker-in-datepicker-container');
const timepickers = document.querySelectorAll('timepicker');
expect(timepickerZone).toBeTruthy();
expect(timepickers.length).toEqual(2);
});
it('should hide timepicker when withTimepicker is false', () => {
const directive = getDaterangepickerDirective(fixture);
directive.bsConfig = {
withTimepicker: false
};
showDatepicker(fixture);
const timepickerZone = document.querySelector('.bs-timepicker-in-datepicker-container');
expect(timepickerZone).not.toBeTruthy();
});
it('should display daterangepicker on show', () => {
const datepicker = showDatepicker(fixture);
expect(getDaterangepickerContainer(datepicker)).toBeDefined();
});
it('should hide daterangepicker on hide', () => {
const datepicker = hideDatepicker(fixture);
expect(getDaterangepickerContainer(datepicker)).toBeNull();
});
it('should display correct date range in input when selected from ranges', () => {
const datepicker = showDatepicker(fixture);
const ranges = [
{
label: 'Last 7 days',
value: [new Date('12-10-2019'), new Date('12-16-2019')]
},
{
label: 'Next 7 days',
value: [new Date('12-16-2019'), new Date('12-22-2019')]
}
];
datepicker.bsConfig.ranges = ranges;
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
datepickerContainerInstance.setRangeOnCalendar(ranges[0]);
fixture.detectChanges();
datepickerContainerInstance[`_store`]
.select(state => state.selectedRange)
.subscribe(view => {
expect(view).toEqual(ranges[0].value);
});
});
it('should display correct number of ranges button', () => {
const ranges = [
{
label: 'Last 7 days',
value: [new Date('12-10-2019'), new Date('12-16-2019')]
},
{
label: 'Next 7 days',
value: [new Date('12-16-2019'), new Date('12-22-2019')]
}
];
const daterangepickerInput = fixture.debugElement.query(By.css('input[bsDaterangepicker]'));
fixture.componentInstance.daterangepicker.bsConfig.ranges = ranges;
daterangepickerInput.nativeElement.click();
fixture.detectChanges();
const rangesButton = document.querySelector('.bs-datepicker-predefined-btns');
expect(rangesButton.childElementCount).toEqual(ranges.length);
});
it('should display correct date range in input when selected from ranges', () => {
const datepicker = showDatepicker(fixture);
const ranges = [
{
label: 'Last 7 days',
value: [new Date('12-10-2019'), new Date('12-16-2019')]
},
{
label: 'Next 7 days',
value: [new Date('12-16-2019'), new Date('12-22-2019')]
}
];
datepicker.bsConfig.ranges = ranges;
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
datepickerContainerInstance.setRangeOnCalendar(ranges[0]);
fixture.detectChanges();
datepickerContainerInstance[`_store`]
.select(state => state.selectedRange)
.subscribe(view => {
expect(view).toEqual(ranges[0].value);
});
});
it('should correctly display the selected range button with active custom class', () => {
const datepicker = showDatepicker(fixture);
const ranges = [
{
label: 'Last 7 days',
value: [new Date('12-10-2019'), new Date('12-16-2019')]
},
{
label: 'Next 7 days',
value: [new Date('12-16-2019'), new Date('12-22-2019')]
}
];
const daterangepickerInput = fixture.debugElement.query(By.css('input[bsDaterangepicker]'));
fixture.componentInstance.daterangepicker.bsConfig.ranges = ranges;
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
datepickerContainerInstance.setRangeOnCalendar(ranges[0]);
daterangepickerInput.nativeElement.click();
fixture.detectChanges();
// only one active element should be present
const activeRangeButton = document.querySelectorAll('.bs-datepicker-predefined-btns button.selected');
expect(activeRangeButton).toBeTruthy();
expect(activeRangeButton.length).toEqual(1);
expect(activeRangeButton[0].innerHTML.trim()).toEqual(ranges[0].label);
});
it('should not allow to select date behind max value', () => {
const datepicker = showDatepicker(fixture);
datepicker.bsConfig.maxDate = new Date();
datepicker.bsConfig.maxDateRange = 10;
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
const correctDateStart = new Date(new Date().setDate(new Date().getDate() - 14));
const correctDateEnd = new Date(new Date().setDate(new Date().getDate() - 7));
const selectedRange: BsCustomDates = {
label: '',
value: [correctDateStart, correctDateEnd]
};
datepickerContainerInstance.setMaxDateRangeOnCalendar(correctDateStart);
datepickerContainerInstance.setRangeOnCalendar(selectedRange);
fixture.detectChanges();
datepickerContainerInstance[`_store`]
.select(state => state)
.subscribe(view => {
expect(view.maxDate).toEqual(correctDateEnd);
});
const incorrectCaseStart = new Date(new Date().setDate(new Date().getDate() - 5));
const incorrectCaseEnd = new Date(new Date().setDate(new Date().getDate() + 15));
const selectedRange1: BsCustomDates = {
label: '',
value: [incorrectCaseStart, incorrectCaseEnd]
};
datepickerContainerInstance.setMaxDateRangeOnCalendar(incorrectCaseStart);
datepickerContainerInstance.setRangeOnCalendar(selectedRange1);
fixture.detectChanges();
datepickerContainerInstance[`_store`]
.select(state => state)
.subscribe(view => {
expect(view.maxDate).not.toEqual(incorrectCaseEnd);
});
});
});