diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-23 20:12:58 -0400 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-23 20:12:58 -0400 |
| commit | 10fa6f4e2e7150ad99827721ada1ae4badcc5e90 (patch) | |
| tree | 960065c8e69f1e7a4150ecf522e2f813c239b5ee /archive/gptel/tests/test-gptel-tools-read-text-file.el | |
| parent | f4cc70c69e7707dd4a686637e14885f5443fcca6 (diff) | |
| download | dotemacs-10fa6f4e2e7150ad99827721ada1ae4badcc5e90.tar.gz dotemacs-10fa6f4e2e7150ad99827721ada1ae4badcc5e90.zip | |
chore(ai): archive gptel and remove it from the live config
I archived gptel to archive/gptel/ since I rarely use it. Moved there: the six gptel modules (ai-config, ai-conversations, ai-conversations-browser, ai-mcp, ai-quick-ask, ai-rewrite), the gptel-tools/ directory, custom/gptel-prompts.el, their test files and utilities, and the four gptel-only specs.
Scrubbed from the live config: the ai-config require in init.el, which also drops the whole C-; a keymap; the gptel-mode emojify hook in font-config.el; the gptel-tools entries in the Makefile clean target and the coverage runner; and the gptel feature notes in README. Cancelled the open gptel tasks in todo.org (the AI Open Work issues, the feature-extension brainstorm, the velox gptel-magit bug).
ai-term stays. It is the ghostel Claude launcher, independent of gptel.
Verified: every module loads, a batch init launch reaches completion clean, and the full test suite shows only pre-existing coverage failures unrelated to this change.
Diffstat (limited to 'archive/gptel/tests/test-gptel-tools-read-text-file.el')
| -rw-r--r-- | archive/gptel/tests/test-gptel-tools-read-text-file.el | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/archive/gptel/tests/test-gptel-tools-read-text-file.el b/archive/gptel/tests/test-gptel-tools-read-text-file.el new file mode 100644 index 00000000..db3d6e7e --- /dev/null +++ b/archive/gptel/tests/test-gptel-tools-read-text-file.el @@ -0,0 +1,201 @@ +;;; test-gptel-tools-read-text-file.el --- Tests for read_text_file gptel tool -*- lexical-binding: t; -*- + +;;; Commentary: +;; Tests for the helpers in read_text_file.el. + +;;; Code: + +(require 'ert) +(require 'cl-lib) + +(eval-and-compile + (add-to-list 'load-path (expand-file-name "tests" user-emacs-directory)) + (add-to-list 'load-path (expand-file-name "gptel-tools" user-emacs-directory)) + (setq load-prefer-newer t) + (unless (featurep 'gptel) + (defvar gptel-tools nil) + (defun gptel-make-tool (&rest _args) nil) + (defun gptel-get-tool (&rest _args) nil) + (provide 'gptel))) + +(require 'read_text_file) + +;; -------------------------- helpers + +(defun test-gptel-tools-read-text-file--in-home (suffix content fn) + "Run FN with a temp file (containing CONTENT) under HOME using SUFFIX." + (let* ((name (format ".test-gptel-tools-read-text-file-%s-%s.tmp" + suffix (format-time-string "%s%N"))) + (path (expand-file-name name "~"))) + (unwind-protect + (progn + (with-temp-file path (insert content)) + (funcall fn path)) + (when (file-exists-p path) (delete-file path))))) + +;; -------------------------- validate-file-path + +(ert-deftest test-gptel-tools-read-text-file-validate-path-normal () + "Normal: an existing readable file under HOME passes." + (test-gptel-tools-read-text-file--in-home + "normal" "hi" + (lambda (path) + (should (equal (cj/validate-file-path path) (file-truename path)))))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-error-outside-home () + "Error: path outside HOME signals." + (should-error (cj/validate-file-path "/etc/hostname"))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-error-missing () + "Error: missing file signals." + (let ((path (expand-file-name + (format ".test-gptel-tools-read-text-file-missing-%s.tmp" + (format-time-string "%s%N")) + "~"))) + (when (file-exists-p path) (delete-file path)) + (should-error (cj/validate-file-path path)))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-error-directory () + "Error: a directory signals." + (should-error (cj/validate-file-path "~"))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-error-unreadable () + "Error: unreadable files signal." + (test-gptel-tools-read-text-file--in-home + "unreadable" "secret" + (lambda (path) + (cl-letf (((symbol-function 'file-readable-p) (lambda (_) nil))) + (should-error (cj/validate-file-path path)))))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-boundary-relative-home-path () + "Boundary: relative paths resolve under HOME." + (test-gptel-tools-read-text-file--in-home + "relative" "hi" + (lambda (path) + (let ((relative (file-relative-name path (expand-file-name "~")))) + (should (equal (cj/validate-file-path relative) + (file-truename path))))))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-boundary-symlink-inside-home () + "Boundary: symlinks inside HOME resolving inside HOME are accepted." + (test-gptel-tools-read-text-file--in-home + "symlink-target" "hi" + (lambda (target) + (let ((link (expand-file-name + (format ".test-gptel-tools-read-text-file-link-%s.tmp" + (format-time-string "%s%N")) + "~"))) + (unwind-protect + (progn + (make-symbolic-link target link t) + (should (equal (cj/validate-file-path link) + (file-truename target)))) + (when (file-symlink-p link) (delete-file link))))))) + +(ert-deftest test-gptel-tools-read-text-file-validate-path-error-symlink-outside-home () + "Error: symlinks inside HOME pointing outside HOME are rejected." + (let ((outside (make-temp-file "test-gptel-tools-read-text-file-outside-")) + (link (expand-file-name + (format ".test-gptel-tools-read-text-file-outside-link-%s.tmp" + (format-time-string "%s%N")) + "~"))) + (unwind-protect + (progn + (make-symbolic-link outside link t) + (should-error (cj/validate-file-path link))) + (when (file-exists-p outside) (delete-file outside)) + (when (file-symlink-p link) (delete-file link))))) + +;; -------------------------- get-file-metadata + +(ert-deftest test-gptel-tools-read-text-file-get-metadata-shape () + "Returns a plist with :size and :string keys." + (test-gptel-tools-read-text-file--in-home + "meta" "abc" + (lambda (path) + (let ((meta (cj/get-file-metadata path))) + (should (plist-get meta :size)) + (should (= 3 (plist-get meta :size))) + (should (stringp (plist-get meta :string))) + (should (string-match-p "modified" (plist-get meta :string))))))) + +;; -------------------------- check-file-size-limits + +(ert-deftest test-gptel-tools-read-text-file-size-limits-normal () + "Small size below warning limit is a no-op." + (should-not (cj/check-file-size-limits 1024 nil))) + +(ert-deftest test-gptel-tools-read-text-file-size-limits-error-hard-cap () + "Sizes above 100MB always signal." + (should-error (cj/check-file-size-limits (* 101 1024 1024) t)) + (should-error (cj/check-file-size-limits (* 101 1024 1024) nil))) + +(ert-deftest test-gptel-tools-read-text-file-size-limits-warning-with-no-confirm () + "Above 10MB but below 100MB with no-confirm passes through silently." + (should-not (cj/check-file-size-limits (* 11 1024 1024) t))) + +(ert-deftest test-gptel-tools-read-text-file-size-limits-warning-user-accepts () + "Above warning limit proceeds when the user accepts." + (cl-letf (((symbol-function 'y-or-n-p) (lambda (_prompt) t))) + (should-not (cj/check-file-size-limits (* 11 1024 1024) nil)))) + +(ert-deftest test-gptel-tools-read-text-file-size-limits-warning-user-declines () + "Above warning limit signals when the user declines." + (cl-letf (((symbol-function 'y-or-n-p) (lambda (_prompt) nil))) + (should-error (cj/check-file-size-limits (* 11 1024 1024) nil)))) + +;; -------------------------- detect-binary-file + +(ert-deftest test-gptel-tools-read-text-file-detect-binary-text-file () + "Text file: detect-binary returns nil." + (test-gptel-tools-read-text-file--in-home + "text" "plain ascii content" + (lambda (path) + (should-not (cj/detect-binary-file path))))) + +(ert-deftest test-gptel-tools-read-text-file-detect-binary-with-null-byte () + "File with NUL in first 1024 bytes returns truthy." + (test-gptel-tools-read-text-file--in-home + "bin" (concat "head\0tail") + (lambda (path) + (should (cj/detect-binary-file path))))) + +;; -------------------------- handle-special-file-types + +(ert-deftest test-gptel-tools-read-text-file-handle-special-epub-error () + "EPUB special-type handler signals \"not yet implemented\"." + (should-error (cj/handle-special-file-types "/tmp/foo.epub" t))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-epub-cancel () + "EPUB special-type handler signals when user declines extraction." + (cl-letf (((symbol-function 'y-or-n-p) (lambda (_prompt) nil))) + (should-error (cj/handle-special-file-types "/tmp/foo.epub" nil)))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-pdf-cancel () + "PDF special-type handler signals when user declines extraction." + (cl-letf (((symbol-function 'y-or-n-p) (lambda (_prompt) nil))) + (should-error (cj/handle-special-file-types "/tmp/foo.pdf" nil)))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-pdf-empty-extraction () + "PDF special-type handler signals when extraction returns empty text." + (cl-letf (((symbol-function 'shell-command-to-string) (lambda (_cmd) ""))) + (should-error (cj/handle-special-file-types "/tmp/foo.pdf" t)))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-pdf-text () + "PDF special-type handler returns extracted text." + (cl-letf (((symbol-function 'shell-command-to-string) + (lambda (_cmd) "pdf text\n"))) + (should (equal (cj/handle-special-file-types "/tmp/foo.pdf" t) + "pdf text\n")))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-binary-cancel () + "Generic binary handler signals when user declines." + (cl-letf (((symbol-function 'y-or-n-p) (lambda (_prompt) nil))) + (should-error (cj/handle-special-file-types "/tmp/foo.bin" nil)))) + +(ert-deftest test-gptel-tools-read-text-file-handle-special-binary-returns-nil () + "Generic binary file with no-confirm returns nil to indicate normal read." + (should-not (cj/handle-special-file-types "/tmp/foo.bin" t))) + +(provide 'test-gptel-tools-read-text-file) +;;; test-gptel-tools-read-text-file.el ends here |
