summaryrefslogtreecommitdiff
path: root/tests/test-music-config--valid-file-p.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--valid-file-p.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--valid-file-p.el')
-rw-r--r--tests/test-music-config--valid-file-p.el99
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/test-music-config--valid-file-p.el b/tests/test-music-config--valid-file-p.el
new file mode 100644
index 00000000..8099c50c
--- /dev/null
+++ b/tests/test-music-config--valid-file-p.el
@@ -0,0 +1,99 @@
+;;; test-music-config--valid-file-p.el --- Tests for music file validation -*- coding: utf-8; lexical-binding: t; -*-
+;;
+;; Author: Craig Jennings <c@cjennings.net>
+;;
+;;; Commentary:
+;; Unit tests for cj/music--valid-file-p function.
+;; Tests the pure, deterministic helper that validates music file extensions.
+;;
+;; Test organization:
+;; - Normal Cases: Valid music extensions (case-insensitive)
+;; - Boundary Cases: Edge conditions (no extension, dots in path, empty strings)
+;; - Error Cases: Invalid extensions, nil input
+;;
+;;; Code:
+
+(require 'ert)
+
+;; Stub missing dependencies before loading music-config
+(defvar-keymap cj/custom-keymap
+ :doc "Stub keymap for testing")
+
+;; Load production code
+(require 'music-config)
+
+;;; Normal Cases
+
+(ert-deftest test-music-config--valid-file-p-normal-mp3-extension-returns-true ()
+ "Validate mp3 file extension returns non-nil."
+ (should (cj/music--valid-file-p "/path/to/song.mp3")))
+
+(ert-deftest test-music-config--valid-file-p-normal-flac-extension-returns-true ()
+ "Validate flac file extension returns non-nil."
+ (should (cj/music--valid-file-p "/path/to/song.flac")))
+
+(ert-deftest test-music-config--valid-file-p-normal-all-extensions-return-true ()
+ "Validate all configured music extensions return non-nil."
+ ;; Test each extension from cj/music-file-extensions
+ (dolist (ext '("aac" "flac" "m4a" "mp3" "ogg" "opus" "wav"))
+ (should (cj/music--valid-file-p (format "/path/to/song.%s" ext)))))
+
+(ert-deftest test-music-config--valid-file-p-normal-uppercase-extension-returns-true ()
+ "Validate uppercase extension returns non-nil (case-insensitive)."
+ (should (cj/music--valid-file-p "/path/to/song.MP3")))
+
+(ert-deftest test-music-config--valid-file-p-normal-mixed-case-extension-returns-true ()
+ "Validate mixed-case extension returns non-nil (case-insensitive)."
+ (should (cj/music--valid-file-p "/path/to/song.Mp3"))
+ (should (cj/music--valid-file-p "/path/to/song.FLaC")))
+
+;;; Boundary Cases
+
+(ert-deftest test-music-config--valid-file-p-boundary-dots-in-path-returns-true ()
+ "Validate file with dots in directory path uses only last extension."
+ (should (cj/music--valid-file-p "/path/with.dots/in.directory/song.mp3")))
+
+(ert-deftest test-music-config--valid-file-p-boundary-multiple-extensions-uses-last ()
+ "Validate file with multiple extensions uses rightmost extension."
+ (should (cj/music--valid-file-p "/path/to/song.backup.mp3"))
+ (should (cj/music--valid-file-p "/path/to/song.old.flac")))
+
+(ert-deftest test-music-config--valid-file-p-boundary-just-filename-with-extension-returns-true ()
+ "Validate bare filename without path returns non-nil."
+ (should (cj/music--valid-file-p "song.mp3")))
+
+(ert-deftest test-music-config--valid-file-p-boundary-no-extension-returns-nil ()
+ "Validate file without extension returns nil."
+ (should-not (cj/music--valid-file-p "/path/to/song")))
+
+(ert-deftest test-music-config--valid-file-p-boundary-dot-at-end-returns-nil ()
+ "Validate file ending with dot (empty extension) returns nil."
+ (should-not (cj/music--valid-file-p "/path/to/song.")))
+
+(ert-deftest test-music-config--valid-file-p-boundary-empty-string-returns-nil ()
+ "Validate empty string returns nil."
+ (should-not (cj/music--valid-file-p "")))
+
+;;; Error Cases
+
+(ert-deftest test-music-config--valid-file-p-error-nil-input-returns-nil ()
+ "Validate nil input returns nil gracefully."
+ (should-not (cj/music--valid-file-p nil)))
+
+(ert-deftest test-music-config--valid-file-p-error-non-music-extension-returns-nil ()
+ "Validate non-music file extension returns nil."
+ (should-not (cj/music--valid-file-p "/path/to/document.txt"))
+ (should-not (cj/music--valid-file-p "/path/to/readme.md")))
+
+(ert-deftest test-music-config--valid-file-p-error-image-extension-returns-nil ()
+ "Validate image file extension returns nil."
+ (should-not (cj/music--valid-file-p "/path/to/cover.jpg"))
+ (should-not (cj/music--valid-file-p "/path/to/artwork.png")))
+
+(ert-deftest test-music-config--valid-file-p-error-video-extension-returns-nil ()
+ "Validate video file extension returns nil (mp4 not in list, only m4a)."
+ (should-not (cj/music--valid-file-p "/path/to/video.mp4"))
+ (should-not (cj/music--valid-file-p "/path/to/clip.mkv")))
+
+(provide 'test-music-config--valid-file-p)
+;;; test-music-config--valid-file-p.el ends here