Skip to content

Commit 7520fbc

Browse files
committed
Add case
1 parent abff3b6 commit 7520fbc

7 files changed

Lines changed: 244 additions & 0 deletions

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

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
ALTER TABLE `users` MODIFY COLUMN `age` bigint
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
ALTER TABLE "users" ALTER COLUMN "age" TYPE bigint
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "users_temp" ( "id" integer NOT NULL, "age" bigint );
6+
INSERT INTO "users_temp" ("id", "age") SELECT "id", "age" FROM "users";
7+
DROP TABLE "users";
8+
ALTER TABLE "users_temp" RENAME TO "users";
9+
CREATE INDEX "idx_age" ON "users" ("age")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
ALTER TABLE `users` MODIFY COLUMN `email` varchar(255)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
ALTER TABLE "users" ALTER COLUMN "email" TYPE varchar(255)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
source: crates/vespertide-query/src/sql/modify_column_type.rs
3+
expression: sql
4+
---
5+
CREATE TABLE "users_temp" ( "id" integer NOT NULL, "email" varchar(255) );
6+
INSERT INTO "users_temp" ("id", "email") SELECT "id", "email" FROM "users";
7+
DROP TABLE "users";
8+
ALTER TABLE "users_temp" RENAME TO "users";
9+
CREATE UNIQUE INDEX "idx_email" ON "users" ("email")

0 commit comments

Comments
 (0)