UNPKG

vuetify

Version:

Vue Material Component Framework

359 lines (296 loc) 12.5 kB
import CalendarWithIntervals from '../calendar-with-intervals' import { CalendarTimestamp } from 'vuetify/types' import { parseTimestamp } from '../../util/timestamp' import { mount, Wrapper, MountOptions, } from '@vue/test-utils' import { ExtractVue } from '../../../../util/mixins' const Mock = CalendarWithIntervals.extend({ render: h => h('div'), }) const createMouseEvent = (x, y) => ({ clientX: x, clientY: y, currentTarget: document.body, }) const createTouchEvent = (x, y) => ({ touches: [{ clientX: x, clientY: y, }], currentTarget: document.body, }) describe('calendar-with-intervals.ts', () => { type Instance = ExtractVue<typeof Mock> let mountFunction: (options?: MountOptions<Instance>) => Wrapper<Instance> beforeEach(() => { mountFunction = (options?: MountOptions<Instance>) => { return mount(Mock, { ...options, mocks: { $vuetify: { lang: { current: 'en-US', }, }, }, }) } }) it('should parse all data', async () => { const wrapper = mountFunction({ propsData: { firstInterval: '1', intervalMinutes: '30', intervalCount: '10', intervalHeight: '20', }, }) expect(wrapper.vm.parsedFirstInterval).toBeDefined() expect(wrapper.vm.parsedFirstInterval).toBe(1) expect(wrapper.vm.parsedIntervalMinutes).toBeDefined() expect(wrapper.vm.parsedIntervalMinutes).toBe(30) expect(wrapper.vm.parsedIntervalCount).toBeDefined() expect(wrapper.vm.parsedIntervalCount).toBe(10) expect(wrapper.vm.parsedIntervalHeight).toBeDefined() expect(wrapper.vm.parsedIntervalHeight).toBe(20) }) it('should generate firstMinute', async () => { const wrapper = mountFunction({ propsData: { firstInterval: '2', intervalMinutes: '30', }, }) expect(wrapper.vm.firstMinute).toBeDefined() expect(wrapper.vm.firstMinute).toBe(60) }) it('should generate bodyHeight', async () => { const wrapper = mountFunction({ propsData: { intervalCount: '10', intervalHeight: '20', }, }) expect(wrapper.vm.bodyHeight).toBeDefined() expect(wrapper.vm.bodyHeight).toBe(200) }) it('should generate days', async () => { const wrapper = mountFunction({ propsData: { start: '2019-01-29', end: '2019-02-04', }, }) expect(wrapper.vm.days).toBeDefined() expect(wrapper.vm.days).toHaveLength(7) expect(wrapper.vm.days[0].date).toBe('2019-01-29') expect(wrapper.vm.days[6].date).toBe('2019-02-04') expect(wrapper.vm.days).toMatchSnapshot() wrapper.setProps({ start: '2019-01-29', end: '2019-02-02', }) expect(wrapper.vm.days).toBeDefined() expect(wrapper.vm.days).toHaveLength(5) expect(wrapper.vm.days[0].date).toBe('2019-01-29') expect(wrapper.vm.days[4].date).toBe('2019-02-02') expect(wrapper.vm.days).toMatchSnapshot() }) it('should generate intervals', async () => { const wrapper = mountFunction({ propsData: { start: '2019-01-29', end: '2019-02-04', }, }) expect(wrapper.vm.intervals).toBeDefined() expect(wrapper.vm.intervals).toHaveLength(7) expect(wrapper.vm.intervals[0]).toHaveLength(24) expect(wrapper.vm.intervals[0][0].date).toBe('2019-01-29') expect(wrapper.vm.intervals[6][0].date).toBe('2019-02-04') expect(wrapper.vm.intervals).toMatchSnapshot() wrapper.setProps({ start: '2019-01-29', end: '2019-02-02', }) expect(wrapper.vm.intervals).toBeDefined() expect(wrapper.vm.intervals).toHaveLength(5) expect(wrapper.vm.intervals[0]).toHaveLength(24) expect(wrapper.vm.intervals[0][0].date).toBe('2019-01-29') expect(wrapper.vm.intervals[4][0].date).toBe('2019-02-02') expect(wrapper.vm.intervals).toMatchSnapshot() }) it('should generate intervalFormatter', async () => { const wrapper = mountFunction() expect(wrapper.vm.intervalFormatter).toBeDefined() expect(typeof wrapper.vm.intervalFormatter).toBe('function') }) // TODO: Re-enable when test doesn't break travis it.skip('should format interval', async () => { const wrapper = mountFunction() expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 8, minute: 30 } as CalendarTimestamp, false)).toBe('8:30 AM') expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 20, minute: 30 } as CalendarTimestamp, false)).toBe('8:30 PM') expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 0, minute: 30 } as CalendarTimestamp, false)).toBe('12:30 AM') expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 8, minute: 30 } as CalendarTimestamp, true)).toBe('8:30 AM') expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 20, minute: 30 } as CalendarTimestamp, true)).toBe('8:30 PM') expect(wrapper.vm.intervalFormatter({ date: '2019-02-08', hour: 0, minute: 30 } as CalendarTimestamp, true)).toBe('12:30 AM') }) it('should return intervalFormat if has one', async () => { const intervalFormat = x => x const wrapper = mountFunction({ propsData: { intervalFormat, }, }) expect(wrapper.vm.intervalFormatter).toBeDefined() expect(typeof wrapper.vm.intervalFormatter).toBe('function') expect(wrapper.vm.intervalFormatter).toBe(intervalFormat) }) it('should generate slot scope', async () => { const wrapper = mountFunction() expect(wrapper.vm.getSlotScope(parseTimestamp('2019-02-08'))).toBeDefined() expect(wrapper.vm.getSlotScope(parseTimestamp('2019-02-08')).date).toBe('2019-02-08') const scope = wrapper.vm.getSlotScope(parseTimestamp('2019-02-08')) delete scope.week expect(scope).toMatchSnapshot() expect(typeof wrapper.vm.getSlotScope(parseTimestamp('2019-02-08')).timeToY).toBe('function') expect(typeof wrapper.vm.getSlotScope(parseTimestamp('2019-02-08')).timeDelta).toBe('function') expect(typeof wrapper.vm.getSlotScope(parseTimestamp('2019-02-08')).minutesToPixels).toBe('function') }) it('should convert time to Y', async () => { const wrapper = mountFunction() expect(typeof wrapper.vm.timeToY).toBe('function') expect(wrapper.vm.timeToY('08:30')).toBeDefined() expect(wrapper.vm.timeToY('08:30')).toBe(408) expect(wrapper.vm.timeToY('09:30')).toBe(456) expect(Math.round(wrapper.vm.timeToY('23:50') || 0)).toBe(1144) wrapper.setProps({ firstInterval: 5, intervalCount: 5, intervalMinutes: 10, bodyHeight: 400, }) expect(wrapper.vm.timeToY('08:30')).toBe(240) expect(wrapper.vm.timeToY('09:30')).toBe(240) expect(wrapper.vm.timeToY('23:50')).toBe(240) expect(wrapper.vm.timeToY('00:05')).toBe(0) expect(Math.round(wrapper.vm.timeToY('08:30', false) || 0)).toBe(2208) expect(wrapper.vm.timeToY('09:30', false)).toBe(2496) expect(wrapper.vm.timeToY('23:50', false)).toBe(6624) expect(wrapper.vm.timeToY('bad')).toBe(false) }) it('should convert time delta', async () => { const wrapper = mountFunction() expect(typeof wrapper.vm.timeDelta).toBe('function') expect(wrapper.vm.timeDelta('08:30')).toBeDefined() expect(wrapper.vm.timeDelta('08:30')).toBe((8 * 60 + 30) / 1440) expect(wrapper.vm.timeDelta('09:30')).toBe((9 * 60 + 30) / 1440) expect(Math.round(wrapper.vm.timeDelta('23:50') || 0)).toBe(1) wrapper.setProps({ firstInterval: 5, intervalCount: 5, intervalMinutes: 10, bodyHeight: 400, }) expect(wrapper.vm.timeDelta('08:30')).toBe((8 * 60 + 30 - 50) / 50) expect(wrapper.vm.timeDelta('09:30')).toBe((9 * 60 + 30 - 50) / 50) expect(wrapper.vm.timeDelta('23:50')).toBe((23 * 60 + 50 - 50) / 50) expect(wrapper.vm.timeDelta('00:50')).toBe(0) expect(wrapper.vm.timeDelta('bad')).toBe(false) }) it('should convert minutes to pixels', async () => { const wrapper = mountFunction({ propsData: { intervalMinutes: 5, bodyHeight: 200, }, }) expect(wrapper.vm.minutesToPixels).toBeDefined() expect(typeof wrapper.vm.minutesToPixels).toBe('function') expect(wrapper.vm.minutesToPixels(5)).toBeDefined() expect(wrapper.vm.minutesToPixels(5)).toBe(48) expect(wrapper.vm.minutesToPixels(10)).toBe(96) expect(wrapper.vm.minutesToPixels(50)).toBe(480) wrapper.setProps({ intervalMinutes: 10, bodyHeight: 400, }) expect(wrapper.vm.minutesToPixels(5)).toBe(24) expect(wrapper.vm.minutesToPixels(10)).toBe(48) expect(wrapper.vm.minutesToPixels(50)).toBe(240) }) it('should scroll to time', async () => { const wrapper = mountFunction({ render: h => h('div', [ h('div', { ref: 'scrollArea', }), ]), }) wrapper.vm.scrollToTime('8:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(408) wrapper.vm.scrollToTime('12:30') expect(Math.round((wrapper.vm.$refs.scrollArea as any).scrollTop)).toBe(600) wrapper.vm.scrollToTime('20:00') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(960) wrapper.setProps({ intervalMinutes: 5, bodyHeight: 200, }) wrapper.vm.scrollToTime('8:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(1152) wrapper.vm.scrollToTime('12:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(1152) wrapper.vm.scrollToTime('20:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(1152) wrapper.setProps({ intervalMinutes: 30, bodyHeight: 1700, }) wrapper.vm.scrollToTime('8:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(816) wrapper.vm.scrollToTime('12:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(1152) wrapper.vm.scrollToTime('20:30') expect((wrapper.vm.$refs.scrollArea as any).scrollTop).toBe(1152) expect(wrapper.vm.scrollToTime('20:19')).toBe(true) expect(wrapper.vm.scrollToTime('bad')).toBe(false) }) it('should get timestamp at mouse event', async () => { const wrapper = mountFunction() expect(typeof wrapper.vm.getTimestampAtEvent).toBe('function') expect(wrapper.vm.getTimestampAtEvent(createMouseEvent(0, 100) as unknown as MouseEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 2, minute: 5 }) expect(wrapper.vm.getTimestampAtEvent(createMouseEvent(0, 150) as unknown as MouseEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 3, minute: 7 }) expect(wrapper.vm.getTimestampAtEvent(createMouseEvent(0, 200) as unknown as MouseEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 4, minute: 10 }) }) it('should get timestamp at touch event', async () => { const wrapper = mountFunction() expect(typeof wrapper.vm.getTimestampAtEvent).toBe('function') expect(wrapper.vm.getTimestampAtEvent(createTouchEvent(0, 100) as unknown as TouchEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 2, minute: 5 }) expect(wrapper.vm.getTimestampAtEvent(createTouchEvent(0, 150) as unknown as TouchEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 3, minute: 7 }) expect(wrapper.vm.getTimestampAtEvent(createTouchEvent(0, 200) as unknown as TouchEvent, { time: '20:00' } as CalendarTimestamp)).toMatchObject({ hour: 4, minute: 10 }) }) it('should get style', async () => { const wrapper = mountFunction() expect(typeof wrapper.vm.intervalStyleDefault).toBe('function') expect(wrapper.vm.intervalStyleDefault({} as CalendarTimestamp)).toBeUndefined() }) it('should show interval label', async () => { const wrapper = mountFunction({ propsData: { start: '2019-01-29', end: '2019-02-04', firstInterval: 5, }, }) expect(typeof wrapper.vm.showIntervalLabelDefault).toBe('function') expect(wrapper.vm.showIntervalLabelDefault({})).toBeTruthy() expect(wrapper.vm.showIntervalLabelDefault({ hour: 0, minute: 5 } as CalendarTimestamp)).toBeTruthy() expect(wrapper.vm.showIntervalLabelDefault({ hour: 12, minute: 30 } as CalendarTimestamp)).toBeTruthy() expect(wrapper.vm.showIntervalLabelDefault({ hour: 13, minute: 0 } as CalendarTimestamp)).toBeTruthy() expect(wrapper.vm.showIntervalLabelDefault({ hour: 13, minute: 30 } as CalendarTimestamp)).toBeTruthy() }) })