main-spex 0.21.0

AI-first development framework that turns specifications into deterministic, verifiable code
#[cfg(test)]
mod tests {
    use super::super::*;
    use tempfile::tempdir;

    fn config(path: &str) -> PackageEntry {
        serde_yaml_ng::from_str(&format!(
            "package_name: demo-api\npackage_short_name: api\npath: {path}\ncontracts:\n  - path: contracts/api.yaml\n    description: REST API\n"
        ))
        .expect("parse package config")
    }

    #[test]
    fn from_config_resolves_package_and_contract_paths_against_the_spex_dir() {
        let spex_dir = Path::new("/project/demo-spex");

        let package = Package::from_config(config("../demo-api"), spex_dir);

        assert_eq!(package.path, Path::new("/project/demo-api"));
        assert_eq!(package.contracts, vec![spex_dir.join("contracts/api.yaml")]);
        assert_eq!(package.package_name, "demo-api");
        assert_eq!(package.package_short_name, "api");
    }

    #[test]
    fn from_config_resolves_a_parent_path_to_the_directory_holding_the_spex_dir() {
        let spex_dir = Path::new("/project/snake/spex");

        let package = Package::from_config(config(".."), spex_dir);

        assert_eq!(package.path, Path::new("/project/snake"));
        assert!(!package.is_spex_dir);
    }

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

        assert!(Package::from_config(config("."), dir.path()).is_spex_dir);
        assert!(!Package::from_config(config("../elsewhere"), dir.path()).is_spex_dir);
    }

    #[test]
    fn matches_any_package_name_accepts_the_name_and_the_short_name() {
        let package = Package::from_config(config("."), Path::new("/spex"));

        assert!(package.matches_any_package_name("demo-api"));
        assert!(package.matches_any_package_name("api"));
        assert!(!package.matches_any_package_name("web"));
    }
}