@@ -259,4 +259,220 @@ mod tests {
259259 assert_snapshot!( result. iter( ) . map( |q| q. build( backend) ) . collect:: <Vec <String >>( ) . join( "\n " ) ) ;
260260 } ) ;
261261 }
262+
263+ #[ test]
264+ fn test_add_column_sqlite_table_not_found ( ) {
265+ let column = ColumnDef {
266+ name : "nickname" . into ( ) ,
267+ r#type : ColumnType :: Simple ( SimpleColumnType :: Text ) ,
268+ nullable : false ,
269+ default : None ,
270+ comment : None ,
271+ primary_key : None ,
272+ unique : None ,
273+ index : None ,
274+ foreign_key : None ,
275+ } ;
276+ let current_schema = vec ! [ ] ; // Empty schema - table not found
277+ let result = build_add_column (
278+ & DatabaseBackend :: Sqlite ,
279+ "users" ,
280+ & column,
281+ None ,
282+ & current_schema,
283+ ) ;
284+ assert ! ( result. is_err( ) ) ;
285+ let err_msg = result. unwrap_err ( ) . to_string ( ) ;
286+ assert ! ( err_msg. contains( "Table 'users' not found in current schema" ) ) ;
287+ }
288+
289+ #[ test]
290+ fn test_add_column_sqlite_with_default ( ) {
291+ let column = ColumnDef {
292+ name : "age" . into ( ) ,
293+ r#type : ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
294+ nullable : false ,
295+ default : Some ( "18" . into ( ) ) ,
296+ comment : None ,
297+ primary_key : None ,
298+ unique : None ,
299+ index : None ,
300+ foreign_key : None ,
301+ } ;
302+ let current_schema = vec ! [ TableDef {
303+ name: "users" . into( ) ,
304+ columns: vec![ ColumnDef {
305+ name: "id" . into( ) ,
306+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
307+ nullable: false ,
308+ default : None ,
309+ comment: None ,
310+ primary_key: None ,
311+ unique: None ,
312+ index: None ,
313+ foreign_key: None ,
314+ } ] ,
315+ constraints: vec![ ] ,
316+ indexes: vec![ ] ,
317+ } ] ;
318+ let result = build_add_column (
319+ & DatabaseBackend :: Sqlite ,
320+ "users" ,
321+ & column,
322+ None ,
323+ & current_schema,
324+ ) ;
325+ assert ! ( result. is_ok( ) ) ;
326+ let queries = result. unwrap ( ) ;
327+ let sql = queries. iter ( ) . map ( |q| q. build ( DatabaseBackend :: Sqlite ) ) . collect :: < Vec < String > > ( ) . join ( "\n " ) ;
328+ // Should use default value (18) for fill
329+ assert ! ( sql. contains( "18" ) ) ;
330+ }
331+
332+ #[ test]
333+ fn test_add_column_sqlite_without_fill_or_default ( ) {
334+ let column = ColumnDef {
335+ name : "age" . into ( ) ,
336+ r#type : ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
337+ nullable : false ,
338+ default : None ,
339+ comment : None ,
340+ primary_key : None ,
341+ unique : None ,
342+ index : None ,
343+ foreign_key : None ,
344+ } ;
345+ let current_schema = vec ! [ TableDef {
346+ name: "users" . into( ) ,
347+ columns: vec![ ColumnDef {
348+ name: "id" . into( ) ,
349+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
350+ nullable: false ,
351+ default : None ,
352+ comment: None ,
353+ primary_key: None ,
354+ unique: None ,
355+ index: None ,
356+ foreign_key: None ,
357+ } ] ,
358+ constraints: vec![ ] ,
359+ indexes: vec![ ] ,
360+ } ] ;
361+ let result = build_add_column (
362+ & DatabaseBackend :: Sqlite ,
363+ "users" ,
364+ & column,
365+ None ,
366+ & current_schema,
367+ ) ;
368+ assert ! ( result. is_ok( ) ) ;
369+ let queries = result. unwrap ( ) ;
370+ let sql = queries. iter ( ) . map ( |q| q. build ( DatabaseBackend :: Sqlite ) ) . collect :: < Vec < String > > ( ) . join ( "\n " ) ;
371+ // Should use NULL for fill
372+ assert ! ( sql. contains( "NULL" ) ) ;
373+ }
374+
375+ #[ test]
376+ fn test_add_column_sqlite_with_indexes ( ) {
377+ use vespertide_core:: IndexDef ;
378+
379+ let column = ColumnDef {
380+ name : "nickname" . into ( ) ,
381+ r#type : ColumnType :: Simple ( SimpleColumnType :: Text ) ,
382+ nullable : false ,
383+ default : None ,
384+ comment : None ,
385+ primary_key : None ,
386+ unique : None ,
387+ index : None ,
388+ foreign_key : None ,
389+ } ;
390+ let current_schema = vec ! [ TableDef {
391+ name: "users" . into( ) ,
392+ columns: vec![ ColumnDef {
393+ name: "id" . into( ) ,
394+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
395+ nullable: false ,
396+ default : None ,
397+ comment: None ,
398+ primary_key: None ,
399+ unique: None ,
400+ index: None ,
401+ foreign_key: None ,
402+ } ] ,
403+ constraints: vec![ ] ,
404+ indexes: vec![
405+ IndexDef {
406+ name: "idx_id" . into( ) ,
407+ columns: vec![ "id" . into( ) ] ,
408+ unique: false ,
409+ } ,
410+ ] ,
411+ } ] ;
412+ let result = build_add_column (
413+ & DatabaseBackend :: Sqlite ,
414+ "users" ,
415+ & column,
416+ None ,
417+ & current_schema,
418+ ) ;
419+ assert ! ( result. is_ok( ) ) ;
420+ let queries = result. unwrap ( ) ;
421+ let sql = queries. iter ( ) . map ( |q| q. build ( DatabaseBackend :: Sqlite ) ) . collect :: < Vec < String > > ( ) . join ( "\n " ) ;
422+ // Should recreate index
423+ assert ! ( sql. contains( "CREATE INDEX" ) ) ;
424+ assert ! ( sql. contains( "idx_id" ) ) ;
425+ }
426+
427+ #[ test]
428+ fn test_add_column_sqlite_with_unique_index ( ) {
429+ use vespertide_core:: IndexDef ;
430+
431+ let column = ColumnDef {
432+ name : "nickname" . into ( ) ,
433+ r#type : ColumnType :: Simple ( SimpleColumnType :: Text ) ,
434+ nullable : false ,
435+ default : None ,
436+ comment : None ,
437+ primary_key : None ,
438+ unique : None ,
439+ index : None ,
440+ foreign_key : None ,
441+ } ;
442+ let current_schema = vec ! [ TableDef {
443+ name: "users" . into( ) ,
444+ columns: vec![ ColumnDef {
445+ name: "id" . into( ) ,
446+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
447+ nullable: false ,
448+ default : None ,
449+ comment: None ,
450+ primary_key: None ,
451+ unique: None ,
452+ index: None ,
453+ foreign_key: None ,
454+ } ] ,
455+ constraints: vec![ ] ,
456+ indexes: vec![
457+ IndexDef {
458+ name: "idx_email" . into( ) ,
459+ columns: vec![ "email" . into( ) ] ,
460+ unique: true ,
461+ } ,
462+ ] ,
463+ } ] ;
464+ let result = build_add_column (
465+ & DatabaseBackend :: Sqlite ,
466+ "users" ,
467+ & column,
468+ None ,
469+ & current_schema,
470+ ) ;
471+ assert ! ( result. is_ok( ) ) ;
472+ let queries = result. unwrap ( ) ;
473+ let sql = queries. iter ( ) . map ( |q| q. build ( DatabaseBackend :: Sqlite ) ) . collect :: < Vec < String > > ( ) . join ( "\n " ) ;
474+ // Should recreate unique index
475+ assert ! ( sql. contains( "CREATE UNIQUE INDEX" ) ) ;
476+ assert ! ( sql. contains( "idx_email" ) ) ;
477+ }
262478}
0 commit comments