summaryrefslogtreecommitdiff
path: root/tests/test-video-audio-recording--get-available-mics.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-02-06 13:00:01 -0600
committerCraig Jennings <c@cjennings.net>2026-02-06 13:12:44 -0600
commitc603124f6487604baee5aab590e1432e99570ca8 (patch)
tree85c8b3ac4dc0573b1aee4448c1ae7d2c21ce3225 /tests/test-video-audio-recording--get-available-mics.el
parent25a2acb634212455abeb0a0c8fb1a97c3ece3a2c (diff)
feat(recording): rewrite device setup, fix video stop, update modeline icons
Video stop fix: kill wf-recorder (producer) first on Wayland so ffmpeg gets clean EOF, then signal process group. Replaces sit-for with poll-based wait-for-exit. Fixes zero-byte output files. Device selection: rewrite quick setup to show all available mics with PulseAudio descriptions, auto-detect default sink monitor for system audio. Skip confirmation dialog, add Cancel option to mic list. Modeline: replace red dot emoji with nerd font icons (mic/camcorder). Rename quick-setup-for-calls to quick-setup, rebind C-; r s / C-; r S. 173 recording tests pass (was 165).
Diffstat (limited to 'tests/test-video-audio-recording--get-available-mics.el')
-rw-r--r--tests/test-video-audio-recording--get-available-mics.el102
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/test-video-audio-recording--get-available-mics.el b/tests/test-video-audio-recording--get-available-mics.el
new file mode 100644
index 00000000..2fea0d7a
--- /dev/null
+++ b/tests/test-video-audio-recording--get-available-mics.el
@@ -0,0 +1,102 @@
+;;; test-video-audio-recording--get-available-mics.el --- Tests for mic discovery -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Unit tests for cj/recording--get-available-mics.
+;; Verifies that available microphones are discovered correctly:
+;; - Monitor sources are excluded (they capture output, not input)
+;; - Muted sources are excluded
+;; - Friendly descriptions from PulseAudio are used
+
+;;; Code:
+
+(require 'ert)
+
+;; Stub dependencies before loading the module
+(defvar cj/custom-keymap (make-sparse-keymap)
+ "Stub keymap for testing.")
+
+(require 'video-audio-recording)
+
+;;; Helper
+
+(defun test-mics--make-pactl-output (sources)
+ "Build fake `pactl list sources' output from SOURCES.
+Each source is (name description mute state)."
+ (mapconcat (lambda (src)
+ (format "Source #1\n\tState: %s\n\tName: %s\n\tDescription: %s\n\tMute: %s\n"
+ (nth 3 src) (nth 0 src) (nth 1 src) (nth 2 src)))
+ sources ""))
+
+;;; Normal Cases
+
+(ert-deftest test-video-audio-recording--get-available-mics-normal-filters-monitors ()
+ "Test that monitor sources are excluded from mic list."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("alsa_input.usb-Jabra.mono" "Jabra Mono" "no" "SUSPENDED")
+ ("alsa_output.usb-Jabra.monitor" "Monitor of Jabra" "no" "SUSPENDED"))))))
+ (let ((mics (cj/recording--get-available-mics)))
+ (should (= 1 (length mics)))
+ (should (equal "alsa_input.usb-Jabra.mono" (car (car mics)))))))
+
+(ert-deftest test-video-audio-recording--get-available-mics-normal-filters-muted ()
+ "Test that muted sources are excluded from mic list."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("active-mic" "Active Mic" "no" "SUSPENDED")
+ ("muted-mic" "Muted Mic" "yes" "SUSPENDED"))))))
+ (let ((mics (cj/recording--get-available-mics)))
+ (should (= 1 (length mics)))
+ (should (equal "active-mic" (car (car mics)))))))
+
+(ert-deftest test-video-audio-recording--get-available-mics-normal-uses-descriptions ()
+ "Test that friendly descriptions are returned as cdr."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("raw-device-name" "Friendly Device Name" "no" "IDLE"))))))
+ (let ((mics (cj/recording--get-available-mics)))
+ (should (equal "Friendly Device Name" (cdr (car mics)))))))
+
+(ert-deftest test-video-audio-recording--get-available-mics-normal-multiple-mics ()
+ "Test that multiple non-muted, non-monitor mics are returned."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("mic-a" "Jabra Mono" "no" "SUSPENDED")
+ ("mic-b" "Built-in" "no" "IDLE")
+ ("alsa_output.jabra.monitor" "Monitor of Jabra" "no" "SUSPENDED")
+ ("muted-mic" "Muted Mic" "yes" "SUSPENDED"))))))
+ (let ((mics (cj/recording--get-available-mics)))
+ (should (= 2 (length mics))))))
+
+;;; Boundary Cases
+
+(ert-deftest test-video-audio-recording--get-available-mics-boundary-empty-output ()
+ "Test that empty pactl output returns empty list."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd) "")))
+ (should (null (cj/recording--get-available-mics)))))
+
+(ert-deftest test-video-audio-recording--get-available-mics-boundary-all-monitors ()
+ "Test that if all sources are monitors, returns empty list."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("sink-a.monitor" "Monitor A" "no" "SUSPENDED")
+ ("sink-b.monitor" "Monitor B" "no" "SUSPENDED"))))))
+ (should (null (cj/recording--get-available-mics)))))
+
+(ert-deftest test-video-audio-recording--get-available-mics-boundary-all-muted ()
+ "Test that if all non-monitor sources are muted, returns empty list."
+ (cl-letf (((symbol-function 'shell-command-to-string)
+ (lambda (_cmd)
+ (test-mics--make-pactl-output
+ '(("muted-a" "Mic A" "yes" "SUSPENDED")
+ ("muted-b" "Mic B" "yes" "SUSPENDED"))))))
+ (should (null (cj/recording--get-available-mics)))))
+
+(provide 'test-video-audio-recording--get-available-mics)
+;;; test-video-audio-recording--get-available-mics.el ends here