decon-spf 0.3.3

This is a simple tool that allows you to deconstruct an existing SPF record that might be retreived in a normal DNS TXT lookup. With version 0.2.0 you can now also construct a new Spf record.
Documentation
mod spf1 {
    use crate::spf::builder::Builder;
    use crate::SpfBuilder;

    #[test]
    fn make_v1() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        assert_eq!(spf.version(), "v=spf1");
    }
}

#[cfg(feature = "spf2")]
mod spf2 {
    use crate::{Builder, SpfBuilder};

    #[test]
    fn make_v2_pra() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v2_pra();
        assert_eq!(spf.version(), "spf2.0/pra");
        assert_eq!(spf.is_v2(), true);
        assert_eq!(spf.version(), "spf2.0/pra")
    }

    #[test]
    fn make_v2_mfrom() {
        let mut spf = SpfBuilder::<Builder>::new();
        spf.set_v2_mfrom();
        assert_eq!(spf.version(), "spf2.0/mfrom");
        assert_eq!(spf.is_v2(), true);
    }

    #[test]
    fn make_v2_mfrom_pra() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v2_mfrom_pra();
        assert_eq!(spf.version(), "spf2.0/mfrom,pra");
        assert_eq!(spf.is_v2(), true);
    }

    #[test]
    fn make_v2_pra_mfrom() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v2_pra_mfrom();
        assert_eq!(spf.version(), "spf2.0/pra,mfrom");
        assert_eq!(spf.is_v2(), true);
    }
}

#[allow(deprecated)]
mod build {
    use crate::spf::builder::Builder;
    use crate::spf::mechanism::{Mechanism, Qualifier};
    use crate::SpfBuilder;

    #[test]
    fn make_a_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::a(Qualifier::Pass));
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Fail));
        assert_eq!(spf.to_string(), "v=spf1 a -all".to_string());
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Pass));
        assert_eq!(spf.to_string(), "v=spf1 a all".to_string());
    }

    #[test]
    fn make_ip4_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "203.32.160.0/24".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Pass));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip4:203.32.160.0/24 all".to_string()
        );
    }

    #[test]
    fn make_ip4_x2_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "10.0.0.0/23".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "203.32.160.0/24".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Pass));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip4:10.0.0.0/23 ip4:203.32.160.0/24 all".to_string()
        );
    }

    #[test]
    fn make_ip6_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "2001:4860:4000::/36".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Pass));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip6:2001:4860:4000::/36 all".to_string()
        );
    }

    #[test]
    fn make_ip6_x2_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "2001:4860:4000::/36".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::ip(
            Qualifier::Pass,
            "2001:5160:4000::/36".parse().unwrap(),
        ));
        spf.append_mechanism(Mechanism::all_with_qualifier(Qualifier::Pass));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip6:2001:4860:4000::/36 ip6:2001:5160:4000::/36 all".to_string()
        );
    }

    #[test]
    fn make_ip4_by_append_ip_mechanism() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "10.0.0.0/23".parse().unwrap(),
        ));
        assert_eq!(spf.to_string(), "v=spf1 ip4:10.0.0.0/23".to_string());
    }

    #[test]
    fn make_ip4_x2_by_append_ip_mechanism() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "10.0.0.0/23".parse().unwrap(),
        ));
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "203.32.160.0/23".parse().unwrap(),
        ));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip4:10.0.0.0/23 ip4:203.32.160.0/23".to_string()
        );
    }

    #[test]
    fn make_ip6_by_append_ip_mechanism() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "2001:5160:4000::/36".parse().unwrap(),
        ));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip6:2001:5160:4000::/36".to_string()
        );
    }

    #[test]
    fn make_v1_a_mx_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.append_mechanism(Mechanism::a(Qualifier::Pass));
        spf.append_mechanism(Mechanism::mx(Qualifier::Pass));
        spf.append_mechanism(Mechanism::all());
        assert_eq!(spf.to_string(), "v=spf1 a mx -all".to_string());
    }

    #[test]
    fn make_v1_ip4_ip6() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "203.32.160.0/23".parse().unwrap(),
        ));
        spf.add_ip(Mechanism::ip(
            Qualifier::Pass,
            "2001:5160:4000::/36".parse().unwrap(),
        ));
        assert_eq!(
            spf.to_string(),
            "v=spf1 ip4:203.32.160.0/23 ip6:2001:5160:4000::/36".to_string()
        );
        let new_spf = spf.clone().build().unwrap();
        assert_eq!(new_spf.to_string(), spf.to_string());
    }
    #[test]
    fn b_to_redirect() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        let mut spf = spf.add_redirect(Mechanism::redirect(Qualifier::Pass, "test.com").unwrap());
        spf.add_mx(Mechanism::mx(Qualifier::Pass));
        let _spf = spf.build();
    }
    #[test]
    fn b_to_all() {
        let mut spf: SpfBuilder<Builder> = SpfBuilder::new();
        spf.set_v1();
        let mut spf = spf.add_all(Mechanism::all());
        spf.add_mx(Mechanism::mx(Qualifier::Pass));
        let _spf = spf.build();
    }
}