Fix/linting * fix import issues and add lint check no-extraneous-dependencies * fix use type HotelType instead of string Approved-by: Anton Gunnarsson
402 lines
9.8 KiB
TypeScript
402 lines
9.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { getGroupedOpeningHours } from './utils'
|
|
|
|
import type { IntlShape } from 'react-intl'
|
|
import { OpeningHours } from './openingHoursTypes'
|
|
|
|
// Mock IntlShape for testing
|
|
const mockIntl = {
|
|
formatMessage: ({ defaultMessage }: { defaultMessage: string }) => {
|
|
const messages: Record<string, string> = {
|
|
Monday: 'Monday',
|
|
Tuesday: 'Tuesday',
|
|
Wednesday: 'Wednesday',
|
|
Thursday: 'Thursday',
|
|
Friday: 'Friday',
|
|
Saturday: 'Saturday',
|
|
Sunday: 'Sunday',
|
|
Closed: 'Closed',
|
|
'Always open': 'Always open',
|
|
}
|
|
return messages[defaultMessage] || defaultMessage
|
|
},
|
|
} as IntlShape
|
|
|
|
describe('getGroupedOpeningHours', () => {
|
|
it('should group all days as closed', () => {
|
|
const allDaysClosed: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 3,
|
|
},
|
|
thursday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 4,
|
|
},
|
|
friday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 5,
|
|
},
|
|
saturday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 6,
|
|
},
|
|
sunday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 7,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(allDaysClosed, mockIntl)
|
|
expect(result).toEqual(['Monday-Sunday: Closed'])
|
|
})
|
|
|
|
it('should group all days with same opening hours', () => {
|
|
const allDaysSameHours: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
thursday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 4,
|
|
},
|
|
friday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 5,
|
|
},
|
|
saturday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 6,
|
|
},
|
|
sunday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 7,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(allDaysSameHours, mockIntl)
|
|
expect(result).toEqual(['Monday-Sunday: 09:00-17:00'])
|
|
})
|
|
|
|
it('should handle mixed opening hours', () => {
|
|
const mixedOpeningHours: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
thursday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 4,
|
|
},
|
|
friday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 5,
|
|
},
|
|
saturday: {
|
|
openingTime: '10:00',
|
|
closingTime: '15:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 6,
|
|
},
|
|
sunday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 7,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(mixedOpeningHours, mockIntl)
|
|
expect(result).toEqual([
|
|
'Monday-Friday: 09:00-17:00',
|
|
'Saturday: 10:00-15:00',
|
|
'Sunday: Closed',
|
|
])
|
|
})
|
|
|
|
it('should handle always open days', () => {
|
|
const someAlwaysOpen: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
alwaysOpen: true,
|
|
isClosed: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
alwaysOpen: true,
|
|
isClosed: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
thursday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 4,
|
|
},
|
|
friday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 5,
|
|
},
|
|
saturday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 6,
|
|
},
|
|
sunday: {
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
openingTime: '',
|
|
closingTime: '',
|
|
sortOrder: 7,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(someAlwaysOpen, mockIntl)
|
|
expect(result).toEqual([
|
|
'Monday-Tuesday: Always open',
|
|
'Wednesday-Friday: 09:00-17:00',
|
|
'Saturday-Sunday: Closed',
|
|
])
|
|
})
|
|
|
|
it('should handle missing days', () => {
|
|
const missingDays: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
wednesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
friday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 5,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(missingDays, mockIntl)
|
|
expect(result).toEqual([
|
|
'Monday: 09:00-17:00',
|
|
'Wednesday: 09:00-17:00',
|
|
'Friday: 09:00-17:00',
|
|
])
|
|
})
|
|
|
|
it('should not group non-consecutive days with same hours', () => {
|
|
const nonConsecutiveSameHours: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
openingTime: '10:00',
|
|
closingTime: '18:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(nonConsecutiveSameHours, mockIntl)
|
|
expect(result).toEqual([
|
|
'Monday: 09:00-17:00',
|
|
'Tuesday: 10:00-18:00',
|
|
'Wednesday: 09:00-17:00',
|
|
])
|
|
})
|
|
|
|
it('should handle nullable opening/closing times', () => {
|
|
const nullableHours: OpeningHours = {
|
|
isActive: true,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '',
|
|
closingTime: '',
|
|
isClosed: true,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 2,
|
|
},
|
|
wednesday: {
|
|
openingTime: '',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 3,
|
|
},
|
|
}
|
|
const result = getGroupedOpeningHours(nullableHours, mockIntl)
|
|
expect(result).toEqual([
|
|
'Monday: Closed',
|
|
// Tuesday and Wednesday won't appear in the result because they have empty string values
|
|
// that don't match any of the conditions in the getGroupedOpeningHours function
|
|
])
|
|
})
|
|
|
|
it('should handle inactive restaurant hours', () => {
|
|
const inactiveHours: OpeningHours = {
|
|
isActive: false,
|
|
name: 'Opening hours',
|
|
nameEnglish: 'Opening hours',
|
|
monday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 1,
|
|
},
|
|
tuesday: {
|
|
openingTime: '09:00',
|
|
closingTime: '17:00',
|
|
isClosed: false,
|
|
alwaysOpen: false,
|
|
sortOrder: 2,
|
|
},
|
|
}
|
|
// Even though isActive is false, the function should still process the hours
|
|
// as it doesn't check for the isActive flag
|
|
const result = getGroupedOpeningHours(inactiveHours, mockIntl)
|
|
expect(result).toEqual(['Monday-Tuesday: 09:00-17:00'])
|
|
})
|
|
})
|