git-meta-cli 0.1.0

Command-line tool for structured Git metadata (get/set, serialize, materialize, push/pull). Installs the `git-meta` binary.
use predicates::prelude::*;

use crate::harness::{self, commit_target, setup_repo};

#[test]
fn list_push() {
    let (dir, sha) = setup_repo();
    let target = commit_target(&sha);

    harness::git_meta(dir.path())
        .args(["list:push", &target, "tags", "first"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["list:push", &target, "tags", "second"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["get", &target, "tags"])
        .assert()
        .success()
        .stdout(predicate::str::contains("first"))
        .stdout(predicate::str::contains("second"));
}

#[test]
fn list_push_converts_string_to_list() {
    let (dir, sha) = setup_repo();
    let target = commit_target(&sha);

    harness::git_meta(dir.path())
        .args(["set", &target, "note", "original"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["list:push", &target, "note", "appended"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["get", &target, "note"])
        .assert()
        .success()
        .stdout(predicate::str::contains("original"))
        .stdout(predicate::str::contains("appended"));
}

#[test]
fn list_pop() {
    let (dir, sha) = setup_repo();
    let target = commit_target(&sha);

    harness::git_meta(dir.path())
        .args(["list:push", &target, "tags", "a"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["list:push", &target, "tags", "b"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["list:pop", &target, "tags", "b"])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["get", &target, "tags"])
        .assert()
        .success()
        .stdout(predicate::str::contains("a"))
        .stdout(predicate::str::contains("b").not());
}

#[test]
fn set_list_type() {
    let (dir, sha) = setup_repo();
    let target = commit_target(&sha);

    harness::git_meta(dir.path())
        .args([
            "set",
            "-t",
            "list",
            &target,
            "items",
            r#"["hello","world"]"#,
        ])
        .assert()
        .success();

    harness::git_meta(dir.path())
        .args(["get", &target, "items"])
        .assert()
        .success()
        .stdout(predicate::str::contains("hello"))
        .stdout(predicate::str::contains("world"));
}