diff --git a/src/actions/__tests__/page-template-actions.test.js b/src/actions/__tests__/page-template-actions.test.js new file mode 100644 index 000000000..ee4fbe061 --- /dev/null +++ b/src/actions/__tests__/page-template-actions.test.js @@ -0,0 +1,69 @@ +import { describe, it, expect } from "@jest/globals"; +import { + PAGE_MODULES_DOWNLOAD, + PAGES_MODULE_KINDS +} from "../../utils/constants"; +import { normalizeEntity } from "../page-template-actions"; + +const buildModule = (kind, type, file) => ({ + kind, + type, + file +}); + +describe("Page Template Actions", () => { + describe("normalizeEntity", () => { + it("should include new file in payload", () => { + const entity = { + modules: [ + buildModule( + PAGES_MODULE_KINDS.DOCUMENT, + PAGE_MODULES_DOWNLOAD.FILE, + [{ name: "newfile.pdf" }] // new file, no id + ) + ] + }; + const result = normalizeEntity(entity); + expect(result.modules[0].file).toBeDefined(); + expect(result.modules[0].file.name).toBe("newfile.pdf"); + }); + + it("should omit existing file from payload", () => { + const entity = { + modules: [ + buildModule(PAGES_MODULE_KINDS.DOCUMENT, PAGE_MODULES_DOWNLOAD.FILE, [ + { id: 123, name: "existing.pdf" } + ]) + ] + }; + const result = normalizeEntity(entity); + expect(result.modules[0].file).toBeUndefined(); + }); + + it("should omit file if not FILE type", () => { + const entity = { + modules: [ + buildModule(PAGES_MODULE_KINDS.DOCUMENT, "NOT_FILE", [ + { name: "other.pdf" } + ]) + ] + }; + const result = normalizeEntity(entity); + expect(result.modules[0].file).toBeUndefined(); + }); + + it("should handle file as null", () => { + const entity = { + modules: [ + buildModule( + PAGES_MODULE_KINDS.DOCUMENT, + PAGE_MODULES_DOWNLOAD.FILE, + null + ) + ] + }; + const result = normalizeEntity(entity); + expect(result.modules[0].file).toBeUndefined(); + }); + }); +}); diff --git a/src/actions/page-template-actions.js b/src/actions/page-template-actions.js index fa23f5ca3..ecf7ca78b 100644 --- a/src/actions/page-template-actions.js +++ b/src/actions/page-template-actions.js @@ -142,7 +142,7 @@ export const resetPageTemplateForm = () => (dispatch) => { dispatch(createAction(RESET_PAGE_TEMPLATE_FORM)({})); }; -const normalizeEntity = (entity) => { +export const normalizeEntity = (entity) => { const normalizedEntity = { ...entity }; normalizedEntity.modules = normalizePageTemplateModules(entity.modules); return normalizedEntity; diff --git a/src/utils/__tests__/page-template.test.js b/src/utils/__tests__/page-template.test.js index b5e9f2197..60d402b48 100644 --- a/src/utils/__tests__/page-template.test.js +++ b/src/utils/__tests__/page-template.test.js @@ -121,7 +121,7 @@ describe("normalizePageTemplateModules", () => { }); describe("DOCUMENT kind — FILE type", () => { - it("should extract the first element from the file array and delete external_url", () => { + it("should remove file and external_url for existing files", () => { const fileObj = { id: 10, storage_key: "key/file.pdf", @@ -134,18 +134,18 @@ describe("normalizePageTemplateModules", () => { external_url: "https://example.com" }; const [result] = normalizePageTemplateModules([module]); - expect(result.file).toStrictEqual(fileObj); + expect(result.file).toBeUndefined(); expect(result.external_url).toBeUndefined(); }); - it("should set file to null when the file array is empty", () => { + it("should remove file when the file array is empty", () => { const module = { kind: PAGES_MODULE_KINDS.DOCUMENT, type: PAGE_MODULES_DOWNLOAD.FILE, file: [] }; const [result] = normalizePageTemplateModules([module]); - expect(result.file).toBeNull(); + expect(result.file).toBeUndefined(); }); }); diff --git a/src/utils/page-template.js b/src/utils/page-template.js index 45ad5f168..c57d8d831 100644 --- a/src/utils/page-template.js +++ b/src/utils/page-template.js @@ -61,7 +61,15 @@ export const normalizePageTemplateModules = (modules = [], timeZone = null) => if (module.kind === PAGES_MODULE_KINDS.DOCUMENT) { if (module.type === PAGE_MODULES_DOWNLOAD.FILE) { - normalizedModule.file = module.file?.[0] || null; + // Only new files (without id or file_id) are sent in the payload; existing files are omitted to prevent overwriting. + const file = Array.isArray(module.file) ? module.file[0] : null; + const isNewFile = + file && typeof file === "object" && !file.id && !file.file_id; + if (isNewFile) { + normalizedModule.file = file; + } else { + delete normalizedModule.file; + } delete normalizedModule.external_url; } else { delete normalizedModule.file; @@ -73,3 +81,4 @@ export const normalizePageTemplateModules = (modules = [], timeZone = null) => return normalizedModule; }); + \ No newline at end of file