Compare commits

..

4 Commits

Author SHA1 Message Date
101c7552b2 ensure Mic/Aux is created as well as Desktop Audio
add option to read the OBS platform from env var
2025-07-29 06:54:23 +01:00
1c0ef025c1 add mac build to Taskfile 2025-07-24 00:15:53 +01:00
2b7b8e0bd5 set inputKind for each platform 2025-07-24 00:15:00 +01:00
040ece840c allow skip group tests
enable replay buffer in test setup()
create Desktop Audio input if it doesn't exist.
2025-07-21 14:33:00 +01:00
8 changed files with 106 additions and 29 deletions

View File

@@ -22,6 +22,7 @@ tasks:
cmds: cmds:
- task: build-windows - task: build-windows
- task: build-linux - task: build-linux
- task: build-macos
vet: vet:
desc: Vet the code desc: Vet the code
@@ -46,6 +47,12 @@ tasks:
- GOOS=linux GOARCH=amd64 go build -ldflags "-X 'main.version={{.VERSION}}'" -o {{.BIN_DIR}}/{{.PROGRAM}}_linux_amd64 - GOOS=linux GOARCH=amd64 go build -ldflags "-X 'main.version={{.VERSION}}'" -o {{.BIN_DIR}}/{{.PROGRAM}}_linux_amd64
internal: true internal: true
build-macos:
desc: Build the gobs-cli project for macOS
cmds:
- GOOS=darwin GOARCH=amd64 go build -ldflags "-X 'main.version={{.VERSION}}'" -o {{.BIN_DIR}}/{{.PROGRAM}}_darwin_amd64
internal: true
test: test:
desc: Run tests desc: Run tests
cmds: cmds:

View File

@@ -33,7 +33,7 @@ func TestFilterListScene(t *testing.T) {
context := newContext(client, &out, StyleConfig{}) context := newContext(client, &out, StyleConfig{})
cmd := &FilterListCmd{ cmd := &FilterListCmd{
SourceName: "gobs-test", SourceName: "gobs-test-scene",
} }
err := cmd.Run(context) err := cmd.Run(context)
if err != nil { if err != nil {

View File

@@ -2,11 +2,20 @@ package main
import ( import (
"bytes" "bytes"
"os"
"strings" "strings"
"testing" "testing"
) )
func skipIfSkipGroupTests(t *testing.T) {
if os.Getenv("GOBS_TEST_SKIP_GROUP_TESTS") != "" {
t.Skip("Skipping group tests due to GOBS_TEST_SKIP_GROUP_TESTS environment variable")
}
}
func TestGroupList(t *testing.T) { func TestGroupList(t *testing.T) {
skipIfSkipGroupTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()
@@ -26,6 +35,8 @@ func TestGroupList(t *testing.T) {
} }
func TestGroupShow(t *testing.T) { func TestGroupShow(t *testing.T) {
skipIfSkipGroupTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()
@@ -46,6 +57,8 @@ func TestGroupShow(t *testing.T) {
} }
func TestGroupToggle(t *testing.T) { func TestGroupToggle(t *testing.T) {
skipIfSkipGroupTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()
@@ -87,6 +100,8 @@ func TestGroupToggle(t *testing.T) {
} }
func TestGroupStatus(t *testing.T) { func TestGroupStatus(t *testing.T) {
skipIfSkipGroupTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()

View File

@@ -22,9 +22,8 @@ func TestInputList(t *testing.T) {
expectedInputs := []string{ expectedInputs := []string{
"Desktop Audio", "Desktop Audio",
"Mic/Aux", "Mic/Aux",
"Colour Source", "gobs-test-input",
"Colour Source 2", "gobs-test-input-2",
"Colour Source 3",
} }
output := out.String() output := out.String()
for _, input := range expectedInputs { for _, input := range expectedInputs {
@@ -52,9 +51,8 @@ func TestInputListFilterInput(t *testing.T) {
} }
expectedFilteredOut := []string{ expectedFilteredOut := []string{
"Desktop Audio", "Desktop Audio",
"Colour Source", "gobs-test-input",
"Colour Source 2", "gobs-test-input-2",
"Colour Source 3",
} }
for _, input := range expectedInputs { for _, input := range expectedInputs {
if !strings.Contains(out.String(), input) { if !strings.Contains(out.String(), input) {
@@ -86,9 +84,8 @@ func TestInputListFilterOutput(t *testing.T) {
} }
expectedFilteredOut := []string{ expectedFilteredOut := []string{
"Mic/Aux", "Mic/Aux",
"Colour Source", "gobs-test-input",
"Colour Source 2", "gobs-test-input-2",
"Colour Source 3",
} }
for _, input := range expectedInputs { for _, input := range expectedInputs {
if !strings.Contains(out.String(), input) { if !strings.Contains(out.String(), input) {
@@ -116,9 +113,8 @@ func TestInputListFilterColour(t *testing.T) {
} }
expectedInputs := []string{ expectedInputs := []string{
"Colour Source", "gobs-test-input",
"Colour Source 2", "gobs-test-input-2",
"Colour Source 3",
} }
for _, input := range expectedInputs { for _, input := range expectedInputs {
if !strings.Contains(out.String(), input) { if !strings.Contains(out.String(), input) {

View File

@@ -2,7 +2,9 @@ package main
import ( import (
"os" "os"
"runtime"
"testing" "testing"
"time"
"github.com/andreykaipov/goobs" "github.com/andreykaipov/goobs"
"github.com/andreykaipov/goobs/api/requests/config" "github.com/andreykaipov/goobs/api/requests/config"
@@ -62,13 +64,23 @@ func setup(client *goobs.Client) {
Key: os.Getenv("OBS_STREAM_KEY"), Key: os.Getenv("OBS_STREAM_KEY"),
})) }))
client.Config.SetCurrentSceneCollection(config.NewSetCurrentSceneCollectionParams(). client.Config.CreateProfile(config.NewCreateProfileParams().
WithSceneCollectionName("test-collection")) WithProfileName("gobs-test-profile"))
time.Sleep(100 * time.Millisecond) // Wait for the profile to be created
client.Config.SetProfileParameter(config.NewSetProfileParameterParams().
WithParameterCategory("SimpleOutput").
WithParameterName("RecRB").
WithParameterValue("true"))
// hack to ensure the Replay Buffer setting is applied
client.Config.SetCurrentProfile(config.NewSetCurrentProfileParams().
WithProfileName("Untitled"))
client.Config.SetCurrentProfile(config.NewSetCurrentProfileParams().
WithProfileName("gobs-test-profile"))
client.Scenes.CreateScene(scenes.NewCreateSceneParams(). client.Scenes.CreateScene(scenes.NewCreateSceneParams().
WithSceneName("gobs-test")) WithSceneName("gobs-test-scene"))
client.Inputs.CreateInput(inputs.NewCreateInputParams(). client.Inputs.CreateInput(inputs.NewCreateInputParams().
WithSceneName("gobs-test"). WithSceneName("gobs-test-scene").
WithInputName("gobs-test-input"). WithInputName("gobs-test-input").
WithInputKind("color_source_v3"). WithInputKind("color_source_v3").
WithInputSettings(map[string]any{ WithInputSettings(map[string]any{
@@ -79,7 +91,7 @@ func setup(client *goobs.Client) {
}). }).
WithSceneItemEnabled(true)) WithSceneItemEnabled(true))
client.Inputs.CreateInput(inputs.NewCreateInputParams(). client.Inputs.CreateInput(inputs.NewCreateInputParams().
WithSceneName("gobs-test"). WithSceneName("gobs-test-scene").
WithInputName("gobs-test-input-2"). WithInputName("gobs-test-input-2").
WithInputKind("color_source_v3"). WithInputKind("color_source_v3").
WithInputSettings(map[string]any{ WithInputSettings(map[string]any{
@@ -90,6 +102,37 @@ func setup(client *goobs.Client) {
}). }).
WithSceneItemEnabled(true)) WithSceneItemEnabled(true))
// ensure Desktop Audio input is created
desktopAudioKinds := map[string]string{
"windows": "wasapi_output_capture",
"linux": "pulse_output_capture",
"darwin": "coreaudio_output_capture",
}
platform := os.Getenv("GOBS_TEST_PLATFORM")
if platform == "" {
platform = runtime.GOOS
}
client.Inputs.CreateInput(inputs.NewCreateInputParams().
WithSceneName("gobs-test-scene").
WithInputName("Desktop Audio").
WithInputKind(desktopAudioKinds[platform]).
WithInputSettings(map[string]any{
"device_id": "default",
}))
// ensure Mic/Aux input is created
micKinds := map[string]string{
"windows": "wasapi_input_capture",
"linux": "pulse_input_capture",
"darwin": "coreaudio_input_capture",
}
client.Inputs.CreateInput(inputs.NewCreateInputParams().
WithSceneName("gobs-test-scene").
WithInputName("Mic/Aux").
WithInputKind(micKinds[platform]).
WithInputSettings(map[string]any{
"device_id": "default",
}))
// Create source filter on an audio input // Create source filter on an audio input
client.Filters.CreateSourceFilter(filters.NewCreateSourceFilterParams(). client.Filters.CreateSourceFilter(filters.NewCreateSourceFilterParams().
WithSourceName("Mic/Aux"). WithSourceName("Mic/Aux").
@@ -106,7 +149,7 @@ func setup(client *goobs.Client) {
// Create source filter on a scene // Create source filter on a scene
client.Filters.CreateSourceFilter(filters.NewCreateSourceFilterParams(). client.Filters.CreateSourceFilter(filters.NewCreateSourceFilterParams().
WithSourceName("gobs-test"). WithSourceName("gobs-test-scene").
WithFilterName("test_filter"). WithFilterName("test_filter").
WithFilterKind("luma_key_filter_v2"). WithFilterKind("luma_key_filter_v2").
WithFilterSettings(map[string]any{ WithFilterSettings(map[string]any{
@@ -115,18 +158,21 @@ func setup(client *goobs.Client) {
} }
func teardown(client *goobs.Client) { func teardown(client *goobs.Client) {
client.Config.RemoveProfile(config.NewRemoveProfileParams().
WithProfileName("gobs-test-profile"))
client.Filters.RemoveSourceFilter(filters.NewRemoveSourceFilterParams(). client.Filters.RemoveSourceFilter(filters.NewRemoveSourceFilterParams().
WithSourceName("Mic/Aux"). WithSourceName("Mic/Aux").
WithFilterName("test_filter")) WithFilterName("test_filter"))
client.Filters.RemoveSourceFilter(filters.NewRemoveSourceFilterParams(). client.Filters.RemoveSourceFilter(filters.NewRemoveSourceFilterParams().
WithSourceName("gobs-test"). WithSourceName("gobs-test-scene").
WithFilterName("test_filter")) WithFilterName("test_filter"))
client.Scenes.RemoveScene(scenes.NewRemoveSceneParams(). client.Scenes.RemoveScene(scenes.NewRemoveSceneParams().
WithSceneName("gobs-test")) WithSceneName("gobs-test-scene"))
client.Config.SetCurrentSceneCollection(config.NewSetCurrentSceneCollectionParams(). client.Config.SetCurrentSceneCollection(config.NewSetCurrentSceneCollectionParams().
WithSceneCollectionName("default")) WithSceneCollectionName("Untitled"))
client.Stream.StopStream() client.Stream.StopStream()
client.Record.StopRecord() client.Record.StopRecord()

View File

@@ -2,11 +2,20 @@ package main
import ( import (
"bytes" "bytes"
"os"
"strings" "strings"
"testing" "testing"
) )
func skipIfSkipReplayBufferTests(t *testing.T) {
if os.Getenv("GOBS_TEST_SKIP_REPLAYBUFFER_TESTS") != "" {
t.Skip("Skipping replay buffer tests due to GOBS_TEST_SKIP_REPLAYBUFFER_TESTS environment variable")
}
}
func TestReplayBufferStart(t *testing.T) { func TestReplayBufferStart(t *testing.T) {
skipIfSkipReplayBufferTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()
@@ -24,6 +33,8 @@ func TestReplayBufferStart(t *testing.T) {
} }
func TestReplayBufferStop(t *testing.T) { func TestReplayBufferStop(t *testing.T) {
skipIfSkipReplayBufferTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()
@@ -41,6 +52,8 @@ func TestReplayBufferStop(t *testing.T) {
} }
func TestReplayBufferToggle(t *testing.T) { func TestReplayBufferToggle(t *testing.T) {
skipIfSkipReplayBufferTests(t)
client, disconnect := getClient(t) client, disconnect := getClient(t)
defer disconnect() defer disconnect()

View File

@@ -17,8 +17,8 @@ func TestSceneList(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to list scenes: %v", err) t.Fatalf("Failed to list scenes: %v", err)
} }
if out.String() == "Current program scene: gobs-test\n" { if out.String() == "Current program scene: gobs-test-scene\n" {
t.Fatalf("Expected output to be 'Current program scene: gobs-test', got '%s'", out.String()) t.Fatalf("Expected output to be 'Current program scene: gobs-test-scene', got '%s'", out.String())
} }
} }
@@ -29,9 +29,9 @@ func TestSceneCurrent(t *testing.T) {
var out bytes.Buffer var out bytes.Buffer
context := newContext(client, &out, StyleConfig{}) context := newContext(client, &out, StyleConfig{})
// Set the current scene to "gobs-test" // Set the current scene to "gobs-test-scene"
cmdSwitch := &SceneSwitchCmd{ cmdSwitch := &SceneSwitchCmd{
NewScene: "gobs-test", NewScene: "gobs-test-scene",
} }
err := cmdSwitch.Run(context) err := cmdSwitch.Run(context)
if err != nil { if err != nil {
@@ -45,7 +45,7 @@ func TestSceneCurrent(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to get current scene: %v", err) t.Fatalf("Failed to get current scene: %v", err)
} }
if out.String() != "Current program scene: gobs-test\n" { if out.String() != "Current program scene: gobs-test-scene\n" {
t.Fatalf("Expected output to be 'Current program scene: gobs-test', got '%s'", out.String()) t.Fatalf("Expected output to be 'Current program scene: gobs-test-scene', got '%s'", out.String())
} }
} }

View File

@@ -14,7 +14,7 @@ func TestSceneItemList(t *testing.T) {
context := newContext(client, &out, StyleConfig{}) context := newContext(client, &out, StyleConfig{})
cmd := &SceneItemListCmd{ cmd := &SceneItemListCmd{
SceneName: "gobs-test", SceneName: "gobs-test-scene",
} }
err := cmd.Run(context) err := cmd.Run(context)
if err != nil { if err != nil {