embers-cli 0.1.0

Interactive terminal UI and automation CLI for the Embers terminal multiplexer.
use embers_test_support::{TestConnection, TestServer};

use crate::support::{run_cli, session_snapshot_by_name, stdout};

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn window_commands_round_trip_through_cli() {
    let server = TestServer::start().await.expect("start server");

    run_cli(&server, ["new-session", "alpha"]);
    let first = run_cli(
        &server,
        [
            "new-window",
            "-t",
            "alpha",
            "--title",
            "editor",
            "--",
            "/bin/sh",
        ],
    );
    assert_eq!(stdout(&first).trim(), "0\teditor");

    let second = run_cli(
        &server,
        [
            "new-window",
            "-t",
            "alpha",
            "--title",
            "logs",
            "--",
            "/bin/sh",
        ],
    );
    assert_eq!(stdout(&second).trim(), "1\tlogs");

    let listed = run_cli(&server, ["list-windows", "-t", "alpha"]);
    assert_eq!(stdout(&listed).trim(), "0\t0\teditor\n1\t1\tlogs");

    run_cli(&server, ["select-window", "-t", "alpha:editor"]);
    let listed = run_cli(&server, ["list-windows", "-t", "alpha"]);
    assert_eq!(stdout(&listed).trim(), "0\t1\teditor\n1\t0\tlogs");

    run_cli(&server, ["rename-window", "-t", "alpha:editor", "ops"]);
    let listed = run_cli(&server, ["list-windows", "-t", "alpha"]);
    assert_eq!(stdout(&listed).trim(), "0\t1\tops\n1\t0\tlogs");

    run_cli(&server, ["kill-window", "-t", "alpha:ops"]);

    let mut connection = TestConnection::connect(server.socket_path())
        .await
        .expect("connect protocol client");
    let snapshot = session_snapshot_by_name(&mut connection, "alpha").await;
    let root = snapshot
        .nodes
        .iter()
        .find(|node| node.id == snapshot.session.root_node_id)
        .expect("root node exists");
    if let Some(tabs) = root.tabs.as_ref() {
        assert_eq!(tabs.tabs.len(), 1);
        assert_eq!(tabs.tabs[0].title, "logs");
    } else {
        let buffer_id = root
            .buffer_view
            .as_ref()
            .expect("single remaining root window collapses to a buffer view")
            .buffer_id;
        let buffer = snapshot
            .buffers
            .iter()
            .find(|buffer| buffer.id == buffer_id)
            .expect("root buffer exists");
        assert_eq!(buffer.title, "logs");
    }

    server.shutdown().await.expect("shutdown server");
}