diff --git a/Cargo.lock b/Cargo.lock index 35693e6..48ac346 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,6 +165,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "dissimilar" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d" + [[package]] name = "errno" version = "0.2.8" @@ -186,6 +192,16 @@ dependencies = [ "libc", ] +[[package]] +name = "expect-test" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0be0a561335815e06dab7c62e50353134c796e7a6155402a64bcff66b6a5e0" +dependencies = [ + "dissimilar", + "once_cell", +] + [[package]] name = "fnv" version = "1.0.7" @@ -339,9 +355,11 @@ name = "nix-editor" version = "0.3.0" dependencies = [ "clap 4.1.4", + "expect-test", "nixpkgs-fmt", "owo-colors", "rnix 0.11.0", + "serde_json", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 66a3874..f39b2b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,16 +6,16 @@ license = "MIT" description = "Some functions to modify NixOS configuration files" repository = "https://github.com/vlinkz/nix-editor/" readme = "README.md" -include = [ - "src/*", - "Cargo.toml", - "LICENSE*", - "README.md", -] +include = ["src/*", "Cargo.toml", "LICENSE*", "README.md"] [dependencies] -clap = { version = "4.1", features = ["derive"] } +clap = { version = "4.1", features = ["derive"] } rnix = "0.11" owo-colors = "3.5" thiserror = "1.0" nixpkgs-fmt = "1.3" + +[dev-dependencies] +expect-test = "1.4.0" +# serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" diff --git a/src/lib.rs b/src/lib.rs index 9c2f74e..3c4f814 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,8 @@ pub mod parse; pub mod read; +#[cfg(test)] +mod tests; pub mod write; + #[cfg(test)] -mod tests; \ No newline at end of file +mod unit_test; diff --git a/src/unit_test.rs b/src/unit_test.rs new file mode 100644 index 0000000..25073a4 --- /dev/null +++ b/src/unit_test.rs @@ -0,0 +1,50 @@ +use crate::write::write; +use expect_test::expect_file; +use std::{ffi::OsStr, fs, path::PathBuf}; + +fn dir_tests(dir: &str, get_actual: F) +where + F: Fn(String, Vec) -> String, +{ + let base_path: PathBuf = [env!("CARGO_MANIFEST_DIR"), "test_data", dir] + .iter() + .collect(); + let tests = base_path.read_dir().unwrap(); + for test_case in tests { + let case_folder = test_case.unwrap().path(); + let entries = base_path.join(&case_folder).read_dir().unwrap(); + + for entry in entries { + let path = entry.unwrap().path(); + + if path.extension() != Some(OsStr::new("nix")) { + continue; + } + + println!("testing: {}", path.display()); + + let mut code = fs::read_to_string(&path).unwrap(); + if code.ends_with('\n') { + code.truncate(code.len() - 1); + } + let args_path = path.with_extension("args"); + let args_raw = fs::read_to_string(&args_path).unwrap(); + let args: Vec = serde_json::from_str(&args_raw).unwrap(); + + let actual = get_actual(code, args); + expect_file![path.with_extension("expect")].assert_eq(&actual); + } + } +} + +#[test] +fn write_dir_tests() { + dir_tests("write", |code: String, args| { + let actual = match write(&code, &args[0], &args[1]) { + Ok(s) => s, + Err(_) => panic!("Failed to write to file"), + }; + + actual + }) +} diff --git a/test_data/write/attrs/empty_attrs.args b/test_data/write/attrs/empty_attrs.args new file mode 100644 index 0000000..eedbc2d --- /dev/null +++ b/test_data/write/attrs/empty_attrs.args @@ -0,0 +1 @@ +["a","1"] \ No newline at end of file diff --git a/test_data/write/attrs/empty_attrs.expect b/test_data/write/attrs/empty_attrs.expect new file mode 100644 index 0000000..1f321dc --- /dev/null +++ b/test_data/write/attrs/empty_attrs.expect @@ -0,0 +1,3 @@ +{ + a = 1; +} \ No newline at end of file diff --git a/test_data/write/attrs/empty_attrs.nix b/test_data/write/attrs/empty_attrs.nix new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/test_data/write/attrs/empty_attrs.nix @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/test_data/write/attrs/existing_attrs.args b/test_data/write/attrs/existing_attrs.args new file mode 100644 index 0000000..eedbc2d --- /dev/null +++ b/test_data/write/attrs/existing_attrs.args @@ -0,0 +1 @@ +["a","1"] \ No newline at end of file diff --git a/test_data/write/attrs/existing_attrs.expect b/test_data/write/attrs/existing_attrs.expect new file mode 100644 index 0000000..a64be0a --- /dev/null +++ b/test_data/write/attrs/existing_attrs.expect @@ -0,0 +1,4 @@ +{ + b = 2; + a = 1; +} \ No newline at end of file diff --git a/test_data/write/attrs/existing_attrs.nix b/test_data/write/attrs/existing_attrs.nix new file mode 100644 index 0000000..dc9ba4d --- /dev/null +++ b/test_data/write/attrs/existing_attrs.nix @@ -0,0 +1,3 @@ +{ + b = 2; +} \ No newline at end of file diff --git a/test_data/write/attrs/nested_attrs.args b/test_data/write/attrs/nested_attrs.args new file mode 100644 index 0000000..49af70a --- /dev/null +++ b/test_data/write/attrs/nested_attrs.args @@ -0,0 +1 @@ +["a.b","{}"] \ No newline at end of file diff --git a/test_data/write/attrs/nested_attrs.expect b/test_data/write/attrs/nested_attrs.expect new file mode 100644 index 0000000..c94f96f --- /dev/null +++ b/test_data/write/attrs/nested_attrs.expect @@ -0,0 +1,3 @@ +{ + a.b = {}; +} \ No newline at end of file diff --git a/test_data/write/attrs/nested_attrs.nix b/test_data/write/attrs/nested_attrs.nix new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/test_data/write/attrs/nested_attrs.nix @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/test_data/write/func/empty_func.args b/test_data/write/func/empty_func.args new file mode 100644 index 0000000..eedbc2d --- /dev/null +++ b/test_data/write/func/empty_func.args @@ -0,0 +1 @@ +["a","1"] \ No newline at end of file diff --git a/test_data/write/func/empty_func.expect b/test_data/write/func/empty_func.expect new file mode 100644 index 0000000..4d4dfbb --- /dev/null +++ b/test_data/write/func/empty_func.expect @@ -0,0 +1,3 @@ +{lib, config, ...}:{ + a = 1; +} \ No newline at end of file diff --git a/test_data/write/func/empty_func.nix b/test_data/write/func/empty_func.nix new file mode 100644 index 0000000..0a63daf --- /dev/null +++ b/test_data/write/func/empty_func.nix @@ -0,0 +1,2 @@ +{lib, config, ...}:{ +} \ No newline at end of file diff --git a/test_data/write/let_in/let.args b/test_data/write/let_in/let.args new file mode 100644 index 0000000..eedbc2d --- /dev/null +++ b/test_data/write/let_in/let.args @@ -0,0 +1 @@ +["a","1"] \ No newline at end of file diff --git a/test_data/write/let_in/let.expect b/test_data/write/let_in/let.expect new file mode 100644 index 0000000..c5b7e69 --- /dev/null +++ b/test_data/write/let_in/let.expect @@ -0,0 +1,5 @@ +let + res = { + a = 1; + }; +in res \ No newline at end of file diff --git a/test_data/write/let_in/let.nix b/test_data/write/let_in/let.nix new file mode 100644 index 0000000..97568e4 --- /dev/null +++ b/test_data/write/let_in/let.nix @@ -0,0 +1,4 @@ +let + res = { + }; +in res \ No newline at end of file diff --git a/test_data/write/values/int.args b/test_data/write/values/int.args new file mode 100644 index 0000000..eedbc2d --- /dev/null +++ b/test_data/write/values/int.args @@ -0,0 +1 @@ +["a","1"] \ No newline at end of file diff --git a/test_data/write/values/int.expect b/test_data/write/values/int.expect new file mode 100644 index 0000000..1f321dc --- /dev/null +++ b/test_data/write/values/int.expect @@ -0,0 +1,3 @@ +{ + a = 1; +} \ No newline at end of file diff --git a/test_data/write/values/int.nix b/test_data/write/values/int.nix new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/test_data/write/values/int.nix @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file