@wix/bex-core 2.336.0 → 2.337.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/cjs/hooks/useImport.js.map +1 -1
  2. package/dist/cjs/index.js +7 -0
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/state/ImportState/ImportState.js +6 -5
  5. package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
  6. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +28 -0
  7. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  8. package/dist/cjs/testkit/createInMemorySchemaSource.js +2 -0
  9. package/dist/cjs/testkit/createInMemorySchemaSource.js.map +1 -1
  10. package/dist/cjs/testkit/hubJobImportMocks.js +14 -4
  11. package/dist/cjs/testkit/hubJobImportMocks.js.map +1 -1
  12. package/dist/cjs/types/Field.js.map +1 -1
  13. package/dist/cjs/types/FieldTypeDefinition.js +79 -0
  14. package/dist/cjs/types/FieldTypeDefinition.js.map +1 -0
  15. package/dist/cjs/types/FieldsSource.js.map +1 -1
  16. package/dist/cjs/types/SchemaSource.js +14 -2
  17. package/dist/cjs/types/SchemaSource.js.map +1 -1
  18. package/dist/cjs/types/__tests__/defineSchemaSource.fieldTypes.spec.js +78 -0
  19. package/dist/cjs/types/__tests__/defineSchemaSource.fieldTypes.spec.js.map +1 -0
  20. package/dist/esm/hooks/useImport.js +1 -1
  21. package/dist/esm/hooks/useImport.js.map +1 -1
  22. package/dist/esm/index.js +1 -0
  23. package/dist/esm/index.js.map +1 -1
  24. package/dist/esm/state/ImportState/ImportState.js +6 -4
  25. package/dist/esm/state/ImportState/ImportState.js.map +1 -1
  26. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +28 -1
  27. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  28. package/dist/esm/testkit/createInMemorySchemaSource.js +2 -1
  29. package/dist/esm/testkit/createInMemorySchemaSource.js.map +1 -1
  30. package/dist/esm/testkit/hubJobImportMocks.js +14 -4
  31. package/dist/esm/testkit/hubJobImportMocks.js.map +1 -1
  32. package/dist/esm/types/FieldTypeDefinition.js +16 -0
  33. package/dist/esm/types/FieldTypeDefinition.js.map +1 -0
  34. package/dist/esm/types/SchemaSource.js +15 -3
  35. package/dist/esm/types/SchemaSource.js.map +1 -1
  36. package/dist/esm/types/__tests__/defineSchemaSource.fieldTypes.spec.js +51 -0
  37. package/dist/esm/types/__tests__/defineSchemaSource.fieldTypes.spec.js.map +1 -0
  38. package/dist/types/hooks/useImport.d.ts.map +1 -1
  39. package/dist/types/index.d.ts +2 -1
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
  42. package/dist/types/testkit/WixPatternsContainer.driver.d.ts +2 -0
  43. package/dist/types/testkit/WixPatternsContainer.driver.d.ts.map +1 -1
  44. package/dist/types/testkit/createInMemorySchemaSource.d.ts +3 -0
  45. package/dist/types/testkit/createInMemorySchemaSource.d.ts.map +1 -1
  46. package/dist/types/testkit/hubJobImportMocks.d.ts +8 -0
  47. package/dist/types/testkit/hubJobImportMocks.d.ts.map +1 -1
  48. package/dist/types/types/Field.d.ts +3 -1
  49. package/dist/types/types/Field.d.ts.map +1 -1
  50. package/dist/types/types/FieldTypeDefinition.d.ts +253 -0
  51. package/dist/types/types/FieldTypeDefinition.d.ts.map +1 -0
  52. package/dist/types/types/FieldsSource.d.ts +29 -1
  53. package/dist/types/types/FieldsSource.d.ts.map +1 -1
  54. package/dist/types/types/SchemaSource.d.ts +21 -2
  55. package/dist/types/types/SchemaSource.d.ts.map +1 -1
  56. package/dist/types/types/__tests__/defineSchemaSource.fieldTypes.spec.d.ts +2 -0
  57. package/dist/types/types/__tests__/defineSchemaSource.fieldTypes.spec.d.ts.map +1 -0
  58. package/package.json +4 -4
@@ -217,6 +217,34 @@ describe('ImportState engine (data-hub job)', () => {
217
217
  state.done();
218
218
  expect(importModalState.close).toHaveBeenCalled();
219
219
  });
220
+ it('counts all successes as created when the job omits itemsSuccessfulInfo', async () => {
221
+ const {
222
+ state
223
+ } = setup({
224
+ getJob: jest.fn(async () => ({
225
+ id: 'job-1',
226
+ status: _types.JobStatus.COMPLETED,
227
+ progress: {
228
+ itemsSuccessful: 2,
229
+ itemsRejected: 0,
230
+ total: 2,
231
+ current: 2
232
+ // No `itemsSuccessfulInfo` — the created/updated split is absent.
233
+ }
234
+ }))
235
+ });
236
+ await state.startImport();
237
+
238
+ // Without the breakdown, every success is reported as created (not 0), so
239
+ // the summary step isn't blank.
240
+ expect(state.result).toEqual({
241
+ succeeded: 2,
242
+ failed: 0,
243
+ created: 2,
244
+ updated: 0
245
+ });
246
+ expect(state.currentStep).toBe('summary');
247
+ });
220
248
  it('shows the summary step (no toast) when some rows are rejected', async () => {
221
249
  const {
222
250
  state,
@@ -1 +1 @@
1
- {"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","itemsSuccessfulInfo","itemsCreated","itemsUpdated","setup","clientOverrides","extra","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","showToast","downloadCsv","translate","key","params","JSON","stringify","detectColumnType","config","configOverride","collectionId","destination","updateSchema","createFields","fieldManagement","mergeFields","fields","idFieldKey","backup","jobApplicationErrorMap","collection","clearResultAndMoveToStart","queryName","dataSource","header","props","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","wixDataCollection","result","toEqual","succeeded","failed","created","updated","importStatus","toBe","currentStep","not","toHaveBeenCalled","force","atLinger","spy","spyOn","mockImplementation","step","processed","processedCount","totalCount","Promise","resolve","mockRestore","done","PARTIALLY_SUCCESSFUL","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","downloadFailedRows","content","toContain","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","duplicate_key","message","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","restore","isSuccess","seedIdMapping","ID","idMappedHeader","toBeNull","objectContaining","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders","storesCatalogProducts","storesCatalogInventory","platformized","canConfigureWritePolicy","wixData","withCreate","canCreateNewField","withoutCreate","Color","fieldType","displayName","mapping","deType","isPii","permissions","installedApps","defaultRead","defaultWrite","Count","RETURNED_FIELDS","type","color","withNewFieldMapping","Error","consoleError","console","schemaConfig","over","off","on","year","Year","Ref","required","hasMissingRequiredFields","missingRequiredFields","map","f","setNewFieldMapping"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ResolvedImportConfig,\n ImportCollection,\n ImportField,\n ImportDataSource,\n UpdateSchemaFn,\n CreateDataExtensionFieldsFn,\n BackupFn,\n JobApplicationErrorMap,\n Destination,\n} from '../ImportState';\nimport type { FieldManagement } from '../../../types/FieldsSource';\nimport type { Schema } from '../../../types/Schema';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: {\n itemsSuccessful: 2,\n itemsRejected: 0,\n total: 2,\n current: 2,\n itemsSuccessfulInfo: { itemsCreated: 1, itemsUpdated: 1 },\n },\n};\n\n// Convenience flat overrides, assembled into the `dataSource` union below;\n// `config` fully replaces the assembled config (for schema-backed configs).\n// `detectColumnType` is an infra prop.\ntype SetupExtra = {\n detectColumnType?: ImportStateProps['detectColumnType'];\n config?: ResolvedImportConfig;\n fields?: ImportField[];\n collectionId?: string;\n destination?: Destination;\n updateSchema?: UpdateSchemaFn;\n createFields?: CreateDataExtensionFieldsFn;\n fieldManagement?: FieldManagement;\n mergeFields?: ResolvedImportConfig['mergeFields'];\n idFieldKey?: string;\n backup?: BackupFn;\n jobApplicationErrorMap?: JobApplicationErrorMap;\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extra: SetupExtra = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const {\n detectColumnType,\n config: configOverride,\n collectionId,\n destination,\n updateSchema,\n createFields,\n fieldManagement,\n mergeFields,\n fields,\n idFieldKey,\n backup,\n jobApplicationErrorMap,\n } = extra;\n\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n queryName: collectionId ?? 'Movies',\n };\n\n const dataSource: ImportDataSource = destination\n ? {\n destination,\n ...(createFields && { createFields }),\n ...(fieldManagement && { fieldManagement }),\n }\n : {\n collectionId: collectionId ?? 'Movies',\n ...(updateSchema && { updateSchema }),\n };\n\n const config: ResolvedImportConfig = configOverride ?? {\n fields: fields ?? [{ id: 'name', header: 'Name' }],\n dataSource,\n ...(mergeFields && { mergeFields }),\n ...(idFieldKey && { idFieldKey }),\n ...(backup && { backup }),\n ...(jobApplicationErrorMap && { jobApplicationErrorMap }),\n };\n\n const props: ImportStateProps = {\n config,\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n detectColumnType,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The poll loop awaits real setTimeouts between polls; make sure timers are\n // real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n // created/updated come from the job's itemsSuccessfulInfo.\n expect(state.result).toEqual({\n succeeded: 2,\n failed: 0,\n created: 1,\n updated: 1,\n });\n expect(state.importStatus.status).toBe('success');\n // The modal stays open on the summary step; the collection is refreshed now\n // so the table is current once the user closes it via `done`.\n expect(state.currentStep).toBe('summary');\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('holds the completed (100%) progress bar on the progress step before the summary (CAIRO-4476)', async () => {\n const { state } = setup();\n\n // The job reports counts only when it finishes, so the bar can only reach\n // 100% at the very end. Capture the step + counts at the moment the linger\n // starts to prove the user sees the completed bar before the summary\n // replaces it.\n let atLinger: { step: string; processed: number; total: number } | null =\n null;\n const spy = jest\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .spyOn(state as any, '_lingerOnCompletion')\n .mockImplementation(() => {\n atLinger = {\n step: state.currentStep,\n processed: state.processedCount,\n total: state.totalCount,\n };\n return Promise.resolve();\n });\n\n await state.startImport();\n\n expect(atLinger).toEqual({ step: 'progress', processed: 2, total: 2 });\n expect(state.currentStep).toBe('summary');\n spy.mockRestore();\n });\n\n it('closes the modal only when the user dismisses the summary via done', async () => {\n const { state, importModalState } = setup();\n\n await state.startImport();\n expect(importModalState.close).not.toHaveBeenCalled();\n\n state.done();\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('shows the summary step (no toast) when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n itemsSuccessfulInfo: { itemsCreated: 1, itemsUpdated: 0 },\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({\n succeeded: 1,\n failed: 1,\n created: 1,\n updated: 0,\n });\n expect(state.currentStep).toBe('summary');\n // The completion toast is gone — the summary step reports the outcome.\n expect(showToast).not.toHaveBeenCalled();\n expect(importModalState.close).not.toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n await state.downloadFailedRows();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows, each prefixed with its failure reason', async () => {\n const { state, client, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n {\n sourceItemId: 'row 3',\n failure: { code: 'bad', description: 'Invalid value' },\n },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n await state.downloadFailedRows();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // A leading reason column (the translated header) + original headers, then\n // the failed row prefixed with the server's failure reason — ready to fix\n // and re-upload. `translate` here echoes the key for the column header.\n expect(downloadCsv).toHaveBeenCalledWith(\n 'cairo.import.failureReasonColumn,Name\\r\\nInvalid value,Pear',\n 'failed-data.csv',\n );\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('resolves a failed job through the consumer jobApplicationErrorMap', async () => {\n // ImportState wraps the failure with `errorHandler.withErrorHandler(run,\n // jobApplicationErrorMap)` itself; the consumer only supplies the per-code\n // map. The surfaced error keeps the application-error-shaped code intact.\n // End-to-end resolution against the real error handler (getResolvedError) is\n // covered in the cairo Table.importButton spec.\n const jobApplicationErrorMap = { duplicate_key: () => ({ message: 'Bad rows' }) };\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { jobApplicationErrorMap },\n );\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore a completed import when the summary is closed', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n await state.startImport();\n\n // The import finished on the summary step and the collection was refreshed.\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('summary');\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n\n // Closing the summary must not revert a successful import.\n await state.close();\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n\ndescribe('ImportState orderedHeaders (row order stability)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Parse a CSV whose `ID` column auto-maps to `_id` (a field with that id\n // exists), so the `_id` row floats to the top of the ordered list.\n async function parseWithIdColumn(state: ImportState) {\n const csv = 'Name,ID,Handle\\nApple,id-1,a\\nPear,id-2,p\\n';\n const file = {\n name: 'data.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n }\n\n it('floats the `_id`-mapped column to the top for a freshly parsed file', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n\n await parseWithIdColumn(state);\n\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('keeps row order stable when the `_id` mapping is cleared and re-added', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n\n // Clearing the `_id` dropdown must not reorder the row under the cursor:\n // the snapshot stays fixed even though `idMappedHeader` becomes null.\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // Re-mapping `_id` also leaves the order untouched.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('re-snapshots the order for a new file and clears it on reset', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // A file with no `_id` column keeps plain CSV order.\n const csv = 'First,Second\\n1,2\\n';\n const file = {\n name: 'other.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n expect(state.orderedHeaders).toEqual(['First', 'Second']);\n\n state.reset();\n expect(state.orderedHeaders).toEqual([]);\n });\n});\n\ndescribe('ImportState platformized destination (non–Wix-Data)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n it('sends a consumer-supplied destination verbatim, ignoring collectionId', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogProducts: {} },\n }),\n );\n });\n\n it('does not add writePolicy to a platformized destination even when `_id` is mapped', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogInventory: {} } },\n );\n // Map a column to `_id` and pick a non-default policy — for a platformized\n // destination this must NOT leak into the destination (writePolicy is a\n // wixDataCollection-only concern).\n runInAction(() => {\n state.csvHeaders = ['Name', 'ID'];\n state.csvRows = [\n ['Apple', '1'],\n ['Pear', '2'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n ID: { kind: 'existing', fieldId: '_id' },\n };\n });\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogInventory: {} },\n }),\n );\n });\n\n it('reports canConfigureWritePolicy=false for a custom destination (control hidden), true for the default path', () => {\n const platformized = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n ).state;\n expect(platformized.canConfigureWritePolicy).toBe(false);\n\n const wixData = setup().state;\n expect(wixData.canConfigureWritePolicy).toBe(true);\n });\n\n describe('DataExtension create fields (destination branch)', () => {\n it('enables create-new-field when the destination branch supplies createFields', () => {\n const withCreate = setup(\n {},\n {\n destination: { storesCatalogProducts: {} },\n createFields: jest.fn(async () => undefined),\n },\n ).state;\n expect(withCreate.canCreateNewField).toBe(true);\n\n const withoutCreate = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n ).state;\n expect(withoutCreate.canCreateNewField).toBe(false);\n });\n\n it('hands createFields the deduped pending columns (source builds its own def)', async () => {\n const createFields = jest.fn(async () => undefined);\n const { state, client } = setup(\n {},\n { destination: { storesCatalogProducts: {} }, createFields },\n );\n\n runInAction(() => {\n state.csvHeaders = ['Name', 'Color'];\n state.csvRows = [\n ['Apple', 'Red'],\n ['Pear', 'Green'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Color: { kind: 'new', fieldType: 'text' },\n };\n });\n\n await state.startImport();\n\n expect(createFields).toHaveBeenCalledTimes(1);\n // Core passes the neutral pending column (deduped key + name + the mapping);\n // the DataExtension source turns it into its own field shape.\n expect(createFields).toHaveBeenCalledWith([\n {\n key: 'color',\n displayName: 'Color',\n mapping: { kind: 'new', fieldType: 'text' },\n },\n ]);\n // The consumer's destination is still sent verbatim.\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogProducts: {} },\n }),\n );\n });\n\n it('carries the edited mapping config (precise type, permissions, PII) in the pending column', async () => {\n const createFields = jest.fn(async () => undefined);\n const { state } = setup(\n {},\n { destination: { storesCatalogProducts: {} }, createFields },\n );\n\n const config = {\n deType: 'decimal',\n isPii: true,\n permissions: {\n installedApps: { defaultRead: true, defaultWrite: false },\n },\n };\n runInAction(() => {\n state.csvHeaders = ['Name', 'Count'];\n state.csvRows = [['Apple', '3']];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Count: {\n kind: 'new',\n fieldType: 'number',\n displayName: 'Count',\n config,\n },\n };\n });\n\n await state.startImport();\n\n expect(createFields).toHaveBeenCalledWith([\n {\n key: 'count',\n displayName: 'Count',\n mapping: {\n kind: 'new',\n fieldType: 'number',\n displayName: 'Count',\n config,\n },\n },\n ]);\n });\n });\n\n describe('created fields (CAIRO-4400)', () => {\n const RETURNED_FIELDS = {\n name: { id: 'name', displayName: 'Name', type: 'SHORT_TEXT' },\n color: { id: 'color', displayName: 'Color', type: 'SHORT_TEXT' },\n } as unknown as Schema['fields'];\n\n // Maps an extra column to a NEW field so `_resolveFieldMapping` calls\n // `updateSchema`. `updateSchema`'s presence is also what enables new mappings.\n function withNewFieldMapping(state: ImportState) {\n runInAction(() => {\n state.csvHeaders = ['Name', 'Color'];\n state.csvRows = [\n ['Apple', 'Red'],\n ['Pear', 'Green'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Color: { kind: 'new', fieldType: 'text' },\n };\n });\n }\n\n it('calls mergeFields with updateSchema’s returned map after a successful import', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state, collection } = setup(\n {},\n { updateSchema, mergeFields },\n );\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).toHaveBeenCalledTimes(1);\n expect(mergeFields).toHaveBeenCalledWith(RETURNED_FIELDS);\n // The merge runs alongside the data refetch on the success path.\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();\n });\n\n it('does not call mergeFields for a plain import (no new fields)', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state } = setup({}, { updateSchema, mergeFields });\n\n await state.startImport();\n\n expect(updateSchema).not.toHaveBeenCalled();\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when updateSchema returns nothing', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => undefined);\n const { state } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when updateSchema returns an empty map', async () => {\n // A `{}` return is truthy; without a size guard it would reach a full-replace\n // mergeFields({}) and wipe every column. Treat it as \"nothing to merge\".\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => ({} as Schema['fields']));\n const { state } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when the import fails after creating fields', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state } = setup(\n {\n uploadFile: jest.fn(async () => {\n throw new Error('upload failed');\n }),\n },\n { updateSchema, mergeFields },\n );\n withNewFieldMapping(state);\n\n await state.startImport();\n\n // Fields were created pre-upload, but a failed import must not merge them.\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(state.importStatus.status).toBe('error');\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('keeps the import successful when mergeFields throws (no void → duplicate-rows)', async () => {\n const consoleError = jest\n .spyOn(console, 'error')\n .mockImplementation(() => {});\n const mergeFields = jest.fn(() => {\n throw new Error('merge boom');\n });\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state, collection } = setup(\n {},\n { updateSchema, mergeFields },\n );\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(mergeFields).toHaveBeenCalledTimes(1);\n // A throwing merge is swallowed — the completed import is untouched.\n expect(state.importStatus.status).toBe('success');\n expect(state.currentStep).toBe('summary');\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();\n\n consoleError.mockRestore();\n });\n });\n\n describe('schema-backed config (live getters + create-field permission)', () => {\n // A schema-backed config: the CMS `dataSource` branch a SchemaImportRef\n // satisfies. It supplies `updateSchema` only when create is permitted — its\n // presence is the create-new-field opt-in (no separate flag).\n const schemaConfig = (\n over: {\n fields?: ImportField[];\n collectionId?: string;\n updateSchema?: UpdateSchemaFn;\n idFieldKey?: string;\n mergeFields?: ResolvedImportConfig['mergeFields'];\n } = {},\n ): ResolvedImportConfig => ({\n fields: over.fields ?? [{ id: 'name', header: 'Name' }],\n dataSource: {\n collectionId: over.collectionId ?? 'RefCollection',\n ...(over.updateSchema && { updateSchema: over.updateSchema }),\n },\n ...(over.idFieldKey && { idFieldKey: over.idFieldKey }),\n ...(over.mergeFields && { mergeFields: over.mergeFields }),\n });\n\n it('reads fields live from the config rather than snapshotting them', () => {\n const config = schemaConfig();\n const { state } = setup({}, { config });\n\n expect(state.fields).toBe(config.fields);\n\n // A later change to the config is reflected — values are read on demand,\n // so a live (getter-backed) config needn't be resolved before the ctor.\n const updated: ImportField[] = [\n { id: 'name', header: 'Name' },\n { id: 'year', header: 'Year' },\n ];\n config.fields = updated;\n expect(state.fields).toBe(updated);\n });\n\n it('gates create-new-field on the presence of a create callback (updateSchema)', () => {\n // No create callback ⇒ create-new-field off (the source didn't permit it).\n const off = setup({}, { config: schemaConfig() });\n expect(off.state.canCreateNewField).toBe(false);\n\n // A create callback present ⇒ on.\n const on = setup(\n {},\n { config: schemaConfig({ updateSchema: jest.fn() }) },\n );\n expect(on.state.canCreateNewField).toBe(true);\n });\n\n it('builds the destination from the config collectionId', async () => {\n const { state, client } = setup(\n {},\n { config: schemaConfig({ collectionId: 'RefCollection' }) },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'RefCollection' } },\n }),\n );\n });\n\n it('creates new fields through the config updateSchema', async () => {\n const updateSchema = jest.fn(\n async () =>\n ({\n name: { id: 'name', displayName: 'Name', type: 'SHORT_TEXT' },\n year: { id: 'year', displayName: 'Year', type: 'NUMBER' },\n } as unknown as Schema['fields']),\n );\n const { state } = setup(\n {},\n { config: schemaConfig({ updateSchema }) },\n );\n\n runInAction(() => {\n state.csvHeaders = ['Name', 'Year'];\n state.csvRows = [['Apple', '1999']];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Year: { kind: 'new', fieldType: 'number' },\n };\n });\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n });\n\n it('detects the id-mapped column using the config idFieldKey', () => {\n const { state } = setup(\n {},\n { config: schemaConfig({ idFieldKey: 'movieId' }) },\n );\n\n runInAction(() => {\n state.mappingByHeader = {\n Ref: { kind: 'existing', fieldId: 'movieId' },\n };\n });\n\n expect(state.idMappedHeader).toBe('Ref');\n });\n });\n});\n\ndescribe('ImportState required fields (CAIRO-4452)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n it('is satisfied when a required field has a column mapped to it', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n // The seeded mapping maps the \"Name\" column to the `name` field.\n expect(state.hasMissingRequiredFields).toBe(false);\n expect(state.missingRequiredFields).toEqual([]);\n });\n\n it('flags a required field the user set to \"don\\'t import\"', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n state.setMapping('Name', null);\n\n expect(state.hasMissingRequiredFields).toBe(true);\n expect(state.missingRequiredFields.map((f) => f.id)).toEqual(['name']);\n });\n\n it('ignores unmapped fields that are not required', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [\n { id: 'name', header: 'Name' },\n { id: 'year', header: 'Year', required: false },\n ],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n state.setMapping('Name', null);\n\n expect(state.hasMissingRequiredFields).toBe(false);\n });\n\n it('is not satisfied by a create-new-field mapping', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: {\n collectionId: 'Movies',\n updateSchema: async () => undefined,\n },\n },\n },\n );\n\n // Mapping the column to a brand-new field can't fill the existing required\n // field, so it stays missing.\n state.setNewFieldMapping('Name');\n\n expect(state.hasMissingRequiredFields).toBe(true);\n });\n\n it('blocks startImport and shows an error toast when a required field is missing', async () => {\n const { state, client, showToast } = setup(\n {},\n {\n config: {\n fields: [\n { id: 'name', header: 'Name', required: true },\n { id: 'year', header: 'Year' },\n ],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n // Keep a mapping (so the import isn't blocked by \"no mappings\") but leave the\n // required `name` field unmapped.\n runInAction(() => {\n state.csvHeaders = ['Name', 'Year'];\n state.csvRows = [['Apple', '2020']];\n });\n state.setMapping('Name', null);\n state.setMapping('Year', 'year');\n\n await state.startImport();\n\n expect(client.uploadFile).not.toHaveBeenCalled();\n expect(client.submitImportJob).not.toHaveBeenCalled();\n expect(state.currentStep).not.toBe('progress');\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'ERROR' }),\n );\n });\n\n it('proceeds with import when all required fields are mapped', async () => {\n const { state, client } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledTimes(1);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","itemsSuccessfulInfo","itemsCreated","itemsUpdated","setup","clientOverrides","extra","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","showToast","downloadCsv","translate","key","params","JSON","stringify","detectColumnType","config","configOverride","collectionId","destination","updateSchema","createFields","fieldManagement","mergeFields","fields","idFieldKey","backup","jobApplicationErrorMap","collection","clearResultAndMoveToStart","queryName","dataSource","header","props","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","wixDataCollection","result","toEqual","succeeded","failed","created","updated","importStatus","toBe","currentStep","not","toHaveBeenCalled","force","atLinger","spy","spyOn","mockImplementation","step","processed","processedCount","totalCount","Promise","resolve","mockRestore","done","PARTIALLY_SUCCESSFUL","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","downloadFailedRows","content","toContain","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","duplicate_key","message","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","restore","isSuccess","seedIdMapping","ID","idMappedHeader","toBeNull","objectContaining","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders","storesCatalogProducts","storesCatalogInventory","platformized","canConfigureWritePolicy","wixData","withCreate","canCreateNewField","withoutCreate","Color","fieldType","displayName","mapping","deType","isPii","permissions","installedApps","defaultRead","defaultWrite","Count","RETURNED_FIELDS","type","color","withNewFieldMapping","Error","consoleError","console","schemaConfig","over","off","on","year","Year","Ref","required","hasMissingRequiredFields","missingRequiredFields","map","f","setNewFieldMapping"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ResolvedImportConfig,\n ImportCollection,\n ImportField,\n ImportDataSource,\n UpdateSchemaFn,\n CreateDataExtensionFieldsFn,\n BackupFn,\n JobApplicationErrorMap,\n Destination,\n} from '../ImportState';\nimport type { FieldManagement } from '../../../types/FieldsSource';\nimport type { Schema } from '../../../types/Schema';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: {\n itemsSuccessful: 2,\n itemsRejected: 0,\n total: 2,\n current: 2,\n itemsSuccessfulInfo: { itemsCreated: 1, itemsUpdated: 1 },\n },\n};\n\n// Convenience flat overrides, assembled into the `dataSource` union below;\n// `config` fully replaces the assembled config (for schema-backed configs).\n// `detectColumnType` is an infra prop.\ntype SetupExtra = {\n detectColumnType?: ImportStateProps['detectColumnType'];\n config?: ResolvedImportConfig;\n fields?: ImportField[];\n collectionId?: string;\n destination?: Destination;\n updateSchema?: UpdateSchemaFn;\n createFields?: CreateDataExtensionFieldsFn;\n fieldManagement?: FieldManagement;\n mergeFields?: ResolvedImportConfig['mergeFields'];\n idFieldKey?: string;\n backup?: BackupFn;\n jobApplicationErrorMap?: JobApplicationErrorMap;\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extra: SetupExtra = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const {\n detectColumnType,\n config: configOverride,\n collectionId,\n destination,\n updateSchema,\n createFields,\n fieldManagement,\n mergeFields,\n fields,\n idFieldKey,\n backup,\n jobApplicationErrorMap,\n } = extra;\n\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n queryName: collectionId ?? 'Movies',\n };\n\n const dataSource: ImportDataSource = destination\n ? {\n destination,\n ...(createFields && { createFields }),\n ...(fieldManagement && { fieldManagement }),\n }\n : {\n collectionId: collectionId ?? 'Movies',\n ...(updateSchema && { updateSchema }),\n };\n\n const config: ResolvedImportConfig = configOverride ?? {\n fields: fields ?? [{ id: 'name', header: 'Name' }],\n dataSource,\n ...(mergeFields && { mergeFields }),\n ...(idFieldKey && { idFieldKey }),\n ...(backup && { backup }),\n ...(jobApplicationErrorMap && { jobApplicationErrorMap }),\n };\n\n const props: ImportStateProps = {\n config,\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n detectColumnType,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The poll loop awaits real setTimeouts between polls; make sure timers are\n // real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n // created/updated come from the job's itemsSuccessfulInfo.\n expect(state.result).toEqual({\n succeeded: 2,\n failed: 0,\n created: 1,\n updated: 1,\n });\n expect(state.importStatus.status).toBe('success');\n // The modal stays open on the summary step; the collection is refreshed now\n // so the table is current once the user closes it via `done`.\n expect(state.currentStep).toBe('summary');\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('holds the completed (100%) progress bar on the progress step before the summary (CAIRO-4476)', async () => {\n const { state } = setup();\n\n // The job reports counts only when it finishes, so the bar can only reach\n // 100% at the very end. Capture the step + counts at the moment the linger\n // starts to prove the user sees the completed bar before the summary\n // replaces it.\n let atLinger: { step: string; processed: number; total: number } | null =\n null;\n const spy = jest\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .spyOn(state as any, '_lingerOnCompletion')\n .mockImplementation(() => {\n atLinger = {\n step: state.currentStep,\n processed: state.processedCount,\n total: state.totalCount,\n };\n return Promise.resolve();\n });\n\n await state.startImport();\n\n expect(atLinger).toEqual({ step: 'progress', processed: 2, total: 2 });\n expect(state.currentStep).toBe('summary');\n spy.mockRestore();\n });\n\n it('closes the modal only when the user dismisses the summary via done', async () => {\n const { state, importModalState } = setup();\n\n await state.startImport();\n expect(importModalState.close).not.toHaveBeenCalled();\n\n state.done();\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('counts all successes as created when the job omits itemsSuccessfulInfo', async () => {\n const { state } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: {\n itemsSuccessful: 2,\n itemsRejected: 0,\n total: 2,\n current: 2,\n // No `itemsSuccessfulInfo` — the created/updated split is absent.\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n // Without the breakdown, every success is reported as created (not 0), so\n // the summary step isn't blank.\n expect(state.result).toEqual({\n succeeded: 2,\n failed: 0,\n created: 2,\n updated: 0,\n });\n expect(state.currentStep).toBe('summary');\n });\n\n it('shows the summary step (no toast) when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n itemsSuccessfulInfo: { itemsCreated: 1, itemsUpdated: 0 },\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({\n succeeded: 1,\n failed: 1,\n created: 1,\n updated: 0,\n });\n expect(state.currentStep).toBe('summary');\n // The completion toast is gone — the summary step reports the outcome.\n expect(showToast).not.toHaveBeenCalled();\n expect(importModalState.close).not.toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n await state.downloadFailedRows();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows, each prefixed with its failure reason', async () => {\n const { state, client, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n {\n sourceItemId: 'row 3',\n failure: { code: 'bad', description: 'Invalid value' },\n },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n await state.downloadFailedRows();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // A leading reason column (the translated header) + original headers, then\n // the failed row prefixed with the server's failure reason — ready to fix\n // and re-upload. `translate` here echoes the key for the column header.\n expect(downloadCsv).toHaveBeenCalledWith(\n 'cairo.import.failureReasonColumn,Name\\r\\nInvalid value,Pear',\n 'failed-data.csv',\n );\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('resolves a failed job through the consumer jobApplicationErrorMap', async () => {\n // ImportState wraps the failure with `errorHandler.withErrorHandler(run,\n // jobApplicationErrorMap)` itself; the consumer only supplies the per-code\n // map. The surfaced error keeps the application-error-shaped code intact.\n // End-to-end resolution against the real error handler (getResolvedError) is\n // covered in the cairo Table.importButton spec.\n const jobApplicationErrorMap = {\n duplicate_key: () => ({ message: 'Bad rows' }),\n };\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { jobApplicationErrorMap },\n );\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore a completed import when the summary is closed', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n await state.startImport();\n\n // The import finished on the summary step and the collection was refreshed.\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('summary');\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n\n // Closing the summary must not revert a successful import.\n await state.close();\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n\ndescribe('ImportState orderedHeaders (row order stability)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Parse a CSV whose `ID` column auto-maps to `_id` (a field with that id\n // exists), so the `_id` row floats to the top of the ordered list.\n async function parseWithIdColumn(state: ImportState) {\n const csv = 'Name,ID,Handle\\nApple,id-1,a\\nPear,id-2,p\\n';\n const file = {\n name: 'data.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n }\n\n it('floats the `_id`-mapped column to the top for a freshly parsed file', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n\n await parseWithIdColumn(state);\n\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('keeps row order stable when the `_id` mapping is cleared and re-added', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n\n // Clearing the `_id` dropdown must not reorder the row under the cursor:\n // the snapshot stays fixed even though `idMappedHeader` becomes null.\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // Re-mapping `_id` also leaves the order untouched.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('re-snapshots the order for a new file and clears it on reset', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // A file with no `_id` column keeps plain CSV order.\n const csv = 'First,Second\\n1,2\\n';\n const file = {\n name: 'other.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n expect(state.orderedHeaders).toEqual(['First', 'Second']);\n\n state.reset();\n expect(state.orderedHeaders).toEqual([]);\n });\n});\n\ndescribe('ImportState platformized destination (non–Wix-Data)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n it('sends a consumer-supplied destination verbatim, ignoring collectionId', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogProducts: {} },\n }),\n );\n });\n\n it('does not add writePolicy to a platformized destination even when `_id` is mapped', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogInventory: {} } },\n );\n // Map a column to `_id` and pick a non-default policy — for a platformized\n // destination this must NOT leak into the destination (writePolicy is a\n // wixDataCollection-only concern).\n runInAction(() => {\n state.csvHeaders = ['Name', 'ID'];\n state.csvRows = [\n ['Apple', '1'],\n ['Pear', '2'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n ID: { kind: 'existing', fieldId: '_id' },\n };\n });\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogInventory: {} },\n }),\n );\n });\n\n it('reports canConfigureWritePolicy=false for a custom destination (control hidden), true for the default path', () => {\n const platformized = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n ).state;\n expect(platformized.canConfigureWritePolicy).toBe(false);\n\n const wixData = setup().state;\n expect(wixData.canConfigureWritePolicy).toBe(true);\n });\n\n describe('DataExtension create fields (destination branch)', () => {\n it('enables create-new-field when the destination branch supplies createFields', () => {\n const withCreate = setup(\n {},\n {\n destination: { storesCatalogProducts: {} },\n createFields: jest.fn(async () => undefined),\n },\n ).state;\n expect(withCreate.canCreateNewField).toBe(true);\n\n const withoutCreate = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n ).state;\n expect(withoutCreate.canCreateNewField).toBe(false);\n });\n\n it('hands createFields the deduped pending columns (source builds its own def)', async () => {\n const createFields = jest.fn(async () => undefined);\n const { state, client } = setup(\n {},\n { destination: { storesCatalogProducts: {} }, createFields },\n );\n\n runInAction(() => {\n state.csvHeaders = ['Name', 'Color'];\n state.csvRows = [\n ['Apple', 'Red'],\n ['Pear', 'Green'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Color: { kind: 'new', fieldType: 'text' },\n };\n });\n\n await state.startImport();\n\n expect(createFields).toHaveBeenCalledTimes(1);\n // Core passes the neutral pending column (deduped key + name + the mapping);\n // the DataExtension source turns it into its own field shape.\n expect(createFields).toHaveBeenCalledWith([\n {\n key: 'color',\n displayName: 'Color',\n mapping: { kind: 'new', fieldType: 'text' },\n },\n ]);\n // The consumer's destination is still sent verbatim.\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogProducts: {} },\n }),\n );\n });\n\n it('carries the edited mapping config (precise type, permissions, PII) in the pending column', async () => {\n const createFields = jest.fn(async () => undefined);\n const { state } = setup(\n {},\n { destination: { storesCatalogProducts: {} }, createFields },\n );\n\n const config = {\n deType: 'decimal',\n isPii: true,\n permissions: {\n installedApps: { defaultRead: true, defaultWrite: false },\n },\n };\n runInAction(() => {\n state.csvHeaders = ['Name', 'Count'];\n state.csvRows = [['Apple', '3']];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Count: {\n kind: 'new',\n fieldType: 'number',\n displayName: 'Count',\n config,\n },\n };\n });\n\n await state.startImport();\n\n expect(createFields).toHaveBeenCalledWith([\n {\n key: 'count',\n displayName: 'Count',\n mapping: {\n kind: 'new',\n fieldType: 'number',\n displayName: 'Count',\n config,\n },\n },\n ]);\n });\n });\n\n describe('created fields (CAIRO-4400)', () => {\n const RETURNED_FIELDS = {\n name: { id: 'name', displayName: 'Name', type: 'SHORT_TEXT' },\n color: { id: 'color', displayName: 'Color', type: 'SHORT_TEXT' },\n } as unknown as Schema['fields'];\n\n // Maps an extra column to a NEW field so `_resolveFieldMapping` calls\n // `updateSchema`. `updateSchema`'s presence is also what enables new mappings.\n function withNewFieldMapping(state: ImportState) {\n runInAction(() => {\n state.csvHeaders = ['Name', 'Color'];\n state.csvRows = [\n ['Apple', 'Red'],\n ['Pear', 'Green'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Color: { kind: 'new', fieldType: 'text' },\n };\n });\n }\n\n it('calls mergeFields with updateSchema’s returned map after a successful import', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state, collection } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).toHaveBeenCalledTimes(1);\n expect(mergeFields).toHaveBeenCalledWith(RETURNED_FIELDS);\n // The merge runs alongside the data refetch on the success path.\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();\n });\n\n it('does not call mergeFields for a plain import (no new fields)', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state } = setup({}, { updateSchema, mergeFields });\n\n await state.startImport();\n\n expect(updateSchema).not.toHaveBeenCalled();\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when updateSchema returns nothing', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => undefined);\n const { state } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when updateSchema returns an empty map', async () => {\n // A `{}` return is truthy; without a size guard it would reach a full-replace\n // mergeFields({}) and wipe every column. Treat it as \"nothing to merge\".\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => ({} as Schema['fields']));\n const { state } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('does not call mergeFields when the import fails after creating fields', async () => {\n const mergeFields = jest.fn();\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state } = setup(\n {\n uploadFile: jest.fn(async () => {\n throw new Error('upload failed');\n }),\n },\n { updateSchema, mergeFields },\n );\n withNewFieldMapping(state);\n\n await state.startImport();\n\n // Fields were created pre-upload, but a failed import must not merge them.\n expect(updateSchema).toHaveBeenCalledTimes(1);\n expect(state.importStatus.status).toBe('error');\n expect(mergeFields).not.toHaveBeenCalled();\n });\n\n it('keeps the import successful when mergeFields throws (no void → duplicate-rows)', async () => {\n const consoleError = jest\n .spyOn(console, 'error')\n .mockImplementation(() => {});\n const mergeFields = jest.fn(() => {\n throw new Error('merge boom');\n });\n const updateSchema = jest.fn(async () => RETURNED_FIELDS);\n const { state, collection } = setup({}, { updateSchema, mergeFields });\n withNewFieldMapping(state);\n\n await state.startImport();\n\n expect(mergeFields).toHaveBeenCalledTimes(1);\n // A throwing merge is swallowed — the completed import is untouched.\n expect(state.importStatus.status).toBe('success');\n expect(state.currentStep).toBe('summary');\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();\n\n consoleError.mockRestore();\n });\n });\n\n describe('schema-backed config (live getters + create-field permission)', () => {\n // A schema-backed config: the CMS `dataSource` branch a SchemaImportRef\n // satisfies. It supplies `updateSchema` only when create is permitted — its\n // presence is the create-new-field opt-in (no separate flag).\n const schemaConfig = (\n over: {\n fields?: ImportField[];\n collectionId?: string;\n updateSchema?: UpdateSchemaFn;\n idFieldKey?: string;\n mergeFields?: ResolvedImportConfig['mergeFields'];\n } = {},\n ): ResolvedImportConfig => ({\n fields: over.fields ?? [{ id: 'name', header: 'Name' }],\n dataSource: {\n collectionId: over.collectionId ?? 'RefCollection',\n ...(over.updateSchema && { updateSchema: over.updateSchema }),\n },\n ...(over.idFieldKey && { idFieldKey: over.idFieldKey }),\n ...(over.mergeFields && { mergeFields: over.mergeFields }),\n });\n\n it('reads fields live from the config rather than snapshotting them', () => {\n const config = schemaConfig();\n const { state } = setup({}, { config });\n\n expect(state.fields).toBe(config.fields);\n\n // A later change to the config is reflected — values are read on demand,\n // so a live (getter-backed) config needn't be resolved before the ctor.\n const updated: ImportField[] = [\n { id: 'name', header: 'Name' },\n { id: 'year', header: 'Year' },\n ];\n config.fields = updated;\n expect(state.fields).toBe(updated);\n });\n\n it('gates create-new-field on the presence of a create callback (updateSchema)', () => {\n // No create callback ⇒ create-new-field off (the source didn't permit it).\n const off = setup({}, { config: schemaConfig() });\n expect(off.state.canCreateNewField).toBe(false);\n\n // A create callback present ⇒ on.\n const on = setup(\n {},\n { config: schemaConfig({ updateSchema: jest.fn() }) },\n );\n expect(on.state.canCreateNewField).toBe(true);\n });\n\n it('builds the destination from the config collectionId', async () => {\n const { state, client } = setup(\n {},\n { config: schemaConfig({ collectionId: 'RefCollection' }) },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'RefCollection' } },\n }),\n );\n });\n\n it('creates new fields through the config updateSchema', async () => {\n const updateSchema = jest.fn(\n async () =>\n ({\n name: { id: 'name', displayName: 'Name', type: 'SHORT_TEXT' },\n year: { id: 'year', displayName: 'Year', type: 'NUMBER' },\n } as unknown as Schema['fields']),\n );\n const { state } = setup({}, { config: schemaConfig({ updateSchema }) });\n\n runInAction(() => {\n state.csvHeaders = ['Name', 'Year'];\n state.csvRows = [['Apple', '1999']];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Year: { kind: 'new', fieldType: 'number' },\n };\n });\n\n await state.startImport();\n\n expect(updateSchema).toHaveBeenCalledTimes(1);\n });\n\n it('detects the id-mapped column using the config idFieldKey', () => {\n const { state } = setup(\n {},\n { config: schemaConfig({ idFieldKey: 'movieId' }) },\n );\n\n runInAction(() => {\n state.mappingByHeader = {\n Ref: { kind: 'existing', fieldId: 'movieId' },\n };\n });\n\n expect(state.idMappedHeader).toBe('Ref');\n });\n });\n});\n\ndescribe('ImportState required fields (CAIRO-4452)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n it('is satisfied when a required field has a column mapped to it', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n // The seeded mapping maps the \"Name\" column to the `name` field.\n expect(state.hasMissingRequiredFields).toBe(false);\n expect(state.missingRequiredFields).toEqual([]);\n });\n\n it('flags a required field the user set to \"don\\'t import\"', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n state.setMapping('Name', null);\n\n expect(state.hasMissingRequiredFields).toBe(true);\n expect(state.missingRequiredFields.map((f) => f.id)).toEqual(['name']);\n });\n\n it('ignores unmapped fields that are not required', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [\n { id: 'name', header: 'Name' },\n { id: 'year', header: 'Year', required: false },\n ],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n state.setMapping('Name', null);\n\n expect(state.hasMissingRequiredFields).toBe(false);\n });\n\n it('is not satisfied by a create-new-field mapping', () => {\n const { state } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: {\n collectionId: 'Movies',\n updateSchema: async () => undefined,\n },\n },\n },\n );\n\n // Mapping the column to a brand-new field can't fill the existing required\n // field, so it stays missing.\n state.setNewFieldMapping('Name');\n\n expect(state.hasMissingRequiredFields).toBe(true);\n });\n\n it('blocks startImport and shows an error toast when a required field is missing', async () => {\n const { state, client, showToast } = setup(\n {},\n {\n config: {\n fields: [\n { id: 'name', header: 'Name', required: true },\n { id: 'year', header: 'Year' },\n ],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n // Keep a mapping (so the import isn't blocked by \"no mappings\") but leave the\n // required `name` field unmapped.\n runInAction(() => {\n state.csvHeaders = ['Name', 'Year'];\n state.csvRows = [['Apple', '2020']];\n });\n state.setMapping('Name', null);\n state.setMapping('Year', 'year');\n\n await state.startImport();\n\n expect(client.uploadFile).not.toHaveBeenCalled();\n expect(client.submitImportJob).not.toHaveBeenCalled();\n expect(state.currentStep).not.toBe('progress');\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'ERROR' }),\n );\n });\n\n it('proceeds with import when all required fields are mapped', async () => {\n const { state, client } = setup(\n {},\n {\n config: {\n fields: [{ id: 'name', header: 'Name', required: true }],\n dataSource: { collectionId: 'Movies' },\n },\n },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledTimes(1);\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -41,6 +41,7 @@ function createInMemorySchemaSource(config) {
41
41
  schemaPermissions = ALL_PERMISSIONS,
42
42
  itemPermissions,
43
43
  creatableFieldTypes = DEFAULT_CREATABLE_FIELD_TYPES,
44
+ fieldTypes,
44
45
  supportsPii = false,
45
46
  references
46
47
  } = config;
@@ -177,6 +178,7 @@ function createInMemorySchemaSource(config) {
177
178
  collectionId,
178
179
  loadSchema,
179
180
  creatableFieldTypes,
181
+ fieldTypes,
180
182
  supportsPii,
181
183
  ...(references && {
182
184
  references
@@ -1 +1 @@
1
- {"version":3,"names":["_SchemaSource","require","_InMemoryBackend","ALL_PERMISSIONS","createField","updateField","deleteField","DEFAULT_CREATABLE_FIELD_TYPES","patternsType","createInMemorySchemaSource","config","_config$fields$","collectionId","idField","displayField","fields","id","schemaPermissions","itemPermissions","creatableFieldTypes","supportsPii","references","forEach","field","schema","keyOf","item","String","fieldsSnapshot","seed","items","backend","InMemoryBackend","paginationMode","total","length","createOne","index","itemKey","collectionBackend","find","query","offset","fetchDataSync","hasNext","get","entityId","Error","create","entity","created","map","set","update","delete","bulkDelete","entityIds","bulkInsert","entities","succeeded","failed","fieldActions","addField","addFields","newFields","editField","fieldId","updates","current","Reflect","deleteProperty","renameField","newName","displayName","makePrimary","loadSchema","source","defineSchemaSource"],"sources":["../../../src/testkit/createInMemorySchemaSource.ts"],"sourcesContent":["import {\n defineSchemaSource,\n type CreatableFieldType,\n type SchemaSource,\n} from '../types/SchemaSource';\nimport type {\n CollectionBackend,\n FieldActions,\n ItemPermissions,\n LoadedSchema,\n Schema,\n SchemaPermissions,\n} from '../types/Schema';\nimport type { Field } from '../types/Field';\nimport type { OffsetQuery } from '../hooks/paginationModeConfig';\nimport { InMemoryBackend } from '../InMemoryBackend';\n\nconst ALL_PERMISSIONS: SchemaPermissions = {\n createField: true,\n updateField: true,\n deleteField: true,\n};\n\n// The types the add/edit modal offers by default (the ones @wix/data can create).\nconst DEFAULT_CREATABLE_FIELD_TYPES: CreatableFieldType[] = [\n { patternsType: 'SHORT_TEXT' },\n { patternsType: 'NUMBER' },\n { patternsType: 'BOOLEAN' },\n { patternsType: 'DATE' },\n];\n\nexport interface InMemorySchemaSource<T> {\n /** The source to pass anywhere a schema source is accepted. */\n source: SchemaSource<T>;\n /** The in-memory backend holding the rows — read or mutate them directly. */\n backend: InMemoryBackend<T>;\n}\n\nexport interface InMemorySchemaSourceConfig<T> {\n collectionId: string;\n /** The collection's fields (keyed internally by `field.id`). */\n fields: Field[];\n /** Seed rows the backend serves via `find`/`get`. */\n items?: T[];\n /** Defaults to the first field's id, else `idField`. */\n displayField?: string;\n /** Defaults to `_id`. */\n idField?: string;\n /** Defaults to all-true (add/edit/delete allowed). */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n /** Types the add-field modal offers. Defaults to text/number/boolean/date. */\n creatableFieldTypes?: CreatableFieldType[];\n supportsPii?: boolean;\n /** Sources for referenced collections, keyed by referenced collection id. */\n references?: Record<string, SchemaSource<any>>;\n}\n\n/**\n * Builds a real `SchemaSource<T>` backed by in-memory state — no data source (no\n * `@wix/data`, no network). Its backend `find` serves the seeded `items`, and\n * its `fieldActions` mutate the in-memory schema and return the updated fields\n * map, so the create-new-field import flow works end to end (the created column\n * surfaces via the schema-source merge).\n *\n * Returns `{ source, backend }`. Pass `source` anywhere a `SchemaSource` is\n * accepted — a `@wix/patterns/schema` collection hook, or `<Table\n * fieldsSource={...} />` (which the import reads from). Use `backend` to read or\n * assert on the in-memory rows directly.\n */\nexport function createInMemorySchemaSource<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(config: InMemorySchemaSourceConfig<T>): InMemorySchemaSource<T> {\n const {\n collectionId,\n idField = '_id',\n displayField = config.fields[0]?.id ?? idField,\n schemaPermissions = ALL_PERMISSIONS,\n itemPermissions,\n creatableFieldTypes = DEFAULT_CREATABLE_FIELD_TYPES,\n supportsPii = false,\n references,\n } = config;\n\n // Mutable in-memory state shared by the backend, schema, and field actions.\n const fields: Schema['fields'] = {};\n config.fields.forEach((field) => {\n fields[field.id] = field;\n });\n\n const schema: Schema = {\n id: collectionId,\n fields,\n displayField,\n idField,\n schemaPermissions,\n ...(itemPermissions && { itemPermissions }),\n };\n\n const keyOf = (item: T): string =>\n String((item as Record<string, unknown>)[idField] ?? '');\n // A fresh copy each mutation, so the schema-source merge sees a new map.\n const fieldsSnapshot = (): Schema['fields'] => ({ ...fields });\n\n // The shared `InMemoryBackend` holds the rows and runs the query logic\n // (ordering, filtering, pagination). The `collectionBackend` below adapts it\n // to the source-neutral contract. Mutations write straight to `backend.map`\n // and reads use the synchronous surface, so operations resolve without the\n // util's simulated async delay (which relies on timers the test suite freezes).\n const seed = config.items ?? [];\n const backend = new InMemoryBackend<T>({\n paginationMode: 'offset',\n total: seed.length,\n createOne: (index) => seed[index],\n itemKey: keyOf,\n });\n\n const collectionBackend: CollectionBackend<T> = {\n paginationMode: 'offset',\n find: async (query: OffsetQuery) => {\n const offset = query.offset ?? 0;\n const { items, total = 0 } = backend.fetchDataSync(query);\n return { items, total, hasNext: offset + items.length < total };\n },\n get: async (entityId) => {\n const item = backend.get(entityId);\n if (!item) {\n throw new Error(`Item \"${entityId}\" not found`);\n }\n return item;\n },\n create: async (entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n return created;\n },\n update: async (entity) => {\n backend.map.set(keyOf(entity), entity);\n return entity;\n },\n delete: async (entityId) => {\n backend.map.delete(entityId);\n },\n bulkDelete: async (entityIds) => {\n entityIds.forEach((entityId) => backend.map.delete(entityId));\n },\n bulkInsert: async (entities) => {\n entities.forEach((entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n });\n return { succeeded: entities.length, failed: 0 };\n },\n };\n\n const fieldActions: FieldActions = {\n addField: async (field) => {\n fields[field.id] = field;\n return fieldsSnapshot();\n },\n addFields: async (newFields) => {\n newFields.forEach((field) => {\n fields[field.id] = field;\n });\n return fieldsSnapshot();\n },\n editField: async (fieldId, updates) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, ...updates } as Field;\n }\n return fieldsSnapshot();\n },\n deleteField: async (fieldId) => {\n Reflect.deleteProperty(fields, fieldId);\n return fieldsSnapshot();\n },\n renameField: async (fieldId, newName) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, displayName: newName } as Field;\n }\n },\n makePrimary: async (fieldId) => {\n schema.displayField = fieldId;\n return fieldsSnapshot();\n },\n };\n\n const loadSchema = async (): Promise<LoadedSchema<T>> => ({\n schema,\n backend: collectionBackend,\n fieldActions,\n });\n\n const source = defineSchemaSource<T>({\n collectionId,\n loadSchema,\n creatableFieldTypes,\n supportsPii,\n ...(references && { references }),\n });\n\n return { source, backend };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_SchemaSource","require","_InMemoryBackend","ALL_PERMISSIONS","createField","updateField","deleteField","DEFAULT_CREATABLE_FIELD_TYPES","patternsType","createInMemorySchemaSource","config","_config$fields$","collectionId","idField","displayField","fields","id","schemaPermissions","itemPermissions","creatableFieldTypes","fieldTypes","supportsPii","references","forEach","field","schema","keyOf","item","String","fieldsSnapshot","seed","items","backend","InMemoryBackend","paginationMode","total","length","createOne","index","itemKey","collectionBackend","find","query","offset","fetchDataSync","hasNext","get","entityId","Error","create","entity","created","map","set","update","delete","bulkDelete","entityIds","bulkInsert","entities","succeeded","failed","fieldActions","addField","addFields","newFields","editField","fieldId","updates","current","Reflect","deleteProperty","renameField","newName","displayName","makePrimary","loadSchema","source","defineSchemaSource"],"sources":["../../../src/testkit/createInMemorySchemaSource.ts"],"sourcesContent":["import {\n defineSchemaSource,\n type CreatableFieldType,\n type SchemaSource,\n} from '../types/SchemaSource';\nimport type {\n CollectionBackend,\n FieldActions,\n ItemPermissions,\n LoadedSchema,\n Schema,\n SchemaPermissions,\n} from '../types/Schema';\nimport type { Field } from '../types/Field';\nimport type { FieldTypeDefinition } from '../types/FieldTypeDefinition';\nimport type { OffsetQuery } from '../hooks/paginationModeConfig';\nimport { InMemoryBackend } from '../InMemoryBackend';\n\nconst ALL_PERMISSIONS: SchemaPermissions = {\n createField: true,\n updateField: true,\n deleteField: true,\n};\n\n// The types the add/edit modal offers by default (the ones @wix/data can create).\nconst DEFAULT_CREATABLE_FIELD_TYPES: CreatableFieldType[] = [\n { patternsType: 'SHORT_TEXT' },\n { patternsType: 'NUMBER' },\n { patternsType: 'BOOLEAN' },\n { patternsType: 'DATE' },\n];\n\nexport interface InMemorySchemaSource<T> {\n /** The source to pass anywhere a schema source is accepted. */\n source: SchemaSource<T>;\n /** The in-memory backend holding the rows — read or mutate them directly. */\n backend: InMemoryBackend<T>;\n}\n\nexport interface InMemorySchemaSourceConfig<T> {\n collectionId: string;\n /** The collection's fields (keyed internally by `field.id`). */\n fields: Field[];\n /** Seed rows the backend serves via `find`/`get`. */\n items?: T[];\n /** Defaults to the first field's id, else `idField`. */\n displayField?: string;\n /** Defaults to `_id`. */\n idField?: string;\n /** Defaults to all-true (add/edit/delete allowed). */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n /** Types the add-field modal offers. Defaults to text/number/boolean/date. */\n creatableFieldTypes?: CreatableFieldType[];\n /** Consumer-defined field types, resolved by fields with `type: 'CUSTOM'`. */\n fieldTypes?: FieldTypeDefinition[];\n supportsPii?: boolean;\n /** Sources for referenced collections, keyed by referenced collection id. */\n references?: Record<string, SchemaSource<any>>;\n}\n\n/**\n * Builds a real `SchemaSource<T>` backed by in-memory state — no data source (no\n * `@wix/data`, no network). Its backend `find` serves the seeded `items`, and\n * its `fieldActions` mutate the in-memory schema and return the updated fields\n * map, so the create-new-field import flow works end to end (the created column\n * surfaces via the schema-source merge).\n *\n * Returns `{ source, backend }`. Pass `source` anywhere a `SchemaSource` is\n * accepted — a `@wix/patterns/schema` collection hook, or `<Table\n * fieldsSource={...} />` (which the import reads from). Use `backend` to read or\n * assert on the in-memory rows directly.\n */\nexport function createInMemorySchemaSource<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(config: InMemorySchemaSourceConfig<T>): InMemorySchemaSource<T> {\n const {\n collectionId,\n idField = '_id',\n displayField = config.fields[0]?.id ?? idField,\n schemaPermissions = ALL_PERMISSIONS,\n itemPermissions,\n creatableFieldTypes = DEFAULT_CREATABLE_FIELD_TYPES,\n fieldTypes,\n supportsPii = false,\n references,\n } = config;\n\n // Mutable in-memory state shared by the backend, schema, and field actions.\n const fields: Schema['fields'] = {};\n config.fields.forEach((field) => {\n fields[field.id] = field;\n });\n\n const schema: Schema = {\n id: collectionId,\n fields,\n displayField,\n idField,\n schemaPermissions,\n ...(itemPermissions && { itemPermissions }),\n };\n\n const keyOf = (item: T): string =>\n String((item as Record<string, unknown>)[idField] ?? '');\n // A fresh copy each mutation, so the schema-source merge sees a new map.\n const fieldsSnapshot = (): Schema['fields'] => ({ ...fields });\n\n // The shared `InMemoryBackend` holds the rows and runs the query logic\n // (ordering, filtering, pagination). The `collectionBackend` below adapts it\n // to the source-neutral contract. Mutations write straight to `backend.map`\n // and reads use the synchronous surface, so operations resolve without the\n // util's simulated async delay (which relies on timers the test suite freezes).\n const seed = config.items ?? [];\n const backend = new InMemoryBackend<T>({\n paginationMode: 'offset',\n total: seed.length,\n createOne: (index) => seed[index],\n itemKey: keyOf,\n });\n\n const collectionBackend: CollectionBackend<T> = {\n paginationMode: 'offset',\n find: async (query: OffsetQuery) => {\n const offset = query.offset ?? 0;\n const { items, total = 0 } = backend.fetchDataSync(query);\n return { items, total, hasNext: offset + items.length < total };\n },\n get: async (entityId) => {\n const item = backend.get(entityId);\n if (!item) {\n throw new Error(`Item \"${entityId}\" not found`);\n }\n return item;\n },\n create: async (entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n return created;\n },\n update: async (entity) => {\n backend.map.set(keyOf(entity), entity);\n return entity;\n },\n delete: async (entityId) => {\n backend.map.delete(entityId);\n },\n bulkDelete: async (entityIds) => {\n entityIds.forEach((entityId) => backend.map.delete(entityId));\n },\n bulkInsert: async (entities) => {\n entities.forEach((entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n });\n return { succeeded: entities.length, failed: 0 };\n },\n };\n\n const fieldActions: FieldActions = {\n addField: async (field) => {\n fields[field.id] = field;\n return fieldsSnapshot();\n },\n addFields: async (newFields) => {\n newFields.forEach((field) => {\n fields[field.id] = field;\n });\n return fieldsSnapshot();\n },\n editField: async (fieldId, updates) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, ...updates } as Field;\n }\n return fieldsSnapshot();\n },\n deleteField: async (fieldId) => {\n Reflect.deleteProperty(fields, fieldId);\n return fieldsSnapshot();\n },\n renameField: async (fieldId, newName) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, displayName: newName } as Field;\n }\n },\n makePrimary: async (fieldId) => {\n schema.displayField = fieldId;\n return fieldsSnapshot();\n },\n };\n\n const loadSchema = async (): Promise<LoadedSchema<T>> => ({\n schema,\n backend: collectionBackend,\n fieldActions,\n });\n\n const source = defineSchemaSource<T>({\n collectionId,\n loadSchema,\n creatableFieldTypes,\n fieldTypes,\n supportsPii,\n ...(references && { references }),\n });\n\n return { source, backend };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,6 +24,12 @@ function hubJobImportMocks(whenRequest, when) {
24
24
  created: 0,
25
25
  /** existing items updated (subset of `succeeded`), for the summary step */
26
26
  updated: 0,
27
+ /**
28
+ * When true, the terminal job omits `itemsSuccessfulInfo` entirely — the
29
+ * created/updated breakdown some jobs (and older servers) don't report, in
30
+ * which case only the total `itemsSuccessful` is available.
31
+ */
32
+ noBreakdown: false,
27
33
  /** number of IN_PROGRESS polls before the job goes terminal */
28
34
  inProgressPolls: 0,
29
35
  /** csvRows indices reported as failed via movement logs */
@@ -46,10 +52,12 @@ function hubJobImportMocks(whenRequest, when) {
46
52
  total: total(),
47
53
  itemsSuccessful: state.succeeded,
48
54
  itemsRejected: state.failed,
49
- itemsSuccessfulInfo: {
50
- itemsCreated: state.created,
51
- itemsUpdated: state.updated
52
- }
55
+ ...(!state.noBreakdown && {
56
+ itemsSuccessfulInfo: {
57
+ itemsCreated: state.created,
58
+ itemsUpdated: state.updated
59
+ }
60
+ })
53
61
  },
54
62
  ...(state.outcome === 'failed' && {
55
63
  error: {
@@ -71,6 +79,7 @@ function hubJobImportMocks(whenRequest, when) {
71
79
  state.failed = counts.failed ?? 0;
72
80
  state.updated = counts.updated ?? 0;
73
81
  state.created = counts.created ?? state.succeeded - state.updated;
82
+ state.noBreakdown = counts.noBreakdown ?? false;
74
83
  },
75
84
  /** Make the job report IN_PROGRESS for `n` polls before going terminal. */
76
85
  setInProgressPolls(n) {
@@ -111,6 +120,7 @@ function hubJobImportMocks(whenRequest, when) {
111
120
  state.failed = 0;
112
121
  state.created = 0;
113
122
  state.updated = 0;
123
+ state.noBreakdown = false;
114
124
  state.inProgressPolls = 0;
115
125
  state.failedRowIndices = [];
116
126
  state.uploadedBody = undefined;