import { nextTick } from 'vue'
import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'
import Calendar from '../src/calendar.vue'
describe('Calendar.vue', () => {
it('create', async () => {
const wrapper = mount({
data: () => ({ value: new Date('2019-04-01') }),
render() {
return
},
})
const titleEl = wrapper.find('.el-calendar__title')
expect(/2019.*April/.test(titleEl.element?.innerHTML)).toBeTruthy()
expect(wrapper.element.querySelectorAll('thead th').length).toBe(7)
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(5)
;(rows[4].lastElementChild as HTMLElement).click()
await nextTick()
expect(/2019.*May/.test(titleEl.element.innerHTML)).toBeTruthy()
const vm = wrapper.vm
const date = vm.value
expect(date.getFullYear()).toBe(2019)
expect(date.getMonth()).toBe(4)
expect(wrapper.find('.is-selected span').element.innerHTML).toBe('4')
})
it('range', () => {
const wrapper = mount(() => (
))
const titleEl = wrapper.find('.el-calendar__title')
expect(/2019.*March/.test(titleEl.element.innerHTML)).toBeTruthy()
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(4)
expect(
wrapper.element.querySelector('.el-calendar__button-group')
).toBeNull()
})
// https://github.com/element-plus/element-plus/issues/3155
it('range when the start date will be calculated to last month', () => {
const wrapper = mount(() => (
))
const titleEl = wrapper.find('.el-calendar__title')
expect(/2021.*January/.test(titleEl.element.innerHTML)).toBeTruthy()
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(5)
expect(
wrapper.element.querySelector('.el-calendar__button-group')
).toBeNull()
})
it('range tow monthes', async () => {
const wrapper = mount(() => (
))
const titleEl = wrapper.find('.el-calendar__title')
expect(/2019.*April/.test(titleEl.element.innerHTML)).toBeTruthy()
const dateTables = wrapper.element.querySelectorAll(
'.el-calendar-table.is-range'
)
expect(dateTables.length).toBe(2)
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(5)
const cell = rows[rows.length - 1].firstElementChild as HTMLElement
cell.click()
await nextTick()
expect(/2019.*May/.test(titleEl.element.innerHTML)).toBeTruthy()
expect(cell?.classList.contains('is-selected')).toBeTruthy()
})
// https://github.com/element-plus/element-plus/issues/3155
it('range tow monthes when the start date will be calculated to last month', async () => {
const wrapper = mount(() => (
))
const titleEl = wrapper.find('.el-calendar__title')
expect(/2021.*January/.test(titleEl.element.innerHTML)).toBeTruthy()
const dateTables = wrapper.element.querySelectorAll(
'.el-calendar-table.is-range'
)
expect(dateTables.length).toBe(3)
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(8)
const cell = rows[rows.length - 1].firstElementChild as HTMLElement
cell.click()
await nextTick()
expect(/2021.*March/.test(titleEl.element.innerHTML)).toBeTruthy()
expect(cell?.classList.contains('is-selected')).toBeTruthy()
})
it('firstDayOfWeek', async () => {
// default en locale, weekStart 0 Sunday
const wrapper = mount({
data: () => ({ value: new Date('2019-04-01') }),
render() {
return
},
})
const head = wrapper.element.querySelector('.el-calendar-table thead')
expect(head?.firstElementChild?.innerHTML).toBe('Sun')
expect(head?.lastElementChild?.innerHTML).toBe('Sat')
const firstRow = wrapper.element.querySelector('.el-calendar-table__row')
expect(firstRow?.firstElementChild?.innerHTML).toContain('31')
expect(firstRow?.lastElementChild?.innerHTML).toContain('6')
})
it('firstDayOfWeek in range mode', async () => {
const wrapper = mount({
data: () => ({ value: new Date('2019-03-04') }),
render() {
return (
)
},
})
const head = wrapper.element.querySelector('.el-calendar-table thead')
expect(head?.firstElementChild?.innerHTML).toBe('Sun')
expect(head?.lastElementChild?.innerHTML).toBe('Sat')
const firstRow = wrapper.element.querySelector('.el-calendar-table__row')
expect(firstRow?.firstElementChild?.innerHTML).toContain('3')
expect(firstRow?.lastElementChild?.innerHTML).toContain('9')
})
it('click previous month or next month', async () => {
const wrapper = mount({
data: () => ({ value: new Date('2019-04-01') }),
render() {
return
},
})
await nextTick()
const btns = wrapper.findAll('.el-button')
const prevBtn = btns.at(0)
const nextBtn = btns.at(2)
await prevBtn?.trigger('click')
expect(wrapper.find('.is-selected').text()).toBe('1')
await nextBtn?.trigger('click')
expect(wrapper.find('.is-selected').text()).toBe('1')
})
it('range two years', async () => {
const wrapper = mount(() => (
))
const titleEl = wrapper.find('.el-calendar__title')
expect(/2021.*December/.test(titleEl.element.innerHTML)).toBeTruthy()
const dateTables = wrapper.element.querySelectorAll(
'.el-calendar-table.is-range'
)
expect(dateTables.length).toBe(3)
const rows = wrapper.element.querySelectorAll('.el-calendar-table__row')
expect(rows.length).toBe(6)
const cell = rows[rows.length - 1].firstElementChild as HTMLElement
cell.click()
await nextTick()
expect(/2022.*January/.test(titleEl.element.innerHTML)).toBeTruthy()
expect(cell?.classList.contains('is-selected')).toBeTruthy()
})
})