@@ -319,6 +319,50 @@ describe('ObjectQL Engine', () => {
319319 expect ( arg . owner ) . toBeUndefined ( ) ;
320320 } ) ;
321321
322+ it ( 'backfills a default when the field is EXPLICITLY null, not just omitted (#2706)' , async ( ) => {
323+ vi . mocked ( SchemaRegistry . getObject ) . mockImplementation ( ( name ) => {
324+ if ( name === 'ticket' ) return {
325+ name : 'ticket' ,
326+ fields : {
327+ title : { type : 'text' } ,
328+ owner : { type : 'user' , reference : 'sys_user' , defaultValue : 'current_user' } ,
329+ status : { type : 'text' , defaultValue : 'planned' } ,
330+ } ,
331+ } as any ;
332+ if ( name === 'sys_user' ) return { name : 'sys_user' , fields : { name : { type : 'text' } } } as any ;
333+ return undefined ;
334+ } ) ;
335+
336+ // A form serializes an unpicked control as explicit `null` (not
337+ // omission) — both the dynamic `current_user` token and a static
338+ // default must still fill in.
339+ await engine . insert ( 'ticket' , { title : 'T1' , owner : null , status : null } , { context : { userId : 'u-42' } as any } ) ;
340+
341+ expect ( mockDriver . create ) . toHaveBeenCalledWith (
342+ 'ticket' ,
343+ expect . objectContaining ( { title : 'T1' , owner : 'u-42' , status : 'planned' } ) ,
344+ expect . anything ( ) ,
345+ ) ;
346+ } ) ;
347+
348+ it ( 'respects an explicit empty-string value and does not overwrite it with the default (#2706)' , async ( ) => {
349+ vi . mocked ( SchemaRegistry . getObject ) . mockImplementation ( ( name ) => {
350+ if ( name === 'ticket' ) return {
351+ name : 'ticket' ,
352+ fields : {
353+ title : { type : 'text' } ,
354+ status : { type : 'text' , defaultValue : 'planned' } ,
355+ } ,
356+ } as any ;
357+ return undefined ;
358+ } ) ;
359+
360+ await engine . insert ( 'ticket' , { title : 'T1' , status : '' } ) ;
361+
362+ const arg = ( mockDriver . create as any ) . mock . calls . at ( - 1 ) [ 1 ] ;
363+ expect ( arg . status ) . toBe ( '' ) ;
364+ } ) ;
365+
322366 it ( 'resolves field defaults BEFORE beforeInsert so a hook can derive from them (#2703)' , async ( ) => {
323367 vi . mocked ( SchemaRegistry . getObject ) . mockImplementation ( ( name ) => {
324368 if ( name === 'ticket' ) return {
0 commit comments