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 uuid::Uuid;

use crate::common::{self, TEST_TRANSITION};

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

    server.expect(
        "GetTransitionKindList",
        json!(null),
        json!({"transitionKinds": ["fade"]}),
    );

    client.list_kinds().await?;

    server.expect(
        "GetSceneTransitionList",
        json!(null),
        json!({
            "currentSceneTransitionName": "main",
            "currentSceneTransitionUuid": Uuid::new_v8([1; 16]),
            "currentSceneTransitionKind": "fade",
            "transitions": [{
                "transitionName": "main",
                "transitionUuid": Uuid::new_v8([1; 16]),
                "transitionKind": "fade",
                "transitionFixed": false,
                "transitionConfigurable": false,
            }],
        }),
    );

    client.list().await?;

    server.expect(
        "SetCurrentSceneTransition",
        json!({"transitionName": "OBWS-TEST-Transition"}),
        json!(null),
    );

    client.set_current(TEST_TRANSITION).await?;

    server.expect(
        "GetCurrentSceneTransition",
        json!(null),
        json!({
            "transitionName": "OBWS-TEST-Transition",
            "transitionUuid": Uuid::new_v8([1; 16]),
            "transitionKind": "fade",
            "transitionFixed": false,
            "transitionDuration": 1000,
            "transitionConfigurable": true,
            "transitionSettings": {},
        }),
    );

    let transition = client.current().await?;

    server.expect(
        "SetCurrentSceneTransitionDuration",
        json!({"transitionDuration": 500}),
        json!(null),
    );

    client
        .set_current_duration(transition.duration.unwrap() / 2)
        .await?;

    server.expect(
        "SetCurrentSceneTransitionSettings",
        json!({"transitionSettings": {}}),
        json!(null),
    );

    client
        .set_current_settings(transition.settings.unwrap(), None)
        .await?;

    server.expect(
        "GetCurrentSceneTransitionCursor",
        json!(null),
        json!({"transitionCursor": 0.1}),
    );

    client.current_cursor().await?;

    server.expect(
        "SetStudioModeEnabled",
        json!({"studioModeEnabled": true}),
        json!(null),
    );

    ui.set_studio_mode_enabled(true).await?;

    server.expect("TriggerStudioModeTransition", json!(null), json!(null));

    client.trigger().await?;

    server.expect("SetTBarPosition", json!({"position": 0.5}), json!(null));

    client.set_tbar_position(0.5, None).await?;

    server.expect(
        "SetStudioModeEnabled",
        json!({"studioModeEnabled": false}),
        json!(null),
    );

    ui.set_studio_mode_enabled(false).await?;

    server.stop().await
}