cargo-sync-rdme 0.8.0

Cargo subcommand to synchronize README with crate documentation
//! Integration test to ensure that package selection arguments work as expected.

use rstest::rstest;
use similar_asserts::assert_eq;
use test_helper::{self as helper, Workspace};

#[rstest]
#[case("workspace", "", &[], &["root"])]
#[case("workspace", "", &["--workspace"], &["pkg-a", "pkg-b", "root"])]
#[case("workspace", "", &["-p", "pkg-a", "-p", "pkg-b"], &["pkg-a", "pkg-b"])]
#[case("workspace", "", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace", "pkg-a", &[], &["pkg-a"])]
#[case("workspace", "pkg-a", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace", "pkg-b", &[], &["pkg-b"])]
#[case("workspace", "pkg-b/src", &[], &["pkg-b"])]
#[case("workspace", "pkg-b/src", &["--manifest-path", "../../Cargo.toml"], &["root"])]
#[case("workspace", "pkg-b/src", &["-m", "../../Cargo.toml"], &["root"])]
#[case("workspace_default", "", &[], &["pkg-a"])]
#[case("workspace_default", "", &["--workspace"], &["pkg-a", "pkg-b", "root"])]
#[case("workspace_default", "", &["-p", "pkg-a", "-p", "pkg-b"], &["pkg-a", "pkg-b"])]
#[case("workspace_default", "", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace_default", "pkg-a", &[], &["pkg-a"])]
#[case("workspace_default", "pkg-a", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace_default", "pkg-b", &[], &["pkg-b"])]
#[case("workspace_default", "pkg-b/src", &[], &["pkg-b"])]
#[case("workspace_virtual", "", &[], &["pkg-a", "pkg-b"])]
#[case("workspace_virtual", "", &["--workspace"], &["pkg-a", "pkg-b"])]
#[case("workspace_virtual", "", &["-p", "pkg-a", "-p", "pkg-b"], &["pkg-a", "pkg-b"])]
#[case("workspace_virtual", "", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace_virtual", "pkg-a", &[], &["pkg-a"])]
#[case("workspace_virtual", "pkg-a", &["-p", "pkg-b"], &["pkg-b"])]
#[case("workspace_virtual", "pkg-b", &[], &["pkg-b"])]
#[case("workspace_virtual", "pkg-b/src", &[], &["pkg-b"])]
fn select_target_packages_by_flags(
    #[case] fixture_name: &str,
    #[case] cwd: &str,
    #[case] flags: &[&str],
    #[case] expected: &[&str],
) {
    let workspace = Workspace::from_fixture(fixture_name);

    workspace
        .cargo_sync_rdme_default()
        .args(flags)
        .current_dir(cwd)
        .assert()
        .success();

    let mut updated = workspace
        .metadata()
        .workspace_packages()
        .into_iter()
        .filter(|pkg| {
            let readme = pkg.readme().unwrap();
            eprintln!("{}", pkg.name);
            eprintln!("{}", std::fs::read_to_string(&readme).unwrap());
            match helper::collect_list_item_from_markdown_file(&readme).as_slice() {
                [s] if s.trim() == "UPDATED" => true,
                [s] if s.trim() == "NOT_UPDATED" => false,
                items => panic!("Unexpected content `{items:?}` in README: {readme:?}"),
            }
        })
        .map(|pkg| pkg.name.as_ref())
        .collect::<Vec<_>>();

    updated.sort_unstable();

    assert_eq!(updated, expected);
}