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