|
3 | 3 | sendForbidden, |
4 | 4 | sendUnauthorized, |
5 | 5 | buildErrorResponse, |
| 6 | + zodIssuesToDetails, |
6 | 7 | ErrorCode, |
7 | 8 | } from '../api-response.utils'; |
8 | 9 | import { requestContextStorage } from '../als.utils'; |
@@ -130,3 +131,41 @@ describe('buildErrorResponse', () => { |
130 | 131 | expect(body!.requestId).toBe(capturedRequestId); |
131 | 132 | }); |
132 | 133 | }); |
| 134 | + |
| 135 | +describe('zodIssuesToDetails', () => { |
| 136 | + it('maps a single issue to a details entry', () => { |
| 137 | + const result = zodIssuesToDetails([ |
| 138 | + { path: ['email'], message: 'Invalid email', code: 'invalid_string' } as any, |
| 139 | + ]); |
| 140 | + expect(result).toEqual([{ field: 'email', message: 'Invalid email' }]); |
| 141 | + }); |
| 142 | + |
| 143 | + it('joins nested paths with a dot', () => { |
| 144 | + const result = zodIssuesToDetails([ |
| 145 | + { path: ['address', 'city'], message: 'Required', code: 'invalid_type' } as any, |
| 146 | + ]); |
| 147 | + expect(result).toEqual([{ field: 'address.city', message: 'Required' }]); |
| 148 | + }); |
| 149 | + |
| 150 | + it('produces an empty string field for root-level issues', () => { |
| 151 | + const result = zodIssuesToDetails([ |
| 152 | + { path: [], message: 'Input must be an object', code: 'invalid_type' } as any, |
| 153 | + ]); |
| 154 | + expect(result).toEqual([{ field: '', message: 'Input must be an object' }]); |
| 155 | + }); |
| 156 | + |
| 157 | + it('returns an empty array for an empty issues list', () => { |
| 158 | + expect(zodIssuesToDetails([])).toEqual([]); |
| 159 | + }); |
| 160 | + |
| 161 | + it('maps multiple issues preserving order', () => { |
| 162 | + const result = zodIssuesToDetails([ |
| 163 | + { path: ['name'], message: 'Required', code: 'invalid_type' } as any, |
| 164 | + { path: ['age'], message: 'Must be a number', code: 'invalid_type' } as any, |
| 165 | + ]); |
| 166 | + expect(result).toEqual([ |
| 167 | + { field: 'name', message: 'Required' }, |
| 168 | + { field: 'age', message: 'Must be a number' }, |
| 169 | + ]); |
| 170 | + }); |
| 171 | +}); |
0 commit comments