Skip to content

Commit 9e452bb

Browse files
committed
tests: update tests
1 parent 4ba5365 commit 9e452bb

File tree

2 files changed

+299
-31
lines changed

2 files changed

+299
-31
lines changed

js/tests/unit/calendar.spec.js

Lines changed: 299 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,299 @@
1+
/* eslint-env jasmine */
2+
3+
import Calendar from '../../src/calendar.js'
4+
import { getFixture, clearFixture, createEvent, jQueryMock } from '../helpers/fixture.js'
5+
import EventHandler from '../../src/dom/event-handler.js'
6+
7+
describe('Calendar', () => {
8+
let fixtureEl
9+
10+
beforeAll(() => {
11+
fixtureEl = getFixture()
12+
})
13+
14+
afterEach(() => {
15+
clearFixture()
16+
})
17+
18+
describe('Default', () => {
19+
it('should return plugin default config', () => {
20+
expect(Calendar.Default).toEqual(jasmine.any(Object))
21+
})
22+
})
23+
24+
describe('DefaultType', () => {
25+
it('should return plugin default type config', () => {
26+
expect(Calendar.DefaultType).toEqual(jasmine.any(Object))
27+
})
28+
})
29+
30+
describe('NAME', () => {
31+
it('should return plugin NAME', () => {
32+
expect(Calendar.NAME).toEqual('calendar')
33+
})
34+
})
35+
36+
describe('constructor', () => {
37+
it('should create a Calendar instance with default config if no config is provided', () => {
38+
fixtureEl.innerHTML = '<div></div>'
39+
40+
const div = fixtureEl.querySelector('div')
41+
const calendar = new Calendar(div)
42+
43+
expect(calendar).toBeInstanceOf(Calendar)
44+
expect(calendar._config).toBeDefined()
45+
expect(calendar._element).toEqual(div)
46+
})
47+
48+
it('should allow overriding default config', () => {
49+
fixtureEl.innerHTML = '<div></div>'
50+
51+
const div = fixtureEl.querySelector('div')
52+
const calendar = new Calendar(div, {
53+
locale: 'fr',
54+
calendars: 2,
55+
selectionType: 'month'
56+
})
57+
58+
expect(calendar._config.locale).toEqual('fr')
59+
expect(calendar._config.calendars).toEqual(2)
60+
expect(calendar._config.selectionType).toEqual('month')
61+
})
62+
63+
it('should set `_view` based on `selectionType`', () => {
64+
fixtureEl.innerHTML = '<div></div>'
65+
66+
const div = fixtureEl.querySelector('div')
67+
const calendar = new Calendar(div, {
68+
selectionType: 'year'
69+
})
70+
71+
expect(calendar._view).toEqual('years')
72+
})
73+
74+
it('should properly create the initial markup for days view', () => {
75+
fixtureEl.innerHTML = '<div></div>'
76+
77+
const div = fixtureEl.querySelector('div')
78+
new Calendar(div) // eslint-disable-line no-new
79+
80+
// Check if .calendar container is created
81+
expect(div.querySelector('.calendar')).not.toBeNull()
82+
83+
// Check if .calendar-nav exists
84+
expect(div.querySelector('.calendar-nav')).not.toBeNull()
85+
86+
// Check if a table with <thead> is created (days view)
87+
expect(div.querySelector('.calendar table thead')).not.toBeNull()
88+
expect(div.querySelector('.calendar table tbody')).not.toBeNull()
89+
})
90+
})
91+
92+
describe('update', () => {
93+
it('should clear the calendar HTML and create a new one', () => {
94+
fixtureEl.innerHTML = '<div></div>'
95+
96+
const div = fixtureEl.querySelector('div')
97+
const calendar = new Calendar(div)
98+
const oldHtml = div.innerHTML
99+
100+
calendar.update({
101+
selectionType: 'month'
102+
})
103+
104+
expect(div.innerHTML).not.toEqual(oldHtml)
105+
// Now we should see the months view
106+
expect(div.querySelector('.calendar table thead')).toBeNull()
107+
expect(div.querySelector('.calendar table tbody')).not.toBeNull()
108+
expect(div.querySelector('.month')).not.toBeNull()
109+
})
110+
111+
it('should use the new config object after update', () => {
112+
fixtureEl.innerHTML = '<div></div>'
113+
114+
const div = fixtureEl.querySelector('div')
115+
const calendar = new Calendar(div)
116+
117+
calendar.update({
118+
showWeekNumber: true
119+
})
120+
121+
expect(calendar._config.showWeekNumber).toBeTrue()
122+
expect(div.classList).toContain('show-week-numbers')
123+
})
124+
})
125+
126+
describe('keyboard navigation', () => {
127+
it('should select a date on Enter key press', () => {
128+
return new Promise(resolve => {
129+
fixtureEl.innerHTML = '<div></div>'
130+
const div = fixtureEl.querySelector('div')
131+
const calendar = new Calendar(div)
132+
const showSpy = spyOn(calendar, '_handleCalendarClick').and.callThrough()
133+
134+
setTimeout(() => {
135+
const dayCell = div.querySelector('.calendar-cell[tabindex="0"]')
136+
expect(dayCell).not.toBeNull()
137+
138+
const keydownEvent = createEvent('keydown')
139+
keydownEvent.key = 'Enter'
140+
dayCell.dispatchEvent(keydownEvent)
141+
142+
expect(showSpy).toHaveBeenCalled()
143+
resolve()
144+
}, 10)
145+
})
146+
})
147+
})
148+
149+
describe('events', () => {
150+
it('should emit `calendarDateChange.coreui.calendar` when the calendar date changes', () => {
151+
fixtureEl.innerHTML = '<div></div>'
152+
const div = fixtureEl.querySelector('div')
153+
const calendar = new Calendar(div)
154+
const listener = jasmine.createSpy('listener')
155+
156+
div.addEventListener('calendarDateChange.coreui.calendar', listener)
157+
// For example, go to next month
158+
calendar._modifyCalendarDate(0, 1)
159+
160+
expect(listener).toHaveBeenCalled()
161+
})
162+
163+
it('should emit `startDateChange.coreui.calendar` when the start date is set', () => {
164+
fixtureEl.innerHTML = '<div></div>'
165+
const div = fixtureEl.querySelector('div')
166+
const calendar = new Calendar(div)
167+
const listener = jasmine.createSpy('listener')
168+
169+
div.addEventListener('startDateChange.coreui.calendar', listener)
170+
calendar._setStartDate(new Date())
171+
172+
expect(listener).toHaveBeenCalled()
173+
})
174+
175+
it('should emit `endDateChange.coreui.calendar` when the end date is set', () => {
176+
fixtureEl.innerHTML = '<div></div>'
177+
const div = fixtureEl.querySelector('div')
178+
const calendar = new Calendar(div)
179+
const listener = jasmine.createSpy('listener')
180+
181+
div.addEventListener('endDateChange.coreui.calendar', listener)
182+
calendar._setEndDate(new Date())
183+
184+
expect(listener).toHaveBeenCalled()
185+
})
186+
})
187+
188+
describe('dispose', () => {
189+
it('should dispose Calendar instance', () => {
190+
fixtureEl.innerHTML = '<div></div>'
191+
const div = fixtureEl.querySelector('div')
192+
const calendar = new Calendar(div)
193+
const spy = spyOn(EventHandler, 'off').and.callThrough()
194+
195+
expect(calendar._element).toEqual(div)
196+
calendar.dispose()
197+
198+
// Typically, you'd set `_element` to null after disposing
199+
expect(calendar._element).toBeNull()
200+
// Should remove all event handlers
201+
expect(spy.calls.count()).toBeGreaterThan(0)
202+
})
203+
})
204+
205+
describe('jQueryInterface', () => {
206+
it('should create a calendar via jQueryInterface', () => {
207+
fixtureEl.innerHTML = '<div data-coreui-toggle="calendar"></div>'
208+
const element = fixtureEl.querySelector('[data-coreui-toggle="calendar"]')
209+
210+
jQueryMock.fn.calendar = Calendar.jQueryInterface
211+
jQueryMock.elements = [element]
212+
jQueryMock.fn.calendar.call(jQueryMock)
213+
214+
expect(Calendar.getInstance(element)).not.toBeNull()
215+
})
216+
217+
it('should throw error on undefined method', () => {
218+
fixtureEl.innerHTML = '<div data-coreui-toggle="calendar"></div>'
219+
const element = fixtureEl.querySelector('[data-coreui-toggle="calendar"]')
220+
221+
jQueryMock.fn.calendar = Calendar.jQueryInterface
222+
jQueryMock.elements = [element]
223+
224+
expect(() => {
225+
jQueryMock.fn.calendar.call(jQueryMock, 'noMethod')
226+
}).toThrowError(TypeError, 'No method named "noMethod"')
227+
})
228+
})
229+
230+
describe('getInstance', () => {
231+
it('should return calendar instance', () => {
232+
fixtureEl.innerHTML = '<div></div>'
233+
234+
const div = fixtureEl.querySelector('div')
235+
const calendar = new Calendar(div)
236+
237+
expect(Calendar.getInstance(div)).toEqual(calendar)
238+
expect(Calendar.getInstance(div)).toBeInstanceOf(Calendar)
239+
})
240+
241+
it('should return null when there is no calendar instance', () => {
242+
fixtureEl.innerHTML = '<div></div>'
243+
const div = fixtureEl.querySelector('div')
244+
245+
expect(Calendar.getInstance(div)).toBeNull()
246+
})
247+
})
248+
249+
describe('getOrCreateInstance', () => {
250+
it('should return calendar instance', () => {
251+
fixtureEl.innerHTML = '<div></div>'
252+
253+
const div = fixtureEl.querySelector('div')
254+
const calendar = new Calendar(div)
255+
256+
expect(Calendar.getOrCreateInstance(div)).toEqual(calendar)
257+
expect(Calendar.getInstance(div)).toEqual(Calendar.getOrCreateInstance(div, {}))
258+
expect(Calendar.getOrCreateInstance(div)).toBeInstanceOf(Calendar)
259+
})
260+
261+
it('should return new instance when there is no calendar instance', () => {
262+
fixtureEl.innerHTML = '<div></div>'
263+
264+
const div = fixtureEl.querySelector('div')
265+
266+
expect(Calendar.getInstance(div)).toBeNull()
267+
expect(Calendar.getOrCreateInstance(div)).toBeInstanceOf(Calendar)
268+
})
269+
270+
it('should return new instance when there is no calendar instance with given configuration', () => {
271+
fixtureEl.innerHTML = '<div></div>'
272+
273+
const div = fixtureEl.querySelector('div')
274+
275+
expect(Calendar.getInstance(div)).toBeNull()
276+
const calendar = Calendar.getOrCreateInstance(div, {
277+
calendars: 3
278+
})
279+
expect(calendar).toBeInstanceOf(Calendar)
280+
expect(calendar._config.calendars).toEqual(3)
281+
})
282+
283+
it('should return the same instance when exists, ignoring new configuration', () => {
284+
fixtureEl.innerHTML = '<div></div>'
285+
286+
const div = fixtureEl.querySelector('div')
287+
const calendar = new Calendar(div, {
288+
calendars: 2
289+
})
290+
291+
const calendar2 = Calendar.getOrCreateInstance(div, {
292+
calendars: 5
293+
})
294+
expect(calendar2).toEqual(calendar)
295+
// Original config is still used
296+
expect(calendar2._config.calendars).toEqual(2)
297+
})
298+
})
299+
})

js/tests/unit/range-slider.spec.js

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -153,37 +153,6 @@ describe('RangeSlider', () => {
153153
resolve()
154154
})
155155
})
156-
157-
it('should handle dragging interactions', () => {
158-
return new Promise(resolve => {
159-
fixtureEl.innerHTML = `
160-
<div data-coreui-toggle="range-slider" data-coreui-value="25,75"></div>
161-
`
162-
163-
const element = fixtureEl.querySelector('[data-coreui-toggle="range-slider"]')
164-
const rangeSlider = new RangeSlider(element)
165-
166-
element.addEventListener('change.coreui.range-slider', event => {
167-
const newValue = event.value
168-
expect(newValue).toEqual([50, 75])
169-
resolve()
170-
})
171-
172-
const container = element.querySelector('.range-slider-inputs-container')
173-
174-
// Simulate mousedown on the first input
175-
const mousedownEvent = createEvent('mousedown', { clientX: 100 })
176-
container.dispatchEvent(mousedownEvent)
177-
178-
// Simulate mousemove to update the slider
179-
const mousemoveEvent = createEvent('mousemove', { clientX: 200 })
180-
document.documentElement.dispatchEvent(mousemoveEvent)
181-
182-
// Simulate mouseup to end dragging
183-
const mouseupEvent = createEvent('mouseup')
184-
document.documentElement.dispatchEvent(mouseupEvent)
185-
})
186-
})
187156
})
188157

189158
describe('Configuration Options', () => {

0 commit comments

Comments
 (0)