puppetfile 0.2.2

Puppetfile parser
use super::{Puppetfile, Module, ModuleInfo};
use semver::{self, VersionReq};

#[test]
fn empty_file() {
    let puppetfile = Puppetfile::parse(r##"forge "https://forge.puppetlabs.com""##);
    assert!(puppetfile.is_ok());
    let parsed = puppetfile.unwrap();
    assert_eq!("https://forge.puppetlabs.com", parsed.forge);
    let expected: Vec<Module> = vec![];
    assert_eq!(expected, parsed.modules);
}

#[test]
fn no_version() {
    let puppetfile = Puppetfile::parse(r##"forge "https://forge.puppetlabs.com"

mod 'mayflower/php'
    "##);
    assert!(puppetfile.is_ok());

    let parsed = puppetfile.unwrap();
    assert_eq!("https://forge.puppetlabs.com", parsed.forge);
    assert_eq!(Module {
                   name: "mayflower/php".to_string(),
                   info: vec![],
               },
               parsed.modules[0]);
}

#[test]
fn git_version() {
    let puppetfile = Puppetfile::parse(r##"forge "https://forge.puppetlabs.com"

mod 'mayflower/php', '1.0.1'
    "##);
    assert!(puppetfile.is_ok());

    let parsed = puppetfile.unwrap();
    assert_eq!("https://forge.puppetlabs.com", parsed.forge);
    assert_eq!(Module {
                   name: "mayflower/php".to_string(),
                   info: vec![ModuleInfo::Version(VersionReq::parse("= 1.0.1").unwrap())],
               },
               parsed.modules[0]);
}

#[test]
fn version() {
    let puppetfile = Puppetfile::parse(r##"forge "https://forge.puppetlabs.com"

mod 'mayflower/php',
:git => 'git://github.com/Mayflower/puppet-php.git'
    "##);
    assert!(puppetfile.is_ok());

    let parsed = puppetfile.unwrap();
    assert_eq!("https://forge.puppetlabs.com", parsed.forge);
    assert_eq!(Module {
                   name: "mayflower/php".to_string(),
                   info: vec![ModuleInfo::Info("git".to_string(),
                                               "git://github.com/Mayflower/puppet-php.git"
                                                   .to_string())],
               },
               parsed.modules[0]);
}

#[test]
fn format() {
    let version = ModuleInfo::Version(VersionReq::parse("= 1.0.0").unwrap());
    assert_eq!("= 1.0.0".to_string(), format!("{}", version));

    let mod_info = ModuleInfo::Info("git".to_string(),
                                    "git://github.com/Mayflower/puppet-php.git".to_string());
    assert_eq!(":git => 'git://github.com/Mayflower/puppet-php.git'",
               format!("{}", mod_info));

    let module = Module {
        name: "mayflower/php".to_string(),
        info: vec![version, mod_info],
    };
    assert_eq!("mod 'mayflower/php', '= 1.0.0',
  :git => \
                'git://github.com/Mayflower/puppet-php.git'",
               format!("{}", module));

    let puppetfile = Puppetfile {
        forge: "https://forge.puppetlabs.com".to_string(),
        modules: vec![module],
    };
    assert_eq!("forge 'https://forge.puppetlabs.com'


mod 'mayflower/php', '= 1.0.0',
  :git => \
                'git://github.com/Mayflower/puppet-php.git'
",
               format!("{}", puppetfile));
}

#[test]
fn version_url() {
    let module = Module {
        name: "mayflower/php".to_string(),
        info: vec![],
    };
    assert_eq!("https://forge.puppetlabs.com/users/mayflower/modules/php/releases/find.json"
                   .to_string(),
               module.version_url("https://forge.puppetlabs.com/").unwrap())
}

#[test]
fn user_name_pair() {
    let module = Module {
        name: "mayflower/php".to_string(),
        info: vec![],
    };
    assert_eq!(module.user_name_pair(), Some(("mayflower", "php")))
}

#[test]
fn forge_version() {
    let module = Module {
        name: "puppetlabs/nginx".to_string(),
        info: vec![],
    };
    assert_eq!(module.forge_version(&"https://forge.puppetlabs.com/".to_string()).unwrap(),
               semver::Version::parse("99.99.99").unwrap())
}