cargo-wsinit 0.1.4

Initializes or updates a cargo workspace Cargo.toml file.
Documentation
mod test_utils;

#[cfg(test)]
mod tests {
    use crate::test_utils::*;
    use cargo_wsinit::*;

    #[test]
    fn create_a_new_toml_file() {
        let test_root = ThreadTestPath::new_removed();

        let options = Options::new(test_root.to_str().unwrap(), FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");

        assert!(toml_file.exists());
    }

    #[test]
    fn create_a_new_toml_file_in_overwrite_mode() {
        let test_root = ThreadTestPath::new_removed();

        let options = Options::new(test_root.to_str().unwrap(), FileExistsBehaviour::Overwrite);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");

        assert!(toml_file.exists());
    }

    #[test]
    fn create_a_new_toml_file_in_update_mode() {
        let test_root = ThreadTestPath::new_removed();

        let options = Options::new(test_root.to_str().unwrap(), FileExistsBehaviour::Update);
        let toml_file_error = Workspace::new(options)
            .update_toml()
            .expect_err("Expect new file to not be made in update mode");

        match toml_file_error {
            Error::GenericCreationError(_) => {}
            _ => assert!(false, "Wrong error enum value"),
        }
    }

    #[test]
    fn a_second_toml_file_in_the_same_location_is_not_allowed_and_doesnt_change_file_contents() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        overwrite_file(&toml_file, "Manually edited");

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let second_toml_file_error = Workspace::new(options)
            .update_toml()
            .expect_err("Expect second file to not be created");

        match second_toml_file_error {
            Error::FileAlreadyExists => {}
            _ => assert!(false, "Wrong error enum value"),
        }

        assert!(toml_file.exists());

        let file_contents = read_file(&toml_file);

        assert_eq!("Manually edited", file_contents);
    }

    #[test]
    fn a_second_toml_file_in_the_same_location_is_allowed_with_overwrite_enabled() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        let options = Options::new(path, FileExistsBehaviour::Update);
        let second_toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");

        assert!(second_toml_file.exists());
    }

    #[test]
    fn update_an_existing_toml() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        overwrite_file(&toml_file, "a = [\"d\", \"e\", \"f\"] # comment");

        let options = Options::new(path, FileExistsBehaviour::Update);
        let second_toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect second file to be updated");

        assert!(second_toml_file.exists());

        let file_contents = read_file(&second_toml_file);

        assert_eq!(
            r#"a = ["d", "e", "f"] # comment

[workspace]
members = [
    # List your crates here, e.g:
    # \"my-lib\",
]
"#,
            file_contents
        );
    }

    #[test]
    fn cant_update_an_existing_bad_toml() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        overwrite_file(&toml_file, "bad toml!");

        let options = Options::new(path, FileExistsBehaviour::Update);
        let second_toml_file_error = Workspace::new(options)
            .update_toml()
            .expect_err("Expect file to not parse");

        match second_toml_file_error {
            Error::ParseError => {}
            _ => assert!(false, "Wrong error enum value"),
        }

        let file_contents = read_file(&toml_file);

        assert_eq!("bad toml!", file_contents);
    }

    #[test]
    fn overwrite_an_existing_toml_requiring_truncate() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        overwrite_file(
            &toml_file,
            r#"[workspace]

members = [
    # List your crates here, e.g:
    # \"my-lib\",
    # \"old-lib\",
    # \"old-lib2\",
]
"#,
        );

        let options = Options::new(path, FileExistsBehaviour::Overwrite);
        let second_toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect second file to be updated");

        assert!(second_toml_file.exists());

        let file_contents = read_file(&second_toml_file);

        assert_eq!(
            r#"[workspace]

members = [
    # List your crates here, e.g:
    # \"my-lib\",
]
"#,
            file_contents
        );
    }

    #[test]
    fn can_overwrite_an_existing_bad_toml() {
        let test_root = ThreadTestPath::new_removed();
        let path = test_root.to_str().unwrap();

        let options = Options::new(path, FileExistsBehaviour::Halt);
        let toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect new file to be made without issue");
        assert!(toml_file.exists());

        overwrite_file(&toml_file, "bad toml!");

        let options = Options::new(path, FileExistsBehaviour::Overwrite);
        let second_toml_file = Workspace::new(options)
            .update_toml()
            .expect("Expect second file to be updated");

        assert!(second_toml_file.exists());

        let file_contents = read_file(&second_toml_file);

        assert_eq!(
            r#"[workspace]

members = [
    # List your crates here, e.g:
    # \"my-lib\",
]
"#,
            file_contents
        );
    }
}