Skip to content

Commit c89c406

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

9 files changed

Lines changed: 24264 additions & 18 deletions

File tree

src/components/NcDateTimePicker/NcDateTimePicker.vue

Lines changed: 19 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']
@@ -549,23 +550,24 @@ const realFormat = computed<LibraryFormatOptions>(() => {
549550
return 'RR-II'
550551
}
551552
552-
let formatter: Intl.DateTimeFormat | undefined
553-
if (props.type === 'date' || props.type === 'date-range') {
554-
formatter = new Intl.DateTimeFormat(getCanonicalLocale(), { dateStyle: 'medium' })
555-
} else if (props.type === 'time' || props.type === 'time-range') {
556-
formatter = new Intl.DateTimeFormat(getCanonicalLocale(), { timeStyle: 'short' })
557-
} else if (props.type === 'datetime' || props.type === 'datetime-range') {
558-
formatter = new Intl.DateTimeFormat(getCanonicalLocale(), { dateStyle: 'medium', timeStyle: 'short' })
559-
} else if (props.type === 'month') {
560-
formatter = new Intl.DateTimeFormat(getCanonicalLocale(), { year: 'numeric', month: '2-digit' })
561-
} else if (props.type === 'year') {
562-
formatter = new Intl.DateTimeFormat(getCanonicalLocale(), { year: 'numeric' })
563-
}
564-
565-
if (formatter) {
566-
return (input: Date | [Date, Date]) => Array.isArray(input)
567-
? formatter.formatRange(input[0], input[1])
568-
: formatter.format(input)
553+
const locale = getCanonicalLocale()
554+
switch (props.type) {
555+
case 'date':
556+
return getDateFormat(locale)
557+
case 'date-range':
558+
return getDateRangeFormat(locale)
559+
case 'time':
560+
return getTimeFormat(locale)
561+
case 'time-range':
562+
return getTimeRangeFormat(locale)
563+
case 'datetime':
564+
return getDateTimeFormat(locale)
565+
case 'datetime-range':
566+
return getDateTimeRangeFormat(locale)
567+
case 'month':
568+
return getMonthFormat(locale)
569+
case 'year':
570+
return getYearFormat(locale)
569571
}
570572
571573
// 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)