obws 0.15.0

The obws (obvious) remote control library for OBS.
Documentation
use anyhow::Result;
use serde_json::json;
use test_log::test;

use crate::common;

const OUTPUT_VIRTUALCAM: &str = "virtualcam_output";

#[test(tokio::test)]
async fn outputs() -> Result<()> {
    let (client, server) = common::new_client().await?;
    let client = client.outputs();

    server.expect("GetOutputList", json!(null), json!({"outputs": []}));

    client.list().await?;

    server.expect(
        "GetOutputStatus",
        json!({"outputName": "virtualcam_output"}),
        json!({
            "outputActive": true,
            "outputReconnecting": false,
            "outputTimecode": "12:30:45.678",
            "outputDuration": 50_000,
            "outputCongestion": 0,
            "outputBytes": 1024,
            "outputSkippedFrames": 0,
            "outputTotalFrames": 250,
        }),
    );

    client.status(OUTPUT_VIRTUALCAM).await?;

    server.expect(
        "ToggleOutput",
        json!({"outputName": "virtualcam_output"}),
        json!({"outputActive": false}),
    );

    client.toggle(OUTPUT_VIRTUALCAM).await?;

    server.expect(
        "StartOutput",
        json!({"outputName": "virtualcam_output"}),
        json!(null),
    );

    client.start(OUTPUT_VIRTUALCAM).await?;

    server.expect(
        "StopOutput",
        json!({"outputName": "virtualcam_output"}),
        json!(null),
    );

    client.stop(OUTPUT_VIRTUALCAM).await?;

    server.expect(
        "GetOutputSettings",
        json!({"outputName": "virtualcam_output"}),
        json!({"outputSettings": {}}),
    );

    let settings = client
        .settings::<serde_json::Value>(OUTPUT_VIRTUALCAM)
        .await?;

    server.expect(
        "SetOutputSettings",
        json!({
            "outputName": "virtualcam_output",
            "outputSettings": {},
        }),
        json!(null),
    );

    client.set_settings(OUTPUT_VIRTUALCAM, &settings).await?;

    server.stop().await
}