diff --git a/Cargo.lock b/Cargo.lock index f97624d..7745c8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,18 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "clap" version = "4.5.20" @@ -113,6 +125,22 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "hashbrown" version = "0.15.0" @@ -147,6 +175,18 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "mcserver" version = "0.1.0" @@ -154,6 +194,7 @@ dependencies = [ "clap", "colored", "serde", + "tempfile", "toml", ] @@ -163,6 +204,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + [[package]] name = "proc-macro2" version = "1.0.88" @@ -181,6 +228,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "serde" version = "1.0.210" @@ -227,6 +287,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "toml" version = "0.8.19" @@ -291,6 +364,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index c592399..d34cebe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,5 @@ edition = "2021" clap = { version = "4.5.20", features = ["derive"] } colored = "2.1.0" serde = { version = "1.0.210", features = ["derive"] } +tempfile = "3.13.0" toml = "0.8.19" diff --git a/src/config.rs b/src/config.rs index 430985a..41a912e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -175,4 +175,135 @@ impl Config { url, } } -} \ No newline at end of file +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs::{self, File}; + use std::io::Write; + use tempfile::TempDir; + + // Helper function to create a project directory with a config.toml file inside + fn create_project_with_toml(project_name: &str, content: &str) -> TempDir { + let tmp_dir = TempDir::new().expect("Failed to create temp dir"); + let project_path = tmp_dir.path().join(project_name); + + // Create project directory + fs::create_dir_all(&project_path).expect("Failed to create project directory"); + + // Create the config.toml file + let file_path = project_path.join("config.toml"); + let mut file = File::create(&file_path).expect("Failed to create config.toml file"); + file.write_all(content.as_bytes()) + .expect("Failed to write to config.toml file"); + + tmp_dir + } + + #[test] + fn test_valid_toml() { + let toml_content = r#" + [mcserver] + project_name = "TestProject" + logfile = "mcserver.log" + tunnel = "playit" + java = "23" + + [server] + online_mode = true + version = "1.21" + server_type = "java" + category = "vanilla" + providor = "vanilla" + url = "https://example.com" + "#; + + // Create a temporary project directory with config.toml inside + let project_name = "my_project"; + let tmp_dir = create_project_with_toml(project_name, toml_content); + + // Test the Config::new method + let config = Config::new(project_name); + + assert_eq!(config.project_name, "TestProject"); + assert_eq!(config.logfile, "mcserver.log"); + assert_eq!(config.tunnel, "playit"); + assert_eq!(config.java, "23"); + + assert_eq!(config.online_mode, true); + assert_eq!(config.version, "1.21"); + assert_eq!(config.server_type, "java"); + assert_eq!(config.category, "vanilla"); + assert_eq!(config.providor, "vanilla"); + assert_eq!(config.url, "https://example.com"); + } + + #[test] + fn test_missing_mcserver_fields() { + let toml_content = r#" + [mcserver] + project_name = "TestProject" + + [server] + online_mode = true + version = "1.21" + server_type = "java" + category = "vanilla" + providor = "vanilla" + url = "https://example.com" + "#; + + // Create a temporary project directory with config.toml inside + let project_name = "my_project_missing_mcserver"; + let tmp_dir = create_project_with_toml(project_name, toml_content); + + let config = Config::new(project_name); + + assert_eq!(config.project_name, "TestProject"); + assert_eq!(config.logfile, "unknown"); // Missing field + assert_eq!(config.tunnel, "unknown"); // Missing field + assert_eq!(config.java, "unknown"); // Missing field + } + + #[test] + fn test_missing_server_fields() { + let toml_content = r#" + [mcserver] + project_name = "TestProject" + logfile = "mcserver.log" + tunnel = "playit" + java = "23" + + [server] + online_mode = true + "#; + + // Create a temporary project directory with config.toml inside + let project_name = "my_project_missing_server"; + let tmp_dir = create_project_with_toml(project_name, toml_content); + + let config = Config::new(project_name); + + assert_eq!(config.online_mode, true); + assert_eq!(config.version, "unknown"); // Missing field + assert_eq!(config.server_type, "unknown"); // Missing field + assert_eq!(config.category, "unknown"); // Missing field + assert_eq!(config.providor, "unknown"); // Missing field + assert_eq!(config.url, "unknown"); // Missing field + } + + #[test] + fn test_missing_both_sections() { + let toml_content = r#""#; // Empty content + + // Create a temporary project directory with empty config.toml inside + let project_name = "my_project_missing_both"; + let tmp_dir = create_project_with_toml(project_name, toml_content); + + let config = Config::new(project_name); + + assert_eq!(config.project_name, "unknown"); // Missing section + assert_eq!(config.online_mode, false); // Missing section + } +}