Files
web/packages/design-system/lib/components/OpeningHours/openingHours.test.ts
Joakim Jäderberg 80c3327419 Merged in fix/linting (pull request #2708)
Fix/linting

* fix import issues and add lint check no-extraneous-dependencies
* fix use type HotelType instead of string

Approved-by: Anton Gunnarsson
2025-08-27 09:22:37 +00:00

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'])
})
})