@sankhyalabs/core 6.1.0 → 6.2.0-dev.1

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 (106) hide show
  1. package/.docs/classes/Change.md +11 -11
  2. package/.docs/classes/ColumnFilterManager.md +6 -6
  3. package/.docs/classes/DataUnit.md +178 -157
  4. package/.docs/classes/DataUnitLoaderUtils.md +6 -6
  5. package/.docs/classes/LangUtils.md +195 -0
  6. package/.docs/classes/SelectionInfo.md +16 -16
  7. package/.docs/enumerations/ChangeOperation.md +4 -4
  8. package/.docs/enumerations/SelectionMode.md +2 -2
  9. package/.docs/functions/defaultDataLoader.md +1 -1
  10. package/.docs/globals.md +1 -0
  11. package/.docs/interfaces/DUActionInterceptor.md +1 -1
  12. package/.docs/interfaces/PageRequest.md +3 -3
  13. package/.docs/interfaces/PaginationInfoBuilderParams.md +3 -3
  14. package/.docs/interfaces/QuickFilter.md +3 -3
  15. package/.docs/interfaces/Record.md +4 -4
  16. package/.docs/interfaces/SavedRecord.md +5 -5
  17. package/.docs/interfaces/WaitingChange.md +3 -3
  18. package/.docs/type-aliases/DataUnitEventOptions.md +1 -1
  19. package/dist/dataunit/Changes.d.ts +52 -0
  20. package/dist/dataunit/Changes.js +64 -0
  21. package/dist/dataunit/Changes.js.map +1 -0
  22. package/dist/dataunit/DataUnit.d.ts +16 -129
  23. package/dist/dataunit/DataUnit.js +97 -177
  24. package/dist/dataunit/DataUnit.js.map +1 -1
  25. package/dist/dataunit/DataUnitHelper.d.ts +2 -1
  26. package/dist/dataunit/DataUnitHelper.js.map +1 -1
  27. package/dist/dataunit/SelectionInfo.d.ts +16 -0
  28. package/dist/dataunit/SelectionInfo.js +39 -0
  29. package/dist/dataunit/SelectionInfo.js.map +1 -0
  30. package/dist/dataunit/formatting/PrettyFormatter.js +5 -3
  31. package/dist/dataunit/formatting/PrettyFormatter.js.map +1 -1
  32. package/dist/dataunit/interfaces/dataUnit.d.ts +61 -0
  33. package/dist/dataunit/interfaces/dataUnit.js +13 -0
  34. package/dist/dataunit/interfaces/dataUnit.js.map +1 -0
  35. package/dist/dataunit/loader/utils/dataUnitLoaderUtils.d.ts +2 -1
  36. package/dist/dataunit/loader/utils/dataUnitLoaderUtils.js.map +1 -1
  37. package/dist/dataunit/loading/LoadDataRequest.d.ts +1 -1
  38. package/dist/dataunit/loading/LoadDataResponse.d.ts +1 -1
  39. package/dist/dataunit/sorting/FieldComparator.d.ts +1 -1
  40. package/dist/dataunit/state/slice/AddedRecordsSlice.d.ts +1 -1
  41. package/dist/dataunit/state/slice/ChangesSlice.d.ts +2 -1
  42. package/dist/dataunit/state/slice/ChangesSlice.js +2 -1
  43. package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -1
  44. package/dist/dataunit/state/slice/LoadingControlSlice.js.map +1 -1
  45. package/dist/dataunit/state/slice/RecordsSlice.d.ts +1 -1
  46. package/dist/dataunit/state/slice/RecordsSlice.js +1 -1
  47. package/dist/dataunit/state/slice/RecordsSlice.js.map +1 -1
  48. package/dist/dataunit/state/slice/SelectionSlice.d.ts +2 -1
  49. package/dist/dataunit/state/slice/SelectionSlice.js +2 -1
  50. package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -1
  51. package/dist/dataunit/state/slice/SnapshotSlice.d.ts +1 -1
  52. package/dist/dataunit/state/slice/WaitingChangesSlice.d.ts +1 -1
  53. package/dist/index.d.ts +6 -2
  54. package/dist/index.js +6 -2
  55. package/dist/index.js.map +1 -1
  56. package/dist/utils/ColumnFilterManager.d.ts +2 -1
  57. package/dist/utils/ColumnFilterManager.js.map +1 -1
  58. package/dist/utils/LangUtils.d.ts +83 -0
  59. package/dist/utils/LangUtils.js +121 -0
  60. package/dist/utils/LangUtils.js.map +1 -0
  61. package/dist/utils/SortingUtils.d.ts +1 -1
  62. package/package.json +3 -2
  63. package/reports/test-report.xml +741 -524
  64. package/src/dataunit/Changes.ts +77 -0
  65. package/src/dataunit/DataUnit.ts +253 -397
  66. package/src/dataunit/DataUnitHelper.ts +2 -1
  67. package/src/dataunit/SelectionInfo.ts +55 -0
  68. package/src/dataunit/formatting/PrettyFormatter.ts +4 -5
  69. package/src/dataunit/interfaces/dataUnit.ts +71 -0
  70. package/src/dataunit/loader/utils/dataUnitLoaderUtils.ts +2 -1
  71. package/src/dataunit/loading/LoadDataRequest.ts +1 -1
  72. package/src/dataunit/loading/LoadDataResponse.ts +1 -1
  73. package/src/dataunit/sorting/FieldComparator.ts +1 -1
  74. package/src/dataunit/state/slice/AddedRecordsSlice.ts +1 -1
  75. package/src/dataunit/state/slice/ChangesSlice.ts +2 -1
  76. package/src/dataunit/state/slice/LoadingControlSlice.ts +1 -2
  77. package/src/dataunit/state/slice/RecordsSlice.ts +3 -2
  78. package/src/dataunit/state/slice/SelectionSlice.ts +2 -1
  79. package/src/dataunit/state/slice/SnapshotSlice.ts +1 -1
  80. package/src/dataunit/state/slice/WaitingChangesSlice.ts +1 -1
  81. package/src/dataunit/state/slice/test/RecordsSlice.spec.ts +1 -1
  82. package/src/index.ts +6 -2
  83. package/src/utils/ColumnFilterManager.ts +2 -1
  84. package/src/utils/LangUtils.ts +129 -0
  85. package/src/utils/SortingUtils.ts +1 -1
  86. package/test/dataunit/AccessParentsDataUnit.spec.ts +69 -0
  87. package/test/dataunit/Actions.spec.ts +74 -0
  88. package/test/dataunit/Change.spec.ts +66 -0
  89. package/test/dataunit/FieldManager.spec.ts +286 -0
  90. package/test/dataunit/FilterSortsLockersAndObservers.spec.ts +339 -0
  91. package/test/dataunit/InfoManager.spec.ts +254 -0
  92. package/test/dataunit/LoadDataAndMetadata.spec.ts +269 -0
  93. package/test/dataunit/RecodsSelection.spec.ts +229 -0
  94. package/test/dataunit/RecordsManager.spec.ts +323 -0
  95. package/test/dataunit/SavingData.spec.ts +206 -0
  96. package/test/dataunit/SelectionInfo.spec.ts +143 -0
  97. package/test/dataunit/formatting/PrettyFormatter.spec.ts +1 -1
  98. package/test/dataunit/loader/dataUnitInMemoryLoader.spec.ts +2 -1
  99. package/test/dataunit/loader/utils/createDataUnitMock.ts +34 -0
  100. package/test/dataunit/loader/utils/dataUnitLoaderUtils.spec.ts +1 -1
  101. package/test/dataunit/resources/metadata.ts +39 -0
  102. package/test/dataunit/resources/records.ts +29 -0
  103. package/test/util/ColumnFilterManager.spec.ts +2 -1
  104. package/test/util/LangUtils.spec.ts +117 -0
  105. package/tsconfig.json +1 -0
  106. package/src/dataunit/test/DataUnit.spec.ts +0 -44
@@ -0,0 +1,254 @@
1
+ import DataUnit from "../../src/dataunit/DataUnit";
2
+ import { DataType } from "../../src/dataunit/metadata/DataType";
3
+ import { SortMode } from "../../src/dataunit/metadata/UnitMetadata";
4
+ import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
5
+ import { recordsTest } from "./resources/records";
6
+
7
+ describe('Info manager', () => {
8
+ let dataUnit: DataUnit;
9
+
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
13
+ ({ dataUnit } = createDataUnitMock());
14
+ });
15
+
16
+ describe('getters and setters', () => {
17
+ it('should return dataUnit uuid', () => {
18
+ const response = dataUnit.dataUnitId;
19
+ expect(response).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
20
+ });
21
+
22
+ it('should return isWaitingToReload', () => {
23
+ let response = dataUnit.isWaitingToReload();
24
+ expect(response).toBeFalsy();
25
+ dataUnit.setWaitingToReload(true);
26
+ response = dataUnit.isWaitingToReload();
27
+ expect(response).toBeTruthy();
28
+ });
29
+
30
+ it('should return cancelPagination', () => {
31
+ let response = dataUnit.cancelPagination;
32
+ expect(response).toBeFalsy();
33
+ dataUnit.cancelPagination = true;
34
+ response = dataUnit.cancelPagination;
35
+ expect(response).toBeTruthy();
36
+ });
37
+
38
+ it('should return isMultipleEdition', () => {
39
+ let response = dataUnit.isMultipleEdition;
40
+ expect(response).toBeFalsy();
41
+ dataUnit.isMultipleEdition = true;
42
+ response = dataUnit.isMultipleEdition;
43
+ expect(response).toBeTruthy();
44
+ });
45
+
46
+ it('should return defaultSorting', () => {
47
+ const sort = {
48
+ dataType: DataType.BOOLEAN,
49
+ field: 'test',
50
+ mode: SortMode.ASC,
51
+ };
52
+ let response = dataUnit.getSort();
53
+ expect(response).toStrictEqual([]);
54
+ dataUnit.defaultSorting = [sort];
55
+ response = dataUnit.getSort();
56
+ expect(response).toStrictEqual([sort]);
57
+ });
58
+
59
+ it('should return pageSize', () => {
60
+ let response = dataUnit.pageSize;
61
+ expect(response).toBe(0);
62
+ dataUnit.pageSize = 10;
63
+ response = dataUnit.pageSize;
64
+ expect(response).toBe(10);
65
+ });
66
+ });
67
+
68
+ describe('waitingForChange', () => {
69
+ it('should return true for changes field', () => {
70
+ dataUnit.startChange('column_name_1', {
71
+ blocking: true,
72
+ waitmessage: 'test',
73
+ });
74
+ const properties = dataUnit.waitingForChange('column_name_1');
75
+ expect(properties).toBeTruthy();
76
+ });
77
+
78
+ it('should return false for no changes field', () => {
79
+ const properties = dataUnit.waitingForChange('column_name_2');
80
+ expect(properties).toBeFalsy();
81
+ });
82
+ });
83
+
84
+ describe('getInvalidMessage', () => {
85
+ beforeEach(async () => {
86
+ await dataUnit.loadMetadata();
87
+ await dataUnit.loadData();
88
+ });
89
+
90
+ it('should return error message from field', () => {
91
+ const messageTest = 'Error message';
92
+ dataUnit.setInvalidField('column_name_1', messageTest, 'test_1');
93
+ const message = dataUnit.getInvalidMessage('test_1', 'column_name_1');
94
+ expect(message).toBe(messageTest);
95
+ });
96
+
97
+ it('should return undefined when not has any error', () => {
98
+ const message = dataUnit.getInvalidMessage('test_1', 'column_name_2');
99
+ expect(message).toBeUndefined();
100
+ });
101
+ });
102
+
103
+ describe('isDirty', () => {
104
+ beforeEach(async () => {
105
+ await dataUnit.loadMetadata();
106
+ await dataUnit.loadData();
107
+ });
108
+
109
+ it('should return true when has data not saved', async () => {
110
+ dataUnit.selectFirst();
111
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
112
+ const isDirty = dataUnit.isDirty();
113
+ expect(isDirty).toBeTruthy();
114
+ });
115
+
116
+ it('should return true when dataUnit child not has data pending', async () => {
117
+ dataUnit.getChildDataunit('test');
118
+ const childDataUnit = dataUnit.getChildDataunit('test');
119
+ childDataUnit.selectFirst();
120
+ await childDataUnit.setFieldValue('column_name_1', 'new_value');
121
+ const isDirty = dataUnit.isDirty();
122
+ expect(isDirty).toBeTruthy();
123
+ });
124
+
125
+ it('should return false when dataUnit child has data not saved and ignoreChildren', async () => {
126
+ const childDataUnit = new DataUnit('test', dataUnit);
127
+ childDataUnit.selectFirst();
128
+ await childDataUnit.setFieldValue('column_name_1', 'new_value');
129
+ const isDirty = dataUnit.isDirty(true);
130
+ expect(isDirty).toBeFalsy();
131
+ });
132
+ });
133
+
134
+ describe('hasDirtyRecords', () => {
135
+ beforeEach(async () => {
136
+ await dataUnit.loadMetadata();
137
+ await dataUnit.loadData();
138
+ const saveLoaderMock = jest.fn().mockResolvedValue(recordsTest);
139
+ dataUnit.saveLoader = saveLoaderMock;
140
+ });
141
+
142
+ it('should return true when any record has data not saved', async () => {
143
+ dataUnit.selectFirst();
144
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
145
+ dataUnit.clearSelection();
146
+ let isDirty = dataUnit.hasDirtyRecords();
147
+ expect(isDirty).toBeTruthy();
148
+ dataUnit.selectLast();
149
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
150
+ dataUnit.clearSelection();
151
+ isDirty = dataUnit.hasDirtyRecords();
152
+ expect(isDirty).toBeTruthy();
153
+ });
154
+
155
+ it('should return false when data has be saved', async () => {
156
+ dataUnit.selectFirst();
157
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
158
+ await dataUnit.saveData();
159
+ const isDirty = dataUnit.hasDirtyRecords();
160
+ expect(isDirty).toBeFalsy();
161
+ });
162
+ });
163
+
164
+ describe('isNewRecord', () => {
165
+ beforeEach(async () => {
166
+ await dataUnit.loadMetadata();
167
+ await dataUnit.loadData();
168
+ });
169
+
170
+ it('should return false when record is not new', async () => {
171
+ dataUnit.selectFirst();
172
+ const recordSelected = dataUnit.getSelectedRecord();
173
+ const isNewRecord = dataUnit.isNewRecord(recordSelected?.__record__id__!);
174
+ expect(isNewRecord).toBeFalsy();
175
+ });
176
+
177
+ it('should return true when record is new', async () => {
178
+ await dataUnit.addRecord();
179
+ const recordSelected = dataUnit.getSelectedRecord();
180
+ const isNewRecord = dataUnit.isNewRecord(recordSelected?.__record__id__!);
181
+ expect(isNewRecord).toBeTruthy();
182
+ });
183
+ });
184
+
185
+ describe('canUndo', () => {
186
+ beforeEach(async () => {
187
+ await dataUnit.loadMetadata();
188
+ await dataUnit.loadData();
189
+ const saveLoaderMock = jest.fn().mockResolvedValue(recordsTest);
190
+ dataUnit.saveLoader = saveLoaderMock;
191
+ });
192
+
193
+ it('should return true when changes can undo', async () => {
194
+ await dataUnit.addRecord();
195
+ const canUndo = dataUnit.canUndo();
196
+ expect(canUndo).toBeTruthy();
197
+ });
198
+
199
+ it('should return true when field value changes can undo', async () => {
200
+ dataUnit.selectFirst();
201
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
202
+ const canUndo = dataUnit.canUndo();
203
+ expect(canUndo).toBeTruthy();
204
+ });
205
+
206
+ it('should return false when changes can not undo', async () => {
207
+ dataUnit.selectFirst();
208
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
209
+ await dataUnit.saveData();
210
+ const canUndo = dataUnit.canUndo();
211
+ expect(canUndo).toBeFalsy();
212
+ });
213
+ });
214
+
215
+ describe('canRedo', () => {
216
+ beforeEach(async () => {
217
+ await dataUnit.loadMetadata();
218
+ await dataUnit.loadData();
219
+ const saveLoaderMock = jest.fn().mockResolvedValue(recordsTest);
220
+ dataUnit.saveLoader = saveLoaderMock;
221
+ });
222
+
223
+ it('should return true when changes can redo', async () => {
224
+ await dataUnit.addRecord();
225
+ const canUndo = dataUnit.canUndo();
226
+ expect(canUndo).toBeTruthy();
227
+ dataUnit.undo();
228
+ const canRedo = dataUnit.canRedo();
229
+ expect(canRedo).toBeTruthy();
230
+ });
231
+
232
+ it('should return true when field value changes can redo', async () => {
233
+ dataUnit.selectFirst();
234
+ await dataUnit.setFieldValue('column_name_1', 'new_value');
235
+ const canUndo = dataUnit.canUndo();
236
+ expect(canUndo).toBeTruthy();
237
+ dataUnit.undo();
238
+ const canRedo = dataUnit.canRedo();
239
+ expect(canRedo).toBeTruthy();
240
+ });
241
+
242
+ it('should return false when changes can not redo', () => {
243
+ const canRedo = dataUnit.canRedo();
244
+ expect(canRedo).toBeFalsy();
245
+ });
246
+ });
247
+
248
+ describe('toString', () => {
249
+ it('should return dataUnit name', () => {
250
+ const name = dataUnit.toString();
251
+ expect(name).toContain('dataunit?');
252
+ });
253
+ });
254
+ });
@@ -0,0 +1,269 @@
1
+ import DataUnit from "../../src/dataunit/DataUnit";
2
+ import { DUActionInterceptor, LoadDataParams } from "../../src/dataunit/interfaces/dataUnit";
3
+ import { PaginationInfo } from "../../src/dataunit/loading/PaginationInfo";
4
+ import { Action, ExecutionContext } from "../../src/dataunit/state/action/DataUnitAction";
5
+ import ErrorException from "../../src/exceptions/ErrorException";
6
+ import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
7
+ import { metadata } from "./resources/metadata";
8
+ import { recordsTest } from "./resources/records";
9
+
10
+ describe('Load data and metadata', () => {
11
+ let dataUnit: DataUnit;
12
+ let dataLoaderMock = jest.fn();
13
+ let metadataLoaderMock = jest.fn();
14
+
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
18
+ ({ dataUnit, dataLoaderMock, metadataLoaderMock } = createDataUnitMock());
19
+ });
20
+
21
+ describe('gotoPage', () => {
22
+ it('should not call loader when pageSize is not defined', async () => {
23
+ await dataUnit.gotoPage(2);
24
+ expect(dataLoaderMock).not.toHaveBeenCalled();
25
+ });
26
+
27
+ it('should pass limit size and offset on request when pageSize is bigger than 0', async () => {
28
+ dataUnit.pageSize = 1;
29
+ const dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
30
+ dataUnit.dataLoader = dataLoaderMock;
31
+ await dataUnit.loadData();
32
+ await dataUnit.gotoPage(2);
33
+ expect(dataLoaderMock).toHaveBeenCalledWith(dataUnit, expect.objectContaining({ limit: 1, offset: 0 }));
34
+ });
35
+
36
+ it('should call loadData when have a next page', async () => {
37
+ dataUnit.pageSize = 1;
38
+ const dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
39
+ dataUnit.dataLoader = dataLoaderMock;
40
+ await dataUnit.updatePagination({
41
+ currentPage: 0,
42
+ firstRecord: 0,
43
+ hasMore: true,
44
+ lastRecord: 4,
45
+ total: 5
46
+ });
47
+ const response = await dataUnit.gotoPage(2);
48
+ expect(dataLoaderMock).toHaveBeenCalled();
49
+ expect(response).toStrictEqual({ records: recordsTest });
50
+ });
51
+
52
+ it('should return undefined when not have any next page', async () => {
53
+ dataUnit.pageSize = 1;
54
+ const dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
55
+ dataUnit.dataLoader = dataLoaderMock;
56
+ await dataUnit.updatePagination({
57
+ currentPage: 5,
58
+ firstRecord: 0,
59
+ hasMore: false,
60
+ lastRecord: 4,
61
+ total: 5
62
+ });
63
+ const response = await dataUnit.gotoPage(6);
64
+ expect(dataLoaderMock).not.toHaveBeenCalled();
65
+ expect(response).toBeUndefined();
66
+ });
67
+ });
68
+
69
+ describe('nextPage', () => {
70
+ it('should call loadData for the next page', async () => {
71
+ const dataUnit = new DataUnit();
72
+ dataUnit.pageSize = 1;
73
+ const dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
74
+ dataUnit.dataLoader = dataLoaderMock;
75
+ await dataUnit.updatePagination({
76
+ currentPage: 0,
77
+ firstRecord: 0,
78
+ hasMore: true,
79
+ lastRecord: 4,
80
+ total: 5
81
+ });
82
+ const response = await dataUnit.nextPage();
83
+ expect(dataLoaderMock).toHaveBeenCalledWith(dataUnit, expect.objectContaining({ offset: 1 }));
84
+ expect(response).toStrictEqual({ records: recordsTest });
85
+ });
86
+ });
87
+
88
+ describe('previousPage', () => {
89
+ it('should call loadData for the previous page', async () => {
90
+ const dataUnit = new DataUnit();
91
+ dataUnit.pageSize = 1;
92
+ const dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
93
+ dataUnit.dataLoader = dataLoaderMock;
94
+ await dataUnit.updatePagination({
95
+ currentPage: 1,
96
+ firstRecord: 0,
97
+ hasMore: true,
98
+ lastRecord: 4,
99
+ total: 5
100
+ });
101
+ const response = await dataUnit.previousPage();
102
+ expect(dataLoaderMock).toHaveBeenCalledWith(dataUnit, expect.objectContaining({ offset: 0 }));
103
+ expect(response).toStrictEqual({ records: recordsTest });
104
+ });
105
+ });
106
+
107
+ describe('dataLoader', () => {
108
+ it('should return records from dataLoader', async () => {
109
+ const result = await dataUnit.loadData();
110
+ expect(result.records).toStrictEqual(recordsTest);
111
+ });
112
+
113
+ it('should call dataLoader when loadData is invoked', async () => {
114
+ dataLoaderMock.mockResolvedValue({ records: [] });
115
+ dataUnit.dataLoader = dataLoaderMock;
116
+
117
+ const result = await dataUnit.loadData();
118
+ expect(dataLoaderMock).toHaveBeenCalled();
119
+ expect(result).toEqual({ records: [] });
120
+ });
121
+
122
+ it('should clear dataUnit when parent record is undefined', async () => {
123
+ dataUnit.selectFirst();
124
+ const childDataUnit = new DataUnit('child', dataUnit);
125
+
126
+ const result = await childDataUnit.loadData();
127
+
128
+ expect(childDataUnit.records).toEqual([]);
129
+ expect(result).toEqual({ records: [] });
130
+ });
131
+
132
+ it('should clear dataUnit when parent record is new', async () => {
133
+ dataUnit.addRecord();
134
+ const childDataUnit = new DataUnit('child', dataUnit);
135
+
136
+ const result = await childDataUnit.loadData();
137
+
138
+ expect(childDataUnit.records).toEqual([]);
139
+ expect(result).toEqual({ records: [] });
140
+ });
141
+
142
+ it('should pass quickFilter on request', async () => {
143
+ const quickFilter = { term: 'test' };
144
+ await dataUnit.loadData(quickFilter);
145
+ expect(dataLoaderMock).toHaveBeenCalledWith(dataUnit, expect.objectContaining({ quickFilter }));
146
+ });
147
+
148
+ it('should pass limit size and offset on request when pageSize is bigger than 0', async () => {
149
+ dataUnit.pageSize = 1;
150
+ await dataUnit.loadData();
151
+ expect(dataLoaderMock).toHaveBeenCalledWith(dataUnit, expect.objectContaining({ limit: 1, offset: 0 }));
152
+ });
153
+
154
+ it('should avoid call dataLoader when request is the same at the last', async () => {
155
+ const paginationInfo: PaginationInfo = {
156
+ currentPage: 0,
157
+ firstRecord: 0,
158
+ hasMore: true,
159
+ lastRecord: 4,
160
+ };
161
+ jest.spyOn(dataUnit, 'getPaginationInfo').mockReturnValue(paginationInfo);
162
+ const response1 = await dataUnit.loadData(undefined, undefined, true, undefined, true);
163
+ const response2 = await dataUnit.loadData(undefined, undefined, true, undefined, true);
164
+ const selectedRecord = dataUnit.getSelectedRecord();
165
+ expect(selectedRecord).toStrictEqual(recordsTest[0]);
166
+ expect(dataLoaderMock).toHaveBeenCalledTimes(1);
167
+ expect(response1.records).toStrictEqual(response2.records);
168
+ });
169
+
170
+ it('should select first record when propertie selectFirstRecord is true', async () => {
171
+ await dataUnit.loadData(undefined, undefined, undefined, undefined, true);
172
+ const selectedRecord = dataUnit.getSelectedRecord();
173
+ expect(selectedRecord).toStrictEqual(recordsTest[0]);
174
+ });
175
+
176
+ it('should handle error dataLoader', async () => {
177
+ dataLoaderMock.mockRejectedValue(new Error("Error test"));
178
+ const loadData = async () => await dataUnit.loadData();
179
+ await expect(loadData()).rejects.toBeInstanceOf(ErrorException);
180
+ });
181
+ });
182
+
183
+ describe('loadDataWithParams', () => {
184
+ it('should pass params to loadData correctly', async () => {
185
+ const loadDataMock = jest.spyOn(dataUnit, 'loadData');
186
+ const executionCtx: ExecutionContext = {
187
+ before: jest.fn((value) => value),
188
+ after: jest.fn((value) => value),
189
+ }
190
+ const params: LoadDataParams = {
191
+ checkLastFilter: true,
192
+ executionCtx,
193
+ keepSelection: true,
194
+ quickFilter: { term: 'test' },
195
+ selectFirstRecord: true,
196
+ source: 'test'
197
+ }
198
+ dataUnit.loadDataWithParams(params);
199
+ expect(loadDataMock).toHaveBeenCalledWith(
200
+ params.quickFilter,
201
+ params.executionCtx,
202
+ params.checkLastFilter,
203
+ params.source,
204
+ params.selectFirstRecord,
205
+ params.keepSelection
206
+ );
207
+ });
208
+ });
209
+
210
+ describe('loadMetadata', () => {
211
+ it('should return metadata', async () => {
212
+ const response = await dataUnit.loadMetadata();
213
+ expect(response).toStrictEqual(metadata);
214
+ });
215
+
216
+ it('should handle error metadataLoader', async () => {
217
+ metadataLoaderMock.mockRejectedValue(new Error("Error test"));
218
+ const loadMetadata = async () => await dataUnit.loadMetadata();
219
+ await expect(loadMetadata()).rejects.toBeInstanceOf(ErrorException);
220
+ });
221
+
222
+ it('should call executionCtx methods', async () => {
223
+ const executionCtx: ExecutionContext = {
224
+ before: jest.fn((value) => value),
225
+ after: jest.fn((value) => value),
226
+ }
227
+ await dataUnit.loadMetadata(executionCtx);
228
+ expect(executionCtx.before).toHaveBeenCalled();
229
+ expect(executionCtx.after).toHaveBeenCalled();
230
+ });
231
+
232
+ it('should call interceptors', async () => {
233
+ const loadingMetadata = jest.fn();
234
+ const metadataLoaded = jest.fn();
235
+ const interceptor: DUActionInterceptor = {
236
+ interceptAction: (action) => {
237
+ switch (action.type) {
238
+ case Action.LOADING_METADATA:
239
+ loadingMetadata(action.payload);
240
+ break;
241
+ case Action.METADATA_LOADED:
242
+ metadataLoaded(action.payload);
243
+ break;
244
+ }
245
+ return action;
246
+ }
247
+ }
248
+ dataUnit.addInterceptor(interceptor);
249
+ const promiseLoadMetadata = dataUnit.loadMetadata();
250
+
251
+ expect(loadingMetadata).toHaveBeenCalled();
252
+ expect(metadataLoaded).not.toHaveBeenCalled();
253
+ await promiseLoadMetadata;
254
+
255
+ expect(metadataLoaded).toHaveBeenCalledWith(metadata);
256
+ });
257
+
258
+ it('should interrupt by executionCtx', async () => {
259
+ const executionCtx: ExecutionContext = {
260
+ before: jest.fn(),
261
+ after: jest.fn(),
262
+ }
263
+ await dataUnit.loadMetadata(executionCtx);
264
+ expect(executionCtx.before).toHaveBeenCalled();
265
+ expect(executionCtx.after).not.toHaveBeenCalled();
266
+ expect(dataUnit.metadataLoader).not.toHaveBeenCalled();
267
+ });
268
+ });
269
+ });