diff options
| author | Craig Jennings <c@cjennings.net> | 2026-02-06 13:00:01 -0600 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-02-06 13:12:44 -0600 |
| commit | c603124f6487604baee5aab590e1432e99570ca8 (patch) | |
| tree | 85c8b3ac4dc0573b1aee4448c1ae7d2c21ce3225 /tests/test-video-audio-recording--get-available-mics.el | |
| parent | 25a2acb634212455abeb0a0c8fb1a97c3ece3a2c (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.el | 102 |
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 |
