Skip to content

Commit cc778eb

Browse files
committed
Add case
1 parent 7afd48a commit cc778eb

File tree

1 file changed

+216
-0
lines changed

1 file changed

+216
-0
lines changed

crates/vespertide-query/src/sql/add_column.rs

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)