aboutsummaryrefslogtreecommitdiff
path: root/tests/test-ai-conversations.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-16 01:42:30 -0500
committerCraig Jennings <c@cjennings.net>2026-05-16 01:42:30 -0500
commita8c7e8bf822535470d1a4621030b0edd07aaccb4 (patch)
treed4a94450401f36c594e37ae9ca7fd107f31ac2f6 /tests/test-ai-conversations.el
parent73e63b6c6850f8e14d8374c7bf6b127971cfbb08 (diff)
downloaddotemacs-a8c7e8bf822535470d1a4621030b0edd07aaccb4.tar.gz
dotemacs-a8c7e8bf822535470d1a4621030b0edd07aaccb4.zip
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.
Diffstat (limited to 'tests/test-ai-conversations.el')
-rw-r--r--tests/test-ai-conversations.el62
1 files changed, 62 insertions, 0 deletions
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