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 { async, ComponentFixture, TestBed } 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(
async(() => TestBed.configureTestingModule({
declarations: [TestComponent],
imports: [
BsDatepickerModule.forRoot(),
BrowserAnimationsModule
]
}).compileComponents()
));
beforeEach(() => {
fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
});
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 + 1); // +1 for `custom range` button
});
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 highlight the Custom Range button when dates selected are not in 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')]
}
];
const selectedRange: BsCustomDates = {
label: 'Next 7 days',
value: [new Date('12-14-2019'), new Date('12-25-2019')]
};
const daterangepickerInput = fixture.debugElement.query(By.css('input[bsDaterangepicker]'));
fixture.componentInstance.daterangepicker.bsConfig.ranges = ranges;
const datepickerContainerInstance = getDaterangepickerContainer(datepicker);
datepickerContainerInstance.setRangeOnCalendar(selectedRange);
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('Custom Range');
});
});