diff --git a/Cargo.lock b/Cargo.lock index 6f44943..a65abfa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,8 +24,8 @@ dependencies = [ "futures-sink", "log", "pin-project 0.4.28", - "tokio 0.2.25", - "tokio-util 0.3.1", + "tokio", + "tokio-util", ] [[package]] @@ -93,7 +93,7 @@ dependencies = [ "futures-core", "futures-util", "fxhash", - "h2 0.2.7", + "h2", "http", "httparse", "indexmap", @@ -163,7 +163,7 @@ dependencies = [ "futures-channel", "futures-util", "smallvec", - "tokio 0.2.25", + "tokio", ] [[package]] @@ -179,11 +179,11 @@ dependencies = [ "futures-channel", "futures-util", "log", - "mio 0.6.23", + "mio", "mio-uds", "num_cpus", "slab", - "socket2 0.3.19", + "socket2", ] [[package]] @@ -207,7 +207,7 @@ dependencies = [ "actix-server", "actix-service", "log", - "socket2 0.3.19", + "socket2", ] [[package]] @@ -290,7 +290,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "socket2 0.3.19", + "socket2", "time 0.2.27", "tinyvec", "url", @@ -1676,31 +1676,12 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 0.2.25", - "tokio-util 0.3.1", + "tokio", + "tokio-util", "tracing", "tracing-futures", ] -[[package]] -name = "h2" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" -dependencies = [ - "bytes 1.0.1", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio 1.8.1", - "tokio-util 0.6.7", - "tracing", -] - [[package]] name = "hashbrown" version = "0.1.8" @@ -1803,13 +1784,12 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 1.0.1", + "bytes 0.5.6", "http", - "pin-project-lite 0.2.7", ] [[package]] @@ -1820,9 +1800,9 @@ checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" [[package]] name = "httpdate" -version = "1.0.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" [[package]] name = "humantime" @@ -1835,23 +1815,23 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.10" +version = "0.13.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7728a72c4c7d72665fde02204bcbd93b247721025b222ef78606f14513e0fd03" +checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" dependencies = [ - "bytes 1.0.1", + "bytes 0.5.6", "futures-channel", "futures-core", "futures-util", - "h2 0.3.3", + "h2", "http", "http-body", "httparse", "httpdate", "itoa", - "pin-project-lite 0.2.7", - "socket2 0.4.0", - "tokio 1.8.1", + "pin-project 1.0.7", + "socket2", + "tokio", "tower-service", "tracing", "want", @@ -1859,15 +1839,15 @@ dependencies = [ [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" dependencies = [ - "bytes 1.0.1", + "bytes 0.5.6", "hyper", "native-tls", - "tokio 1.8.1", - "tokio-native-tls", + "tokio", + "tokio-tls", ] [[package]] @@ -1978,7 +1958,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ - "socket2 0.3.19", + "socket2", "widestring", "winapi 0.3.9", "winreg 0.6.2", @@ -2217,25 +2197,12 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.2", + "miow", "net2", "slab", "winapi 0.2.8", ] -[[package]] -name = "mio" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" -dependencies = [ - "libc", - "log", - "miow 0.3.7", - "ntapi", - "winapi 0.3.9", -] - [[package]] name = "mio-uds" version = "0.6.8" @@ -2244,7 +2211,7 @@ checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ "iovec", "libc", - "mio 0.6.23", + "mio", ] [[package]] @@ -2259,15 +2226,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "nanorand" version = "0.5.2" @@ -2335,15 +2293,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -2812,7 +2761,7 @@ dependencies = [ "tempdir", "test_bin", "thiserror", - "tokio 0.2.25", + "tokio", "tracing", "tracing-actix-web", "tracing-opentelemetry", @@ -3171,12 +3120,12 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.4" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" +checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" dependencies = [ "base64 0.13.0", - "bytes 1.0.1", + "bytes 0.5.6", "cookie", "cookie_store", "encoding_rs", @@ -3191,14 +3140,15 @@ dependencies = [ "lazy_static", "log", "mime", + "mime_guess", "native-tls", "percent-encoding", "pin-project-lite 0.2.7", "serde", "serde_urlencoded", "time 0.2.27", - "tokio 1.8.1", - "tokio-native-tls", + "tokio", + "tokio-tls", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -3569,16 +3519,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "socket2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "spin" version = "0.5.2" @@ -3694,7 +3634,7 @@ dependencies = [ "actix-rt", "actix-threadpool", "once_cell", - "tokio 0.2.25", + "tokio", "tokio-rustls", ] @@ -4023,12 +3963,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" dependencies = [ "bytes 0.5.6", + "fnv", "futures-core", "iovec", "lazy_static", "libc", "memchr", - "mio 0.6.23", + "mio", "mio-uds", "num_cpus", "pin-project-lite 0.1.12", @@ -4038,21 +3979,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "tokio" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c8b05dc14c75ea83d63dd391100353789f5f24b8b3866542a5e85c8be8e985" -dependencies = [ - "autocfg 1.0.1", - "bytes 1.0.1", - "libc", - "memchr", - "mio 0.7.13", - "pin-project-lite 0.2.7", - "winapi 0.3.9", -] - [[package]] name = "tokio-macros" version = "0.2.6" @@ -4064,16 +3990,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio 1.8.1", -] - [[package]] name = "tokio-rustls" version = "0.14.1" @@ -4082,10 +3998,20 @@ checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" dependencies = [ "futures-core", "rustls", - "tokio 0.2.25", + "tokio", "webpki", ] +[[package]] +name = "tokio-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.3.1" @@ -4097,21 +4023,7 @@ dependencies = [ "futures-sink", "log", "pin-project-lite 0.1.12", - "tokio 0.2.25", -] - -[[package]] -name = "tokio-util" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" -dependencies = [ - "bytes 1.0.1", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.2.7", - "tokio 1.8.1", + "tokio", ] [[package]] @@ -4254,7 +4166,7 @@ dependencies = [ "rand 0.7.3", "smallvec", "thiserror", - "tokio 0.2.25", + "tokio", "url", ] @@ -4273,7 +4185,7 @@ dependencies = [ "resolv-conf", "smallvec", "thiserror", - "tokio 0.2.25", + "tokio", "trust-dns-proto", ] diff --git a/pslink/Cargo.toml b/pslink/Cargo.toml index e4a01b3..b4e82b5 100644 --- a/pslink/Cargo.toml +++ b/pslink/Cargo.toml @@ -66,6 +66,7 @@ tokio = "0.2.25" assert_cmd = "1.0.7" predicates = "2.0.0" + [dev-dependencies.reqwest] features = ["cookies"] -version = "0.11.3" +version = "0.10.10" diff --git a/pslink/tests/integration-tests.rs b/pslink/tests/integration-tests.rs index b63d674..1c1c6d1 100644 --- a/pslink/tests/integration-tests.rs +++ b/pslink/tests/integration-tests.rs @@ -1,356 +1,404 @@ -// use assert_cmd::prelude::*; // Add methods on commands -// use predicates::prelude::*; -// use std::process::Command; // Used for writing assertions +use assert_cmd::prelude::*; // Add methods on commands +use predicates::prelude::*; +use std::{ + io::Read, + process::{Child, Command}, +}; +use tempdir::TempDir; // Used for writing assertions -// use shared::datatypes::Secret; +use shared::datatypes::Secret; -// #[test] -// fn test_help_of_command_for_breaking_changes() { -// let output = test_bin::get_test_bin("pslink") -// .output() -// .expect("Failed to start pslink"); -// assert!(String::from_utf8_lossy(&output.stdout).contains("USAGE")); +#[test] +fn test_help_of_command_for_breaking_changes() { + let output = test_bin::get_test_bin("pslink") + .output() + .expect("Failed to start pslink"); + assert!(String::from_utf8_lossy(&output.stdout).contains("USAGE")); -// let output = test_bin::get_test_bin("pslink") -// .args(&["--help"]) -// .output() -// .expect("Failed to start pslink"); -// let outstring = String::from_utf8_lossy(&output.stdout); + let output = test_bin::get_test_bin("pslink") + .args(&["--help"]) + .output() + .expect("Failed to start pslink"); + let outstring = String::from_utf8_lossy(&output.stdout); -// let args = &[ -// "USAGE", -// "-h", -// "--help", -// "-b", -// "-e", -// "-i", -// "-p", -// "-t", -// "-u", -// "runserver", -// "create-admin", -// "generate-env", -// "migrate-database", -// "help", -// ]; + let args = &[ + "USAGE", + "-h", + "--help", + "-b", + "-e", + "-i", + "-p", + "-t", + "-u", + "runserver", + "create-admin", + "generate-env", + "migrate-database", + "help", + ]; -// for s in args { -// assert!( -// outstring.contains(s), -// "{} was not found in the help - this is a breaking change", -// s -// ); -// } -// } + for s in args { + assert!( + outstring.contains(s), + "{} was not found in the help - this is a breaking change", + s + ); + } +} -// #[test] -// fn test_generate_env() { -// use std::io::BufRead; -// let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); -// let output = test_bin::get_test_bin("pslink") -// .args(&["generate-env", "--secret", "abcdefghijklmnopqrstuvw"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed to start pslink"); -// let envfile = tmp_dir.path().join(".env"); -// let dbfile = tmp_dir.path().join("links.db"); -// println!("{}", envfile.display()); -// println!("{}", dbfile.display()); -// println!("{}", String::from_utf8_lossy(&output.stdout)); -// assert!(envfile.exists(), "No .env-file was created!"); -// assert!(dbfile.exists(), "No database-file was created!"); +#[test] +fn test_generate_env() { + use std::io::BufRead; + let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); + let output = test_bin::get_test_bin("pslink") + .args(&["generate-env", "--secret", "abcdefghijklmnopqrstuvw"]) + .current_dir(&tmp_dir) + .output() + .expect("Failed to start pslink"); + let envfile = tmp_dir.path().join(".env"); + let dbfile = tmp_dir.path().join("links.db"); + println!("{}", envfile.display()); + println!("{}", dbfile.display()); + println!("{}", String::from_utf8_lossy(&output.stdout)); + assert!(envfile.exists(), "No .env-file was created!"); + assert!(dbfile.exists(), "No database-file was created!"); -// let envfile = std::fs::File::open(envfile).unwrap(); -// let envcontent: Vec> = std::io::BufReader::new(envfile).lines().collect(); -// assert!( -// envcontent -// .iter() -// .any(|s| s.as_ref().unwrap().starts_with("PSLINK_PORT=")), -// "Failed to find PSLINK_PORT in the generated .env file." -// ); -// assert!( -// envcontent -// .iter() -// .any(|s| s.as_ref().unwrap().starts_with("PSLINK_SECRET=")), -// "Failed to find PSLINK_SECRET in the generated .env file." -// ); -// assert!( -// !envcontent.iter().any(|s| { -// let r = s.as_ref().unwrap().contains("***SECRET***"); -// r -// }), -// "It seems that a censored secret was used in the .env file." -// ); -// assert!( -// envcontent.iter().any(|s| { -// let r = s.as_ref().unwrap().contains("abcdefghijklmnopqrstuvw"); -// r -// }), -// "The secret has not made it into the .env file!" -// ); -// let output = test_bin::get_test_bin("pslink") -// .args(&["generate-env"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed to start pslink"); -// let second_out = String::from_utf8_lossy(&output.stdout); -// assert!(!second_out.contains("secret")); -// } + let envfile = std::fs::File::open(envfile).unwrap(); + let envcontent: Vec> = std::io::BufReader::new(envfile).lines().collect(); + assert!( + envcontent + .iter() + .any(|s| s.as_ref().unwrap().starts_with("PSLINK_PORT=")), + "Failed to find PSLINK_PORT in the generated .env file." + ); + assert!( + envcontent + .iter() + .any(|s| s.as_ref().unwrap().starts_with("PSLINK_SECRET=")), + "Failed to find PSLINK_SECRET in the generated .env file." + ); + assert!( + !envcontent.iter().any(|s| { + let r = s.as_ref().unwrap().contains("***SECRET***"); + r + }), + "It seems that a censored secret was used in the .env file." + ); + assert!( + envcontent.iter().any(|s| { + let r = s.as_ref().unwrap().contains("abcdefghijklmnopqrstuvw"); + r + }), + "The secret has not made it into the .env file!" + ); + let output = test_bin::get_test_bin("pslink") + .args(&["generate-env"]) + .current_dir(&tmp_dir) + .output() + .expect("Failed to start pslink"); + let second_out = String::from_utf8_lossy(&output.stdout); + assert!(!second_out.contains("secret")); +} -// #[actix_rt::test] -// async fn test_migrate_database() { -// use std::io::Write; -// #[derive(serde::Serialize, Debug)] -// pub struct Count { -// pub number: i32, -// } +#[actix_rt::test] +async fn test_migrate_database() { + use std::io::Write; + #[derive(serde::Serialize, Debug)] + pub struct Count { + pub number: i32, + } -// let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); -// // generate .env file -// let _output = test_bin::get_test_bin("pslink") -// .args(&["generate-env"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed generate .env"); + let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); + // generate .env file + let _output = test_bin::get_test_bin("pslink") + .args(&["generate-env"]) + .current_dir(&tmp_dir) + .output() + .expect("Failed generate .env"); -// // migrate the database -// let output = test_bin::get_test_bin("pslink") -// .args(&["migrate-database"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed to migrate the database"); -// println!("{}", String::from_utf8_lossy(&output.stdout)); + // migrate the database + let output = test_bin::get_test_bin("pslink") + .args(&["migrate-database"]) + .current_dir(&tmp_dir) + .output() + .expect("Failed to migrate the database"); + println!("{}", String::from_utf8_lossy(&output.stdout)); -// // check if the users table exists by counting the number of admins. -// let db_pool = sqlx::pool::Pool::::connect( -// &tmp_dir.path().join("links.db").display().to_string(), -// ) -// .await -// .expect("Error: Failed to connect to database!"); -// let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") -// .fetch_one(&db_pool) -// .await -// .unwrap(); -// // initially no admin is present -// assert_eq!(num.number, 0, "Failed to create the database!"); + // check if the users table exists by counting the number of admins. + let db_pool = sqlx::pool::Pool::::connect( + &tmp_dir.path().join("links.db").display().to_string(), + ) + .await + .expect("Error: Failed to connect to database!"); + let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") + .fetch_one(&db_pool) + .await + .unwrap(); + // initially no admin is present + assert_eq!(num.number, 0, "Failed to create the database!"); -// // create a new admin -// let mut input = test_bin::get_test_bin("pslink") -// .args(&["create-admin"]) -// .current_dir(&tmp_dir) -// .stdin(std::process::Stdio::piped()) -// .stdout(std::process::Stdio::piped()) -// .spawn() -// .expect("Failed to migrate the database"); -// let mut procin = input.stdin.take().unwrap(); + // create a new admin + let mut input = test_bin::get_test_bin("pslink") + .args(&["create-admin"]) + .current_dir(&tmp_dir) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::piped()) + .spawn() + .expect("Failed to migrate the database"); + let mut procin = input.stdin.take().unwrap(); -// procin.write_all(b"test\n").unwrap(); -// procin.write_all(b"test@mail.test\n").unwrap(); -// procin.write_all(b"testpw\n").unwrap(); + procin.write_all(b"test\n").unwrap(); + procin.write_all(b"test@mail.test\n").unwrap(); + procin.write_all(b"testpw\n").unwrap(); -// let r = input.wait().unwrap(); -// println!("Exitstatus is: {}", r); + let r = input.wait().unwrap(); + println!("Exitstatus is: {}", r); -// println!("{}", String::from_utf8_lossy(&output.stdout)); -// let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") -// .fetch_one(&db_pool) -// .await -// .unwrap(); -// // now 1 admin is there -// assert_eq!(num.number, 1, "Failed to create an admin!"); -// } + println!("{}", String::from_utf8_lossy(&output.stdout)); + let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") + .fetch_one(&db_pool) + .await + .unwrap(); + // now 1 admin is there + assert_eq!(num.number, 1, "Failed to create an admin!"); +} -// async fn run_server() { -// use std::io::Write; -// #[derive(serde::Serialize, Debug)] -// pub struct Count { -// pub number: i32, -// } -// let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); -// // generate .env file -// let _output = Command::cargo_bin("pslink") -// .expect("Failed to get binary executable") -// .args(&["generate-env", "--secret", "abcdefghijklmnopqrstuvw"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed generate .env"); -// // migrate the database -// let output = Command::cargo_bin("pslink") -// .args(&["migrate-database"]) -// .current_dir(&tmp_dir) -// .output() -// .expect("Failed to migrate the database"); +struct RunningServer { + server: Child, + port: i32, + dir: TempDir, +} -// // create a database connection. -// let db_pool = sqlx::pool::Pool::::connect( -// &tmp_dir.path().join("links.db").display().to_string(), -// ) -// .await -// .expect("Error: Failed to connect to database!"); // create a new admin -// let mut input = test_bin::get_test_bin("pslink") -// .args(&["create-admin"]) -// .current_dir(&tmp_dir) -// .stdin(std::process::Stdio::piped()) -// .stdout(std::process::Stdio::piped()) -// .spawn() -// .expect("Failed to migrate the database"); -// let mut procin = input.stdin.take().unwrap(); +impl Drop for RunningServer { + fn drop(&mut self) { + self.server.kill().unwrap(); + } +} -// procin.write_all(b"test\n").unwrap(); -// procin.write_all(b"test@mail.test\n").unwrap(); -// procin.write_all(b"testpw\n").unwrap(); +async fn run_server() -> RunningServer { + use std::io::Write; -// let r = input.wait().unwrap(); -// println!("Exitstatus is: {}", r); + use rand::thread_rng; + use rand::Rng; + let mut rng = thread_rng(); + let port = rng.gen_range(12000..20000); -// println!("{}", String::from_utf8_lossy(&output.stdout)); -// let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") -// .fetch_one(&db_pool) -// .await -// .unwrap(); -// // now 1 admin is there -// assert_eq!( -// num.number, 1, -// "Failed to create an admin! See previous tests!" -// ); + #[derive(serde::Serialize, Debug)] + pub struct Count { + pub number: i32, + } + let tmp_dir = tempdir::TempDir::new("pslink_test_env").expect("create temp dir"); + // generate .env file + let _output = Command::cargo_bin("pslink") + .expect("Failed to get binary executable") + .args(&[ + "generate-env", + "--secret", + "abcdefghijklmnopqrstuvw", + "--port", + &port.to_string(), + ]) + .current_dir(&tmp_dir) + .output() + .expect("Failed generate .env"); + // migrate the database + let output = Command::cargo_bin("pslink") + .unwrap() + .args(&["migrate-database"]) + .current_dir(&tmp_dir) + .output() + .expect("Failed to migrate the database"); -// let server_config = pslink::ServerConfig { -// secret: Secret::new("abcdefghijklmnopqrstuvw".to_string()), -// db: std::path::PathBuf::from("links.db"), -// db_pool, -// public_url: "localhost:8080".to_string(), -// internal_ip: "localhost".to_string(), -// port: 8080, -// protocol: pslink::Protocol::Http, -// empty_forward_url: "https://github.com/enaut/pslink".to_string(), -// brand_name: "Pslink".to_string(), -// }; + // create a database connection. + let db_pool = sqlx::pool::Pool::::connect( + &tmp_dir.path().join("links.db").display().to_string(), + ) + .await + .expect("Error: Failed to connect to database!"); // create a new admin + let mut input = Command::cargo_bin("pslink") + .unwrap() + .args(&["create-admin"]) + .current_dir(&tmp_dir) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::piped()) + .spawn() + .expect("Failed to migrate the database"); + let mut procin = input.stdin.take().unwrap(); -// let server = pslink::main::webservice(server_config); + procin.write_all(b"test\n").unwrap(); + procin.write_all(b"test@mail.test\n").unwrap(); + procin.write_all(b"testpw\n").unwrap(); -// let _neveruse = tokio::spawn(server); -// } + let r = input.wait().unwrap(); + println!("Exitstatus is: {}", r); -// #[actix_rt::test] -// async fn test_web_paths() { -// run_server().await; + println!("{}", String::from_utf8_lossy(&output.stdout)); + let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") + .fetch_one(&db_pool) + .await + .unwrap(); + // now 1 admin is there + assert_eq!( + num.number, 1, + "Failed to create an admin! See previous tests!" + ); -// // We need to bring in `reqwest` -// // to perform HTTP requests against our application. -// let client = reqwest::Client::builder() -// .cookie_store(true) -// .redirect(reqwest::redirect::Policy::none()) -// .build() -// .unwrap(); + let mut server = Command::cargo_bin("pslink") + .unwrap() + .args(&["runserver"]) + .current_dir(&tmp_dir) + .stdout(std::process::Stdio::piped()) + .spawn() + .unwrap(); -// // Act -// let response = client -// .get("http://localhost:8080/") -// .send() -// .await -// .expect("Failed to execute request."); + // Wait until the server signals it is up and running. + let mut sout = server.stdout.take().unwrap(); + let mut buffer = [0; 15]; + println!("Running the webserver for testing #############"); + loop { + let num = sout.read(&mut buffer[..]).unwrap(); + println!("{}", num); + let t = std::str::from_utf8(&buffer).unwrap(); + println!("{:?}", std::str::from_utf8(&buffer)); + if num > 0 && t.contains("/app") { + break; + } + } -// // The basic redirection is working! -// assert!(response.status().is_redirection()); -// let location = response.headers().get("location").unwrap(); -// assert!(location.to_str().unwrap().contains("github")); + RunningServer { + server, + port, + dir: tmp_dir, + } +} -// // Act -// let response = client -// .get("http://localhost:8080/admin/login/") -// .send() -// .await -// .expect("Failed to execute request."); +#[actix_rt::test] +async fn test_web_paths() { + let mut server = run_server().await; -// // The Loginpage is reachable and contains a password field! -// assert!(response.status().is_success()); -// let content = response.text().await.unwrap(); -// assert!( -// content.contains(r#""#), -// "No Logout Button was found on /admin/index/!" -// ); + // // Act + // let formdata = &[("username", "test"), ("password", "testpw")]; + // let response = client + // .post(login_url) + // .form(formdata) + // .send() + // .await + // .expect("Failed to execute request."); -// // Act title=haupt&target=http%3A%2F%2Fdas.geht%2Fjetzt%2F&code=tpuah -// let formdata = &[ -// ("title", "haupt"), -// ("target", "https://das.geht/jetzt/"), -// ("code", "tpuah"), -// ]; -// let response = client -// .post("http://localhost:8080/admin/submit/") -// .form(formdata) -// .send() -// .await -// .expect("Failed to execute request."); + // // It is possible to login + // assert!(response.status().is_redirection()); + // let location = response.headers().get("location").unwrap(); + // assert_eq!("/admin/index/", location.to_str().unwrap()); + // assert!( + // response.headers().get("set-cookie").is_some(), + // "A auth cookie is not set even though authentication succeeds" + // ); -// // It is possible to login -// assert!(response.status().is_redirection()); -// let location = response.headers().get("location").unwrap(); -// assert_eq!("/admin/view/link/tpuah", location.to_str().unwrap()); + // // After login this should return a redirect + // let response = client + // .get("http://localhost:8080/admin/login/") + // .send() + // .await + // .expect("Failed to execute request."); -// // Act -// let response = client -// .get("http://localhost:8080/tpuah") -// .send() -// .await -// .expect("Failed to execute request."); + // // The Loginpage redirects to link index when logged in + // assert!( + // response.status().is_redirection(), + // "/admin/login/ is not redirecting correctly when logged in!" + // ); + // let location = response.headers().get("location").unwrap(); + // assert_eq!("/admin/index/", location.to_str().unwrap()); -// // The basic redirection is working! -// assert!(response.status().is_redirection()); -// let location = response.headers().get("location").unwrap(); -// assert!(location -// .to_str() -// .unwrap() -// .contains("https://das.geht/jetzt/")); -// } + // // After login this should return a redirect + // let response = client + // .get("http://localhost:8080/admin/index/") + // .send() + // .await + // .expect("Failed to execute request."); + + // // The Loginpage redirects to link index when logged in + // assert!( + // response.status().is_success(), + // "Could not access /admin/index/" + // ); + // let content = response.text().await.unwrap(); + // assert!( + // content.contains(r#""#), + // "No Logout Button was found on /admin/index/!" + // ); + + // // Act title=haupt&target=http%3A%2F%2Fdas.geht%2Fjetzt%2F&code=tpuah + // let formdata = &[ + // ("title", "haupt"), + // ("target", "https://das.geht/jetzt/"), + // ("code", "tpuah"), + // ]; + // let response = client + // .post("http://localhost:8080/admin/submit/") + // .form(formdata) + // .send() + // .await + // .expect("Failed to execute request."); + + // // It is possible to login + // assert!(response.status().is_redirection()); + // let location = response.headers().get("location").unwrap(); + // assert_eq!("/admin/view/link/tpuah", location.to_str().unwrap()); + + // // Act + // let response = client + // .get("http://localhost:8080/tpuah") + // .send() + // .await + // .expect("Failed to execute request."); + + // // The basic redirection is working! + // assert!(response.status().is_redirection()); + // let location = response.headers().get("location").unwrap(); + // assert!(location + // .to_str() + // .unwrap() + // .contains("https://das.geht/jetzt/")); + + drop(server); +}