obws 0.15.0

The obws (obvious) remote control library for OBS.
Documentation
use anyhow::Result;
use obws::requests::scenes::SetTransitionOverride;
use serde_json::json;
use test_log::test;
use time::Duration;
use uuid::Uuid;

use crate::common::{self, TEST_SCENE, TEST_SCENE_CREATE, TEST_SCENE_RENAME, TEST_TRANSITION};

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

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

    ui.set_studio_mode_enabled(true).await?;

    server.expect(
        "GetSceneList",
        json!(null),
        json!({
            "currentProgramSceneName": "main",
            "currentProgramSceneUuid": Uuid::new_v8([1; 16]),
            "currentPreviewSceneName": "other",
            "currentPreviewSceneUuid": Uuid::new_v8([2; 16]),
            "scenes": [
                {
                    "sceneName": "main",
                    "sceneUuid":  Uuid::new_v8([1; 16]),
                    "sceneIndex": 0,
                },
                {
                    "sceneName": "other",
                    "sceneUuid": Uuid::new_v8([2; 16]),
                    "sceneIndex": 1,
                },
            ],
        }),
    );

    let scenes = client.list().await?.scenes;

    server.expect("GetGroupList", json!(null), json!({"groups": ["one"]}));

    client.list_groups().await?;

    server.expect(
        "GetCurrentProgramScene",
        json!(null),
        json!({
            "sceneName": "main",
            "sceneUuid": Uuid::new_v8([1; 16]),
        }),
    );

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

    server.expect(
        "SetCurrentProgramScene",
        json!({"sceneUuid": Uuid::new_v8([2; 16])}),
        json!(null),
    );

    let other = &scenes.iter().find(|s| s.id != current.id).unwrap().id;
    client.set_current_program_scene(other).await?;

    server.expect(
        "GetCurrentPreviewScene",
        json!(null),
        json!({
            "sceneName": "main",
            "sceneUuid": Uuid::new_v8([2; 16]),
        }),
    );

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

    server.expect(
        "SetCurrentPreviewScene",
        json!({"sceneUuid": Uuid::new_v8([1; 16])}),
        json!(null),
    );

    let other = &scenes.iter().find(|s| s.id != current.id).unwrap().id;
    client.set_current_preview_scene(other).await?;

    server.expect(
        "SetSceneName",
        json!({
            "sceneName": "OBWS-TEST-Scene",
            "newSceneName": "OBWS-TEST-Scene-Renamed",
        }),
        json!(null),
    );

    client
        .set_name(TEST_SCENE, TEST_SCENE_RENAME.as_name().unwrap())
        .await?;

    server.expect(
        "CreateScene",
        json!({"sceneName": "OBWS-TEST-Scene-Created"}),
        json!({"sceneUuid": Uuid::new_v8([3; 16])}),
    );

    client.create(TEST_SCENE_CREATE.as_name().unwrap()).await?;

    server.expect(
        "RemoveScene",
        json!({"sceneName": "OBWS-TEST-Scene-Created"}),
        json!(null),
    );

    client.remove(TEST_SCENE_CREATE).await?;

    server.expect(
        "GetSceneSceneTransitionOverride",
        json!({"sceneName": "OBWS-TEST-Scene"}),
        json!({
            "transitionName": "some-transition",
            "transitionDuration": 500,
        }),
    );

    client.transition_override(TEST_SCENE).await?;

    server.expect(
        "SetSceneSceneTransitionOverride",
        json!({
            "sceneName": "OBWS-TEST-Scene",
            "transitionName": "OBWS-TEST-Transition",
            "transitionDuration": 5000,
        }),
        json!(null),
    );

    client
        .set_transition_override(SetTransitionOverride {
            scene: TEST_SCENE,
            transition: Some(TEST_TRANSITION),
            duration: Some(Duration::seconds(5)),
        })
        .await?;

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

    ui.set_studio_mode_enabled(false).await?;

    server.stop().await
}