blob: b1b8470bf3e5ff036776f04d9ccd27001f9d678e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
;;; test-video-audio-recording-get-devices.el --- Tests for cj/recording-get-devices -*- lexical-binding: t; -*-
;;; Commentary:
;; Unit tests for cj/recording-get-devices function.
;; Tests device auto-detection fallback logic.
;;
;; Note: This function has interactive prompts, but we test the core logic paths
;; without mocking y-or-n-p. We focus on testing:
;; - Already-set devices (no auto-detection needed)
;; - Successful auto-detection
;; - Failed auto-detection → error
;;; 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-get-devices-setup ()
"Reset device variables before each test."
(setq cj/recording-mic-device nil)
(setq cj/recording-system-device nil))
(defun test-get-devices-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-get-devices-normal-already-set-returns-devices ()
"Test that already-set devices are returned without auto-detection."
(test-get-devices-setup)
(unwind-protect
(progn
(setq cj/recording-mic-device "test-mic")
(setq cj/recording-system-device "test-monitor")
(let ((result (cj/recording-get-devices)))
(should (consp result))
(should (equal "test-mic" (car result)))
(should (equal "test-monitor" (cdr result)))))
(test-get-devices-teardown)))
(ert-deftest test-video-audio-recording-get-devices-normal-auto-detect-success ()
"Test that auto-detection succeeds and returns devices."
(test-get-devices-setup)
(unwind-protect
(cl-letf (((symbol-function 'cj/recording-detect-mic-device)
(lambda () "auto-detected-mic"))
((symbol-function 'cj/recording-detect-system-device)
(lambda () "auto-detected-monitor")))
(let ((result (cj/recording-get-devices)))
(should (consp result))
(should (equal "auto-detected-mic" (car result)))
(should (equal "auto-detected-monitor" (cdr result)))
;; Verify variables were set
(should (equal "auto-detected-mic" cj/recording-mic-device))
(should (equal "auto-detected-monitor" cj/recording-system-device))))
(test-get-devices-teardown)))
(ert-deftest test-video-audio-recording-get-devices-normal-partial-auto-detect ()
"Test when only one device is already set, only the other is auto-detected."
(test-get-devices-setup)
(unwind-protect
(progn
(setq cj/recording-mic-device "preset-mic")
(cl-letf (((symbol-function 'cj/recording-detect-system-device)
(lambda () "auto-detected-monitor")))
(let ((result (cj/recording-get-devices)))
(should (consp result))
(should (equal "preset-mic" (car result)))
(should (equal "auto-detected-monitor" (cdr result))))))
(test-get-devices-teardown)))
;;; Error Cases
(ert-deftest test-video-audio-recording-get-devices-error-auto-detect-fails-signals-error ()
"Test that failed auto-detection signals user-error.
When auto-detection fails and user doesn't manually select, function errors."
(test-get-devices-setup)
(unwind-protect
(cl-letf (((symbol-function 'cj/recording-detect-mic-device)
(lambda () nil))
((symbol-function 'cj/recording-detect-system-device)
(lambda () nil))
;; Mock y-or-n-p to say no to manual selection
((symbol-function 'y-or-n-p)
(lambda (_prompt) nil)))
(should-error (cj/recording-get-devices) :type 'user-error))
(test-get-devices-teardown)))
(ert-deftest test-video-audio-recording-get-devices-error-only-mic-detected-signals-error ()
"Test that detecting only mic (no monitor) signals error."
(test-get-devices-setup)
(unwind-protect
(cl-letf (((symbol-function 'cj/recording-detect-mic-device)
(lambda () "detected-mic"))
((symbol-function 'cj/recording-detect-system-device)
(lambda () nil))
((symbol-function 'y-or-n-p)
(lambda (_prompt) nil)))
(should-error (cj/recording-get-devices) :type 'user-error))
(test-get-devices-teardown)))
(ert-deftest test-video-audio-recording-get-devices-error-only-monitor-detected-signals-error ()
"Test that detecting only monitor (no mic) signals error."
(test-get-devices-setup)
(unwind-protect
(cl-letf (((symbol-function 'cj/recording-detect-mic-device)
(lambda () nil))
((symbol-function 'cj/recording-detect-system-device)
(lambda () "detected-monitor"))
((symbol-function 'y-or-n-p)
(lambda (_prompt) nil)))
(should-error (cj/recording-get-devices) :type 'user-error))
(test-get-devices-teardown)))
(ert-deftest test-video-audio-recording-get-devices-error-message-mentions-select-devices ()
"Test that error message guides user to manual selection command."
(test-get-devices-setup)
(unwind-protect
(cl-letf (((symbol-function 'cj/recording-detect-mic-device)
(lambda () nil))
((symbol-function 'cj/recording-detect-system-device)
(lambda () nil))
((symbol-function 'y-or-n-p)
(lambda (_prompt) nil)))
(condition-case err
(cj/recording-get-devices)
(user-error
(should (string-match-p "cj/recording-select-devices" (error-message-string err))))))
(test-get-devices-teardown)))
(provide 'test-video-audio-recording-get-devices)
;;; test-video-audio-recording-get-devices.el ends here
|