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-quick-setup.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-quick-setup.el')
| -rw-r--r-- | tests/test-video-audio-recording-quick-setup.el | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/tests/test-video-audio-recording-quick-setup.el b/tests/test-video-audio-recording-quick-setup.el new file mode 100644 index 00000000..8b46b9b0 --- /dev/null +++ b/tests/test-video-audio-recording-quick-setup.el @@ -0,0 +1,172 @@ +;;; test-video-audio-recording-quick-setup.el --- Tests for cj/recording-quick-setup -*- lexical-binding: t; -*- + +;;; Commentary: +;; Unit tests for cj/recording-quick-setup function. +;; The quick setup shows available mics and auto-selects the default +;; sink's monitor for system audio capture. + +;;; Code: + +(require 'ert) + +;; Stub dependencies before loading the module +(defvar cj/custom-keymap (make-sparse-keymap) + "Stub keymap for testing.") + +;; Now load the actual production module +(require 'video-audio-recording) + +;;; Setup and Teardown + +(defun test-quick-setup-setup () + "Reset device variables before each test." + (setq cj/recording-mic-device nil) + (setq cj/recording-system-device nil)) + +(defun test-quick-setup-teardown () + "Clean up device variables after each test." + (setq cj/recording-mic-device nil) + (setq cj/recording-system-device nil)) + +;;; Normal Cases + +(ert-deftest test-video-audio-recording-quick-setup-normal-sets-mic-device () + "Test that selecting a mic sets cj/recording-mic-device." + (test-quick-setup-setup) + (unwind-protect + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("jabra-input" . "Jabra SPEAK 510 Mono") + ("builtin-input" . "Built-in Analog")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "jds-labs.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt table &rest _args) + (car (all-completions "" table))))) + (cj/recording-quick-setup) + (should (equal "jabra-input" cj/recording-mic-device))) + (test-quick-setup-teardown))) + +(ert-deftest test-video-audio-recording-quick-setup-normal-sets-system-to-default-monitor () + "Test that system device is set to the default sink's monitor." + (test-quick-setup-setup) + (unwind-protect + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("jabra-input" . "Jabra SPEAK 510 Mono")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "alsa_output.usb-JDS_Labs-00.analog-stereo.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt table &rest _args) + (car (all-completions "" table))))) + (cj/recording-quick-setup) + (should (equal "alsa_output.usb-JDS_Labs-00.analog-stereo.monitor" + cj/recording-system-device))) + (test-quick-setup-teardown))) + +(ert-deftest test-video-audio-recording-quick-setup-normal-presents-descriptions () + "Test that completing-read receives friendly descriptions and Cancel option." + (test-quick-setup-setup) + (unwind-protect + (let ((presented-candidates nil)) + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("raw-device-1" . "Jabra SPEAK 510 Mono") + ("raw-device-2" . "Built-in Analog")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "default.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt table &rest _args) + (setq presented-candidates (all-completions "" table)) + (car presented-candidates)))) + (cj/recording-quick-setup) + ;; Candidates should have friendly descriptions + (should (member "Jabra SPEAK 510 Mono" presented-candidates)) + (should (member "Built-in Analog" presented-candidates)) + ;; Cancel option should be present + (should (member "Cancel" presented-candidates)))) + (test-quick-setup-teardown))) + +(ert-deftest test-video-audio-recording-quick-setup-normal-confirmation-message () + "Test that confirmation message mentions the selected mic and monitor." + (test-quick-setup-setup) + (unwind-protect + (let ((message-text nil)) + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("jabra-input" . "Jabra SPEAK 510 Mono")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "jds-labs.analog-stereo.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt table &rest _args) + (car (all-completions "" table)))) + ((symbol-function 'message) + (lambda (fmt &rest args) + (setq message-text (apply #'format fmt args))))) + (cj/recording-quick-setup) + (should (string-match-p "Recording ready" message-text)) + (should (string-match-p "Jabra SPEAK 510 Mono" message-text)) + (should (string-match-p "default output monitor" message-text)))) + (test-quick-setup-teardown))) + +;;; Boundary Cases + +(ert-deftest test-video-audio-recording-quick-setup-boundary-single-mic () + "Test that with only one mic, it still presents selection." + (test-quick-setup-setup) + (unwind-protect + (let ((read-called nil)) + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("sole-mic" . "Only Mic Available")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "default.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt table &rest _args) + (setq read-called t) + (car (all-completions "" table))))) + (cj/recording-quick-setup) + (should read-called) + (should (equal "sole-mic" cj/recording-mic-device)))) + (test-quick-setup-teardown))) + +;;; Error Cases + +(ert-deftest test-video-audio-recording-quick-setup-error-cancel-selected () + "Test that selecting Cancel signals user-error and does not set devices." + (test-quick-setup-setup) + (unwind-protect + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () '(("jabra-input" . "Jabra SPEAK 510 Mono")))) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "default.monitor")) + ((symbol-function 'completing-read) + (lambda (_prompt _choices &rest _args) + "Cancel"))) + (should-error (cj/recording-quick-setup) :type 'user-error) + (should (null cj/recording-mic-device)) + (should (null cj/recording-system-device))) + (test-quick-setup-teardown))) + +(ert-deftest test-video-audio-recording-quick-setup-error-no-mics () + "Test that function signals error when no mics are found." + (test-quick-setup-setup) + (unwind-protect + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () nil)) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "default.monitor"))) + (should-error (cj/recording-quick-setup) :type 'user-error)) + (test-quick-setup-teardown))) + +(ert-deftest test-video-audio-recording-quick-setup-error-no-mics-message () + "Test that error message mentions mic and unmuted." + (test-quick-setup-setup) + (unwind-protect + (cl-letf (((symbol-function 'cj/recording--get-available-mics) + (lambda () nil)) + ((symbol-function 'cj/recording--get-default-sink-monitor) + (lambda () "default.monitor"))) + (condition-case err + (cj/recording-quick-setup) + (user-error + (should (string-match-p "mic" (error-message-string err)))))) + (test-quick-setup-teardown))) + +(provide 'test-video-audio-recording-quick-setup) +;;; test-video-audio-recording-quick-setup.el ends here |
