From 92646e00b83f5c2b24e93062adbee36f148c20ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Th=C3=A9riault?= Date: Thu, 23 Jul 2020 17:46:27 -0400 Subject: [PATCH] Fix migrate! and add migration test --- .github/workflows/sqlx.yml | 14 ++++----- Cargo.toml | 9 ++++++ sqlx-cli/src/migrate.rs | 8 ++--- sqlx-macros/src/migrate.rs | 3 +- sqlx-macros/src/query/input.rs | 1 - src/macros.rs | 30 ++++++++----------- tests/migrate/macro.rs | 17 +++++++++++ .../migrations/20200723212833_tweet.sql | 6 ++++ .../migrations/20200723212841_accounts.sql | 5 ++++ 9 files changed, 61 insertions(+), 32 deletions(-) create mode 100644 tests/migrate/macro.rs create mode 100644 tests/migrate/migrations/20200723212833_tweet.sql create mode 100644 tests/migrate/migrations/20200723212841_accounts.sql diff --git a/.github/workflows/sqlx.yml b/.github/workflows/sqlx.yml index de783b671..b5fa4417a 100644 --- a/.github/workflows/sqlx.yml +++ b/.github/workflows/sqlx.yml @@ -48,14 +48,14 @@ jobs: args: > --manifest-path sqlx-core/Cargo.toml --no-default-features - --features offline,all-databases,all-types,runtime-${{ matrix.runtime }} + --features offline,all-databases,all-types,migrate,runtime-${{ matrix.runtime }} - uses: actions-rs/cargo@v1 with: command: check args: > --no-default-features - --features offline,all-databases,all-types,runtime-${{ matrix.runtime }},macros + --features offline,all-databases,all-types,migrate,runtime-${{ matrix.runtime }},macros test: name: Unit Test @@ -97,7 +97,7 @@ jobs: command: test args: > --no-default-features - --features any,macros,sqlite,all-types,runtime-${{ matrix.runtime }} + --features any,macros,migrate,sqlite,all-types,runtime-${{ matrix.runtime }} -- --test-threads=1 env: @@ -143,7 +143,7 @@ jobs: command: test args: > --no-default-features - --features any,postgres,macros,all-types,runtime-${{ matrix.runtime }} + --features any,postgres,macros,migrate,all-types,runtime-${{ matrix.runtime }} env: DATABASE_URL: postgres://postgres:password@localhost:5432/sqlx?sslmode=verify-ca&sslrootcert=.%2Ftests%2Fcerts%2Fca.crt @@ -178,7 +178,7 @@ jobs: command: test args: > --no-default-features - --features any,mysql,macros,all-types,runtime-${{ matrix.runtime }} + --features any,mysql,macros,migrate,all-types,runtime-${{ matrix.runtime }} env: DATABASE_URL: mysql://root:password@localhost:3306/sqlx @@ -213,7 +213,7 @@ jobs: command: test args: > --no-default-features - --features any,mysql,macros,all-types,runtime-${{ matrix.runtime }} + --features any,mysql,macros,migrate,all-types,runtime-${{ matrix.runtime }} env: DATABASE_URL: mysql://root:password@localhost:3306/sqlx @@ -248,6 +248,6 @@ jobs: command: test args: > --no-default-features - --features any,mssql,macros,all-types,runtime-${{ matrix.runtime }} + --features any,mssql,macros,migrate,all-types,runtime-${{ matrix.runtime }} env: DATABASE_URL: mssql://sa:Password123!@localhost/sqlx diff --git a/Cargo.toml b/Cargo.toml index fd37a64df..922719517 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,6 +107,15 @@ name = "any-pool" path = "tests/any/pool.rs" required-features = [ "any" ] +# +# Migrations +# + +[[test]] +name = "migrate-macro" +path = "tests/migrate/macro.rs" +required-features = [ "macros", "migrate" ] + # # SQLite # diff --git a/sqlx-cli/src/migrate.rs b/sqlx-cli/src/migrate.rs index 08dccf82d..8fe7d6563 100644 --- a/sqlx-cli/src/migrate.rs +++ b/sqlx-cli/src/migrate.rs @@ -44,8 +44,8 @@ pub async fn info(uri: &str) -> anyhow::Result<()> { for migration in migrator.iter() { println!( "{}/{} {}", - style(migration.version()).cyan(), - if version >= migration.version() { + style(migration.version).cyan(), + if version >= migration.version { style("installed").green() } else { style("pending").yellow() @@ -70,12 +70,12 @@ pub async fn run(uri: &str) -> anyhow::Result<()> { } for migration in migrator.iter() { - if migration.version() > version { + if migration.version > version { let elapsed = conn.apply(migration).await?; println!( "{}/{} {} {}", - style(migration.version()).cyan(), + style(migration.version).cyan(), style("migrate").green(), migration.description, style(format!("({:?})", elapsed)).dim() diff --git a/sqlx-macros/src/migrate.rs b/sqlx-macros/src/migrate.rs index fc4245f1f..6d4c1f580 100644 --- a/sqlx-macros/src/migrate.rs +++ b/sqlx-macros/src/migrate.rs @@ -2,7 +2,6 @@ use proc_macro2::TokenStream; use quote::{quote, ToTokens, TokenStreamExt}; use sha2::{Digest, Sha384}; use std::fs; -use std::path::Path; use syn::LitStr; struct QuotedMigration { @@ -26,7 +25,7 @@ impl ToTokens for QuotedMigration { version: #version, description: std::borrow::Cow::Borrowed(#description), sql: std::borrow::Cow::Borrowed(#sql), - checksum: std::borow::Cow::Borrowed(&[ + checksum: std::borrow::Cow::Borrowed(&[ #(#checksum),* ]), } diff --git a/sqlx-macros/src/query/input.rs b/sqlx-macros/src/query/input.rs index bded9f94c..f48373cf2 100644 --- a/sqlx-macros/src/query/input.rs +++ b/sqlx-macros/src/query/input.rs @@ -1,4 +1,3 @@ -use std::env; use std::fs; use proc_macro2::{Ident, Span}; diff --git a/src/macros.rs b/src/macros.rs index d43b20979..76c018313 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -594,25 +594,19 @@ macro_rules! query_file_as_unchecked ( #[cfg(feature = "migrate")] #[macro_export] macro_rules! migrate { - ($dir:literal) => { - #[allow(dead_code)] - { - #[macro_use] - mod _macro_result { - $crate::sqlx_macros::migrate!($dir); - } - macro_result!() + ($dir:literal) => {{ + #[macro_use] + mod _macro_result { + $crate::sqlx_macros::migrate!($dir); } - }; + macro_result!() + }}; - () => { - #[allow(dead_code)] - { - #[macro_use] - mod _macro_result { - $crate::sqlx_macros::migrate!("migrations"); - } - macro_result!() + () => {{ + #[macro_use] + mod _macro_result { + $crate::sqlx_macros::migrate!("migrations"); } - }; + macro_result!() + }}; } diff --git a/tests/migrate/macro.rs b/tests/migrate/macro.rs new file mode 100644 index 000000000..3b5e49fc1 --- /dev/null +++ b/tests/migrate/macro.rs @@ -0,0 +1,17 @@ +use sqlx::migrate::Migrator; +use std::path::Path; + +#[sqlx_macros::test] +async fn same_output() -> anyhow::Result<()> { + let embedded = sqlx::migrate!("tests/migrate/migrations"); + let runtime = Migrator::new(Path::new("tests/migrate/migrations")).await?; + + for (e, r) in embedded.iter().zip(runtime.iter()) { + assert_eq!(e.version, r.version); + assert_eq!(e.description, r.description); + assert_eq!(e.sql, r.sql); + assert_eq!(e.checksum, r.checksum); + } + + Ok(()) +} diff --git a/tests/migrate/migrations/20200723212833_tweet.sql b/tests/migrate/migrations/20200723212833_tweet.sql new file mode 100644 index 000000000..45c09606c --- /dev/null +++ b/tests/migrate/migrations/20200723212833_tweet.sql @@ -0,0 +1,6 @@ +CREATE TABLE tweet ( + id BIGINT NOT NULL PRIMARY KEY, + text TEXT NOT NULL, + is_sent BOOLEAN NOT NULL DEFAULT TRUE, + owner_id BIGINT +); diff --git a/tests/migrate/migrations/20200723212841_accounts.sql b/tests/migrate/migrations/20200723212841_accounts.sql new file mode 100644 index 000000000..f2c0a7392 --- /dev/null +++ b/tests/migrate/migrations/20200723212841_accounts.sql @@ -0,0 +1,5 @@ +CREATE TABLE accounts ( + id INTEGER NOT NULL PRIMARY KEY, + name TEXT NOT NULL, + is_active BOOLEAN +);