main-spex 0.25.0

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

    fn entry(rule_id: &str, check: &str, files: &[&str]) -> PreexistingError {
        PreexistingError {
            rule_id: rule_id.to_string(),
            check: check.to_string(),
            files: files.iter().map(|file| file.to_string()).collect(),
        }
    }

    #[test]
    fn set_check_ignore_creates_the_block_in_an_empty_file() {
        let out = set_check_ignore("", &[entry("X", "no-cyrillic", &["README.md"])]);

        assert_eq!(
            out,
            indoc! {"
                check_ignore:
                  - rule_id: X
                    check: no-cyrillic
                    files:
                      - README.md
            "}
        );
    }

    #[test]
    fn set_check_ignore_omits_files_for_a_whole_check_entry() {
        let out = set_check_ignore("", &[entry("X", "no-git-history-slop", &[])]);

        assert_eq!(
            out,
            indoc! {"
                check_ignore:
                  - rule_id: X
                    check: no-git-history-slop
            "}
        );
    }

    #[test]
    fn set_check_ignore_inserts_the_block_before_coverage_ignore() {
        let raw = indoc! {"
            coverage_ignore:
              - spec_id: place-order
                layer: impl
        "};

        let out = set_check_ignore(raw, &[entry("X", "no-cyrillic", &["README.md"])]);

        assert_eq!(
            out,
            indoc! {"
                check_ignore:
                  - rule_id: X
                    check: no-cyrillic
                    files:
                      - README.md
                coverage_ignore:
                  - spec_id: place-order
                    layer: impl
            "}
        );
    }

    #[test]
    fn set_check_ignore_replaces_an_existing_block_in_place_and_keeps_the_rest() {
        let raw = indoc! {"
            # owned by the api team
            check_ignore:
              - rule_id: X
                check: old-check
                files: [old.md]
              - rule_id: X
                check: other-old-check

            coverage_ignore:
              - spec_id: place-order
                layer: impl
        "};

        let out = set_check_ignore(raw, &[entry("X", "no-cyrillic", &["README.md"])]);

        assert_eq!(
            out,
            indoc! {"
                # owned by the api team
                check_ignore:
                  - rule_id: X
                    check: no-cyrillic
                    files:
                      - README.md

                coverage_ignore:
                  - spec_id: place-order
                    layer: impl
            "}
        );
    }

    #[test]
    fn set_check_ignore_replaces_a_block_whose_sequence_is_not_indented() {
        let raw = indoc! {"
            check_ignore:
            - rule_id: X
              check: old-check

              files: [old.md]
            coverage_ignore: []
        "};

        let out = set_check_ignore(raw, &[entry("X", "no-cyrillic", &[])]);

        assert_eq!(
            out,
            indoc! {"
                check_ignore:
                  - rule_id: X
                    check: no-cyrillic
                coverage_ignore: []
            "}
        );
    }

    #[test]
    fn set_check_ignore_drops_the_block_when_no_errors_are_left() {
        let raw = indoc! {"
            check_ignore:
              - rule_id: X
                check: old-check
            coverage_ignore:
              - spec_id: place-order
                layer: impl
        "};

        let out = set_check_ignore(raw, &[]);

        assert_eq!(
            out,
            indoc! {"
                coverage_ignore:
                  - spec_id: place-order
                    layer: impl
            "}
        );
    }

    #[test]
    fn set_check_ignore_empties_a_file_that_held_only_the_block() {
        let raw = indoc! {"
            check_ignore:
              - rule_id: X
                check: old-check
        "};

        assert_eq!(set_check_ignore(raw, &[]), "");
    }

    #[test]
    fn set_check_ignore_returns_the_file_as_is_when_there_is_nothing_to_write() {
        for raw in ["", "coverage_ignore: []", "coverage_ignore: []\n"] {
            assert_eq!(set_check_ignore(raw, &[]), raw);
        }
    }

    #[test]
    fn set_check_ignore_is_stable_when_run_again_on_its_own_output() {
        let entries = [entry("X", "no-cyrillic", &["README.md", "docs/intro.md"])];
        let once = set_check_ignore("coverage_ignore: []\n", &entries);

        assert_eq!(set_check_ignore(&once, &entries), once);
    }
}