From bc9652752c231e8634a90c875ed6d206ff172458 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 24 May 2026 07:16:42 -0500 Subject: refactor(video-capture): drop startup timers for lazy protocol init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit quick-video-capture scheduled an after-init-hook idle timer plus a 2-second fallback run-with-timer to call cj/setup-video-download, which require-d org-protocol and org-capture and registered both the protocol handler and the capture template. That loaded Org protocol/capture plumbing at every startup even when the video workflow was never used. Split the two concerns the way org-webclipper already does. The org-protocol handler is registered in a with-eval-after-load (quote org-protocol) block — a lightweight add-to-list that needs no org-capture — so it is in place whenever org-protocol loads (org-config requires it at startup). cj/setup-video-download now registers only the capture template, lazily, on the first capture (org-capture-mode-hook) or the first protocol call (the handler ensures it). Both startup timers are gone. Tests pin that setup registers the template idempotently and no longer touches the protocol alist; verified in a live daemon that the protocol registers on load. --- tests/test-quick-video-capture--init.el | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/test-quick-video-capture--init.el (limited to 'tests/test-quick-video-capture--init.el') diff --git a/tests/test-quick-video-capture--init.el b/tests/test-quick-video-capture--init.el new file mode 100644 index 00000000..ffdb547a --- /dev/null +++ b/tests/test-quick-video-capture--init.el @@ -0,0 +1,57 @@ +;;; test-quick-video-capture--init.el --- Tests for video-capture lazy init -*- lexical-binding: t; -*- + +;;; Commentary: +;; Initialization is split so module load has no startup side effects: +;; `cj/setup-video-download' registers only the org-capture template (lazily, +;; on first capture or first protocol call), while the org-protocol handler is +;; registered separately via `with-eval-after-load'. These tests pin that +;; separation so setup can't drag in org-protocol plumbing on its own. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +;; Load these for real so `org-capture-templates' and +;; `org-protocol-protocol-alist' are genuine special vars the tests can +;; dynamically rebind (a `let' over a non-special symbol would be lexical +;; and invisible to the module's functions). +(require 'org-capture) +(require 'org-protocol) + +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) +(require 'quick-video-capture) + +;;; cj/setup-video-download + +(ert-deftest test-qvc-setup-registers-capture-template () + "Normal: setup registers the \"v\" capture template and flips the flag." + (let ((org-capture-templates nil) + (cj/video-download-initialized nil)) + (cl-letf (((symbol-function 'cj/log-silently) #'ignore)) + (cj/setup-video-download) + (should (assoc "v" org-capture-templates)) + (should cj/video-download-initialized)))) + +(ert-deftest test-qvc-setup-is-idempotent () + "Boundary: a second setup call does not duplicate the capture template." + (let ((org-capture-templates nil) + (cj/video-download-initialized nil)) + (cl-letf (((symbol-function 'cj/log-silently) #'ignore)) + (cj/setup-video-download) + (cj/setup-video-download) + (should (= 1 (length (seq-filter (lambda (e) (equal (car e) "v")) + org-capture-templates))))))) + +(ert-deftest test-qvc-setup-does-not-register-protocol () + "Boundary: setup touches only capture state, not the org-protocol alist. +Protocol registration is the job of the `with-eval-after-load' block, so +setup must not add to `org-protocol-protocol-alist' on its own." + (let ((org-capture-templates nil) + (org-protocol-protocol-alist nil) + (cj/video-download-initialized nil)) + (cl-letf (((symbol-function 'cj/log-silently) #'ignore)) + (cj/setup-video-download) + (should-not (assoc "video-download" org-protocol-protocol-alist))))) + +(provide 'test-quick-video-capture--init) +;;; test-quick-video-capture--init.el ends here -- cgit v1.2.3