From a8c7e8bf822535470d1a4621030b0edd07aaccb4 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 16 May 2026 01:42:30 -0500 Subject: feat(ai-conversations): add cj/gptel-autosave-toggle with [AS] mode-line indicator `cj/gptel-autosave-enabled` flipped to t inside the save/load entry points with no way back off short of editing the variable or clearing the buffer, and no visible indicator that it was on. Two pieces: - `cj/gptel-autosave-toggle` flips the buffer-local state in the current GPTel buffer. Bound to `C-; a A` via `cj/ai-keymap` (which-key: "toggle autosave"). When autosave is OFF and no filepath is configured yet, the command prompts to save the conversation first so a save target exists; otherwise it just flips the bit. - `cj/gptel-autosave-mode-line-format` surfaces " [AS]" in the mode-line when autosave is on, blank when off. Installed via a `gptel-mode-hook` so every GPTel buffer picks it up. The install helper is idempotent. 6 new tests cover enable/disable paths, the no-filepath prompt path, the not-a-gptel-buffer error path, the mode-line format evaluation, and the install idempotence. --- tests/test-ai-conversations.el | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'tests') diff --git a/tests/test-ai-conversations.el b/tests/test-ai-conversations.el index f4d43236..26b2423b 100644 --- a/tests/test-ai-conversations.el +++ b/tests/test-ai-conversations.el @@ -405,5 +405,67 @@ (should (= 1 (cl-count #'cj/gptel--autosave-after-response gptel-post-response-functions))))) +;; --------------------------------------------- autosave-toggle / indicator + +(ert-deftest test-ai-conversations-autosave-toggle-enables-with-filepath () + "Toggle enables autosave when a filepath is set." + (with-temp-buffer + (setq-local gptel-mode t) + (setq-local cj/gptel-autosave-enabled nil) + (setq-local cj/gptel-autosave-filepath "/tmp/foo.gptel") + (cj/gptel-autosave-toggle) + (should cj/gptel-autosave-enabled))) + +(ert-deftest test-ai-conversations-autosave-toggle-disables () + "Toggle turns autosave off when already on." + (with-temp-buffer + (setq-local gptel-mode t) + (setq-local cj/gptel-autosave-enabled t) + (setq-local cj/gptel-autosave-filepath "/tmp/foo.gptel") + (cj/gptel-autosave-toggle) + (should-not cj/gptel-autosave-enabled))) + +(ert-deftest test-ai-conversations-autosave-toggle-prompts-when-no-filepath () + "Toggle prompts to save first when no filepath is configured." + (with-temp-buffer + (setq-local gptel-mode t) + (setq-local cj/gptel-autosave-enabled nil) + (setq-local cj/gptel-autosave-filepath nil) + (let ((prompted nil) + (save-called nil)) + (cl-letf (((symbol-function 'y-or-n-p) + (lambda (&rest _) (setq prompted t) nil)) + ((symbol-function 'cj/gptel-save-conversation) + (lambda () (setq save-called t)))) + (cj/gptel-autosave-toggle)) + (should prompted) + (should-not save-called) + (should-not cj/gptel-autosave-enabled)))) + +(ert-deftest test-ai-conversations-autosave-toggle-error-outside-gptel-mode () + "Toggle signals when called outside a gptel buffer." + (with-temp-buffer + (setq-local gptel-mode nil) + (should-error (cj/gptel-autosave-toggle)))) + +(ert-deftest test-ai-conversations-autosave-mode-line-format-evaluates () + "Mode-line format evaluates to \" [AS]\" only when autosave is enabled." + (with-temp-buffer + (setq-local cj/gptel-autosave-enabled t) + (should (equal (eval (cadr cj/gptel-autosave-mode-line-format)) + " [AS]"))) + (with-temp-buffer + (setq-local cj/gptel-autosave-enabled nil) + (should-not (eval (cadr cj/gptel-autosave-mode-line-format))))) + +(ert-deftest test-ai-conversations-install-mode-line-idempotent () + "Repeated installs do not duplicate the construct in mode-line-format." + (with-temp-buffer + (setq-local mode-line-format '("base")) + (cj/gptel--install-autosave-mode-line) + (cj/gptel--install-autosave-mode-line) + (cj/gptel--install-autosave-mode-line) + (should (= 1 (cl-count 'cj/gptel-autosave-mode-line-format mode-line-format))))) + (provide 'test-ai-conversations) ;;; test-ai-conversations.el ends here -- cgit v1.2.3