validation.test.ts121 lines · main
1import { describe, expect, it } from 'vitest'
2
3import {
4 getKeyValueFieldArrayValidationIssues,
5 stripEmptyKeyValueFieldArrayRows,
6} from './validation'
7
8describe('getKeyValueFieldArrayValidationIssues', () => {
9 it('allows fully empty draft rows by default', () => {
10 expect(
11 getKeyValueFieldArrayValidationIssues({
12 rows: [{ key: '', value: '' }],
13 keyFieldName: 'key',
14 valueFieldName: 'value',
15 keyRequiredMessage: 'Header name is required',
16 valueRequiredMessage: 'Header value is required',
17 })
18 ).toEqual([])
19 })
20
21 it('adds an issue on value for key-only rows', () => {
22 expect(
23 getKeyValueFieldArrayValidationIssues({
24 rows: [{ key: 'Authorization', value: '' }],
25 keyFieldName: 'key',
26 valueFieldName: 'value',
27 keyRequiredMessage: 'Header name is required',
28 valueRequiredMessage: 'Header value is required',
29 })
30 ).toEqual([{ path: [0, 'value'], message: 'Header value is required' }])
31 })
32
33 it('adds an issue on key for value-only rows', () => {
34 expect(
35 getKeyValueFieldArrayValidationIssues({
36 rows: [{ key: '', value: 'Bearer token' }],
37 keyFieldName: 'key',
38 valueFieldName: 'value',
39 keyRequiredMessage: 'Header name is required',
40 valueRequiredMessage: 'Header value is required',
41 })
42 ).toEqual([{ path: [0, 'key'], message: 'Header name is required' }])
43 })
44
45 it('adds duplicate key issues when duplicate validation is enabled', () => {
46 expect(
47 getKeyValueFieldArrayValidationIssues({
48 rows: [
49 { key: 'Authorization', value: 'Bearer 1' },
50 { key: 'Authorization', value: 'Bearer 2' },
51 ],
52 keyFieldName: 'key',
53 valueFieldName: 'value',
54 keyRequiredMessage: 'Header name is required',
55 valueRequiredMessage: 'Header value is required',
56 duplicateKeyMessage: 'Header name already exists',
57 })
58 ).toEqual([
59 { path: [0, 'key'], message: 'Header name already exists' },
60 { path: [1, 'key'], message: 'Header name already exists' },
61 ])
62 })
63
64 it('supports custom key/value field names', () => {
65 expect(
66 getKeyValueFieldArrayValidationIssues({
67 rows: [{ name: 'tenant', value: '' }],
68 keyFieldName: 'name',
69 valueFieldName: 'value',
70 keyRequiredMessage: 'Parameter name is required',
71 valueRequiredMessage: 'Parameter value is required',
72 })
73 ).toEqual([{ path: [0, 'value'], message: 'Parameter value is required' }])
74 })
75
76 it('skips duplicate checks when no duplicate message is provided', () => {
77 expect(
78 getKeyValueFieldArrayValidationIssues({
79 rows: [
80 { key: 'Authorization', value: 'Bearer 1' },
81 { key: 'Authorization', value: 'Bearer 2' },
82 ],
83 keyFieldName: 'key',
84 valueFieldName: 'value',
85 keyRequiredMessage: 'Header name is required',
86 valueRequiredMessage: 'Header value is required',
87 })
88 ).toEqual([])
89 })
90})
91
92describe('stripEmptyKeyValueFieldArrayRows', () => {
93 it('removes fully empty draft rows', () => {
94 expect(
95 stripEmptyKeyValueFieldArrayRows({
96 rows: [
97 { key: 'Authorization', value: 'Bearer token' },
98 { key: '', value: '' },
99 ],
100 keyFieldName: 'key',
101 valueFieldName: 'value',
102 })
103 ).toEqual([{ key: 'Authorization', value: 'Bearer token' }])
104 })
105
106 it('keeps partially filled rows so schema validation can handle them', () => {
107 expect(
108 stripEmptyKeyValueFieldArrayRows({
109 rows: [
110 { name: 'Authorization', value: '' },
111 { name: '', value: 'Bearer token' },
112 ],
113 keyFieldName: 'name',
114 valueFieldName: 'value',
115 })
116 ).toEqual([
117 { name: 'Authorization', value: '' },
118 { name: '', value: 'Bearer token' },
119 ])
120 })
121})