Skip to content

Commit a5a609a

Browse files
committed
test(NcDateTimePicker): add snapshot tests for localized formatting
Signed-off-by: Oleksandr Dzhychko <hey@oleks.dev>
1 parent 20e1809 commit a5a609a

9 files changed

Lines changed: 24263 additions & 18 deletions

File tree

src/components/NcDateTimePicker/NcDateTimePicker.vue

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ import NcIconSvgWrapper from '../NcIconSvgWrapper/NcIconSvgWrapper.vue'
293293
import NcTimezonePicker from '../NcTimezonePicker/NcTimezonePicker.vue'
294294
import { t } from '../../l10n.ts'
295295
import NcButton from '../NcButton/index.ts'
296+
import { getDateFormat, getDateRangeFormat, getDateTimeFormat, getDateTimeRangeFormat, getMonthFormat, getTimeFormat, getTimeRangeFormat, getYearFormat } from './format.ts'
296297
import useDateFnsLocale from './useDateFnsLocale.ts'
297298
298299
type LibraryFormatOptions = VueDatePickerProps['format']
@@ -557,23 +558,23 @@ const realFormat = computed<LibraryFormatOptions>(() => {
557558
return 'RR-II'
558559
}
559560
560-
let formatter: Intl.DateTimeFormat | undefined
561-
if (props.type === 'date' || props.type === 'date-range') {
562-
formatter = new Intl.DateTimeFormat(realLocale, { dateStyle: 'medium' })
563-
} else if (props.type === 'time' || props.type === 'time-range') {
564-
formatter = new Intl.DateTimeFormat(realLocale, { timeStyle: 'short' })
565-
} else if (props.type === 'datetime' || props.type === 'datetime-range') {
566-
formatter = new Intl.DateTimeFormat(realLocale, { dateStyle: 'medium', timeStyle: 'short' })
567-
} else if (props.type === 'month') {
568-
formatter = new Intl.DateTimeFormat(realLocale, { year: 'numeric', month: '2-digit' })
569-
} else if (props.type === 'year') {
570-
formatter = new Intl.DateTimeFormat(realLocale, { year: 'numeric' })
571-
}
572-
573-
if (formatter) {
574-
return (input: Date | [Date, Date]) => Array.isArray(input)
575-
? formatter.formatRange(input[0], input[1])
576-
: formatter.format(input)
561+
switch (props.type) {
562+
case 'date':
563+
return getDateFormat(realLocale)
564+
case 'date-range':
565+
return getDateRangeFormat(realLocale)
566+
case 'time':
567+
return getTimeFormat(realLocale)
568+
case 'time-range':
569+
return getTimeRangeFormat(realLocale)
570+
case 'datetime':
571+
return getDateTimeFormat(realLocale)
572+
case 'datetime-range':
573+
return getDateTimeRangeFormat(realLocale)
574+
case 'month':
575+
return getMonthFormat(realLocale)
576+
case 'year':
577+
return getYearFormat(realLocale)
577578
}
578579
579580
// fallback to default formatting
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
type DateFormat = ((date: Date) => string)
7+
type DateRangeFormat = ((dates: Date[]) => string)
8+
type LocaleCode = string
9+
10+
export function getDateFormat(locale: LocaleCode): DateFormat {
11+
const formatter = new Intl.DateTimeFormat(locale, { dateStyle: 'medium' })
12+
return (date) => {
13+
return formatter.format(date)
14+
}
15+
}
16+
17+
export function getDateRangeFormat(locale: LocaleCode): DateRangeFormat {
18+
const formatter = new Intl.DateTimeFormat(locale, { dateStyle: 'medium' })
19+
return (dates) => {
20+
return formatter.formatRange(dates[0], dates[1])
21+
}
22+
}
23+
24+
export function getTimeFormat(locale: LocaleCode): DateFormat {
25+
const formatter = new Intl.DateTimeFormat(locale, { timeStyle: 'short' })
26+
return (date) => {
27+
return formatter.format(date)
28+
}
29+
}
30+
31+
export function getTimeRangeFormat(locale: LocaleCode): DateRangeFormat {
32+
const formatter = new Intl.DateTimeFormat(locale, { timeStyle: 'short' })
33+
return (dates) => {
34+
return formatter.formatRange(dates[0], dates[1])
35+
}
36+
}
37+
38+
export function getDateTimeFormat(locale: LocaleCode): DateFormat {
39+
const formatter = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' })
40+
return (date) => {
41+
return formatter.format(date)
42+
}
43+
}
44+
45+
export function getDateTimeRangeFormat(locale: LocaleCode): DateRangeFormat {
46+
const formatter = new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' })
47+
return (dates) => {
48+
return formatter.formatRange(dates[0], dates[1])
49+
}
50+
}
51+
52+
export function getMonthFormat(locale: LocaleCode): DateFormat {
53+
const formatter = new Intl.DateTimeFormat(locale, { year: 'numeric', month: '2-digit' })
54+
return (date) => {
55+
return formatter.format(date)
56+
}
57+
}
58+
59+
export function getYearFormat(locale: LocaleCode): DateFormat {
60+
const formatter = new Intl.DateTimeFormat(locale, { year: 'numeric' })
61+
return (date) => {
62+
return formatter.format(date)
63+
}
64+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<!--
2+
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
3+
- SPDX-License-Identifier: AGPL-3.0-or-later
4+
-->
5+
6+
<template>
7+
<pre>{{ snapshotString }}</pre>
8+
</template>
9+
10+
<script setup lang="ts">
11+
import { getDateFormat, getDateRangeFormat, getDateTimeFormat, getDateTimeRangeFormat, getMonthFormat, getTimeFormat, getTimeRangeFormat, getYearFormat } from '../../../../src/components/NcDateTimePicker/format.ts'
12+
import allLocales from './allLocales.ts'
13+
14+
const date = new Date(2000, 0, 2, 3, 4)
15+
const dateRange = [new Date(2000, 0, 1), new Date(2000, 0, 7)]
16+
const timeRange = [new Date(2000, 0, 1, 2, 3), new Date(2000, 0, 1, 8, 9)]
17+
const dateTimeRange = [new Date(2000, 0, 1, 2, 3), new Date(2000, 0, 7, 8, 9)]
18+
19+
const snapshot = {
20+
21+
}
22+
23+
for (const locale of allLocales) {
24+
const localeCode = locale.code.replaceAll('_', '-')
25+
if (Intl.DateTimeFormat.supportedLocalesOf([localeCode]).length === 0) {
26+
continue
27+
}
28+
snapshot[localeCode] = {
29+
localeName: locale.name,
30+
date: getDateFormat(localeCode)(date),
31+
dateRange: getDateRangeFormat(localeCode)(dateRange),
32+
time: getTimeFormat(localeCode)(date),
33+
timeRange: getTimeRangeFormat(localeCode)(timeRange),
34+
dateTime: getDateTimeFormat(localeCode)(date),
35+
dateTimeRange: getDateTimeRangeFormat(localeCode)(dateTimeRange),
36+
month: getMonthFormat(localeCode)(date),
37+
year: getYearFormat(localeCode)(date),
38+
}
39+
}
40+
41+
const snapshotString = JSON.stringify(snapshot, null, 2)
42+
</script>

tests/component/components/NcDateTimePicker.spec.ts renamed to tests/component/components/NcDateTimePicker/NcDateTimePicker.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import { expect, test } from '@playwright/experimental-ct-vue'
7-
import NcDateTimePicker from '../../../src/components/NcDateTimePicker/NcDateTimePicker.vue'
7+
import NcDateTimePicker from '../../../../src/components/NcDateTimePicker/NcDateTimePicker.vue'
88

99
test('aria-label set on input element', async ({ mount, page }) => {
1010
await mount(NcDateTimePicker, {

0 commit comments

Comments
 (0)