Add integration tests for scene items

v5-api
Dominik Nakamura 2 years ago
parent b4a19218b2
commit 5f3edcd188
No known key found for this signature in database
GPG Key ID: E4C6A749B2491910

@ -12,6 +12,17 @@ impl<'a> Scenes<'a> {
self.client.send_message(RequestType::GetSceneList).await
}
/// Gets an array of all groups in OBS.
///
/// Groups in OBS are actually scenes, but renamed and modified. In obs-websocket, we treat them
/// as scenes where we can.
pub async fn get_group_list(&self) -> Result<Vec<String>> {
self.client
.send_message::<responses::Groups>(RequestType::GetGroupList)
.await
.map(|g| g.groups)
}
/// Gets the current program scene.
pub async fn get_current_program_scene(&self) -> Result<String> {
self.client

@ -277,7 +277,7 @@ pub enum Event {
/// Name of the scene the item was removed from.
scene_name: String,
/// Name of the underlying source (input/scene).
input_name: String,
source_name: String,
/// Numeric ID of the scene item.
scene_item_id: u64,
},

@ -501,6 +501,7 @@ pub(crate) enum RequestType<'a> {
// Scenes
// --------------------------------
GetSceneList,
GetGroupList,
GetCurrentProgramScene,
#[serde(rename_all = "camelCase")]
SetCurrentProgramScene {
@ -748,6 +749,27 @@ pub struct SceneItemTransform {
pub crop_bottom: Option<u32>,
}
impl From<crate::responses::SceneItemTransform> for SceneItemTransform {
fn from(t: crate::responses::SceneItemTransform) -> Self {
Self {
position_x: Some(t.position_x),
position_y: Some(t.position_y),
rotation: Some(t.rotation),
scale_x: Some(t.scale_x),
scale_y: Some(t.scale_y),
alignment: Some(t.alignment),
bounds_type: Some(t.bounds_type),
bounds_alignment: Some(t.bounds_alignment),
bounds_width: Some(t.bounds_width),
bounds_height: Some(t.bounds_height),
crop_left: Some(t.crop_left),
crop_right: Some(t.crop_right),
crop_top: Some(t.crop_top),
crop_bottom: Some(t.crop_bottom),
}
}
}
#[derive(Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetSceneItemEnabled<'a> {

@ -595,6 +595,14 @@ pub struct Scene {
pub scene_index: usize,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Groups {
/// Array of group names.
pub groups:Vec<String>
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CurrentProgramScene {

@ -16,6 +16,7 @@ pub const TEST_TEXT_2: &str = "OBWS-TEST-Text2";
pub const TEST_BROWSER: &str = "OBWS-TEST-Browser";
pub const TEST_BROWSER_RENAME: &str = "OBWS-TEST-Browser-Renamed";
pub const TEST_MEDIA: &str = "OBWS-TEST-Media";
pub const TEST_GROUP: &str = "OBWS-TEST-Group";
pub const INPUT_KIND_TEXT_FT2: &str = "text_ft2_source_v2";
pub const INPUT_KIND_BROWSER: &str = "browser_source";
pub const INPUT_KIND_VLC: &str = "vlc_source";
@ -62,6 +63,13 @@ async fn ensure_obs_setup(client: &Client) -> Result<()> {
TEST_SCENE_CREATE
);
let groups = client.scenes().get_group_list().await?;
ensure!(
groups.iter().map(String::as_str).any(is_required_group),
"group `{}` not found, required for scenes and scene items tests",
TEST_GROUP
);
let inputs = client.inputs().get_input_list(None).await?;
ensure!(
inputs.iter().any(is_required_text_input),
@ -144,6 +152,10 @@ fn is_created_scene(scene: &Scene) -> bool {
scene.scene_name == TEST_SCENE_CREATE
}
fn is_required_group(group: &str) -> bool {
group == TEST_GROUP
}
fn is_required_text_input(input: &Input) -> bool {
input.input_name == TEST_TEXT && is_text_input(input)
}

@ -7,6 +7,7 @@ mod inputs;
mod media_inputs;
mod outputs;
mod recording;
mod scene_items;
mod scenes;
mod sources;
mod streaming;

@ -0,0 +1,119 @@
use anyhow::Result;
use obws::{
common::BoundsType,
requests::{
CreateSceneItem, DuplicateSceneItem, SceneItemTransform, SetSceneItemEnabled,
SetSceneItemIndex, SetSceneItemLocked, SetSceneItemTransform,
},
};
use crate::common::{self, TEST_GROUP, TEST_SCENE, TEST_SCENE_2, TEST_TEXT};
#[tokio::test]
async fn scene_items() -> Result<()> {
let client = common::new_client().await?;
let client = client.scene_items();
client.get_scene_item_list(TEST_SCENE).await?;
client.get_group_scene_item_list(TEST_GROUP).await?;
let test_text_id = client.get_scene_item_id(TEST_SCENE, TEST_TEXT).await?;
let id = client
.duplicate_scene_item(DuplicateSceneItem {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
destination_scene_name: Some(TEST_SCENE_2),
})
.await?;
client.remove_scene_item(TEST_SCENE_2, id).await?;
let id = client
.create_scene_item(CreateSceneItem {
scene_name: TEST_SCENE_2,
source_name: TEST_TEXT,
scene_item_enabled: Some(true),
})
.await?;
client.remove_scene_item(TEST_SCENE_2, id).await?;
let transform = client
.get_scene_item_transform(TEST_SCENE, test_text_id)
.await?;
client
.set_scene_item_transform(SetSceneItemTransform {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_transform: SceneItemTransform {
bounds_type: Some(BoundsType::Stretch),
..SceneItemTransform::default()
},
})
.await?;
client
.set_scene_item_transform(SetSceneItemTransform {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_transform: SceneItemTransform {
bounds_type: Some(transform.bounds_type),
..SceneItemTransform::default()
},
})
.await?;
let enabled = client
.get_scene_item_enabled(TEST_SCENE, test_text_id)
.await?;
client
.set_scene_item_enabled(SetSceneItemEnabled {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_enabled: !enabled,
})
.await?;
client
.set_scene_item_enabled(SetSceneItemEnabled {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_enabled: enabled,
})
.await?;
let locked = client
.get_scene_item_locked(TEST_SCENE, test_text_id)
.await?;
client
.set_scene_item_locked(SetSceneItemLocked {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_locked: !locked,
})
.await?;
client
.set_scene_item_locked(SetSceneItemLocked {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_locked: locked,
})
.await?;
let index = client
.get_scene_item_index(TEST_SCENE, test_text_id)
.await?;
client
.set_scene_item_index(SetSceneItemIndex {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_index: 0,
})
.await?;
client
.set_scene_item_index(SetSceneItemIndex {
scene_name: TEST_SCENE,
scene_item_id: test_text_id,
scene_item_index: index,
})
.await?;
Ok(())
}

@ -11,6 +11,7 @@ async fn scenes() -> Result<()> {
general.set_studio_mode_enabled(true).await?;
let scenes = client.get_scene_list().await?.scenes;
client.get_group_list().await?;
let current = client.get_current_program_scene().await?;
let other = &scenes

Loading…
Cancel
Save