@@ -200,4 +200,210 @@ mod tests {
200200 assert_snapshot!( sql) ;
201201 } ) ;
202202 }
203+
204+ #[ test]
205+ fn test_modify_column_type_sqlite_table_not_found ( ) {
206+ // Test error when table is not found in current schema (line 25)
207+ let result = build_modify_column_type (
208+ & DatabaseBackend :: Sqlite ,
209+ "nonexistent_table" ,
210+ "age" ,
211+ & ColumnType :: Simple ( SimpleColumnType :: BigInt ) ,
212+ & [ ] , // Empty schema
213+ ) ;
214+ assert ! ( result. is_err( ) ) ;
215+ let err_msg = result. unwrap_err ( ) . to_string ( ) ;
216+ assert ! ( err_msg. contains( "Table 'nonexistent_table' not found in current schema" ) ) ;
217+ }
218+
219+ #[ test]
220+ fn test_modify_column_type_sqlite_column_not_found ( ) {
221+ // Test error when column is not found in table (lines 35-37)
222+ let current_schema = vec ! [ TableDef {
223+ name: "users" . into( ) ,
224+ columns: vec![ ColumnDef {
225+ name: "id" . into( ) ,
226+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
227+ nullable: false ,
228+ default : None ,
229+ comment: None ,
230+ primary_key: None ,
231+ unique: None ,
232+ index: None ,
233+ foreign_key: None ,
234+ } ] ,
235+ constraints: vec![ ] ,
236+ indexes: vec![ ] ,
237+ } ] ;
238+ let result = build_modify_column_type (
239+ & DatabaseBackend :: Sqlite ,
240+ "users" ,
241+ "nonexistent_column" ,
242+ & ColumnType :: Simple ( SimpleColumnType :: BigInt ) ,
243+ & current_schema,
244+ ) ;
245+ assert ! ( result. is_err( ) ) ;
246+ let err_msg = result. unwrap_err ( ) . to_string ( ) ;
247+ assert ! ( err_msg. contains( "Column 'nonexistent_column' not found in table 'users'" ) ) ;
248+ }
249+
250+ #[ rstest]
251+ #[ case:: modify_column_type_with_index_postgres(
252+ "modify_column_type_with_index_postgres" ,
253+ DatabaseBackend :: Postgres
254+ ) ]
255+ #[ case:: modify_column_type_with_index_mysql(
256+ "modify_column_type_with_index_mysql" ,
257+ DatabaseBackend :: MySql
258+ ) ]
259+ #[ case:: modify_column_type_with_index_sqlite(
260+ "modify_column_type_with_index_sqlite" ,
261+ DatabaseBackend :: Sqlite
262+ ) ]
263+ fn test_modify_column_type_with_index (
264+ #[ case] title : & str ,
265+ #[ case] backend : DatabaseBackend ,
266+ ) {
267+ // Test modify column type with indexes (lines 85-88, 90-91, 93-94)
268+ use vespertide_core:: IndexDef ;
269+
270+ let current_schema = vec ! [ TableDef {
271+ name: "users" . into( ) ,
272+ columns: vec![
273+ ColumnDef {
274+ name: "id" . into( ) ,
275+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
276+ nullable: false ,
277+ default : None ,
278+ comment: None ,
279+ primary_key: None ,
280+ unique: None ,
281+ index: None ,
282+ foreign_key: None ,
283+ } ,
284+ ColumnDef {
285+ name: "age" . into( ) ,
286+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
287+ nullable: true ,
288+ default : None ,
289+ comment: None ,
290+ primary_key: None ,
291+ unique: None ,
292+ index: None ,
293+ foreign_key: None ,
294+ } ,
295+ ] ,
296+ constraints: vec![ ] ,
297+ indexes: vec![ IndexDef {
298+ name: "idx_age" . into( ) ,
299+ columns: vec![ "age" . into( ) ] ,
300+ unique: false ,
301+ } ] ,
302+ } ] ;
303+
304+ let result = build_modify_column_type (
305+ & backend,
306+ "users" ,
307+ "age" ,
308+ & ColumnType :: Simple ( SimpleColumnType :: BigInt ) ,
309+ & current_schema,
310+ )
311+ . unwrap ( ) ;
312+
313+ let sql = result
314+ . iter ( )
315+ . map ( |q| q. build ( backend) )
316+ . collect :: < Vec < _ > > ( )
317+ . join ( ";\n " ) ;
318+
319+ // For SQLite, should recreate index
320+ if matches ! ( backend, DatabaseBackend :: Sqlite ) {
321+ assert ! ( sql. contains( "CREATE INDEX" ) ) ;
322+ assert ! ( sql. contains( "idx_age" ) ) ;
323+ }
324+
325+ with_settings ! ( { snapshot_suffix => format!( "modify_column_type_with_index_{}" , title) } , {
326+ assert_snapshot!( sql) ;
327+ } ) ;
328+ }
329+
330+ #[ rstest]
331+ #[ case:: modify_column_type_with_unique_index_postgres(
332+ "modify_column_type_with_unique_index_postgres" ,
333+ DatabaseBackend :: Postgres
334+ ) ]
335+ #[ case:: modify_column_type_with_unique_index_mysql(
336+ "modify_column_type_with_unique_index_mysql" ,
337+ DatabaseBackend :: MySql
338+ ) ]
339+ #[ case:: modify_column_type_with_unique_index_sqlite(
340+ "modify_column_type_with_unique_index_sqlite" ,
341+ DatabaseBackend :: Sqlite
342+ ) ]
343+ fn test_modify_column_type_with_unique_index (
344+ #[ case] title : & str ,
345+ #[ case] backend : DatabaseBackend ,
346+ ) {
347+ // Test modify column type with unique index (lines 85-88, 90-91, 93-94)
348+ use vespertide_core:: IndexDef ;
349+
350+ let current_schema = vec ! [ TableDef {
351+ name: "users" . into( ) ,
352+ columns: vec![
353+ ColumnDef {
354+ name: "id" . into( ) ,
355+ r#type: ColumnType :: Simple ( SimpleColumnType :: Integer ) ,
356+ nullable: false ,
357+ default : None ,
358+ comment: None ,
359+ primary_key: None ,
360+ unique: None ,
361+ index: None ,
362+ foreign_key: None ,
363+ } ,
364+ ColumnDef {
365+ name: "email" . into( ) ,
366+ r#type: ColumnType :: Simple ( SimpleColumnType :: Text ) ,
367+ nullable: true ,
368+ default : None ,
369+ comment: None ,
370+ primary_key: None ,
371+ unique: None ,
372+ index: None ,
373+ foreign_key: None ,
374+ } ,
375+ ] ,
376+ constraints: vec![ ] ,
377+ indexes: vec![ IndexDef {
378+ name: "idx_email" . into( ) ,
379+ columns: vec![ "email" . into( ) ] ,
380+ unique: true ,
381+ } ] ,
382+ } ] ;
383+
384+ let result = build_modify_column_type (
385+ & backend,
386+ "users" ,
387+ "email" ,
388+ & ColumnType :: Complex ( ComplexColumnType :: Varchar { length : 255 } ) ,
389+ & current_schema,
390+ )
391+ . unwrap ( ) ;
392+
393+ let sql = result
394+ . iter ( )
395+ . map ( |q| q. build ( backend) )
396+ . collect :: < Vec < _ > > ( )
397+ . join ( ";\n " ) ;
398+
399+ // For SQLite, should recreate unique index
400+ if matches ! ( backend, DatabaseBackend :: Sqlite ) {
401+ assert ! ( sql. contains( "CREATE UNIQUE INDEX" ) ) ;
402+ assert ! ( sql. contains( "idx_email" ) ) ;
403+ }
404+
405+ with_settings ! ( { snapshot_suffix => format!( "modify_column_type_with_unique_index_{}" , title) } , {
406+ assert_snapshot!( sql) ;
407+ } ) ;
408+ }
203409}
0 commit comments