aboutsummaryrefslogtreecommitdiff
path: root/tests/test-gptel-tools-read-buffer.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-16 01:39:57 -0500
committerCraig Jennings <c@cjennings.net>2026-05-16 01:39:57 -0500
commit73e63b6c6850f8e14d8374c7bf6b127971cfbb08 (patch)
treeb446f4ac63901d75376664abfd7b8cb5f8ac436a /tests/test-gptel-tools-read-buffer.el
parent2a98feaf1285b495e7d6d1eed2abf02620188e29 (diff)
downloaddotemacs-73e63b6c6850f8e14d8374c7bf6b127971cfbb08.tar.gz
dotemacs-73e63b6c6850f8e14d8374c7bf6b127971cfbb08.zip
test(gptel-tools): cover the helpers across the five remaining tools
The gptel-tools files had zero direct coverage outside of `update_text_file`, which landed with its rewrite earlier this session. This commit adds 52 tests across the five other tools. For three of the tools the helpers were already top-level defuns (`read_text_file`, `list_directory_files`, `move_to_trash`). The other two had their main bodies inlined into the `gptel-make-tool` lambda -- I extracted them so the work is testable without mocking gptel itself: read_buffer.el -> `cj/read-buffer--get-content` write_text_file.el -> `cj/write-text-file--run` plus `--validate-path`, `--backup-name`, `--ensure-parent` Test files, by tool: - read_buffer.el (5 tests): normal, empty, buffer-object, text-property-stripping, missing buffer. - write_text_file.el (10 tests): validate-path, backup-name shape, ensure-parent (creates missing / rejects unwritable), run with normal / overwrite / existing-no-overwrite / empty content / outside-home. - read_text_file.el (12 tests): validate-file-path (normal + three error shapes), metadata plist shape, size limits (no-op / hard cap / warning bypass with no-confirm), binary detection (text vs null-byte), special-type EPUB and generic-binary paths. - list_directory_files.el (15 tests): mode-to-permissions (file / dir / executable), get-file-info (file / directory), extension filter (keep / drop / always-dir / nil-extension), format-file- entry, list-directory flat / recursive / error, format-output with and without files. - move_to_trash.el (10 tests): unique-name (no conflict / conflict with timestamp / no-extension), validate-path (HOME / /tmp / outside / critical-dir / missing), perform on file and directory. Each test file uses the same load-path / gptel-stub idiom (`eval-and-compile` block, gptel stub when the real package isn't available) so the byte-compile hook is happy.
Diffstat (limited to 'tests/test-gptel-tools-read-buffer.el')
-rw-r--r--tests/test-gptel-tools-read-buffer.el60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/test-gptel-tools-read-buffer.el b/tests/test-gptel-tools-read-buffer.el
new file mode 100644
index 00000000..75efd604
--- /dev/null
+++ b/tests/test-gptel-tools-read-buffer.el
@@ -0,0 +1,60 @@
+;;; test-gptel-tools-read-buffer.el --- Tests for read_buffer gptel tool -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for `cj/read-buffer--get-content', the testable helper that
+;; backs the read_buffer gptel tool.
+
+;;; Code:
+
+(require 'ert)
+
+(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_buffer)
+
+(ert-deftest test-gptel-tools-read-buffer-normal ()
+ "Normal: returns the contents of an existing buffer."
+ (with-temp-buffer
+ (rename-buffer "test-gptel-tools-read-buffer-normal" t)
+ (insert "hello world")
+ (should (equal (cj/read-buffer--get-content (buffer-name)) "hello world"))))
+
+(ert-deftest test-gptel-tools-read-buffer-boundary-empty-buffer ()
+ "Boundary: empty buffer returns the empty string."
+ (with-temp-buffer
+ (rename-buffer "test-gptel-tools-read-buffer-empty" t)
+ (should (equal (cj/read-buffer--get-content (buffer-name)) ""))))
+
+(ert-deftest test-gptel-tools-read-buffer-boundary-buffer-object ()
+ "Boundary: accepts a buffer object as well as a name string."
+ (with-temp-buffer
+ (insert "from buffer object")
+ (should (equal (cj/read-buffer--get-content (current-buffer))
+ "from buffer object"))))
+
+(ert-deftest test-gptel-tools-read-buffer-boundary-strips-text-properties ()
+ "Boundary: the returned string has no text properties."
+ (with-temp-buffer
+ (rename-buffer "test-gptel-tools-read-buffer-props" t)
+ (insert (propertize "fontified" 'face 'bold))
+ (let ((content (cj/read-buffer--get-content (buffer-name))))
+ (should (equal content "fontified"))
+ (should-not (text-properties-at 0 content)))))
+
+(ert-deftest test-gptel-tools-read-buffer-error-missing-buffer ()
+ "Error: nonexistent buffer name signals."
+ (when (get-buffer "test-gptel-tools-read-buffer-absent")
+ (kill-buffer "test-gptel-tools-read-buffer-absent"))
+ (should-error (cj/read-buffer--get-content
+ "test-gptel-tools-read-buffer-absent")))
+
+(provide 'test-gptel-tools-read-buffer)
+;;; test-gptel-tools-read-buffer.el ends here