22 * @vitest -environment node
33 */
44
5- import { describe , expect , it } from 'vitest'
5+ import { afterEach , describe , expect , it } from 'vitest'
6+ import { COLUMN_TYPE_REGISTRY } from '@/lib/table/column-types'
67import { retypeCellRewrite } from '@/lib/table/columns/service'
78import type { ColumnDefinition } from '@/lib/table/types'
89
910const column = ( over : Partial < ColumnDefinition > ) : ColumnDefinition =>
1011 ( { name : 'col' , type : 'string' , ...over } ) as ColumnDefinition
1112
13+ const sourceDefinition = COLUMN_TYPE_REGISTRY . string
14+ const originalValueForConversion = sourceDefinition . valueForConversion
15+
16+ afterEach ( ( ) => {
17+ if ( originalValueForConversion === undefined ) {
18+ Reflect . deleteProperty ( sourceDefinition , 'valueForConversion' )
19+ return
20+ }
21+ Object . assign ( sourceDefinition , { valueForConversion : originalValueForConversion } )
22+ } )
23+
1224describe ( 'retypeCellRewrite' , ( ) => {
1325 it ( 'preserves an empty string the target type can hold' , ( ) => {
1426 // `''` is a real stored value: `coerceRowValues` keeps it for `string`, and
@@ -32,6 +44,29 @@ describe('retypeCellRewrite', () => {
3244 expect ( retypeCellRewrite ( 'true' , column ( { type : 'boolean' } ) ) ) . toEqual ( { value : true } )
3345 } )
3446
47+ it ( 'writes back null produced by source normalization' , ( ) => {
48+ Object . assign ( sourceDefinition , { valueForConversion : ( ) => null } )
49+
50+ expect (
51+ retypeCellRewrite ( 'stored-value' , column ( { type : 'number' } ) , column ( { type : 'string' } ) )
52+ ) . toEqual ( { value : null } )
53+ } )
54+
55+ it ( 'coerces source-normalized values into select storage' , ( ) => {
56+ Object . assign ( sourceDefinition , { valueForConversion : ( ) => 'Choice' } )
57+
58+ expect (
59+ retypeCellRewrite (
60+ 'stored-value' ,
61+ column ( {
62+ type : 'select' ,
63+ options : [ { id : 'opt_choice' , name : 'Choice' } ] ,
64+ } ) ,
65+ column ( { type : 'string' } )
66+ )
67+ ) . toEqual ( { value : 'opt_choice' } )
68+ } )
69+
3570 it ( 'skips a cell whose stored value already matches the coercion' , ( ) => {
3671 expect ( retypeCellRewrite ( 'kept' , column ( { type : 'json' } ) ) ) . toBeNull ( )
3772 expect ( retypeCellRewrite ( 3 , column ( { type : 'json' } ) ) ) . toBeNull ( )
0 commit comments