aboutsummaryrefslogtreecommitdiff
path: root/tests/test-ai-config-gptel-backend-libs.el
blob: cbf48f444de26455dfec311fa260f75fce4f7224 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
;;; test-ai-config-gptel-backend-libs.el --- Tests for gptel backend-lib loading -*- lexical-binding: t; -*-

;;; Commentary:
;; Regression coverage for the "gptel-make-anthropic void" bug.  The local
;; gptel fork (:load-path "~/code/gptel", :ensure nil) ships no generated
;; autoloads, so (require 'gptel) alone never loads gptel-anthropic /
;; gptel-openai where the gptel-make-* constructors live.  The fix is to
;; require those backend libraries explicitly before constructing backends.
;;
;; These tests don't load gptel itself (it isn't reliably loadable in batch);
;; they stub `require' and the constructors to verify the loader requires both
;; libs and that `cj/ensure-gptel-backends' calls it before building backends.

;;; Code:

(require 'ert)
(require 'cl-lib)

(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
(require 'ai-config)

;; gptel defvars these at runtime; declare them here so the wiring test can
;; let-bind them in a batch session where gptel itself is not loaded.
(defvar gptel-backend)
(defvar gptel-model)

(ert-deftest test-ai-config-gptel-load-backend-libs-requires-both ()
  "Normal: the loader requires gptel-anthropic and gptel-openai so the fork's
make-* constructors exist despite the missing autoloads."
  (let ((required '()))
    (cl-letf (((symbol-function 'require)
               (lambda (feature &rest _) (push feature required) feature)))
      (cj/--gptel-load-backend-libs))
    (should (memq 'gptel-anthropic required))
    (should (memq 'gptel-openai required))))

(ert-deftest test-ai-config-ensure-gptel-backends-loads-libs-first ()
  "Regression: `cj/ensure-gptel-backends' loads the backend libs before it
calls the constructors, so a fork without autoloads no longer signals
`void-function gptel-make-anthropic'."
  (let ((loaded nil)
        (gptel-claude-backend nil)
        (gptel-chatgpt-backend nil)
        (gptel-backend nil)
        (gptel-model nil))
    (cl-letf (((symbol-function 'cj/--gptel-load-backend-libs)
               (lambda () (setq loaded t)))
              ((symbol-function 'gptel-make-anthropic) (lambda (&rest _) 'claude))
              ((symbol-function 'gptel-make-openai) (lambda (&rest _) 'chatgpt))
              ((symbol-function 'cj/anthropic-api-key) (lambda () "k"))
              ((symbol-function 'cj/openai-api-key) (lambda () "k")))
      (cj/ensure-gptel-backends))
    (should loaded)
    (should (eq gptel-claude-backend 'claude))
    (should (eq gptel-chatgpt-backend 'chatgpt))))

(provide 'test-ai-config-gptel-backend-libs)
;;; test-ai-config-gptel-backend-libs.el ends here