aboutsummaryrefslogtreecommitdiff
path: root/tests/test-transcription-config--ratio-backend.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-09-22 13:50:04 -0400
committerCraig Jennings <c@cjennings.net>2026-09-22 13:50:04 -0400
commitbefb206ae7b2daeb61acd20f11aa9d2d5017733f (patch)
treeaa2ec8683188af9d194a88d1b6cc1e4110d63aa7 /tests/test-transcription-config--ratio-backend.el
parent44a7e4284a7dbd660c978158ae8419ea61f4550c (diff)
downloaddotemacs-befb206ae7b2daeb61acd20f11aa9d2d5017733f.tar.gz
dotemacs-befb206ae7b2daeb61acd20f11aa9d2d5017733f.zip
feat(transcription): add the self-hosted ratio backend
scripts/ratio-transcribe runs whisper plus speaker diarization on my own transcription host over an ssh job queue, with a local worker as the fallback when the host is unreachable. It needs no API key, so its descriptor carries nil for the auth host and the env var. The process environment passes through untouched. SPEAKERS=N in the environment pins the diarizer's speaker count. The interactive switcher used to carry its own copy of the backend list, so a backend added to the descriptors was reachable only by setq. It now derives its choices from the descriptor alist, and a test pins the two to each other. The script's own behavior (argument validation, the job-id hash, the remote and local branches) is tested in the repo it came from. A bats mirror of those cases is tracked separately.
Diffstat (limited to 'tests/test-transcription-config--ratio-backend.el')
-rw-r--r--tests/test-transcription-config--ratio-backend.el102
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/test-transcription-config--ratio-backend.el b/tests/test-transcription-config--ratio-backend.el
new file mode 100644
index 00000000..f368b859
--- /dev/null
+++ b/tests/test-transcription-config--ratio-backend.el
@@ -0,0 +1,102 @@
+;;; test-transcription-config--ratio-backend.el --- the ratio self-hosted backend -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; The `ratio' backend runs whisper plus speaker diarization on my own host
+;; through the scripts/ratio-transcribe client. It needs no API key, so its
+;; descriptor carries nil for both :auth-host and :env-var, and the process
+;; environment passes through unchanged.
+;;
+;; Two seams have to agree for a backend to be usable: the descriptor alist
+;; that resolves the script, and the completing-read list the interactive
+;; switcher offers. The switcher used to carry its own copy of that list, so
+;; a descriptor added without a switcher entry was reachable only by setq. It
+;; now derives its choices from the alist; the boundary test below guards
+;; against a return to a hardcoded list.
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-lib)
+
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+
+(defvar cj/custom-keymap (make-sparse-keymap)
+ "Stub keymap for testing.")
+
+(unless (fboundp 'notifications-notify)
+ (defun notifications-notify (&rest _args)
+ "Stub notification function for testing."
+ nil))
+
+(require 'transcription-config)
+
+(defun test-transcription-ratio--switcher-choices ()
+ "Return the backend names `cj/transcription-switch-backend' offers.
+Captures the collection handed to `completing-read' and answers with the
+current backend so the switcher is a no-op."
+ (let (offered)
+ (cl-letf (((symbol-function 'completing-read)
+ (lambda (_prompt collection &rest _)
+ (setq offered (mapcar #'car collection))
+ (symbol-name cj/transcribe-backend))))
+ (let ((cj/transcribe-backend cj/transcribe-backend))
+ (cj/transcription-switch-backend)))
+ offered))
+
+;;; Normal
+
+(ert-deftest test-transcription-config-ratio-descriptor-resolves ()
+ "Normal: the ratio backend resolves to the ratio-transcribe client with no
+API-key requirement."
+ (let ((desc (cj/--backend-plist 'ratio)))
+ (should (equal (plist-get desc :script) "ratio-transcribe"))
+ (should (null (plist-get desc :auth-host)))
+ (should (null (plist-get desc :env-var)))))
+
+(ert-deftest test-transcription-config-ratio-script-path-and-executable ()
+ "Normal: the script path lands on scripts/ratio-transcribe and the file is
+there and executable, so a transcription can actually start."
+ (let ((cj/transcribe-backend 'ratio))
+ (let ((path (cj/--transcription-script-path)))
+ (should (string-suffix-p "scripts/ratio-transcribe" path))
+ (should (file-executable-p path)))))
+
+(ert-deftest test-transcription-config-ratio-environment-passes-through ()
+ "Normal: no API key means the process environment is returned unchanged,
+and nothing consults authinfo."
+ (cl-letf (((symbol-function 'cj/--auth-source-password)
+ (lambda (&rest _) (ert-fail "auth-source consulted for a keyless backend"))))
+ (should (eq (cj/--build-process-environment 'ratio) process-environment))))
+
+(ert-deftest test-transcription-config-switcher-offers-ratio ()
+ "Normal: the interactive switcher lists ratio, so the backend is reachable
+without a setq."
+ (should (member "ratio" (test-transcription-ratio--switcher-choices))))
+
+;;; Boundary
+
+(ert-deftest test-transcription-config-switcher-matches-descriptors ()
+ "Boundary: the switcher offers exactly the descriptor set. It derives the
+list from the alist now; this is what stops a hardcoded copy coming back."
+ (should (equal (sort (test-transcription-ratio--switcher-choices) #'string<)
+ (sort (mapcar (lambda (entry) (symbol-name (car entry)))
+ cj/--transcription-backends)
+ #'string<))))
+
+(ert-deftest test-transcription-config-every-descriptor-script-exists ()
+ "Boundary: every descriptor names a script that exists under scripts/.
+A descriptor for a script that never landed (a hosted alternative referenced
+from another repo, say) would fail at transcription time instead."
+ (dolist (entry cj/--transcription-backends)
+ (let ((cj/transcribe-backend (car entry)))
+ (should (file-exists-p (cj/--transcription-script-path))))))
+
+;;; Error
+
+(ert-deftest test-transcription-config-unknown-backend-still-signals ()
+ "Error: adding ratio did not loosen the descriptor lookup; an unknown
+backend still signals `user-error'."
+ (should-error (cj/--backend-plist 'no-such-backend) :type 'user-error))
+
+(provide 'test-transcription-config--ratio-backend)
+;;; test-transcription-config--ratio-backend.el ends here