@@ -25,10 +25,10 @@ test('trailing columns', () => {
2525describe ( 'remapErrorStructure' , ( ) => {
2626 test ( 'groups errors by message, collects rows' , ( ) => {
2727 const errors = [
28- { row : 1 , field : "A" , message : "Error 1" } ,
29- { row : 1 , field : "B" , message : "Error 2" } ,
30- { row : 2 , field : "B" , message : "Error 2" } ,
31- { row : 3 , field : "A" , message : "Error 1" } ,
28+ { row : 1 , field : "A" , type : { variant : "IncorrectType" } } ,
29+ { row : 1 , field : "B" , type : { variant : "IncorrectType" } } ,
30+ { row : 2 , field : "B" , type : { variant : "IncorrectType" } } ,
31+ { row : 3 , field : "A" , type : { variant : "IncorrectType" } } ,
3232 ] ;
3333 // Adjusted expected result to match grouping by error, then by field
3434 const row_data = [
@@ -38,30 +38,32 @@ describe('remapErrorStructure', () => {
3838 const result = sheets_lib . RemapErrorStructure ( errors , row_data , RewrittenMapping ) ;
3939 expect ( result ) . toEqual ( [
4040 {
41- message : "Error 1" ,
41+ type : { variant : "IncorrectType" , field : "A" } ,
4242 fields : [ "A" ] ,
43- meta : { first : 1 , count : 2 } ,
43+ // Only 1 error (in the two rows) because A appears twice but in
44+ // rows 1 and 3 and here we have rows 1 and 2
45+ meta : { first : 1 , count : 1 } ,
4446 rows : [
45- { index :1 , row :[ { value :"0" , error : true } , { value :"1" , error : true } ] } ,
47+ { index :1 , error : true , row :[ { value :"0" , error : true } , { value :"1" , error : true } ] } ,
4648 { index :2 , row :[ { value :"2" , error : true } , { value :"3" , error : true } ] }
4749 ]
4850 } ,
4951 {
50- message : "Error 2" ,
52+ type : { variant : "IncorrectType" , field : "B" } ,
5153 fields : [ "B" ] ,
5254 meta : { first : 1 , count : 2 } ,
5355 rows : [
54- { index :1 , row : [ { value :"0" , error : true } , { value :"1" , error : true } ] } ,
55- { index :2 , row : [ { value :"2" , error : true } , { value :"3" , error : true } ] }
56+ { index :1 , error : true , row : [ { value :"0" , error : true } , { value :"1" , error : true } ] } ,
57+ { index :2 , error : true , row : [ { value :"2" , error : true } , { value :"3" , error : true } ] }
5658 ]
5759 }
5860 ] ) ;
5961 } ) ;
6062
6163 test ( 'with row_data, includes adjacent rows' , ( ) => {
6264 const errors = [
63- { row : 1 , field : "A" , message : "Error 1" } ,
64- { row : 2 , field : "A" , message : "Error 1" } ,
65+ { row : 1 , field : "A" , type : "Error 1" } ,
66+ { row : 2 , field : "A" , type : "Error 1" } ,
6567 ] ;
6668 const row_data = [
6769 { index : 1 , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
@@ -70,21 +72,21 @@ describe('remapErrorStructure', () => {
7072 const result = sheets_lib . RemapErrorStructure ( errors , row_data , RewrittenMapping ) ;
7173 expect ( result ) . toEqual ( [
7274 {
73- message : "Error 1" ,
75+ type : "Error 1" ,
7476 fields : [ "A" ] ,
7577 meta : { first : 1 , count : 2 } ,
7678 rows : [
77- { index : 1 , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
78- { index : 2 , row : [ { value :"2" , error : true } , { value :"3" } ] }
79+ { index : 1 , error : true , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
80+ { index : 2 , error : true , row : [ { value :"2" , error : true } , { value :"3" } ] }
7981 ]
8082 }
8183 ] ) ;
8284 } ) ;
8385
8486 test ( 'does not add out-of-bounds adjacent rows' , ( ) => {
8587 const errors = [
86- { row : 1 , field : "A" , message : "Error 1" } ,
87- { row : 3 , field : "A" , message : "Error 1" } ,
88+ { row : 1 , field : "A" , type : "Error 1" } ,
89+ { row : 3 , field : "A" , type : "Error 1" } ,
8890 ] ;
8991 const row_data = [
9092 { index : 1 , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
@@ -96,11 +98,11 @@ describe('remapErrorStructure', () => {
9698 // For row 3: 2, 3
9799 expect ( result ) . toEqual ( [
98100 {
99- message : "Error 1" ,
101+ type : "Error 1" ,
100102 fields : [ "A" ] ,
101103 meta : { first : 1 , count : 1 } ,
102104 rows : [
103- { index : 1 , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
105+ { index : 1 , error : true , row : [ { value :"0" , error : true } , { value :"1" } ] } ,
104106 { index : 2 , row : [ { value :"2" } , { value :"3" } ] }
105107 ]
106108 }
@@ -115,23 +117,23 @@ describe('remapErrorStructure', () => {
115117
116118 test ( 'ignores errors with missing row in row_data' , ( ) => {
117119 const errors = [
118- { row : 5 , field : "A" , message : "Error 1" }
120+ { row : 5 , field : "A" , type : "Error 1" }
119121 ] ;
120122 const row_data = [
121123 { index : 1 , row : [ { value :"0" } , { value :"1" } ] } ,
122124 { index : 2 , row : [ { value :"2" } , { value :"3" } ] }
123125 ] ;
124126 const result = sheets_lib . RemapErrorStructure ( errors , row_data , RewrittenMapping ) ;
125127 expect ( result ) . toEqual ( [
126- { message : "Error 1" , meta : { count : 0 , first : 0 } , fields : [ "A" ] , rows : [ ] }
128+ { type : "Error 1" , meta : { count : 0 , first : 0 } , fields : [ "A" ] , rows : [ ] }
127129 ] ) ;
128130 } ) ;
129131
130132 test ( 'remapping errors - missing fields' , ( ) => {
131133 const errors = [
132- { row : 2 , field : 'Salary' , message : "'Salary' must be supplied" } ,
133- { row : 3 , field : 'Salary' , message : "'Salary' must be supplied" } ,
134- { row : 5 , field : 'Salary' , message : "'Salary' must be supplied" }
134+ { row : 2 , field : 'Salary' , type : { variant : "FieldRequired" } } ,
135+ { row : 3 , field : 'Salary' , type : { variant : "FieldRequired" } } ,
136+ { row : 5 , field : 'Salary' , type : { variant : "FieldRequired" } }
135137 ] ;
136138 const row_data =
137139 [
@@ -157,16 +159,16 @@ describe('remapErrorStructure', () => {
157159 const result = sheets_lib . RemapErrorStructure ( errors , row_data , mappingIndices , headerRangeOffset ) ;
158160 expect ( result ) . toEqual ( [
159161 {
160- message : "'Salary' must be supplied" ,
162+ type : { variant : "FieldRequired" , field : "Salary" } ,
161163 fields : [ 'Salary' ] ,
162164 meta : { first : 3 , count : 3 } ,
163165 rows : [
164166 // errors in index 3, 5 and 6
165167 { index : 2 , row : [ { value : "2" } , { value : "Mr" } , { value : "Odie" } , { value : "Arbuckle" } , { value : "2025-02-01" } , { value : "123" } , { value : "12%" } , { value : "2025-04-01" } ] } ,
166- { index : 3 , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
167- { index : 4 , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
168+ { index : 3 , error : true , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
169+ { index : 4 , error : true , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
168170 { index : 5 , row : [ { value : "2" } , { value : "Mr" } , { value : "Odie" } , { value : "Arbuckle" } , { value : "2025-02-01" } , { value : "123" } , { value : "12%" } , { value : "2025-04-01" } ] } ,
169- { index : 6 , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
171+ { index : 6 , error : true , row : [ { value : "1" } , { value : "Mr" } , { value : "Jon" } , { value : "Arbuckle" } , { value : "2025-01-01" } , { value : " " , error : true } , undefined , { value : "2025-04-01" } ] } ,
170172 { index : 7 , row : [ { value : "2" } , { value : "Mr" } , { value : "Odie" } , { value : "Arbuckle" } , { value : "2025-02-01" } , { value : "123" } , { value : "12%" } , { value : "2025-04-01" } ] }
171173 ]
172174 }
@@ -176,12 +178,12 @@ describe('remapErrorStructure', () => {
176178
177179 test ( 'remapping errors - multiple errors' , ( ) => {
178180 const errors = [
179- { row : 3 , field : 'Salary' , message : "'Salary' must be supplied" } ,
180- { row : 4 , field : 'Salary' , message : 'This is not a valid number' } ,
181- { row : 5 , field : 'Salary' , message : "'Salary' must be supplied" } ,
182- { row : 6 , field : 'Salary' , message : 'This is not a valid number' } ,
183- { row : 7 , field : 'Salary' , message : "'Salary' must be supplied" } ,
184- { row : 8 , field : 'Salary' , message : "'Salary' must be supplied" }
181+ { row : 3 , field : 'Salary' , type : { variant : "FieldRequired" } } ,
182+ { row : 4 , field : 'Salary' , type : { variant : "IncorrectType" } } ,
183+ { row : 5 , field : 'Salary' , type : { variant : "FieldRequired" } } ,
184+ { row : 6 , field : 'Salary' , type : { variant : "IncorrectType" } } ,
185+ { row : 7 , field : 'Salary' , type : { variant : "FieldRequired" } } ,
186+ { row : 8 , field : 'Salary' , type : { variant : "FieldRequired" } }
185187 ] ;
186188 const row_data = [
187189 { index : 4 , row : [
@@ -207,9 +209,9 @@ describe('remapErrorStructure', () => {
207209 const headerRangeOffset = 3 ;
208210
209211 const result = sheets_lib . RemapErrorStructure ( errors , row_data , mappingIndices , headerRangeOffset ) ;
210- expect ( result ) . toEqual ( [
212+ expect ( result ) . toMatchObject ( [
211213 {
212- message : "'Salary' must be supplied" ,
214+ type : { variant : "FieldRequired" } ,
213215 meta : { first : 4 , count : 4 } ,
214216 fields : [ 'Salary' ] ,
215217 rows :[
@@ -222,7 +224,7 @@ describe('remapErrorStructure', () => {
222224 ]
223225 } ,
224226 {
225- message : 'This is not a valid number' ,
227+ type : { variant : "IncorrectType" } ,
226228 meta : { first : 5 , count : 2 } ,
227229 fields : [ 'Salary' ] ,
228230 rows : [
0 commit comments