diff --git a/sea-orm-cli/Cargo.toml b/sea-orm-cli/Cargo.toml index 320b35cf..aead20df 100644 --- a/sea-orm-cli/Cargo.toml +++ b/sea-orm-cli/Cargo.toml @@ -33,6 +33,7 @@ sqlx = { version = "^0.5", default-features = false, features = [ "mysql", "post env_logger = { version = "^0.9" } log = { version = "^0.4" } url = "^2.2" +smol = "1.2.5" [features] default = [ "runtime-async-std-native-tls" ] diff --git a/sea-orm-cli/src/main.rs b/sea-orm-cli/src/main.rs index f5c59529..2529b0f1 100644 --- a/sea-orm-cli/src/main.rs +++ b/sea-orm-cli/src/main.rs @@ -24,16 +24,6 @@ async fn main() { async fn run_generate_command(matches: &ArgMatches<'_>) -> Result<(), Box> { match matches.subcommand() { ("entity", Some(args)) => { - // The database should be a valid URL that can be parsed - // protocol://username:password@host/database_name - let url = match Url::parse( - args.value_of("DATABASE_URL") - .expect("No database url could be found"), - ) { - Ok(url) => url, - Err(e) => panic!("Invalid database url: {}", e), - }; - let output_dir = args.value_of("OUTPUT_DIR").unwrap(); let include_hidden_tables = args.is_present("INCLUDE_HIDDEN_TABLES"); let tables = args @@ -49,6 +39,33 @@ async fn run_generate_command(matches: &ArgMatches<'_>) -> Result<(), Box) -> Result<(), Box match e.downcast::() { + Ok(_) => (), + Err(e) => panic!("Expected ParseError but got: {:?}", e), + }, + _ => panic!("Should have panicked"), + } + } + + #[test] + #[should_panic] + fn test_generate_entity_no_database_section() { + let matches = cli::build_cli() + .setting(AppSettings::NoBinaryName) + .get_matches_from(vec![ + "generate", + "entity", + "--database-url", + "postgresql://root:root@localhost:3306", + ]); + + smol::block_on(run_generate_command(matches.subcommand().1.unwrap())) + .unwrap_or_else(handle_error); + } + + #[test] + #[should_panic] + fn test_generate_entity_no_database_path() { + let matches = cli::build_cli() + .setting(AppSettings::NoBinaryName) + .get_matches_from(vec![ + "generate", + "entity", + "--database-url", + "mysql://root:root@localhost:3306/", + ]); + + smol::block_on(run_generate_command(matches.subcommand().1.unwrap())) + .unwrap_or_else(handle_error); + } + + #[test] + #[should_panic] + fn test_generate_entity_no_username() { + let matches = cli::build_cli() + .setting(AppSettings::NoBinaryName) + .get_matches_from(vec![ + "generate", + "entity", + "--database-url", + "mysql://:root@localhost:3306/database", + ]); + + smol::block_on(run_generate_command(matches.subcommand().1.unwrap())) + .unwrap_or_else(handle_error); + } + + #[test] + #[should_panic] + fn test_generate_entity_no_password() { + let matches = cli::build_cli() + .setting(AppSettings::NoBinaryName) + .get_matches_from(vec![ + "generate", + "entity", + "--database-url", + "mysql://root:@localhost:3306/database", + ]); + + smol::block_on(run_generate_command(matches.subcommand().1.unwrap())) + .unwrap_or_else(handle_error); + } + + #[async_std::test] + async fn test_generate_entity_no_host() { + let matches = cli::build_cli() + .setting(AppSettings::NoBinaryName) + .get_matches_from(vec![ + "generate", + "entity", + "--database-url", + "postgres://root:root@/database", + ]); + + let result = std::panic::catch_unwind(|| { + smol::block_on(run_generate_command(matches.subcommand().1.unwrap())) + }); + + // Make sure result is a ParseError + match result { + Ok(Err(e)) => match e.downcast::() { + Ok(_) => (), + Err(e) => panic!("Expected ParseError but got: {:?}", e), + }, + _ => panic!("Should have panicked"), + } + } +}