diff --git a/src/record/import/repositories/parsers/parseCsv/__tests__/fixtures/withMultipleSubtable/expected.ts b/src/record/import/repositories/parsers/parseCsv/__tests__/fixtures/withMultipleSubtable/expected.ts index 5c927ac14d..23b3168d86 100644 --- a/src/record/import/repositories/parsers/parseCsv/__tests__/fixtures/withMultipleSubtable/expected.ts +++ b/src/record/import/repositories/parsers/parseCsv/__tests__/fixtures/withMultipleSubtable/expected.ts @@ -67,10 +67,34 @@ export const expected: LocalRecord[] = [ data: { text: { value: "sample1" }, subTable: { - value: [{ id: "102", value: {} }], + value: [ + { + id: "102", + value: { + numberInSubtable: { + value: "", + }, + textInSubtable: { + value: "", + }, + }, + }, + ], }, subTable2: { - value: [{ id: "202", value: {} }], + value: [ + { + id: "202", + value: { + numberInSubtable2: { + value: "", + }, + textInSubtable2: { + value: "", + }, + }, + }, + ], }, }, metadata: { @@ -85,6 +109,9 @@ export const expected: LocalRecord[] = [ { id: "", value: { + numberInSubtable: { + value: "", + }, textInSubtable: { value: "carol", }, @@ -100,6 +127,9 @@ export const expected: LocalRecord[] = [ numberInSubtable2: { value: "30", }, + textInSubtable2: { + value: "", + }, }, }, ], diff --git a/src/record/import/repositories/parsers/parseCsv/__tests__/subtable.test.ts b/src/record/import/repositories/parsers/parseCsv/__tests__/subtable.test.ts new file mode 100644 index 0000000000..0908dc9b21 --- /dev/null +++ b/src/record/import/repositories/parsers/parseCsv/__tests__/subtable.test.ts @@ -0,0 +1,98 @@ +import type { SubtableRow, FieldInSubtable } from "../subtable"; + +import { fieldInSubtableReader } from "../subtable"; +import type { InSubtable } from "../../../../types/schema"; + +const fields: InSubtable[] = [ + { + type: "SINGLE_LINE_TEXT", + code: "Text_0", + label: "Text", + noLabel: false, + required: false, + minLength: "", + maxLength: "", + expression: "", + hideExpression: false, + unique: false, + defaultValue: "", + }, + { + type: "NUMBER", + code: "Number_0", + label: "Number", + noLabel: false, + required: false, + minValue: "", + maxValue: "", + digit: false, + unique: false, + defaultValue: "", + displayScale: "", + unit: "", + unitPosition: "BEFORE", + }, +]; + +const patterns: Array<{ + description: string; + input: SubtableRow; + expected: FieldInSubtable[]; +}> = [ + { + description: "all fields have valid value", + input: { + id: "", + row: { + "*": "*", + Record_number: "", + Table: "1", + Text_0: "Text_0", + Number_0: "10", + }, + fields, + }, + expected: [ + { code: "Text_0", value: "Text_0", type: "SINGLE_LINE_TEXT" }, + { code: "Number_0", value: "10", type: "NUMBER" }, + ], + }, + { + description: "empty field value", + input: { + id: "", + row: { + "*": "*", + Record_number: "", + Table: "1", + Text_0: "", + Number_0: "10", + }, + fields, + }, + expected: [ + { code: "Text_0", value: "", type: "SINGLE_LINE_TEXT" }, + { code: "Number_0", value: "10", type: "NUMBER" }, + ], + }, + { + description: "missing field value", + input: { + id: "", + row: { + "*": "*", + Record_number: "", + Table: "1", + Number_0: "10", + }, + fields, + }, + expected: [{ code: "Number_0", value: "10", type: "NUMBER" }], + }, +]; + +describe("fieldInSubtableReader", () => { + it.each(patterns)("$description", ({ input, expected }) => { + expect(Array.from(fieldInSubtableReader(input))).toStrictEqual(expected); + }); +}); diff --git a/src/record/import/repositories/parsers/parseCsv/subtable.ts b/src/record/import/repositories/parsers/parseCsv/subtable.ts index cebef0ad0a..b9dd116796 100644 --- a/src/record/import/repositories/parsers/parseCsv/subtable.ts +++ b/src/record/import/repositories/parsers/parseCsv/subtable.ts @@ -49,7 +49,7 @@ export function* subtableFieldReader( } } -type SubtableRow = { +export type SubtableRow = { id: string; row: CsvRow; fields: InSubtable[]; @@ -78,7 +78,7 @@ function* subtableRowReader( } } -type FieldInSubtable = { +export type FieldInSubtable = { code: string; value: string; type: InSubtable["type"]; @@ -90,14 +90,12 @@ const convertFieldInSubtable = ( }; // eslint-disable-next-line func-style -function* fieldInSubtableReader({ +export function* fieldInSubtableReader({ row, fields, }: SubtableRow): Generator { for (const fieldInSubtable of fields) { - if ( - !(fieldInSubtable.code in row && row[fieldInSubtable.code].length > 0) - ) { + if (!(fieldInSubtable.code in row)) { continue; }