summaryrefslogtreecommitdiff
path: root/tests/test-music-config--get-m3u-basenames.el
blob: 91c8af70325c2fdfa88f6fcc7978bb1e34f4fbf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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