vespertide_query/sql/
rename_column.rs

1use sea_query::{Alias, Table};
2
3use super::types::BuiltQuery;
4
5pub fn build_rename_column(table: &str, from: &str, to: &str) -> BuiltQuery {
6    let stmt = Table::alter()
7        .table(Alias::new(table))
8        .rename_column(Alias::new(from), Alias::new(to))
9        .to_owned();
10    BuiltQuery::AlterTable(Box::new(stmt))
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16    use crate::sql::types::DatabaseBackend;
17    use insta::{assert_snapshot, with_settings};
18    use rstest::rstest;
19
20    #[rstest]
21    #[case::rename_column_postgres(
22        "rename_column_postgres",
23        DatabaseBackend::Postgres,
24        &["ALTER TABLE \"users\" RENAME COLUMN \"email\" TO \"contact_email\""]
25    )]
26    #[case::rename_column_mysql(
27        "rename_column_mysql",
28        DatabaseBackend::MySql,
29        &["ALTER TABLE `users` RENAME COLUMN `email` TO `contact_email`"]
30    )]
31    #[case::rename_column_sqlite(
32        "rename_column_sqlite",
33        DatabaseBackend::Sqlite,
34        &["ALTER TABLE \"users\" RENAME COLUMN \"email\" TO \"contact_email\""]
35    )]
36    fn test_rename_column(
37        #[case] title: &str,
38        #[case] backend: DatabaseBackend,
39        #[case] expected: &[&str],
40    ) {
41        let result = build_rename_column("users", "email", "contact_email");
42        let sql = result.build(backend);
43        for exp in expected {
44            assert!(
45                sql.contains(exp),
46                "Expected SQL to contain '{}', got: {}",
47                exp,
48                sql
49            );
50        }
51
52        with_settings!({ snapshot_suffix => format!("rename_column_{}", title) }, {
53            assert_snapshot!(sql);
54        });
55    }
56}