@@ -8,11 +8,21 @@ import type { TableDefinition } from '@/lib/table/types'
88
99const mocks = vi . hoisted ( ( ) => ( {
1010 withLockedTable : vi . fn ( ) ,
11+ assertColumnReferencesInWorkspace : vi . fn ( ) ,
12+ migrationFrom : vi . fn ( ) ,
13+ migrationTo : vi . fn ( ) ,
14+ writeBackCoercedCells : vi . fn ( ) ,
1115 set : vi . fn ( ) ,
1216 where : vi . fn ( ) ,
1317} ) )
1418
1519vi . mock ( '@/lib/table/service' , ( ) => ( { withLockedTable : mocks . withLockedTable } ) )
20+ vi . mock ( '@/lib/table/column-types/registry.server' , ( ) => ( {
21+ assertColumnReferencesInWorkspace : mocks . assertColumnReferencesInWorkspace ,
22+ migrationFrom : mocks . migrationFrom ,
23+ migrationTo : mocks . migrationTo ,
24+ writeBackCoercedCells : mocks . writeBackCoercedCells ,
25+ } ) )
1626
1727import {
1828 addTableColumn ,
@@ -50,6 +60,10 @@ function tableWithReference(referenceTableId = 'tbl_accounts'): TableDefinition
5060describe ( 'reference column metadata persistence' , ( ) => {
5161 beforeEach ( ( ) => {
5262 vi . clearAllMocks ( )
63+ mocks . assertColumnReferencesInWorkspace . mockResolvedValue ( undefined )
64+ mocks . migrationFrom . mockReturnValue ( undefined )
65+ mocks . migrationTo . mockReturnValue ( undefined )
66+ mocks . writeBackCoercedCells . mockResolvedValue ( undefined )
5367 mocks . where . mockResolvedValue ( undefined )
5468 mocks . set . mockReturnValue ( { where : mocks . where } )
5569 } )
@@ -87,6 +101,11 @@ describe('reference column metadata persistence', () => {
87101 type : 'reference' ,
88102 referenceTableId : 'tbl_accounts' ,
89103 } )
104+ expect ( mocks . assertColumnReferencesInWorkspace ) . toHaveBeenCalledWith (
105+ expect . anything ( ) ,
106+ 'ws_1' ,
107+ [ expect . objectContaining ( { referenceTableId : 'tbl_accounts' } ) ]
108+ )
90109 } )
91110
92111 it ( 'retains the supplied target when converting a column to reference' , async ( ) => {
@@ -107,6 +126,11 @@ describe('reference column metadata persistence', () => {
107126 type : 'reference' ,
108127 referenceTableId : 'tbl_accounts' ,
109128 } )
129+ expect ( mocks . assertColumnReferencesInWorkspace ) . toHaveBeenCalledWith (
130+ expect . anything ( ) ,
131+ 'ws_1' ,
132+ [ expect . objectContaining ( { referenceTableId : 'tbl_accounts' } ) ]
133+ )
110134 } )
111135
112136 it ( 'changes a reference target without reading or rewriting rows' , async ( ) => {
@@ -122,6 +146,11 @@ describe('reference column metadata persistence', () => {
122146 )
123147
124148 expect ( updated . schema . columns [ 0 ] ) . toMatchObject ( { referenceTableId : 'tbl_companies' } )
149+ expect ( mocks . assertColumnReferencesInWorkspace ) . toHaveBeenCalledWith (
150+ expect . anything ( ) ,
151+ 'ws_1' ,
152+ [ expect . objectContaining ( { referenceTableId : 'tbl_companies' } ) ]
153+ )
125154 expect ( trx . select ) . not . toHaveBeenCalled ( )
126155 expect ( trx . execute ) . not . toHaveBeenCalled ( )
127156 expect ( trx . update ) . toHaveBeenCalledOnce ( )
@@ -144,6 +173,24 @@ describe('reference column metadata persistence', () => {
144173 expect ( trx . update ) . not . toHaveBeenCalled ( )
145174 } )
146175
176+ it ( 'leaves the source schema unchanged when the target table is unavailable' , async ( ) => {
177+ const trx = useTable ( tableWithReference ( ) )
178+ mocks . assertColumnReferencesInWorkspace . mockRejectedValueOnce ( { code : 'not_found' } )
179+
180+ await expect (
181+ updateColumnReference (
182+ {
183+ tableId : 'tbl_people' ,
184+ columnName : 'col_account' ,
185+ referenceTableId : 'tbl_missing' ,
186+ } ,
187+ 'req_1'
188+ )
189+ ) . rejects . toMatchObject ( { code : 'not_found' } )
190+
191+ expect ( trx . update ) . not . toHaveBeenCalled ( )
192+ } )
193+
147194 it ( 'returns the locked table unchanged when the target is already set' , async ( ) => {
148195 const table = tableWithReference ( )
149196 const trx = useTable ( table )
0 commit comments