main-spex 0.26.0

AI-first development framework that turns specifications into verified code
#[cfg(test)]
mod tests {
    use super::super::*;
    use crate::commands::check::fixtures::scoped_file;
    use crate::support::testing;
    use tempfile::tempdir;

    #[test]
    fn provided_files_resolves_existing_relative_paths() {
        let dir = tempdir().expect("temp dir");
        scoped_file(&dir, "src/api/main.rs", "");
        scoped_file(&dir, "README.md", "");

        let files = vec![
            "src/api/main.rs".to_string(),
            "./README.md".to_string(),
            "missing.rs".to_string(),
        ];
        let resolved = ScopedFile::provided(dir.path(), &files);
        let names: Vec<&Path> = resolved.iter().map(|file| file.rel.as_path()).collect();

        assert_eq!(
            names,
            vec![Path::new("src/api/main.rs"), Path::new("README.md")]
        );
    }

    fn package_excluding(dir: &tempfile::TempDir, patterns: &[&str]) -> Package {
        Package {
            path: dir.path().to_path_buf(),
            exclude: patterns.iter().map(ToString::to_string).collect(),
            ..testing::package("api", "api")
        }
    }

    fn rel_names(files: &[ScopedFile]) -> Vec<&Path> {
        files.iter().map(|file| file.rel.as_path()).collect()
    }

    #[test]
    fn collect_skips_the_files_and_folders_the_package_excludes() {
        let dir = tempdir().expect("temp dir");
        for file in [
            "src/main.rs",
            "src/models.generated.ts",
            "vendor/lib.js",
            "README.md",
        ] {
            scoped_file(&dir, file, "");
        }

        let files = ScopedFile::collect(&package_excluding(&dir, &["vendor", "**/*.generated.ts"]))
            .expect("collect");

        assert_eq!(
            rel_names(&files),
            vec![Path::new("README.md"), Path::new("src/main.rs")]
        );
    }

    #[test]
    fn collect_fails_naming_the_package_when_an_exclude_is_not_a_valid_glob() {
        let dir = tempdir().expect("temp dir");

        let error = ScopedFile::collect(&package_excluding(&dir, &["src/{a,b"]))
            .err()
            .expect("invalid exclude");

        let message = crate::error::describe(&error);
        assert!(message.contains("`api`"), "{message}");
        assert!(message.contains("src/{a,b"), "{message}");
    }

    #[test]
    fn provided_not_excluded_drops_listed_files_the_package_excludes() {
        let dir = tempdir().expect("temp dir");
        scoped_file(&dir, "src/main.rs", "");
        scoped_file(&dir, "vendor/lib.js", "");
        let files = vec!["src/main.rs".to_string(), "vendor/lib.js".to_string()];

        let resolved =
            ScopedFile::provided_not_excluded(&package_excluding(&dir, &["vendor/**"]), &files)
                .expect("provided");

        assert_eq!(rel_names(&resolved), vec![Path::new("src/main.rs")]);
    }
}