import { beforeEach, describe, expect, it } from 'vitest'
import { elementUpdated, fixture, html } from '@open-wc/testing-helpers'
import type { UsDatepicker } from './UsDatepicker'
import type { IDatepickerBaseOptions } from './models/IDatepickerBaseOptions'
import { EnumDatepickerPresets } from './models/IDatepickerBaseOptions'
import './UsDatepicker'
function addDays(days: number) {
const date = new Date()
date.setDate(date.getDate() + days)
return date
}
describe('UsDatepicker', () => {
let datepicker: UsDatepicker
let widgetView: IDatepickerBaseOptions['widgetView']
let locale = 'en'
let options: IDatepickerBaseOptions['options'] = {}
let datepickerData: IDatepickerBaseOptions['datepickerData']
const containerSize = { width: 400, height: 400 }
const getElShadowRoot = (): HTMLElement => {
return datepicker.shadowRoot?.querySelector('.datepicker') as HTMLElement
}
beforeEach(async () => {
widgetView = 'vertical'
options = {
minDate: new Date(),
inline: false,
}
datepickerData = [
{ date: new Date().toDateString(), paymentTypes: ['expense'] },
{ date: addDays(1).toDateString(), paymentTypes: ['expense'] },
{ date: addDays(3).toDateString(), paymentTypes: ['income', 'expense'] },
{ date: addDays(9).toDateString(), paymentTypes: ['income'] },
]
datepicker = await fixture(
html`
`,
)
})
it('should display default structure datepicker', () => {
expect(datepicker).toBeDefined()
expect(datepicker.tagName).toBe('US-DATEPICKER')
})
it('default has expected props and props values', () => {
expect(datepicker.widgetView).toBeDefined()
expect(datepicker.widgetView).toBe(widgetView)
expect(datepicker.locale).toBeDefined()
expect(datepicker.locale).toBe(locale)
expect(datepicker.containerSize).toBeDefined()
expect(datepicker.containerSize).toEqual(containerSize)
expect(datepicker.legend).toBeUndefined()
expect(datepicker.showLegend).toBeFalsy()
expect(datepicker.placeholder).toBe('')
expect(datepicker.initialPreset).toBe(EnumDatepickerPresets.CUSTOM)
expect(datepicker.availablePresets).toEqual([])
expect(datepicker.options).toBeDefined()
expect(datepicker.datepickerOptions).not.toEqual(options)
expect(datepicker.datepickerData).toBeDefined()
expect(datepicker.datepickerData).toEqual(datepickerData)
expect(datepicker.dataTestId).toBe('datepicker')
})
it('default has expected classes for datepicker container', () => {
const container = getElShadowRoot()
const classList = container.className.trim()
expect(classList).toContain('datepicker')
expect(classList).toContain('vertical')
})
it('should have initSimpleBar / disposeSimpleBar methods', () => {
expect(datepicker.initSimpleBar).toBeDefined()
expect(datepicker.disposeSimpleBar).toBeDefined()
})
it('should have a getDefaultHeight method', () => {
expect(datepicker.getDefaultHeight).toBeDefined()
})
it('should have a configurateDatepicker method', () => {
expect(datepicker.configurateDatepicker).toBeDefined()
})
it('should have a onChangeViewDate method', () => {
expect(datepicker.onChangeViewDate).toBeDefined()
})
it('should have a onChangeView method', () => {
expect(datepicker.onChangeView).toBeDefined()
})
it('should have a onShow method', () => {
expect(datepicker.onShow).toBeDefined()
})
it('should have a onHide method', () => {
expect(datepicker.onHide).toBeDefined()
})
it('should have a onSelect method', () => {
expect(datepicker.onSelect).toBeDefined()
})
it('should have a onRenderCell method', () => {
expect(datepicker.onRenderCell).toBeDefined()
})
it('should change locale in datepicker and date-formatting', async () => {
locale = 'es'
datepicker = await fixture(
html`
`,
)
const dateFormatting = datepicker.datepickerOptions.dateFormat
const daysShort = datepicker.datepickerOptions.locale?.daysShort
expect(dateFormatting).toBe('d MMM yyyy')
expect(daysShort).toEqual(['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'])
})
// it('should filter presets if availablePresets has been provided', async () => {
// const availablePresets = [EnumDatepickerPresets.LAST_7_DAYS, EnumDatepickerPresets.LAST_30_DAYS]
// datepicker = await fixture(
// html`
//
// `,
// )
// const listItems = getElShadowRoot().querySelectorAll('.datepicker__list-item')
// expect(datepicker.filteredPresets).length(2)
// expect(listItems).length(2)
// })
it('should toggle menu state', async () => {
datepicker.isMenuOpen = true
await elementUpdated(datepicker)
datepicker.toggleMenu()
expect(datepicker.isMenuOpen).toBeFalsy()
})
it('should close menu state', async () => {
datepicker.isMenuOpen = true
await elementUpdated(datepicker)
datepicker.closeMenu()
expect(datepicker.isMenuOpen).toBeFalsy()
})
it('should open datepicker after custom preset has been selected', async () => {
const customPresetEl = getElShadowRoot().querySelector('.datepicker__list-item') as HTMLLIElement
customPresetEl?.click()
expect(datepicker.isDatepickerOpen).toBeTruthy()
expect(datepicker.isMenuOpen).toBeFalsy()
})
})