@oslokommune/punkt-elements
Version:
Komponentbiblioteket til Punkt, et designsystem laget av Oslo Origo
111 lines (85 loc) • 4.07 kB
text/typescript
import '@testing-library/jest-dom'
import { parseISODateString } from 'shared-utils/date-utils'
import './calendar'
import { PktCalendar } from './calendar'
const waitForCustomElements = async () => {
await customElements.whenDefined('pkt-calendar')
}
// Helper function to create calendar markup
const createCalendar = async (calendarProps = '') => {
const container = document.createElement('div')
container.innerHTML = `
<pkt-calendar ${calendarProps}></pkt-calendar>
`
document.body.appendChild(container)
await waitForCustomElements()
return container
}
// Cleanup after each test
afterEach(() => {
document.body.innerHTML = ''
})
describe('PktCalendar', () => {
describe('Date range functionality', () => {
test('handles earliest date property correctly', async () => {
const earliestDate = '2024-01-15'
// Set current month to January 2024 so we can see disabled dates before the 15th
const container = await createCalendar(`earliest="${earliestDate}" currentmonth="2024-01-01"`)
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
expect(calendar.earliest).toBe(earliestDate)
// Check that dates before earliest are disabled (dates 1-14 should be disabled)
const disabledDates = calendar.querySelectorAll('.pkt-calendar__date--disabled')
expect(disabledDates.length).toBeGreaterThan(0)
})
test('handles latest date property correctly', async () => {
const latestDate = '2024-12-15'
const container = await createCalendar(`latest="${latestDate}"`)
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
expect(calendar.latest).toBe(latestDate)
})
test('restricts selectable dates between earliest and latest', async () => {
// Set current month to June 2024 so we can see the date range restrictions
const container = await createCalendar(
'earliest="2024-06-10" latest="2024-06-20" currentmonth="2024-06-01"',
)
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
const enabledDates = calendar.querySelectorAll(
'.pkt-calendar__date:not(.pkt-calendar__date--disabled)',
)
const disabledDates = calendar.querySelectorAll('.pkt-calendar__date--disabled')
expect(enabledDates.length).toBeGreaterThan(0)
expect(disabledDates.length).toBeGreaterThan(0)
})
})
describe('Date exclusion functionality', () => {
test('excludes specific dates correctly', async () => {
const excludedDates = '2024-06-15,2024-06-20'
const container = await createCalendar(`excludedates="${excludedDates}"`)
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
expect(calendar.excludedates).toHaveLength(2)
expect(calendar.excludedates[0]).toEqual(parseISODateString('2024-06-15'))
expect(calendar.excludedates[1]).toEqual(parseISODateString('2024-06-20'))
})
test('excludes weekdays correctly', async () => {
// Exclude weekends (Saturday=6, Sunday=0)
const container = await createCalendar('excludeweekdays="0,6"')
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
expect(calendar.excludeweekdays).toEqual(['0', '6'])
// Check that weekend dates are disabled
const disabledDates = calendar.querySelectorAll('.pkt-calendar__date--disabled')
expect(disabledDates.length).toBeGreaterThan(0)
})
test('excludes both specific dates and weekdays', async () => {
const container = await createCalendar('excludedates="2024-06-15" excludeweekdays="0,6"')
const calendar = container.querySelector('pkt-calendar') as PktCalendar
await calendar.updateComplete
expect(calendar.excludedates).toHaveLength(1)
expect(calendar.excludeweekdays).toEqual(['0', '6'])
})
})
})