summaryrefslogtreecommitdiff
path: root/tests/test-video-audio-recording-toggle-functions.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-11 17:43:34 -0600
committerCraig Jennings <c@cjennings.net>2025-11-11 17:43:34 -0600
commitb07f8fe248db0c9916eccbc249f24d7a9107a3ce (patch)
treef6336d009b589f1840fadac901bf2758563af9aa /tests/test-video-audio-recording-toggle-functions.el
parent23b3df60eb619351fada7b83c9646c86e1addbd2 (diff)
a/v recording: fix setup, add test functionality and indicatorlkg
Integrates a modeline indicator to display active recording status in Emacs. The indicator shows "🔴Audio", "🔴Video", or "🔴A+V" based on the active recording processes. Includes functions for starting and stopping audio/video recordings, with sentinel processes ensuring timely updates to the modeline. Also adds extensive integration tests to validate modeline synchronization.
Diffstat (limited to 'tests/test-video-audio-recording-toggle-functions.el')
-rw-r--r--tests/test-video-audio-recording-toggle-functions.el185
1 files changed, 185 insertions, 0 deletions
diff --git a/tests/test-video-audio-recording-toggle-functions.el b/tests/test-video-audio-recording-toggle-functions.el
new file mode 100644
index 00000000..2355ab4f
--- /dev/null
+++ b/tests/test-video-audio-recording-toggle-functions.el
@@ -0,0 +1,185 @@
+;;; test-video-audio-recording-toggle-functions.el --- Tests for toggle functions -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Unit tests for cj/video-recording-toggle and cj/audio-recording-toggle functions.
+;; Tests start/stop toggle behavior for recording processes.
+
+;;; Code:
+
+(require 'ert)
+
+;; Stub dependencies before loading the module
+(defvar cj/custom-keymap (make-sparse-keymap)
+ "Stub keymap for testing.")
+
+;; Stub directory variables
+(defvar video-recordings-dir "/tmp/video-recordings/")
+(defvar audio-recordings-dir "/tmp/audio-recordings/")
+
+;; Now load the actual production module
+(require 'video-audio-recording)
+
+;;; Setup and Teardown
+
+(defun test-toggle-setup ()
+ "Reset process variables before each test."
+ (setq cj/video-recording-ffmpeg-process nil)
+ (setq cj/audio-recording-ffmpeg-process nil)
+ (setq cj/recording-mic-device "test-mic")
+ (setq cj/recording-system-device "test-monitor"))
+
+(defun test-toggle-teardown ()
+ "Clean up process variables after each test."
+ (when cj/video-recording-ffmpeg-process
+ (ignore-errors (delete-process cj/video-recording-ffmpeg-process)))
+ (when cj/audio-recording-ffmpeg-process
+ (ignore-errors (delete-process cj/audio-recording-ffmpeg-process)))
+ (setq cj/video-recording-ffmpeg-process nil)
+ (setq cj/audio-recording-ffmpeg-process nil)
+ (setq cj/recording-mic-device nil)
+ (setq cj/recording-system-device nil))
+
+;;; Video Toggle - Normal Cases
+
+(ert-deftest test-video-audio-recording-video-toggle-normal-starts-when-not-recording ()
+ "Test that video toggle starts recording when not currently recording."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((start-called nil))
+ (cl-letf (((symbol-function 'cj/ffmpeg-record-video)
+ (lambda (_dir) (setq start-called t))))
+ (cj/video-recording-toggle nil)
+ (should start-called)))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-video-toggle-normal-stops-when-recording ()
+ "Test that video toggle stops recording when currently recording."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((stop-called nil)
+ (fake-process (make-process :name "test-video" :command '("sleep" "1000"))))
+ (setq cj/video-recording-ffmpeg-process fake-process)
+ (cl-letf (((symbol-function 'cj/video-recording-stop)
+ (lambda () (setq stop-called t))))
+ (cj/video-recording-toggle nil)
+ (should stop-called))
+ (ignore-errors (delete-process fake-process)))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-video-toggle-normal-uses-default-directory ()
+ "Test that video toggle uses default directory when no prefix arg."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((recorded-dir nil))
+ (cl-letf (((symbol-function 'cj/ffmpeg-record-video)
+ (lambda (dir) (setq recorded-dir dir))))
+ (cj/video-recording-toggle nil)
+ (should (equal video-recordings-dir recorded-dir))))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-video-toggle-normal-prompts-for-location-with-prefix ()
+ "Test that video toggle prompts for location with prefix arg."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((prompt-called nil)
+ (recorded-dir nil))
+ (cl-letf (((symbol-function 'read-directory-name)
+ (lambda (_prompt) (setq prompt-called t) "/custom/path/"))
+ ((symbol-function 'file-directory-p)
+ (lambda (_dir) t)) ; Directory exists
+ ((symbol-function 'cj/ffmpeg-record-video)
+ (lambda (dir) (setq recorded-dir dir))))
+ (cj/video-recording-toggle t)
+ (should prompt-called)
+ (should (equal "/custom/path/" recorded-dir))))
+ (test-toggle-teardown)))
+
+;;; Audio Toggle - Normal Cases
+
+(ert-deftest test-video-audio-recording-audio-toggle-normal-starts-when-not-recording ()
+ "Test that audio toggle starts recording when not currently recording."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((start-called nil))
+ (cl-letf (((symbol-function 'cj/ffmpeg-record-audio)
+ (lambda (_dir) (setq start-called t))))
+ (cj/audio-recording-toggle nil)
+ (should start-called)))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-audio-toggle-normal-stops-when-recording ()
+ "Test that audio toggle stops recording when currently recording."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((stop-called nil)
+ (fake-process (make-process :name "test-audio" :command '("sleep" "1000"))))
+ (setq cj/audio-recording-ffmpeg-process fake-process)
+ (cl-letf (((symbol-function 'cj/audio-recording-stop)
+ (lambda () (setq stop-called t))))
+ (cj/audio-recording-toggle nil)
+ (should stop-called))
+ (ignore-errors (delete-process fake-process)))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-audio-toggle-normal-uses-default-directory ()
+ "Test that audio toggle uses default directory when no prefix arg."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((recorded-dir nil))
+ (cl-letf (((symbol-function 'cj/ffmpeg-record-audio)
+ (lambda (dir) (setq recorded-dir dir))))
+ (cj/audio-recording-toggle nil)
+ (should (equal audio-recordings-dir recorded-dir))))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-audio-toggle-normal-prompts-for-location-with-prefix ()
+ "Test that audio toggle prompts for location with prefix arg."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((prompt-called nil)
+ (recorded-dir nil))
+ (cl-letf (((symbol-function 'read-directory-name)
+ (lambda (_prompt) (setq prompt-called t) "/custom/path/"))
+ ((symbol-function 'file-directory-p)
+ (lambda (_dir) t)) ; Directory exists
+ ((symbol-function 'cj/ffmpeg-record-audio)
+ (lambda (dir) (setq recorded-dir dir))))
+ (cj/audio-recording-toggle t)
+ (should prompt-called)
+ (should (equal "/custom/path/" recorded-dir))))
+ (test-toggle-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-video-audio-recording-video-toggle-boundary-creates-directory ()
+ "Test that video toggle creates directory if it doesn't exist."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((mkdir-called nil))
+ (cl-letf (((symbol-function 'file-directory-p)
+ (lambda (_dir) nil))
+ ((symbol-function 'make-directory)
+ (lambda (_dir _parents) (setq mkdir-called t)))
+ ((symbol-function 'cj/ffmpeg-record-video)
+ (lambda (_dir) nil)))
+ (cj/video-recording-toggle nil)
+ (should mkdir-called)))
+ (test-toggle-teardown)))
+
+(ert-deftest test-video-audio-recording-audio-toggle-boundary-creates-directory ()
+ "Test that audio toggle creates directory if it doesn't exist."
+ (test-toggle-setup)
+ (unwind-protect
+ (let ((mkdir-called nil))
+ (cl-letf (((symbol-function 'file-directory-p)
+ (lambda (_dir) nil))
+ ((symbol-function 'make-directory)
+ (lambda (_dir _parents) (setq mkdir-called t)))
+ ((symbol-function 'cj/ffmpeg-record-audio)
+ (lambda (_dir) nil)))
+ (cj/audio-recording-toggle nil)
+ (should mkdir-called)))
+ (test-toggle-teardown)))
+
+(provide 'test-video-audio-recording-toggle-functions)
+;;; test-video-audio-recording-toggle-functions.el ends here