@@ -10,6 +10,8 @@ import {
1010} from './index.js'
1111import {
1212 applyBatch ,
13+ displayToField ,
14+ fieldToDisplay ,
1315 MAX_CELLS_PER_SPREADSHEET ,
1416 readEnumValidations ,
1517 readSheet ,
@@ -2051,3 +2053,48 @@ describe('enum constraints on any column', () => {
20512053 ) . toBeUndefined ( )
20522054 } )
20532055} )
2056+
2057+ describe ( 'fieldToDisplay / displayToField' , ( ) => {
2058+ it ( 'roundtrip — lowercase snake_case fields survive display conversion' , ( ) => {
2059+ const fields = [ 'id' , 'created_at' , 'customer_id' , 'object' , 'invoice_item_id' ]
2060+ for ( const f of fields ) {
2061+ expect ( displayToField ( fieldToDisplay ( f ) ) ) . toBe ( f )
2062+ }
2063+ } )
2064+
2065+ it ( 'fieldToDisplay — single word gets sentence case' , ( ) => {
2066+ expect ( fieldToDisplay ( 'id' ) ) . toBe ( 'Id' )
2067+ expect ( fieldToDisplay ( 'object' ) ) . toBe ( 'Object' )
2068+ } )
2069+
2070+ it ( 'fieldToDisplay — multi-word snake_case becomes sentence case with spaces' , ( ) => {
2071+ expect ( fieldToDisplay ( 'created_at' ) ) . toBe ( 'Created at' )
2072+ expect ( fieldToDisplay ( 'customer_id' ) ) . toBe ( 'Customer id' )
2073+ } )
2074+
2075+ it ( 'fieldToDisplay — uppercase in input is normalised to lowercase (no case leakage)' , ( ) => {
2076+ expect ( fieldToDisplay ( 'API_version' ) ) . toBe ( 'Api version' )
2077+ expect ( fieldToDisplay ( 'UPPER_case' ) ) . toBe ( 'Upper case' )
2078+ } )
2079+
2080+ it ( 'fieldToDisplay — system fields (leading underscore) are returned as-is' , ( ) => {
2081+ expect ( fieldToDisplay ( '_idx' ) ) . toBe ( '_idx' )
2082+ expect ( fieldToDisplay ( '_updated_at' ) ) . toBe ( '_updated_at' )
2083+ } )
2084+
2085+ it ( 'displayToField — reverses sentence case label back to snake_case' , ( ) => {
2086+ expect ( displayToField ( 'Created at' ) ) . toBe ( 'created_at' )
2087+ expect ( displayToField ( 'Customer id' ) ) . toBe ( 'customer_id' )
2088+ expect ( displayToField ( 'Id' ) ) . toBe ( 'id' )
2089+ } )
2090+
2091+ it ( 'displayToField — system fields (leading underscore) are returned as-is' , ( ) => {
2092+ expect ( displayToField ( '_idx' ) ) . toBe ( '_idx' )
2093+ expect ( displayToField ( '_updated_at' ) ) . toBe ( '_updated_at' )
2094+ } )
2095+
2096+ it ( 'displayToField — idempotent on already-snake_case strings' , ( ) => {
2097+ expect ( displayToField ( 'customer_id' ) ) . toBe ( 'customer_id' )
2098+ expect ( displayToField ( 'id' ) ) . toBe ( 'id' )
2099+ } )
2100+ } )
0 commit comments