From b7323a37a37a5948716060edb508a4c5791117b5 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 23 May 2026 09:51:55 -0500 Subject: feat(linear): wire linear-emacs into the config for DeepSat I added modules/linear-config.el to load the local linear-emacs checkout (the same :load-path + :ensure nil shape gptel and org-drill use) and point it at DeepSat's Linear workspace. The personal API key comes from authinfo.gpg, loaded lazily by a named :before advice on the request function, so there's no GPG prompt at startup. The default team is DeepSat's Software Engineering team, and the commands sit under a C-; L prefix. Verified live against DeepSat: the connection authenticates, lists all five workspace teams, and pulls real issues (SE-*, DEE-*). Tests cover the key-loader (loads when unset, keeps an existing key, stays nil when absent) and the keymap wiring. --- tests/test-linear-config.el | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/test-linear-config.el (limited to 'tests') diff --git a/tests/test-linear-config.el b/tests/test-linear-config.el new file mode 100644 index 000000000..c3e702d8b --- /dev/null +++ b/tests/test-linear-config.el @@ -0,0 +1,52 @@ +;;; test-linear-config.el --- Tests for linear-config.el -*- lexical-binding: t; -*- + +;;; Commentary: +;; Covers the lazy API-key loader and the keybinding wiring. linear-emacs +;; itself is never loaded here (it's a deferred :load-path package), so +;; `linear-emacs-api-key' is declared special below to make the dynamic +;; let-bindings reach `cj/linear--ensure-api-key'. `cj/auth-source-secret-value' +;; is stubbed — no authinfo.gpg / GPG access in the tests. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(require 'linear-config) + +;; linear-config declares this with a bare (defvar linear-emacs-api-key), which +;; is only file-local; declare it special here so the let-bindings are dynamic. +(defvar linear-emacs-api-key nil) + +(ert-deftest test-linear-ensure-api-key-loads-when-unset () + "Normal: an unset key is loaded from auth-source." + (let ((linear-emacs-api-key nil)) + (cl-letf (((symbol-function 'cj/auth-source-secret-value) + (lambda (&rest _) "lin_api_test"))) + (cj/linear--ensure-api-key) + (should (equal linear-emacs-api-key "lin_api_test"))))) + +(ert-deftest test-linear-ensure-api-key-keeps-existing () + "Boundary: an already-set key is neither overwritten nor re-fetched." + (let ((linear-emacs-api-key "already-set") (fetched nil)) + (cl-letf (((symbol-function 'cj/auth-source-secret-value) + (lambda (&rest _) (setq fetched t) "other"))) + (cj/linear--ensure-api-key) + (should (equal linear-emacs-api-key "already-set")) + (should-not fetched)))) + +(ert-deftest test-linear-ensure-api-key-nil-when-absent () + "Boundary: a missing authinfo entry leaves the key nil without error." + (let ((linear-emacs-api-key nil)) + (cl-letf (((symbol-function 'cj/auth-source-secret-value) (lambda (&rest _) nil))) + (cj/linear--ensure-api-key) + (should-not linear-emacs-api-key)))) + +(ert-deftest test-linear-keymap-bound-under-prefix () + "Smoke: C-; L holds the linear keymap and the entry commands are bound." + (should (keymapp cj/linear-keymap)) + (should (eq (keymap-lookup (current-global-map) "C-; L") cj/linear-keymap)) + (should (eq (keymap-lookup cj/linear-keymap "l") #'linear-emacs-list-issues)) + (should (eq (keymap-lookup cj/linear-keymap "n") #'linear-emacs-new-issue))) + +(provide 'test-linear-config) +;;; test-linear-config.el ends here -- cgit v1.2.3