diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index ee118d331..b127d7c69 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -136,9 +136,9 @@ impl Shuttle { println!("First, let's log in to your Shuttle account."); self.login(args.login_args.clone()).await?; println!(); - } else if args.new && args.login_args.api_key.is_some() { + } else if args.login_args.api_key.is_some() { self.login(args.login_args.clone()).await?; - } else { + } else if args.new { bail!("Tried to login to create a Shuttle environment, but no API key was set.") } } diff --git a/cargo-shuttle/tests/integration/init.rs b/cargo-shuttle/tests/integration/init.rs index 75ac846fa..223987b5b 100644 --- a/cargo-shuttle/tests/integration/init.rs +++ b/cargo-shuttle/tests/integration/init.rs @@ -33,8 +33,6 @@ async fn non_interactive_basic_init() { assert!(cargo_toml.contains("shuttle-runtime = ")); } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[tokio::test] async fn non_interactive_rocket_init() { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -57,8 +55,6 @@ async fn non_interactive_rocket_init() { assert_valid_rocket_project(temp_dir_path.as_path(), "rocket-init"); } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[test] fn interactive_rocket_init() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -98,8 +94,6 @@ fn interactive_rocket_init() -> Result<(), Box> { Ok(()) } -// TODO: unignore when shuttle-rocket is published -#[ignore] #[test] fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -135,8 +129,6 @@ fn interactive_rocket_init_dont_prompt_framework() -> Result<(), Box Result<(), Box> { let temp_dir = Builder::new().prefix("rocket-init").tempdir().unwrap(); @@ -176,11 +168,10 @@ fn interactive_rocket_init_dont_prompt_name() -> Result<(), Box shuttle_service::ShuttleRocket { + #[shuttle_runtime::main] + async fn rocket() -> shuttle_rocket::ShuttleRocket { let rocket = rocket::build().mount("/hello", routes![index]); - Ok(rocket) + Ok(rocket.into()) }"#}; - assert_eq!(lib_file, expected); + assert_eq!(main_file, expected); } diff --git a/cargo-shuttle/tests/integration/run.rs b/cargo-shuttle/tests/integration/run.rs index cc2244520..6f0b2fc45 100644 --- a/cargo-shuttle/tests/integration/run.rs +++ b/cargo-shuttle/tests/integration/run.rs @@ -120,6 +120,58 @@ async fn rocket_postgres() { assert_eq!(request_text, "{\"id\":1,\"note\":\"Deploy to shuttle\"}"); } +#[tokio::test(flavor = "multi_thread")] +async fn axum_static_files() { + let url = cargo_shuttle_run("../examples/axum/static-files", false).await; + let client = reqwest::Client::new(); + + let request_text = client + .get(format!("{url}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello, world!"); + + let request_text = client.get(url).send().await.unwrap().text().await.unwrap(); + + assert!( + request_text.contains("This is an example of serving static files with axum and shuttle.") + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn shuttle_next() { + let url = cargo_shuttle_run("../examples/next/hello-world", false).await; + let client = reqwest::Client::new(); + + let request_text = client + .get(format!("{url}/hello")) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(request_text, "Hello, World!"); + + let post_text = client + .post(format!("{url}/uppercase")) + .body("uppercase this") + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + + assert_eq!(post_text, "UPPERCASE THIS"); +} + #[tokio::test(flavor = "multi_thread")] #[ignore] async fn rocket_authentication() { diff --git a/codegen/src/shuttle_main/mod.rs b/codegen/src/shuttle_main/mod.rs index 3d49794d8..49d67101f 100644 --- a/codegen/src/shuttle_main/mod.rs +++ b/codegen/src/shuttle_main/mod.rs @@ -232,7 +232,7 @@ impl ToTokens for Loader { None } else { Some(parse_quote!( - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; )) }; @@ -391,7 +391,7 @@ mod tests { ) -> ShuttleComplex { use shuttle_runtime::Context; use shuttle_runtime::tracing_subscriber::prelude::*; - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; let filter_layer = shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() @@ -506,7 +506,7 @@ mod tests { ) -> ShuttleComplex { use shuttle_runtime::Context; use shuttle_runtime::tracing_subscriber::prelude::*; - use shuttle_runtime::ResourceBuilder; + use shuttle_runtime::{Factory, ResourceBuilder}; let filter_layer = shuttle_runtime::tracing_subscriber::EnvFilter::try_from_default_env() diff --git a/resources/static-folder/src/lib.rs b/resources/static-folder/src/lib.rs index 4d9abc944..4a3f3c775 100644 --- a/resources/static-folder/src/lib.rs +++ b/resources/static-folder/src/lib.rs @@ -65,6 +65,10 @@ impl<'a> ResourceBuilder for StaticFolder<'a> { trace!(output_directory = ?output_dir, "got output directory"); + if output_dir.join(self.folder) == input_dir { + return Ok(output_dir.join(self.folder)); + } + let copy_options = CopyOptions::new().overwrite(true); match copy(&input_dir, &output_dir, ©_options) { Ok(_) => Ok(output_dir.join(self.folder)), diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 31c11a7fa..8e1cf8e28 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -227,7 +227,7 @@ pub use logger::Logger; pub use next::{AxumWasm, NextArgs}; pub use provisioner_factory::ProvisionerFactory; pub use shuttle_common::storage_manager::StorageManager; -pub use shuttle_service::{main, CustomError, Error, ResourceBuilder, Service}; +pub use shuttle_service::{main, CustomError, Error, Factory, ResourceBuilder, Service}; // Dependencies required by the codegen pub use anyhow::Context;