summaryrefslogtreecommitdiff
path: root/tests/test-fs-list-directory-recursive-extra.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-fs-list-directory-recursive-extra.el')
-rw-r--r--tests/test-fs-list-directory-recursive-extra.el106
1 files changed, 106 insertions, 0 deletions
diff --git a/tests/test-fs-list-directory-recursive-extra.el b/tests/test-fs-list-directory-recursive-extra.el
new file mode 100644
index 00000000..53ce3c8d
--- /dev/null
+++ b/tests/test-fs-list-directory-recursive-extra.el
@@ -0,0 +1,106 @@
+;;; test-tool-library-fs-list-directory-recursive-extra.el --- Additional ERT tests for cj/fs-list-directory-recursive -*- lexical-binding: t; -*-
+
+;; Author: gptel-tool-writer and cjennings
+;; Keywords: tests, filesystem, tools
+
+;;; Commentary:
+;; Additional tests to verify combined filters, boundary cases,
+;; symlink protection, and permission issue handling in
+;; cj/fs-list-directory-recursive.
+
+;;; Code:
+
+(require 'ert)
+(require 'f)
+(require 'tool-filesystem-library)
+
+(defvar cj/fs-extra-test--temp-dir nil "Temporary temp directory for extra fs-list-directory-recursive tests.")
+
+(defun cj/fs-extra-test--setup ()
+ "Set up temp directory for extra fs-list-directory-recursive tests."
+ (setq cj/fs-extra-test--temp-dir (make-temp-file "fs-lib-test" t))
+ ;; Create directory structure
+ (make-directory (f-join cj/fs-extra-test--temp-dir "subdir") t)
+ (make-directory (f-join cj/fs-extra-test--temp-dir "subdir2") t)
+ ;; Files at root level
+ (with-temp-buffer (insert "Root org file") (write-file (f-join cj/fs-extra-test--temp-dir "file1.org")))
+ (with-temp-buffer (insert "Root txt file") (write-file (f-join cj/fs-extra-test--temp-dir "file2.txt")))
+ ;; Files in subdirectories
+ (with-temp-buffer (insert "Subdir txt file") (write-file (f-join cj/fs-extra-test--temp-dir "subdir" "file3.txt")))
+ (with-temp-buffer (insert "Subdir2 org file") (write-file (f-join cj/fs-extra-test--temp-dir "subdir2" "file4.org")))
+ ;; Symlink to subdir2 inside subdir (potential for loops)
+ (let ((target (f-join cj/fs-extra-test--temp-dir "subdir2"))
+ (link (f-join cj/fs-extra-test--temp-dir "subdir" "link-to-subdir2")))
+ (ignore-errors (delete-file link))
+ (make-symbolic-link target link))
+
+ ;; Create protected directory inside subdir to test permission issues
+ (let ((protected-dir (f-join cj/fs-extra-test--temp-dir "subdir" "protected-dir")))
+ (make-directory protected-dir t)
+ ;; Remove read & execute permissions
+ (set-file-modes protected-dir #o000)))
+
+(defun cj/fs-extra-test--teardown ()
+ "Clean up temp directory for extra tests."
+ (when (and cj/fs-extra-test--temp-dir (file-directory-p cj/fs-extra-test--temp-dir))
+ ;; Reset permissions to allow deletion
+ (let ((protected-dir (f-join cj/fs-extra-test--temp-dir "subdir" "protected-dir")))
+ (when (file-exists-p protected-dir)
+ (set-file-modes protected-dir #o755)))
+ (delete-directory cj/fs-extra-test--temp-dir t))
+ (setq cj/fs-extra-test--temp-dir nil))
+
+(ert-deftest test-cj/fs-list-directory-recursive-normal-combined-filter-maxdepth ()
+ "Normal: recursive listing combining extension filter and max depth."
+ (cj/fs-extra-test--setup)
+ (unwind-protect
+ (let* ((filter-fn (lambda (fi)
+ (string-suffix-p ".org" (f-filename (plist-get fi :path)))))
+ ;; max-depth 1 means root directory only, no recursion into subdirs
+ (files (cj/fs-list-directory-recursive cj/fs-extra-test--temp-dir filter-fn 1)))
+ ;; Should find only root level org files, not ones nested
+ (should (cl-some (lambda (fi) (string= (f-filename (plist-get fi :path)) "file1.org")) files))
+ (should-not (cl-some (lambda (fi) (string= (f-filename (plist-get fi :path)) "file4.org")) files)))
+ (cj/fs-extra-test--teardown)))
+
+(ert-deftest test-cj/fs-list-directory-recursive-boundary-max-depth-zero ()
+ "Boundary: max depth zero lists no files (no recursion)."
+ (cj/fs-extra-test--setup)
+ (unwind-protect
+ (let ((files (cj/fs-list-directory-recursive cj/fs-extra-test--temp-dir nil 0)))
+ ;; Should be empty as depth 0 means no entries processed
+ (should (equal files nil)))
+ (cj/fs-extra-test--teardown)))
+
+(ert-deftest test-cj/fs-list-directory-recursive-error-negative-max-depth ()
+ "Error: negative max depth results in error."
+ (cj/fs-extra-test--setup)
+ (unwind-protect
+ (should-error (cj/fs-list-directory-recursive cj/fs-extra-test--temp-dir nil -1))
+ (cj/fs-extra-test--teardown)))
+
+(ert-deftest test-cj/fs-list-directory-recursive-boundary-symlink-no-infinite-loop ()
+ "Boundary: symlinked directories do not cause infinite recursion."
+ (cj/fs-extra-test--setup)
+ (unwind-protect
+ (let ((files (cj/fs-list-directory-recursive cj/fs-extra-test--temp-dir nil 5)))
+ ;; There should be files from subdirs, but no infinite loop crashes
+ (should (cl-some (lambda (fi) (string= (f-filename (plist-get fi :path)) "file4.org")) files))
+ (should (cl-some (lambda (fi) (string= (f-filename (plist-get fi :path)) "file1.org")) files)))
+ (cj/fs-extra-test--teardown)))
+
+(ert-deftest test-cj/fs-list-directory-recursive-normal-permission-issue-handling ()
+ "Normal: files in directories with permission issues are handled gracefully."
+ (cj/fs-extra-test--setup)
+ (unwind-protect
+ (let ((caught-warning nil))
+ (cl-letf (((symbol-function 'message)
+ (lambda (&rest args)
+ (when (string-match "Warning:" (apply #'format args))
+ (setq caught-warning t)))))
+ (cj/fs-list-directory-recursive cj/fs-extra-test--temp-dir nil 5)
+ (should caught-warning)))
+ (cj/fs-extra-test--teardown)))
+
+(provide 'test-tool-library-fs-list-directory-recursive-extra)
+;;; test-tool-library-fs-list-directory-recursive-extra.el ends here