* Add handlePaste function and integrate it with options fields * Prevents function running if user does not paste a list, allows list items to be pasted without deleting following items * Subs useState for rhf useWatch to fix issues with multiple form fields * Sets options array as optional property in zod schema * Assigns default value to options array to fix possibly undefined type errors * Sets placedholder property as optional * maps selectText to options on mount * Removes comma & semicolon delimiting for pasted lists (new line only) & defines regex as a constant * Sets default value of placeholder to empty string, provides default fallback for component text field if placeholder is omitted. * Fix type error on placeholder * Extracts handlePaste to service function & tests thoroughly * Some improvements and tests arent needed * More fixes * Fix reporting as well * TS fixes * Do transforms to and fro from label * Add unit tests * Unit test reporting * Test Improvements * Self review feedback addressed --------- Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
159 lines
4.4 KiB
TypeScript
159 lines
4.4 KiB
TypeScript
import { v4 as uuidv4 } from "uuid";
|
|
import { describe, it, expect } from "vitest";
|
|
|
|
import { buildResponsesForReporting } from "./report.handler";
|
|
|
|
describe("buildResponsesForReporting", () => {
|
|
it("for fields with options, it should return the labels of the options", () => {
|
|
const field1Id = uuidv4();
|
|
const field2Id = uuidv4();
|
|
|
|
const responsesFromDb = [
|
|
{
|
|
[field1Id]: { value: "value1" },
|
|
[field2Id]: { value: ["option1", "option2"] },
|
|
},
|
|
];
|
|
|
|
const fields = [
|
|
{ id: field1Id, label: "Field 1" },
|
|
{
|
|
id: field2Id,
|
|
label: "Field 2",
|
|
options: [
|
|
{ id: "option1", label: "Option 1" },
|
|
{ id: "option2", label: "Option 2" },
|
|
],
|
|
},
|
|
];
|
|
|
|
const expectedResponses = [["value1", "Option 1, Option 2"]];
|
|
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(["Field 1", "Field 2"]);
|
|
});
|
|
|
|
it("for fields with options having null id, it should return what DB provided(as that would be labels only).", () => {
|
|
const field1Id = uuidv4();
|
|
const field2Id = uuidv4();
|
|
const responsesFromDb = [
|
|
{
|
|
[field1Id]: { value: "value1" },
|
|
[field2Id]: { value: ["Option 1", "Option 2"] },
|
|
},
|
|
];
|
|
|
|
const fields = [
|
|
{ id: field1Id, label: "Field 1" },
|
|
{
|
|
id: field2Id,
|
|
label: "Field 2",
|
|
options: [
|
|
{ id: null, label: "Option 1" },
|
|
{ id: null, label: "Option 2" },
|
|
],
|
|
},
|
|
];
|
|
|
|
const expectedResponses = [["value1", "Option 1, Option 2"]];
|
|
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(["Field 1", "Field 2"]);
|
|
});
|
|
|
|
it("for fields with no options but having array value, it should return the value as is", () => {
|
|
const field2Id = uuidv4();
|
|
const responsesFromDb = [
|
|
{
|
|
[field2Id]: { value: ["Option 1", "Option 2"] },
|
|
},
|
|
];
|
|
|
|
const fields = [
|
|
{
|
|
id: field2Id,
|
|
label: "Field 2",
|
|
},
|
|
];
|
|
|
|
const expectedResponses = [["Option 1, Option 2"]];
|
|
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(["Field 2"]);
|
|
});
|
|
|
|
it("should correctly handle numeric responses converting them to strings", () => {
|
|
const field1Id = uuidv4();
|
|
const field2Id = uuidv4();
|
|
const responsesFromDb = [
|
|
{
|
|
[field1Id]: { value: 1 },
|
|
[field2Id]: { value: [1, 2] },
|
|
},
|
|
];
|
|
|
|
const fields = [
|
|
{ id: field1Id, label: "Field 1" },
|
|
{
|
|
id: field2Id,
|
|
label: "Field 2",
|
|
options: [
|
|
{ id: null, label: "Option 1" },
|
|
{ id: null, label: "Option 2" },
|
|
],
|
|
},
|
|
];
|
|
const expectedResponses = [["1", "1, 2"]];
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(["Field 1", "Field 2"]);
|
|
});
|
|
|
|
it("should handle empty responses", () => {
|
|
const field1Id = uuidv4();
|
|
const responsesFromDb = [{}];
|
|
|
|
const fields = [{ id: field1Id, label: "Field 1" }];
|
|
|
|
const expectedResponses = [[""]];
|
|
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(["Field 1"]);
|
|
});
|
|
|
|
it("should show correct header for deleted fields", () => {
|
|
const field1Id = uuidv4();
|
|
const field2Id = uuidv4();
|
|
const responsesFromDb = [
|
|
{
|
|
[field1Id]: { value: "value1" },
|
|
[field2Id]: { value: ["Option 1", "Option 2"] },
|
|
},
|
|
];
|
|
|
|
const fields = [
|
|
{ id: field1Id, label: "Field 1" },
|
|
{
|
|
id: field2Id,
|
|
label: "Field 2",
|
|
deleted: true,
|
|
options: [
|
|
{ id: "option1", label: "Option 1" },
|
|
{ id: "option2", label: "Option 2" },
|
|
],
|
|
},
|
|
];
|
|
|
|
const expectedResponses = [["value1", "Option 1, Option 2"]];
|
|
const expectedHeaders = ["Field 1", "Field 2(Deleted)"];
|
|
|
|
const { responses, headers } = buildResponsesForReporting({ responsesFromDb, fields });
|
|
expect(responses).toEqual(expectedResponses);
|
|
expect(headers).toEqual(expectedHeaders);
|
|
});
|
|
});
|