@sankhyalabs/core 6.1.0-dev.2 → 6.1.0-dev.4
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.
- package/.docs/classes/Change.md +11 -11
- package/.docs/classes/ColumnFilterManager.md +6 -6
- package/.docs/classes/DataUnit.md +157 -157
- package/.docs/classes/DataUnitLoaderUtils.md +6 -6
- package/.docs/classes/SelectionInfo.md +16 -16
- package/.docs/enumerations/ChangeOperation.md +4 -4
- package/.docs/enumerations/SelectionMode.md +2 -2
- package/.docs/functions/defaultDataLoader.md +1 -1
- package/.docs/interfaces/DUActionInterceptor.md +1 -1
- package/.docs/interfaces/PageRequest.md +3 -3
- package/.docs/interfaces/PaginationInfoBuilderParams.md +3 -3
- package/.docs/interfaces/QuickFilter.md +3 -3
- package/.docs/interfaces/Record.md +4 -4
- package/.docs/interfaces/SavedRecord.md +5 -5
- package/.docs/interfaces/WaitingChange.md +3 -3
- package/.docs/type-aliases/DataUnitEventOptions.md +1 -1
- package/dist/dataunit/Changes.d.ts +52 -0
- package/dist/dataunit/Changes.js +64 -0
- package/dist/dataunit/Changes.js.map +1 -0
- package/dist/dataunit/DataUnit.d.ts +9 -129
- package/dist/dataunit/DataUnit.js +87 -177
- package/dist/dataunit/DataUnit.js.map +1 -1
- package/dist/dataunit/DataUnitHelper.d.ts +2 -1
- package/dist/dataunit/DataUnitHelper.js.map +1 -1
- package/dist/dataunit/SelectionInfo.d.ts +16 -0
- package/dist/dataunit/SelectionInfo.js +39 -0
- package/dist/dataunit/SelectionInfo.js.map +1 -0
- package/dist/dataunit/interfaces/dataUnit.d.ts +61 -0
- package/dist/dataunit/interfaces/dataUnit.js +13 -0
- package/dist/dataunit/interfaces/dataUnit.js.map +1 -0
- package/dist/dataunit/loader/dataUnitInMemoryLoader.js +2 -2
- package/dist/dataunit/loader/dataUnitInMemoryLoader.js.map +1 -1
- package/dist/dataunit/loader/utils/dataUnitLoaderUtils.d.ts +2 -1
- package/dist/dataunit/loader/utils/dataUnitLoaderUtils.js.map +1 -1
- package/dist/dataunit/loading/LoadDataRequest.d.ts +1 -1
- package/dist/dataunit/loading/LoadDataResponse.d.ts +1 -1
- package/dist/dataunit/sorting/FieldComparator.d.ts +1 -1
- package/dist/dataunit/state/slice/AddedRecordsSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/ChangesSlice.d.ts +2 -1
- package/dist/dataunit/state/slice/ChangesSlice.js +2 -1
- package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -1
- package/dist/dataunit/state/slice/LoadingControlSlice.js.map +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.js +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.js.map +1 -1
- package/dist/dataunit/state/slice/SelectionSlice.d.ts +2 -1
- package/dist/dataunit/state/slice/SelectionSlice.js +2 -1
- package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -1
- package/dist/dataunit/state/slice/SnapshotSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/WaitingChangesSlice.d.ts +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/ColumnFilterManager.d.ts +2 -1
- package/dist/utils/ColumnFilterManager.js.map +1 -1
- package/dist/utils/SortingUtils.d.ts +1 -1
- package/package.json +2 -1
- package/reports/test-report.xml +672 -471
- package/src/dataunit/Changes.ts +77 -0
- package/src/dataunit/DataUnit.ts +242 -397
- package/src/dataunit/DataUnitHelper.ts +2 -1
- package/src/dataunit/SelectionInfo.ts +55 -0
- package/src/dataunit/interfaces/dataUnit.ts +71 -0
- package/src/dataunit/loader/dataUnitInMemoryLoader.ts +2 -2
- package/src/dataunit/loader/utils/dataUnitLoaderUtils.ts +2 -1
- package/src/dataunit/loading/LoadDataRequest.ts +1 -1
- package/src/dataunit/loading/LoadDataResponse.ts +1 -1
- package/src/dataunit/sorting/FieldComparator.ts +1 -1
- package/src/dataunit/state/slice/AddedRecordsSlice.ts +1 -1
- package/src/dataunit/state/slice/ChangesSlice.ts +2 -1
- package/src/dataunit/state/slice/LoadingControlSlice.ts +1 -2
- package/src/dataunit/state/slice/RecordsSlice.ts +3 -2
- package/src/dataunit/state/slice/SelectionSlice.ts +2 -1
- package/src/dataunit/state/slice/SnapshotSlice.ts +1 -1
- package/src/dataunit/state/slice/WaitingChangesSlice.ts +1 -1
- package/src/dataunit/state/slice/test/RecordsSlice.spec.ts +1 -1
- package/src/index.ts +4 -1
- package/src/utils/ColumnFilterManager.ts +2 -1
- package/src/utils/SortingUtils.ts +1 -1
- package/test/dataunit/AccessParentsDataUnit.spec.ts +69 -0
- package/test/dataunit/Actions.spec.ts +74 -0
- package/test/dataunit/Change.spec.ts +66 -0
- package/test/dataunit/FieldManager.spec.ts +286 -0
- package/test/dataunit/FilterSortsLockersAndObservers.spec.ts +339 -0
- package/test/dataunit/InfoManager.spec.ts +254 -0
- package/test/dataunit/LoadDataAndMetadata.spec.ts +269 -0
- package/test/dataunit/RecodsSelection.spec.ts +229 -0
- package/test/dataunit/RecordsManager.spec.ts +323 -0
- package/test/dataunit/SavingData.spec.ts +206 -0
- package/test/dataunit/SelectionInfo.spec.ts +143 -0
- package/test/dataunit/loader/dataUnitInMemoryLoader.spec.ts +2 -1
- package/test/dataunit/loader/utils/createDataUnitMock.ts +34 -0
- package/test/dataunit/loader/utils/dataUnitLoaderUtils.spec.ts +1 -1
- package/test/dataunit/resources/metadata.ts +39 -0
- package/test/dataunit/resources/records.ts +29 -0
- package/test/util/ColumnFilterManager.spec.ts +2 -1
- package/tsconfig.json +1 -0
- package/src/dataunit/test/DataUnit.spec.ts +0 -44
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import DataUnit from "../../src/dataunit/DataUnit";
|
|
2
|
+
import { DataType } from "../../src/dataunit/metadata/DataType";
|
|
3
|
+
import { Sort, SortingProvider, SortMode } from "../../src/dataunit/metadata/UnitMetadata";
|
|
4
|
+
import { ExecutionContext } from "../../src/dataunit/state/action/DataUnitAction";
|
|
5
|
+
import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
|
|
6
|
+
import { recordsTest } from "./resources/records";
|
|
7
|
+
|
|
8
|
+
describe('Records selection', () => {
|
|
9
|
+
let dataUnit: DataUnit;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
jest.clearAllMocks();
|
|
13
|
+
window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
|
|
14
|
+
({ dataUnit } = createDataUnitMock());
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('getSelectionInfo', () => {
|
|
18
|
+
it('should return selection records', async () => {
|
|
19
|
+
await dataUnit.loadData();
|
|
20
|
+
dataUnit.selectFirst();
|
|
21
|
+
const response = dataUnit.getSelectionInfo();
|
|
22
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [recordsTest[0]] }));
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should get all records', async () => {
|
|
26
|
+
await dataUnit.loadData();
|
|
27
|
+
const allRecodsLoader = jest.fn().mockReturnValue(recordsTest);
|
|
28
|
+
dataUnit.allRecordsLoader = allRecodsLoader;
|
|
29
|
+
dataUnit.selectFirst();
|
|
30
|
+
const response = dataUnit.getSelectionInfo();
|
|
31
|
+
const allRecords = response.getAllRecords?.();
|
|
32
|
+
expect(allRecodsLoader).toHaveBeenCalledWith(dataUnit);
|
|
33
|
+
expect(allRecords).toStrictEqual(recordsTest);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should return empty array when loader return invalid value', async () => {
|
|
37
|
+
await dataUnit.loadData();
|
|
38
|
+
const allRecodsLoader = jest.fn();
|
|
39
|
+
dataUnit.allRecordsLoader = allRecodsLoader;
|
|
40
|
+
dataUnit.selectFirst();
|
|
41
|
+
const response = dataUnit.getSelectionInfo();
|
|
42
|
+
const allRecords = response.getAllRecords?.();
|
|
43
|
+
expect(allRecodsLoader).toHaveBeenCalledWith(dataUnit);
|
|
44
|
+
expect(allRecords).toStrictEqual([]);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should return empty array when not has a loader', async () => {
|
|
48
|
+
await dataUnit.loadData();
|
|
49
|
+
dataUnit.allRecordsLoader = undefined;
|
|
50
|
+
dataUnit.selectFirst();
|
|
51
|
+
const response = dataUnit.getSelectionInfo();
|
|
52
|
+
const allRecords = response.getAllRecords?.();
|
|
53
|
+
expect(allRecords).toStrictEqual([]);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should return sortable records', async () => {
|
|
57
|
+
const sortingProvider: SortingProvider = {
|
|
58
|
+
getSort: () => {
|
|
59
|
+
const sort: Sort = {
|
|
60
|
+
field: 'column_name_1',
|
|
61
|
+
dataType: DataType.TEXT,
|
|
62
|
+
mode: SortMode.DESC,
|
|
63
|
+
};
|
|
64
|
+
return [sort];
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
dataUnit.sortingProvider = sortingProvider;
|
|
68
|
+
await dataUnit.loadMetadata();
|
|
69
|
+
await dataUnit.loadData();
|
|
70
|
+
const allRecodsLoader = jest.fn().mockReturnValue(recordsTest);
|
|
71
|
+
dataUnit.allRecordsLoader = allRecodsLoader;
|
|
72
|
+
dataUnit.selectFirst();
|
|
73
|
+
const response = dataUnit.getSelectionInfo();
|
|
74
|
+
const allRecords = response.getAllRecords?.();
|
|
75
|
+
expect(allRecodsLoader).toHaveBeenCalledWith(dataUnit);
|
|
76
|
+
expect(allRecords).toStrictEqual(recordsTest);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('selectAllRecords', () => {
|
|
81
|
+
it('should select all records', async () => {
|
|
82
|
+
await dataUnit.loadData();
|
|
83
|
+
await dataUnit.selectAllRecords();
|
|
84
|
+
const response = dataUnit.getSelectionInfo();
|
|
85
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: recordsTest }));
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('unSelectAllRecords', () => {
|
|
90
|
+
it('should remove all records selection', async () => {
|
|
91
|
+
await dataUnit.loadData();
|
|
92
|
+
await dataUnit.selectAllRecords();
|
|
93
|
+
await dataUnit.unSelectAllRecords();
|
|
94
|
+
const response = dataUnit.getSelectionInfo();
|
|
95
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [] }));
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('clearSelection', () => {
|
|
100
|
+
it('should remove all records selection', async () => {
|
|
101
|
+
await dataUnit.loadData();
|
|
102
|
+
dataUnit.selectFirst();
|
|
103
|
+
dataUnit.clearSelection();
|
|
104
|
+
const response = dataUnit.getSelectionInfo();
|
|
105
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [] }));
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('updatePageSelection', () => {
|
|
110
|
+
it('should set records selection', async () => {
|
|
111
|
+
await dataUnit.loadData();
|
|
112
|
+
dataUnit.selectFirst();
|
|
113
|
+
const response = await dataUnit.updatePageSelection([recordsTest[4].__record__id__]);
|
|
114
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [recordsTest[4]] }));
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should remove all records selection', async () => {
|
|
118
|
+
await dataUnit.loadData();
|
|
119
|
+
dataUnit.selectFirst();
|
|
120
|
+
const response = await dataUnit.updatePageSelection([]);
|
|
121
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [] }));
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should remove all records selection', async () => {
|
|
125
|
+
await dataUnit.loadData();
|
|
126
|
+
dataUnit.selectFirst();
|
|
127
|
+
const response = await dataUnit.updatePageSelection();
|
|
128
|
+
expect(response).toStrictEqual(expect.objectContaining({ records: [recordsTest[0]] }));
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe('hasNext', () => {
|
|
133
|
+
it('should return true when has a next record', async () => {
|
|
134
|
+
await dataUnit.loadData();
|
|
135
|
+
dataUnit.selectFirst();
|
|
136
|
+
const response = dataUnit.hasNext();
|
|
137
|
+
expect(response).toBeTruthy();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('should return false when not has a next record', async () => {
|
|
141
|
+
await dataUnit.loadData();
|
|
142
|
+
dataUnit.selectLast();
|
|
143
|
+
const response = dataUnit.hasNext();
|
|
144
|
+
expect(response).toBeFalsy();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('hasPrevious', () => {
|
|
149
|
+
it('should return true when has a prevous record', async () => {
|
|
150
|
+
await dataUnit.loadData();
|
|
151
|
+
dataUnit.selectFirst();
|
|
152
|
+
const response = dataUnit.hasPrevious();
|
|
153
|
+
expect(response).toBeFalsy();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should return false when not has a prevous record', async () => {
|
|
157
|
+
await dataUnit.loadData();
|
|
158
|
+
dataUnit.selectLast();
|
|
159
|
+
const response = dataUnit.hasPrevious();
|
|
160
|
+
expect(response).toBeTruthy();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('nextRecord', () => {
|
|
165
|
+
it('should change selection to second record when has a next in the same page', async () => {
|
|
166
|
+
await dataUnit.loadData();
|
|
167
|
+
dataUnit.selectFirst();
|
|
168
|
+
await dataUnit.nextRecord();
|
|
169
|
+
const response = dataUnit.getSelectionInfo();
|
|
170
|
+
expect(response.records).toStrictEqual([recordsTest[1]]);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('should change selection to second record when not has a next in the same page', async () => {
|
|
174
|
+
dataUnit.pageSize = 2;
|
|
175
|
+
await dataUnit.loadData();
|
|
176
|
+
dataUnit.selectLast();
|
|
177
|
+
await dataUnit.nextRecord();
|
|
178
|
+
const response = dataUnit.getSelectionInfo();
|
|
179
|
+
expect(response.records).toStrictEqual([recordsTest[2]]);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should call executionCtx', async () => {
|
|
183
|
+
dataUnit.pageSize = 2;
|
|
184
|
+
await dataUnit.loadData();
|
|
185
|
+
dataUnit.selectLast();
|
|
186
|
+
const executionCtx: ExecutionContext = {
|
|
187
|
+
before: jest.fn((value) => value),
|
|
188
|
+
}
|
|
189
|
+
await dataUnit.nextRecord(executionCtx);
|
|
190
|
+
const response = dataUnit.getSelectionInfo();
|
|
191
|
+
expect(response.records).toStrictEqual([recordsTest[2]]);
|
|
192
|
+
expect(executionCtx.before).toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('previousRecord', () => {
|
|
197
|
+
it('should change selection to first record when has a previous in the same page', async () => {
|
|
198
|
+
await dataUnit.loadData();
|
|
199
|
+
dataUnit.selectLast();
|
|
200
|
+
await dataUnit.previousRecord();
|
|
201
|
+
const response = dataUnit.getSelectionInfo();
|
|
202
|
+
expect(response.records).toStrictEqual([recordsTest[3]]);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should change selection to first record when not has a previous in the same page', async () => {
|
|
206
|
+
dataUnit.pageSize = 2;
|
|
207
|
+
await dataUnit.loadData();
|
|
208
|
+
await dataUnit.gotoPage(1);
|
|
209
|
+
dataUnit.selectFirst();
|
|
210
|
+
await dataUnit.previousRecord();
|
|
211
|
+
const response = dataUnit.getSelectionInfo();
|
|
212
|
+
expect(response.records).toStrictEqual([recordsTest[1]]);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('should call executionCtx', async () => {
|
|
216
|
+
dataUnit.pageSize = 2;
|
|
217
|
+
await dataUnit.loadData();
|
|
218
|
+
await dataUnit.gotoPage(1);
|
|
219
|
+
dataUnit.selectFirst();
|
|
220
|
+
const executionCtx: ExecutionContext = {
|
|
221
|
+
before: jest.fn((value) => value),
|
|
222
|
+
}
|
|
223
|
+
await dataUnit.previousRecord(executionCtx);
|
|
224
|
+
const response = dataUnit.getSelectionInfo();
|
|
225
|
+
expect(response.records).toStrictEqual([recordsTest[1]]);
|
|
226
|
+
expect(executionCtx.before).toHaveBeenCalled();
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import DataUnit from "../../src/dataunit/DataUnit";
|
|
2
|
+
import { SelectionMode } from "../../src/dataunit/interfaces/dataUnit";
|
|
3
|
+
import ErrorException from "../../src/exceptions/ErrorException";
|
|
4
|
+
import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
|
|
5
|
+
import { recordsTest } from "./resources/records";
|
|
6
|
+
|
|
7
|
+
describe('Records manager', () => {
|
|
8
|
+
let dataUnit: DataUnit;
|
|
9
|
+
let dataLoaderMock = jest.fn();
|
|
10
|
+
let metadataLoaderMock = jest.fn();
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
jest.clearAllMocks();
|
|
14
|
+
window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
|
|
15
|
+
({ dataUnit, dataLoaderMock, metadataLoaderMock } = createDataUnitMock());
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe('removeRecords', () => {
|
|
19
|
+
it('should remove first record', async () => {
|
|
20
|
+
await dataUnit.loadData();
|
|
21
|
+
await dataUnit.removeRecords(["test_1"], [recordsTest[0]]);
|
|
22
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(1, recordsTest.length));
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should remove first record with loader', async () => {
|
|
26
|
+
dataUnit.removeLoader = jest.fn((_, ids) => new Promise<string[]>(resolve => resolve(ids)))
|
|
27
|
+
await dataUnit.loadData();
|
|
28
|
+
await dataUnit.removeRecords(["test_1"], [recordsTest[0]]);
|
|
29
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(1, recordsTest.length));
|
|
30
|
+
expect(dataUnit.removeLoader).toHaveBeenCalled();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should remove two record with loader', async () => {
|
|
34
|
+
dataUnit.removeLoader = jest.fn((_, ids) => new Promise<string[]>(resolve => resolve(ids)))
|
|
35
|
+
await dataUnit.loadData();
|
|
36
|
+
await dataUnit.removeRecords(["test_2", "test_1"], [recordsTest[1], recordsTest[0]]);
|
|
37
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(2, recordsTest.length));
|
|
38
|
+
expect(dataUnit.removeLoader).toHaveBeenCalled();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should remove last', async () => {
|
|
42
|
+
dataUnit.removeLoader = jest.fn((_, ids) => new Promise<string[]>(resolve => resolve(ids)))
|
|
43
|
+
await dataUnit.loadData();
|
|
44
|
+
await dataUnit.removeRecords(["test_5"], [recordsTest[4]]);
|
|
45
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(0, 4));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should handle error dataLoader', async () => {
|
|
49
|
+
dataUnit.removeLoader = jest.fn().mockRejectedValue(new Error("Error test"));
|
|
50
|
+
const removeRecords = async () => await dataUnit.removeRecords(["test_1"], [recordsTest[0]]);
|
|
51
|
+
await expect(removeRecords()).rejects.toBeInstanceOf(ErrorException);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('removeSelectedRecords', () => {
|
|
56
|
+
it('should remove first record', async () => {
|
|
57
|
+
await dataUnit.loadData();
|
|
58
|
+
dataUnit.selectFirst();
|
|
59
|
+
const response = await dataUnit.removeSelectedRecords();
|
|
60
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(1, recordsTest.length));
|
|
61
|
+
expect(response).toStrictEqual(["test_1"]);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should remove last record', async () => {
|
|
65
|
+
await dataUnit.loadData();
|
|
66
|
+
dataUnit.selectLast();
|
|
67
|
+
const response = await dataUnit.removeSelectedRecords();
|
|
68
|
+
expect(dataUnit.records).toStrictEqual(recordsTest.slice(0, 4));
|
|
69
|
+
expect(response).toStrictEqual(["test_5"]);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should ignore when not has a record selected', async () => {
|
|
73
|
+
await dataUnit.loadData();
|
|
74
|
+
const response = await dataUnit.removeSelectedRecords();
|
|
75
|
+
expect(dataUnit.records).toStrictEqual(recordsTest);
|
|
76
|
+
expect(response).toStrictEqual([]);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should throw error when all records is selected', async () => {
|
|
80
|
+
await dataUnit.loadData();
|
|
81
|
+
await dataUnit.setSelection(SelectionMode.ALL_RECORDS);
|
|
82
|
+
const removeSelectedRecords = async () => await dataUnit.removeSelectedRecords();
|
|
83
|
+
await expect(removeSelectedRecords()).rejects.toBeInstanceOf(Error);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe('copySelected', () => {
|
|
88
|
+
it('should copy first record', async () => {
|
|
89
|
+
await dataUnit.loadData();
|
|
90
|
+
dataUnit.selectFirst();
|
|
91
|
+
dataUnit.copySelected();
|
|
92
|
+
expect(dataUnit.records.length).toBe(recordsTest.length + 1);
|
|
93
|
+
expect(dataUnit.records[dataUnit.records.length - 1].__record__id__).toBe("NEW_0");
|
|
94
|
+
expect(dataUnit.records[dataUnit.records.length - 1].__record__source__id__).toBe("test_1");
|
|
95
|
+
expect(dataUnit.records[dataUnit.records.length - 1].__copy__).toBeTruthy();
|
|
96
|
+
expect(dataUnit.records[dataUnit.records.length - 1]).toStrictEqual(expect.objectContaining({
|
|
97
|
+
column_name_1: 'column_value_1',
|
|
98
|
+
column_name_2: 1,
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('should copy last record', async () => {
|
|
103
|
+
await dataUnit.loadData();
|
|
104
|
+
dataUnit.selectLast();
|
|
105
|
+
dataUnit.copySelected();
|
|
106
|
+
expect(dataUnit.records[dataUnit.records.length - 1].__record__source__id__).toBe("test_5");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should ignore when not has a record selected', async () => {
|
|
110
|
+
await dataUnit.loadData();
|
|
111
|
+
dataUnit.copySelected();
|
|
112
|
+
expect(dataUnit.records).toStrictEqual(recordsTest);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should ignore when not has records', async () => {
|
|
116
|
+
dataUnit.copySelected();
|
|
117
|
+
expect(dataUnit.records).toStrictEqual([]);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('should throw error when all records is selected', async () => {
|
|
121
|
+
await dataUnit.loadData();
|
|
122
|
+
await dataUnit.setSelection(SelectionMode.ALL_RECORDS);
|
|
123
|
+
expect(() => dataUnit.copySelected()).toThrow("Erro interno: Impossível copiar os registros selecionados pois a seleção atual é virtual.");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe('hasCopiedRecord', () => {
|
|
128
|
+
it('should be true when has new records', async () => {
|
|
129
|
+
await dataUnit.loadData();
|
|
130
|
+
dataUnit.selectFirst();
|
|
131
|
+
dataUnit.copySelected();
|
|
132
|
+
const hasCopiedRecord = dataUnit.hasCopiedRecord();
|
|
133
|
+
expect(hasCopiedRecord).toBeTruthy();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should be false when not have any record', async () => {
|
|
137
|
+
dataUnit.copySelected();
|
|
138
|
+
const hasCopiedRecord = dataUnit.hasCopiedRecord();
|
|
139
|
+
expect(hasCopiedRecord).toBeFalsy();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should be false when not have any new record', async () => {
|
|
143
|
+
await dataUnit.loadData();
|
|
144
|
+
const hasCopiedRecord = dataUnit.hasCopiedRecord();
|
|
145
|
+
expect(hasCopiedRecord).toBeFalsy();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should be false when has new value created', async () => {
|
|
149
|
+
await dataUnit.addRecord();
|
|
150
|
+
const hasCopiedRecord = dataUnit.hasCopiedRecord();
|
|
151
|
+
expect(hasCopiedRecord).toBeFalsy();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('reloadCurrentRecord', () => {
|
|
156
|
+
it('should return empty array when not has recordLoader', async () => {
|
|
157
|
+
await dataUnit.loadData();
|
|
158
|
+
dataUnit.selectFirst();
|
|
159
|
+
const response = await dataUnit.reloadCurrentRecord();
|
|
160
|
+
expect(response).toStrictEqual([]);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should return empty array when not has dataLoader', async () => {
|
|
164
|
+
dataUnit.dataLoader = undefined;
|
|
165
|
+
dataUnit.recordLoader = jest.fn().mockResolvedValue({ records: recordsTest });
|
|
166
|
+
const response = await dataUnit.reloadCurrentRecord();
|
|
167
|
+
expect(response).toStrictEqual([]);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('should call dataLoader to fech records', async () => {
|
|
171
|
+
await dataUnit.loadData();
|
|
172
|
+
dataUnit.selectFirst();
|
|
173
|
+
const recordLoader = jest.fn().mockResolvedValue(recordsTest);
|
|
174
|
+
dataUnit.recordLoader = recordLoader;
|
|
175
|
+
|
|
176
|
+
const response = await dataUnit.reloadCurrentRecord();
|
|
177
|
+
expect(response).toStrictEqual(recordsTest);
|
|
178
|
+
expect(recordLoader).toHaveBeenCalledWith(dataUnit, ["test_1"]);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('should handle error recordLoader', async () => {
|
|
182
|
+
await dataUnit.loadData();
|
|
183
|
+
dataUnit.selectFirst();
|
|
184
|
+
const recordLoader = jest.fn().mockRejectedValue(new Error("Error test"));
|
|
185
|
+
dataUnit.recordLoader = recordLoader;
|
|
186
|
+
|
|
187
|
+
const reloadCurrentRecord = () => dataUnit.reloadCurrentRecord();
|
|
188
|
+
await expect(reloadCurrentRecord).rejects.toBeInstanceOf(ErrorException);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
describe('getModifiedRecords', () => {
|
|
193
|
+
it('should return record that has been modified', async () => {
|
|
194
|
+
await dataUnit.loadData();
|
|
195
|
+
dataUnit.selectFirst();
|
|
196
|
+
dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
197
|
+
const response = dataUnit.getModifiedRecords();
|
|
198
|
+
expect(response).toStrictEqual([{ ...recordsTest[0], column_name_1: 'new_value' }]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('should return empty when not has any record modified', async () => {
|
|
202
|
+
await dataUnit.loadData();
|
|
203
|
+
const response = dataUnit.getModifiedRecords();
|
|
204
|
+
expect(response).toStrictEqual([]);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe('getAddedRecords', () => {
|
|
209
|
+
it('should return the new record has been created', async () => {
|
|
210
|
+
await dataUnit.loadData();
|
|
211
|
+
await dataUnit.addRecord();
|
|
212
|
+
const response = dataUnit.getAddedRecords();
|
|
213
|
+
expect(response).toStrictEqual([{ "__record__id__": "NEW_0", }]);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('should return undefined when not has any new record', async () => {
|
|
217
|
+
await dataUnit.loadData();
|
|
218
|
+
const response = dataUnit.getAddedRecords();
|
|
219
|
+
expect(response).toBeUndefined();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
describe('getLastLoadRequest', () => {
|
|
224
|
+
it('should return a empty request', async () => {
|
|
225
|
+
await dataUnit.loadData();
|
|
226
|
+
const response = dataUnit.getLastLoadRequest();
|
|
227
|
+
expect(response).toStrictEqual({
|
|
228
|
+
filters: undefined,
|
|
229
|
+
keepSelection: undefined,
|
|
230
|
+
parentRecordId: undefined,
|
|
231
|
+
sort: [],
|
|
232
|
+
source: undefined,
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('should return a fully example request', async () => {
|
|
237
|
+
const params = {
|
|
238
|
+
checkLastFilter: true,
|
|
239
|
+
keepSelection: true,
|
|
240
|
+
quickFilter: {
|
|
241
|
+
filter: {
|
|
242
|
+
expression: 'test',
|
|
243
|
+
name: 'test',
|
|
244
|
+
params: []
|
|
245
|
+
},
|
|
246
|
+
term: 'test',
|
|
247
|
+
},
|
|
248
|
+
selectFirstRecord: true,
|
|
249
|
+
source: 'test'
|
|
250
|
+
}
|
|
251
|
+
await dataUnit.loadDataWithParams(params);
|
|
252
|
+
const response = dataUnit.getLastLoadRequest();
|
|
253
|
+
expect(response).toStrictEqual({
|
|
254
|
+
filters: [params.quickFilter.filter],
|
|
255
|
+
keepSelection: true,
|
|
256
|
+
quickFilter: params.quickFilter,
|
|
257
|
+
parentRecordId: undefined,
|
|
258
|
+
sort: [],
|
|
259
|
+
source: 'test'
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
describe('clearDataUnit', () => {
|
|
265
|
+
it('should clean all records', async () => {
|
|
266
|
+
await dataUnit.loadData();
|
|
267
|
+
expect(dataUnit.records).toStrictEqual(recordsTest);
|
|
268
|
+
dataUnit.clearDataUnit();
|
|
269
|
+
expect(dataUnit.records).toStrictEqual([]);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
describe('cancelEdition', () => {
|
|
274
|
+
it('should cancel edition', async () => {
|
|
275
|
+
await dataUnit.loadData();
|
|
276
|
+
dataUnit.selectFirst();
|
|
277
|
+
dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
278
|
+
const response = await dataUnit.cancelEdition();
|
|
279
|
+
expect(dataUnit.isDirty()).toBeFalsy();
|
|
280
|
+
expect(response).toBeTruthy();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('should cancel edition in child dataUnits', async () => {
|
|
284
|
+
const parentDataUnit = new DataUnit();
|
|
285
|
+
const childDataUnit = parentDataUnit.getChildDataunit('test');
|
|
286
|
+
dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
|
|
287
|
+
childDataUnit.dataLoader = dataLoaderMock;
|
|
288
|
+
parentDataUnit.dataLoader = dataLoaderMock;
|
|
289
|
+
await childDataUnit.loadData();
|
|
290
|
+
await parentDataUnit.loadData();
|
|
291
|
+
|
|
292
|
+
childDataUnit.selectFirst();
|
|
293
|
+
await childDataUnit.setFieldValue('column_name_1', 'new_value');
|
|
294
|
+
await parentDataUnit.setFieldValue('column_name_1', 'new_value');
|
|
295
|
+
|
|
296
|
+
const response = await parentDataUnit.cancelEdition();
|
|
297
|
+
expect(childDataUnit.isDirty()).toBeFalsy();
|
|
298
|
+
expect(parentDataUnit.isDirty()).toBeFalsy();
|
|
299
|
+
expect(response).toBeTruthy();
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('should load data when cancel edition in child dataUnits and has a record selected', async () => {
|
|
303
|
+
const parentDataUnit = new DataUnit();
|
|
304
|
+
const childDataUnit = parentDataUnit.getChildDataunit('test');
|
|
305
|
+
dataLoaderMock = jest.fn().mockResolvedValue({ records: recordsTest });
|
|
306
|
+
childDataUnit.dataLoader = dataLoaderMock;
|
|
307
|
+
parentDataUnit.dataLoader = dataLoaderMock;
|
|
308
|
+
await childDataUnit.loadData();
|
|
309
|
+
await parentDataUnit.loadData();
|
|
310
|
+
|
|
311
|
+
parentDataUnit.selectFirst();
|
|
312
|
+
childDataUnit.selectFirst();
|
|
313
|
+
await childDataUnit.setFieldValue('column_name_1', 'new_value');
|
|
314
|
+
await parentDataUnit.setFieldValue('column_name_1', 'new_value');
|
|
315
|
+
|
|
316
|
+
const response = await parentDataUnit.cancelEdition();
|
|
317
|
+
expect(childDataUnit.isDirty()).toBeFalsy();
|
|
318
|
+
expect(parentDataUnit.isDirty()).toBeFalsy();
|
|
319
|
+
expect(response).toBeTruthy();
|
|
320
|
+
expect(dataLoaderMock).toHaveBeenCalled();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|