summaryrefslogtreecommitdiff
path: root/tests/test-music-config--get-m3u-basenames.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-03 16:15:24 -0600
committerCraig Jennings <c@cjennings.net>2025-11-03 16:15:24 -0600
commitd7cc8638562daceb48aa8895cde4e057d3c25f6b (patch)
treeb6bf1d3fde9085d90b226ef8c8f12639f86f11fe /tests/test-music-config--get-m3u-basenames.el
parentaea61b34693f164ced731cf3b0f0e8ee798c342c (diff)
test: Add unit tests for music config and org-contacts functions
Add comprehensive unit tests for various Emacs Lisp functions, covering M3U file handling, music file validation, and contact capture template finalization: - Tests for appending tracks to M3U files Tests for recursive music - collection Tests for completion table creation Tests for - extracting M3U basenames and files Tests for M3U file parsing - Tests for filename sanitization Tests for directory and file - validity checks Tests for org-contacts capture template - finalization Each test validates normal, boundary, and error conditions. These tests improve code reliability by verifying expected behavior across a range of scenarios.
Diffstat (limited to 'tests/test-music-config--get-m3u-basenames.el')
-rw-r--r--tests/test-music-config--get-m3u-basenames.el121
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/test-music-config--get-m3u-basenames.el b/tests/test-music-config--get-m3u-basenames.el
new file mode 100644
index 00000000..91c8af70
--- /dev/null
+++ b/tests/test-music-config--get-m3u-basenames.el
@@ -0,0 +1,121 @@
+;;; test-music-config--get-m3u-basenames.el --- Tests for M3U basename extraction -*- coding: utf-8; lexical-binding: t; -*-
+;;
+;; Author: Craig Jennings <c@cjennings.net>
+;;
+;;; Commentary:
+;; Unit tests for cj/music--get-m3u-basenames function.
+;; Tests the helper that extracts M3U basenames (without .m3u extension).
+;;
+;; Test organization:
+;; - Normal Cases: Multiple files, single file
+;; - Boundary Cases: Empty directory, extension removal
+;; - Error Cases: Nonexistent directory
+;;
+;;; Code:
+
+(require 'ert)
+(require 'testutil-general)
+
+;; Stub missing dependencies before loading music-config
+(defvar-keymap cj/custom-keymap
+ :doc "Stub keymap for testing")
+
+;; Load production code
+(require 'music-config)
+
+;;; Setup & Teardown
+
+(defun test-music-config--get-m3u-basenames-setup ()
+ "Setup test environment."
+ (cj/create-test-base-dir))
+
+(defun test-music-config--get-m3u-basenames-teardown ()
+ "Clean up test environment."
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-music-config--get-m3u-basenames-normal-multiple-files-returns-basenames ()
+ "Extract basenames from multiple M3U files without .m3u extension."
+ (test-music-config--get-m3u-basenames-setup)
+ (unwind-protect
+ (let* ((test-dir (cj/create-test-subdirectory "playlists"))
+ (file1 (cj/create-temp-test-file-with-content "" "rock.m3u"))
+ (file2 (cj/create-temp-test-file-with-content "" "jazz.m3u"))
+ (file3 (cj/create-temp-test-file-with-content "" "classical.m3u")))
+ (rename-file file1 (expand-file-name "rock.m3u" test-dir))
+ (rename-file file2 (expand-file-name "jazz.m3u" test-dir))
+ (rename-file file3 (expand-file-name "classical.m3u" test-dir))
+
+ (let ((cj/music-m3u-root test-dir))
+ (let ((result (cj/music--get-m3u-basenames)))
+ (should (= (length result) 3))
+ ;; Sort for consistent comparison
+ (let ((sorted-result (sort result #'string<)))
+ (should (equal sorted-result '("classical" "jazz" "rock")))))))
+ (test-music-config--get-m3u-basenames-teardown)))
+
+(ert-deftest test-music-config--get-m3u-basenames-normal-single-file-returns-basename ()
+ "Extract basename from single M3U file without .m3u extension."
+ (test-music-config--get-m3u-basenames-setup)
+ (unwind-protect
+ (let* ((test-dir (cj/create-test-subdirectory "playlists"))
+ (file1 (cj/create-temp-test-file-with-content "" "favorites.m3u")))
+ (rename-file file1 (expand-file-name "favorites.m3u" test-dir))
+
+ (let ((cj/music-m3u-root test-dir))
+ (let ((result (cj/music--get-m3u-basenames)))
+ (should (= (length result) 1))
+ (should (equal (car result) "favorites")))))
+ (test-music-config--get-m3u-basenames-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-music-config--get-m3u-basenames-boundary-empty-directory-returns-empty ()
+ "Extract basenames from empty directory returns empty list."
+ (test-music-config--get-m3u-basenames-setup)
+ (unwind-protect
+ (let* ((test-dir (cj/create-test-subdirectory "empty-playlists")))
+ (let ((cj/music-m3u-root test-dir))
+ (let ((result (cj/music--get-m3u-basenames)))
+ (should (null result)))))
+ (test-music-config--get-m3u-basenames-teardown)))
+
+(ert-deftest test-music-config--get-m3u-basenames-boundary-extension-removed ()
+ "Basenames have .m3u extension removed."
+ (test-music-config--get-m3u-basenames-setup)
+ (unwind-protect
+ (let* ((test-dir (cj/create-test-subdirectory "playlists"))
+ (file1 (cj/create-temp-test-file-with-content "" "test.m3u")))
+ (rename-file file1 (expand-file-name "playlist.m3u" test-dir))
+
+ (let ((cj/music-m3u-root test-dir))
+ (let ((result (cj/music--get-m3u-basenames)))
+ (should (equal result '("playlist")))
+ ;; Verify no .m3u extension present
+ (should-not (string-match-p "\\.m3u" (car result))))))
+ (test-music-config--get-m3u-basenames-teardown)))
+
+(ert-deftest test-music-config--get-m3u-basenames-boundary-spaces-in-filename-preserved ()
+ "Basenames with spaces preserve the spaces."
+ (test-music-config--get-m3u-basenames-setup)
+ (unwind-protect
+ (let* ((test-dir (cj/create-test-subdirectory "playlists"))
+ (file1 (cj/create-temp-test-file-with-content "" "test.m3u")))
+ (rename-file file1 (expand-file-name "My Favorite Songs.m3u" test-dir))
+
+ (let ((cj/music-m3u-root test-dir))
+ (let ((result (cj/music--get-m3u-basenames)))
+ (should (equal result '("My Favorite Songs"))))))
+ (test-music-config--get-m3u-basenames-teardown)))
+
+;;; Error Cases
+
+(ert-deftest test-music-config--get-m3u-basenames-error-nonexistent-directory-signals-error ()
+ "Nonexistent directory signals error."
+ (let ((cj/music-m3u-root "/nonexistent/directory/path"))
+ (should-error (cj/music--get-m3u-basenames)
+ :type 'file-error)))
+
+(provide 'test-music-config--get-m3u-basenames)
+;;; test-music-config--get-m3u-basenames.el ends here