@wix/bex-core 2.331.0 → 2.332.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 (113) hide show
  1. package/dist/cjs/assets/locale/messages_ar.json +8 -0
  2. package/dist/cjs/assets/locale/messages_bg.json +8 -0
  3. package/dist/cjs/assets/locale/messages_ca.json +8 -0
  4. package/dist/cjs/assets/locale/messages_cs.json +8 -0
  5. package/dist/cjs/assets/locale/messages_da.json +8 -0
  6. package/dist/cjs/assets/locale/messages_de.json +8 -0
  7. package/dist/cjs/assets/locale/messages_el.json +8 -0
  8. package/dist/cjs/assets/locale/messages_en.json +8 -0
  9. package/dist/cjs/assets/locale/messages_es.json +8 -0
  10. package/dist/cjs/assets/locale/messages_fi.json +8 -0
  11. package/dist/cjs/assets/locale/messages_fr.json +8 -0
  12. package/dist/cjs/assets/locale/messages_he.json +8 -0
  13. package/dist/cjs/assets/locale/messages_hi.json +8 -0
  14. package/dist/cjs/assets/locale/messages_hu.json +8 -0
  15. package/dist/cjs/assets/locale/messages_id.json +8 -0
  16. package/dist/cjs/assets/locale/messages_it.json +8 -0
  17. package/dist/cjs/assets/locale/messages_ja.json +8 -0
  18. package/dist/cjs/assets/locale/messages_ko.json +8 -0
  19. package/dist/cjs/assets/locale/messages_lt.json +8 -0
  20. package/dist/cjs/assets/locale/messages_ms.json +8 -0
  21. package/dist/cjs/assets/locale/messages_nl.json +8 -0
  22. package/dist/cjs/assets/locale/messages_no.json +8 -0
  23. package/dist/cjs/assets/locale/messages_pl.json +8 -0
  24. package/dist/cjs/assets/locale/messages_pt.json +8 -0
  25. package/dist/cjs/assets/locale/messages_ro.json +8 -0
  26. package/dist/cjs/assets/locale/messages_ru.json +8 -0
  27. package/dist/cjs/assets/locale/messages_sk.json +8 -0
  28. package/dist/cjs/assets/locale/messages_sl.json +8 -0
  29. package/dist/cjs/assets/locale/messages_sv.json +8 -0
  30. package/dist/cjs/assets/locale/messages_th.json +8 -0
  31. package/dist/cjs/assets/locale/messages_tl.json +8 -0
  32. package/dist/cjs/assets/locale/messages_tr.json +8 -0
  33. package/dist/cjs/assets/locale/messages_uk.json +8 -0
  34. package/dist/cjs/assets/locale/messages_vi.json +8 -0
  35. package/dist/cjs/assets/locale/messages_zh.json +8 -0
  36. package/dist/cjs/assets/locale/version_file +1 -1
  37. package/dist/cjs/hooks/useImport.js +3 -13
  38. package/dist/cjs/hooks/useImport.js.map +1 -1
  39. package/dist/cjs/hooks/useImportConfig.js +2 -0
  40. package/dist/cjs/hooks/useImportConfig.js.map +1 -1
  41. package/dist/cjs/services/translations.js.map +1 -1
  42. package/dist/cjs/state/ImportState/ImportState.js +95 -18
  43. package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
  44. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +278 -3
  45. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  46. package/dist/cjs/state/TagsState/TagsManagementState.js +17 -44
  47. package/dist/cjs/state/TagsState/TagsManagementState.js.map +1 -1
  48. package/dist/cjs/state/TagsState/TagsSearchState.js +0 -6
  49. package/dist/cjs/state/TagsState/TagsSearchState.js.map +1 -1
  50. package/dist/cjs/types/FieldsSource.js.map +1 -1
  51. package/dist/cjs/types/Schema.js.map +1 -1
  52. package/dist/esm/assets/locale/messages_ar.json +8 -0
  53. package/dist/esm/assets/locale/messages_bg.json +8 -0
  54. package/dist/esm/assets/locale/messages_ca.json +8 -0
  55. package/dist/esm/assets/locale/messages_cs.json +8 -0
  56. package/dist/esm/assets/locale/messages_da.json +8 -0
  57. package/dist/esm/assets/locale/messages_de.json +8 -0
  58. package/dist/esm/assets/locale/messages_el.json +8 -0
  59. package/dist/esm/assets/locale/messages_en.json +8 -0
  60. package/dist/esm/assets/locale/messages_es.json +8 -0
  61. package/dist/esm/assets/locale/messages_fi.json +8 -0
  62. package/dist/esm/assets/locale/messages_fr.json +8 -0
  63. package/dist/esm/assets/locale/messages_he.json +8 -0
  64. package/dist/esm/assets/locale/messages_hi.json +8 -0
  65. package/dist/esm/assets/locale/messages_hu.json +8 -0
  66. package/dist/esm/assets/locale/messages_id.json +8 -0
  67. package/dist/esm/assets/locale/messages_it.json +8 -0
  68. package/dist/esm/assets/locale/messages_ja.json +8 -0
  69. package/dist/esm/assets/locale/messages_ko.json +8 -0
  70. package/dist/esm/assets/locale/messages_lt.json +8 -0
  71. package/dist/esm/assets/locale/messages_ms.json +8 -0
  72. package/dist/esm/assets/locale/messages_nl.json +8 -0
  73. package/dist/esm/assets/locale/messages_no.json +8 -0
  74. package/dist/esm/assets/locale/messages_pl.json +8 -0
  75. package/dist/esm/assets/locale/messages_pt.json +8 -0
  76. package/dist/esm/assets/locale/messages_ro.json +8 -0
  77. package/dist/esm/assets/locale/messages_ru.json +8 -0
  78. package/dist/esm/assets/locale/messages_sk.json +8 -0
  79. package/dist/esm/assets/locale/messages_sl.json +8 -0
  80. package/dist/esm/assets/locale/messages_sv.json +8 -0
  81. package/dist/esm/assets/locale/messages_th.json +8 -0
  82. package/dist/esm/assets/locale/messages_tl.json +8 -0
  83. package/dist/esm/assets/locale/messages_tr.json +8 -0
  84. package/dist/esm/assets/locale/messages_uk.json +8 -0
  85. package/dist/esm/assets/locale/messages_vi.json +8 -0
  86. package/dist/esm/assets/locale/messages_zh.json +8 -0
  87. package/dist/esm/assets/locale/version_file +1 -1
  88. package/dist/esm/hooks/useImport.js +2 -7
  89. package/dist/esm/hooks/useImport.js.map +1 -1
  90. package/dist/esm/hooks/useImportConfig.js.map +1 -1
  91. package/dist/esm/state/ImportState/ImportState.js +68 -12
  92. package/dist/esm/state/ImportState/ImportState.js.map +1 -1
  93. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +164 -3
  94. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  95. package/dist/esm/state/TagsState/TagsManagementState.js +17 -33
  96. package/dist/esm/state/TagsState/TagsManagementState.js.map +1 -1
  97. package/dist/esm/state/TagsState/TagsSearchState.js +0 -6
  98. package/dist/esm/state/TagsState/TagsSearchState.js.map +1 -1
  99. package/dist/types/hooks/useImport.d.ts +3 -18
  100. package/dist/types/hooks/useImport.d.ts.map +1 -1
  101. package/dist/types/hooks/useImportConfig.d.ts +4 -20
  102. package/dist/types/hooks/useImportConfig.d.ts.map +1 -1
  103. package/dist/types/services/translations.d.ts +14 -1
  104. package/dist/types/services/translations.d.ts.map +1 -1
  105. package/dist/types/state/ImportState/ImportState.d.ts +63 -28
  106. package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
  107. package/dist/types/state/TagsState/TagsManagementState.d.ts.map +1 -1
  108. package/dist/types/state/TagsState/TagsSearchState.d.ts.map +1 -1
  109. package/dist/types/types/FieldsSource.d.ts +5 -1
  110. package/dist/types/types/FieldsSource.d.ts.map +1 -1
  111. package/dist/types/types/Schema.d.ts +6 -0
  112. package/dist/types/types/Schema.d.ts.map +1 -1
  113. package/package.json +4 -4
@@ -22,7 +22,12 @@ const COMPLETED_JOB = {
22
22
  current: 2
23
23
  }
24
24
  };
25
- function setup(clientOverrides = {}, extraProps = {}) {
25
+
26
+ // Config overrides merge into the default config; `config` fully replaces it
27
+ // (for schema-backed configs). `detectColumnType` is an infra prop; `mergeFields`
28
+ // is part of the config (merged via configOverrides).
29
+
30
+ function setup(clientOverrides = {}, extra = {}) {
26
31
  const client = {
27
32
  uploadFile: jest.fn(async _file => 'file-1'),
28
33
  submitImportJob: jest.fn(async () => 'job-1'),
@@ -41,12 +46,21 @@ function setup(clientOverrides = {}, extraProps = {}) {
41
46
  const showToast = jest.fn();
42
47
  const downloadCsv = jest.fn();
43
48
  const translate = (key, params) => params ? `${key}:${JSON.stringify(params)}` : key;
44
- const props = {
49
+ const {
50
+ detectColumnType,
51
+ config: configOverride,
52
+ ...configOverrides
53
+ } = extra;
54
+ const config = configOverride ?? {
45
55
  fields: [{
46
56
  id: 'name',
47
57
  header: 'Name'
48
58
  }],
49
59
  collectionId: 'Movies',
60
+ ...configOverrides
61
+ };
62
+ const props = {
63
+ config,
50
64
  httpClient: {
51
65
  request: jest.fn()
52
66
  },
@@ -58,7 +72,7 @@ function setup(clientOverrides = {}, extraProps = {}) {
58
72
  },
59
73
  showToast: showToast,
60
74
  downloadCsv,
61
- ...extraProps
75
+ detectColumnType
62
76
  };
63
77
  const state = new _ImportState.ImportState(props);
64
78
 
@@ -671,5 +685,266 @@ describe('ImportState platformized destination (non–Wix-Data)', () => {
671
685
  const wixData = setup().state;
672
686
  expect(wixData.canConfigureWritePolicy).toBe(true);
673
687
  });
688
+ describe('created fields (CAIRO-4400)', () => {
689
+ const RETURNED_FIELDS = {
690
+ name: {
691
+ id: 'name',
692
+ displayName: 'Name',
693
+ type: 'SHORT_TEXT'
694
+ },
695
+ color: {
696
+ id: 'color',
697
+ displayName: 'Color',
698
+ type: 'SHORT_TEXT'
699
+ }
700
+ };
701
+
702
+ // Maps an extra column to a NEW field so `_resolveFieldMapping` calls
703
+ // `updateSchema`. `updateSchema`'s presence is also what enables new mappings.
704
+ function withNewFieldMapping(state) {
705
+ (0, _mobx.runInAction)(() => {
706
+ state.csvHeaders = ['Name', 'Color'];
707
+ state.csvRows = [['Apple', 'Red'], ['Pear', 'Green']];
708
+ state.mappingByHeader = {
709
+ Name: {
710
+ kind: 'existing',
711
+ fieldId: 'name'
712
+ },
713
+ Color: {
714
+ kind: 'new',
715
+ fieldType: 'text'
716
+ }
717
+ };
718
+ });
719
+ }
720
+ it('calls mergeFields with updateSchema’s returned map after a successful import', async () => {
721
+ const mergeFields = jest.fn();
722
+ const updateSchema = jest.fn(async () => RETURNED_FIELDS);
723
+ const {
724
+ state,
725
+ collection
726
+ } = setup({}, {
727
+ updateSchema,
728
+ mergeFields
729
+ });
730
+ withNewFieldMapping(state);
731
+ await state.startImport();
732
+ expect(updateSchema).toHaveBeenCalledTimes(1);
733
+ expect(mergeFields).toHaveBeenCalledTimes(1);
734
+ expect(mergeFields).toHaveBeenCalledWith(RETURNED_FIELDS);
735
+ // The merge runs alongside the data refetch on the success path.
736
+ expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();
737
+ });
738
+ it('does not call mergeFields for a plain import (no new fields)', async () => {
739
+ const mergeFields = jest.fn();
740
+ const updateSchema = jest.fn(async () => RETURNED_FIELDS);
741
+ const {
742
+ state
743
+ } = setup({}, {
744
+ updateSchema,
745
+ mergeFields
746
+ });
747
+ await state.startImport();
748
+ expect(updateSchema).not.toHaveBeenCalled();
749
+ expect(mergeFields).not.toHaveBeenCalled();
750
+ });
751
+ it('does not call mergeFields when updateSchema returns nothing', async () => {
752
+ const mergeFields = jest.fn();
753
+ const updateSchema = jest.fn(async () => undefined);
754
+ const {
755
+ state
756
+ } = setup({}, {
757
+ updateSchema,
758
+ mergeFields
759
+ });
760
+ withNewFieldMapping(state);
761
+ await state.startImport();
762
+ expect(updateSchema).toHaveBeenCalledTimes(1);
763
+ expect(mergeFields).not.toHaveBeenCalled();
764
+ });
765
+ it('does not call mergeFields when updateSchema returns an empty map', async () => {
766
+ // A `{}` return is truthy; without a size guard it would reach a full-replace
767
+ // mergeFields({}) and wipe every column. Treat it as "nothing to merge".
768
+ const mergeFields = jest.fn();
769
+ const updateSchema = jest.fn(async () => ({}));
770
+ const {
771
+ state
772
+ } = setup({}, {
773
+ updateSchema,
774
+ mergeFields
775
+ });
776
+ withNewFieldMapping(state);
777
+ await state.startImport();
778
+ expect(updateSchema).toHaveBeenCalledTimes(1);
779
+ expect(mergeFields).not.toHaveBeenCalled();
780
+ });
781
+ it('does not call mergeFields when the import fails after creating fields', async () => {
782
+ const mergeFields = jest.fn();
783
+ const updateSchema = jest.fn(async () => RETURNED_FIELDS);
784
+ const {
785
+ state
786
+ } = setup({
787
+ uploadFile: jest.fn(async () => {
788
+ throw new Error('upload failed');
789
+ })
790
+ }, {
791
+ updateSchema,
792
+ mergeFields
793
+ });
794
+ withNewFieldMapping(state);
795
+ await state.startImport();
796
+
797
+ // Fields were created pre-upload, but a failed import must not merge them.
798
+ expect(updateSchema).toHaveBeenCalledTimes(1);
799
+ expect(state.importStatus.status).toBe('error');
800
+ expect(mergeFields).not.toHaveBeenCalled();
801
+ });
802
+ it('keeps the import successful when mergeFields throws (no void → duplicate-rows)', async () => {
803
+ const consoleError = jest.spyOn(console, 'error').mockImplementation(() => {});
804
+ const mergeFields = jest.fn(() => {
805
+ throw new Error('merge boom');
806
+ });
807
+ const updateSchema = jest.fn(async () => RETURNED_FIELDS);
808
+ const {
809
+ state,
810
+ importModalState,
811
+ collection
812
+ } = setup({}, {
813
+ updateSchema,
814
+ mergeFields
815
+ });
816
+ withNewFieldMapping(state);
817
+ await state.startImport();
818
+ expect(mergeFields).toHaveBeenCalledTimes(1);
819
+ // A throwing merge is swallowed — the completed import is untouched.
820
+ expect(state.importStatus.status).toBe('success');
821
+ expect(importModalState.close).toHaveBeenCalled();
822
+ expect(collection.clearResultAndMoveToStart).toHaveBeenCalled();
823
+ consoleError.mockRestore();
824
+ });
825
+ });
826
+ describe('schema-backed config (live getters + create-field permission)', () => {
827
+ // A schema-backed config sets canAddFields explicitly and supplies
828
+ // updateSchema/idFieldKey — the shape a SchemaImportRef satisfies.
829
+ const schemaConfig = (over = {}) => ({
830
+ fields: [{
831
+ id: 'name',
832
+ header: 'Name'
833
+ }],
834
+ collectionId: 'RefCollection',
835
+ canAddFields: false,
836
+ ...over
837
+ });
838
+ it('reads fields live from the config rather than snapshotting them', () => {
839
+ const config = schemaConfig();
840
+ const {
841
+ state
842
+ } = setup({}, {
843
+ config
844
+ });
845
+ expect(state.fields).toBe(config.fields);
846
+
847
+ // A later change to the config is reflected — values are read on demand,
848
+ // so a live (getter-backed) config needn't be resolved before the ctor.
849
+ const updated = [{
850
+ id: 'name',
851
+ header: 'Name'
852
+ }, {
853
+ id: 'year',
854
+ header: 'Year'
855
+ }];
856
+ config.fields = updated;
857
+ expect(state.fields).toBe(updated);
858
+ });
859
+ it('gates create-new-field on canAddFields even when updateSchema is present', () => {
860
+ const off = setup({}, {
861
+ config: schemaConfig({
862
+ canAddFields: false,
863
+ updateSchema: jest.fn()
864
+ })
865
+ });
866
+ expect(off.state.canCreateNewField).toBe(false);
867
+ const on = setup({}, {
868
+ config: schemaConfig({
869
+ canAddFields: true
870
+ })
871
+ });
872
+ expect(on.state.canCreateNewField).toBe(true);
873
+ });
874
+ it('builds the destination from the config collectionId', async () => {
875
+ const {
876
+ state,
877
+ client
878
+ } = setup({}, {
879
+ config: schemaConfig({
880
+ collectionId: 'RefCollection'
881
+ })
882
+ });
883
+ await state.startImport();
884
+ expect(client.submitImportJob).toHaveBeenCalledWith(expect.objectContaining({
885
+ destination: {
886
+ wixDataCollection: {
887
+ collectionId: 'RefCollection'
888
+ }
889
+ }
890
+ }));
891
+ });
892
+ it('creates new fields through the config updateSchema', async () => {
893
+ const updateSchema = jest.fn(async () => ({
894
+ name: {
895
+ id: 'name',
896
+ displayName: 'Name',
897
+ type: 'SHORT_TEXT'
898
+ },
899
+ year: {
900
+ id: 'year',
901
+ displayName: 'Year',
902
+ type: 'NUMBER'
903
+ }
904
+ }));
905
+ const {
906
+ state
907
+ } = setup({}, {
908
+ config: schemaConfig({
909
+ canAddFields: true,
910
+ updateSchema
911
+ })
912
+ });
913
+ (0, _mobx.runInAction)(() => {
914
+ state.csvHeaders = ['Name', 'Year'];
915
+ state.csvRows = [['Apple', '1999']];
916
+ state.mappingByHeader = {
917
+ Name: {
918
+ kind: 'existing',
919
+ fieldId: 'name'
920
+ },
921
+ Year: {
922
+ kind: 'new',
923
+ fieldType: 'number'
924
+ }
925
+ };
926
+ });
927
+ await state.startImport();
928
+ expect(updateSchema).toHaveBeenCalledTimes(1);
929
+ });
930
+ it('detects the id-mapped column using the config idFieldKey', () => {
931
+ const {
932
+ state
933
+ } = setup({}, {
934
+ config: schemaConfig({
935
+ idFieldKey: 'movieId'
936
+ })
937
+ });
938
+ (0, _mobx.runInAction)(() => {
939
+ state.mappingByHeader = {
940
+ Ref: {
941
+ kind: 'existing',
942
+ fieldId: 'movieId'
943
+ }
944
+ };
945
+ });
946
+ expect(state.idMappedHeader).toBe('Ref');
947
+ });
948
+ });
674
949
  });
675
950
  //# sourceMappingURL=ImportState.engine.spec.js.map
@@ -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","setup","clientOverrides","extraProps","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","props","fields","header","collectionId","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","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders","storesCatalogProducts","storesCatalogInventory","platformized","canConfigureWritePolicy","wixData"],"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 ImportCollection,\n} from '../ImportState';\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: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extraProps: Partial<ImportStateProps> = {},\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 collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\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 props: ImportStateProps = {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\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 ...extraProps,\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 success path awaits a real setTimeout (completion linger); make sure\n // timers are 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 expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success 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 },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = 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 const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\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 from the partial toast action', async () => {\n const { state, client, showToast, 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 { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\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('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\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 { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\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 when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\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"],"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","setup","clientOverrides","extra","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","detectColumnType","config","configOverride","configOverrides","fields","header","collectionId","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","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders","storesCatalogProducts","storesCatalogInventory","platformized","canConfigureWritePolicy","wixData","RETURNED_FIELDS","displayName","color","withNewFieldMapping","Color","fieldType","mergeFields","updateSchema","Error","consoleError","spyOn","console","mockRestore","schemaConfig","over","canAddFields","updated","off","canCreateNewField","on","year","Year","idFieldKey","Ref"],"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 ImportButtonConfig,\n ImportCollection,\n ImportField,\n} from '../ImportState';\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: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\n// Config overrides merge into the default config; `config` fully replaces it\n// (for schema-backed configs). `detectColumnType` is an infra prop; `mergeFields`\n// is part of the config (merged via configOverrides).\ntype SetupExtra = Partial<ImportButtonConfig> &\n Pick<ImportStateProps, 'detectColumnType'> & {\n config?: ImportButtonConfig;\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 collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\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 { detectColumnType, config: configOverride, ...configOverrides } =\n extra;\n const config: ImportButtonConfig = configOverride ?? {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\n ...configOverrides,\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 success path awaits a real setTimeout (completion linger); make sure\n // timers are 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 expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success 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 },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = 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 const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\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 from the partial toast action', async () => {\n const { state, client, showToast, 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 { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\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('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\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 { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\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 when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\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('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, importModalState, 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(importModalState.close).toHaveBeenCalled();\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 sets canAddFields explicitly and supplies\n // updateSchema/idFieldKey — the shape a SchemaImportRef satisfies.\n const schemaConfig = (\n over: Partial<ImportButtonConfig> = {},\n ): ImportButtonConfig => ({\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'RefCollection',\n canAddFields: false,\n ...over,\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 canAddFields even when updateSchema is present', () => {\n const off = setup(\n {},\n { config: schemaConfig({ canAddFields: false, updateSchema: jest.fn() }) },\n );\n expect(off.state.canCreateNewField).toBe(false);\n\n const on = setup({}, { config: schemaConfig({ canAddFields: true }) });\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({ canAddFields: true, 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"],"mappings":"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","ignoreList":[]}