mirror of
https://github.com/formbricks/formbricks.git
synced 2026-03-13 19:30:36 -05:00
chore: additional tests
This commit is contained in:
@@ -3,12 +3,11 @@
|
||||
import Link from "next/link";
|
||||
import { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { parseDateByFormat } from "@formbricks/surveys/date-format";
|
||||
import { TSurvey, TSurveyElementSummaryDate } from "@formbricks/types/surveys/types";
|
||||
import { TUserLocale } from "@formbricks/types/user";
|
||||
import { timeSince } from "@/lib/time";
|
||||
import { getContactIdentifier } from "@/lib/utils/contact";
|
||||
import { formatDateWithOrdinal } from "@/lib/utils/datetime";
|
||||
import { formatStoredDateForDisplay } from "@/lib/utils/date-display";
|
||||
import { PersonAvatar } from "@/modules/ui/components/avatars";
|
||||
import { Button } from "@/modules/ui/components/button";
|
||||
import { EmptyState } from "@/modules/ui/components/empty-state";
|
||||
@@ -34,12 +33,7 @@ export const DateElementSummary = ({ elementSummary, environmentId, survey, loca
|
||||
|
||||
const renderResponseValue = (value: string) => {
|
||||
const format = elementSummary.element?.format ?? "y-M-d";
|
||||
const parsedDate = parseDateByFormat(value, format);
|
||||
|
||||
if (parsedDate === null) {
|
||||
return `${t("common.invalid_date")}(${value})`;
|
||||
}
|
||||
return formatDateWithOrdinal(parsedDate);
|
||||
return formatStoredDateForDisplay(value, format, `${t("common.invalid_date")}(${value})`);
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
43
apps/web/lib/utils/date-display.test.ts
Normal file
43
apps/web/lib/utils/date-display.test.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { formatStoredDateForDisplay } from "./date-display";
|
||||
|
||||
describe("formatStoredDateForDisplay", () => {
|
||||
test("returns formatted date for valid ISO string (y-M-d)", () => {
|
||||
const result = formatStoredDateForDisplay("2024-03-13", "y-M-d", "fallback");
|
||||
expect(result).toContain("2024");
|
||||
expect(result).toContain("13");
|
||||
expect(result).not.toBe("fallback");
|
||||
});
|
||||
|
||||
test("returns formatted date for valid d-M-y string", () => {
|
||||
const result = formatStoredDateForDisplay("20-03-2026", "d-M-y", "fallback");
|
||||
expect(result).toContain("2026");
|
||||
expect(result).toContain("20");
|
||||
expect(result).not.toBe("fallback");
|
||||
});
|
||||
|
||||
test("returns formatted date for valid M-d-y string", () => {
|
||||
const result = formatStoredDateForDisplay("03-20-2026", "M-d-y", "fallback");
|
||||
expect(result).toContain("2026");
|
||||
expect(result).toContain("20");
|
||||
expect(result).not.toBe("fallback");
|
||||
});
|
||||
|
||||
test("returns fallback when value is unparseable", () => {
|
||||
const fallback = "Invalid date(bad)";
|
||||
const result = formatStoredDateForDisplay("bad", "y-M-d", fallback);
|
||||
expect(result).toBe(fallback);
|
||||
});
|
||||
|
||||
test("returns fallback when value is empty", () => {
|
||||
const fallback = "—";
|
||||
const result = formatStoredDateForDisplay("", "y-M-d", fallback);
|
||||
expect(result).toBe(fallback);
|
||||
});
|
||||
|
||||
test("returns fallback when value is malformed (wrong format)", () => {
|
||||
const fallback = "Invalid date(13-03-2024)";
|
||||
const result = formatStoredDateForDisplay("13-03-2024", "y-M-d", fallback);
|
||||
expect(result).toBe(fallback);
|
||||
});
|
||||
});
|
||||
17
apps/web/lib/utils/date-display.ts
Normal file
17
apps/web/lib/utils/date-display.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import type { TSurveyDateStorageFormat } from "@formbricks/surveys/date-format";
|
||||
import { parseDateByFormat } from "@formbricks/surveys/date-format";
|
||||
import { formatDateWithOrdinal } from "./datetime";
|
||||
|
||||
/**
|
||||
* Parses a stored date string with the given format and returns a display string.
|
||||
* If parsing fails, returns the provided fallback (e.g. raw value or "Invalid date(value)").
|
||||
*/
|
||||
export function formatStoredDateForDisplay(
|
||||
value: string,
|
||||
format: TSurveyDateStorageFormat,
|
||||
fallback: string
|
||||
): string {
|
||||
const parsed = parseDateByFormat(value, format);
|
||||
if (parsed === null) return fallback;
|
||||
return formatDateWithOrdinal(parsed);
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
import { CheckCheckIcon, MousePointerClickIcon, PhoneIcon } from "lucide-react";
|
||||
import React from "react";
|
||||
import { logger } from "@formbricks/logger";
|
||||
import { parseDateByFormat } from "@formbricks/surveys/date-format";
|
||||
import { TResponseDataValue } from "@formbricks/types/responses";
|
||||
import {
|
||||
TSurveyDateElement,
|
||||
@@ -13,7 +12,7 @@ import { cn } from "@/lib/cn";
|
||||
import { getLanguageCode, getLocalizedValue } from "@/lib/i18n/utils";
|
||||
import { getChoiceIdByValue } from "@/lib/response/utils";
|
||||
import { processResponseData } from "@/lib/responses";
|
||||
import { formatDateWithOrdinal } from "@/lib/utils/datetime";
|
||||
import { formatStoredDateForDisplay } from "@/lib/utils/date-display";
|
||||
import { renderHyperlinkedContent } from "@/modules/analysis/utils";
|
||||
import { ArrayResponse } from "@/modules/ui/components/array-response";
|
||||
import { FileUploadResponse } from "@/modules/ui/components/file-upload-response";
|
||||
@@ -70,16 +69,14 @@ export const RenderResponse: React.FC<RenderResponseProps> = ({
|
||||
case TSurveyElementTypeEnum.Date:
|
||||
if (typeof responseData === "string") {
|
||||
const format = (element as TSurveyDateElement).format ?? "y-M-d";
|
||||
const parsedDate = parseDateByFormat(responseData, format);
|
||||
if (parsedDate === null) {
|
||||
const formatted = formatStoredDateForDisplay(responseData, format, responseData);
|
||||
if (formatted === responseData) {
|
||||
logger.warn(
|
||||
{ elementId: element.id, format, value: responseData },
|
||||
"[RenderResponse] could not parse date response value"
|
||||
);
|
||||
return <p className="ph-no-capture my-1 truncate font-normal text-slate-700">{responseData}</p>;
|
||||
}
|
||||
const formattedDate = formatDateWithOrdinal(parsedDate);
|
||||
return <p className="ph-no-capture my-1 truncate font-normal text-slate-700">{formattedDate}</p>;
|
||||
return <p className="ph-no-capture my-1 truncate font-normal text-slate-700">{formatted}</p>;
|
||||
}
|
||||
break;
|
||||
case TSurveyElementTypeEnum.PictureSelection:
|
||||
|
||||
Reference in New Issue
Block a user