summaryrefslogtreecommitdiff
path: root/tests/test-music-config--get-m3u-files.el
blob: 2d31d55450c0f9c687f01bcbff9e40f6f18116c3 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
;;; test-music-config--get-m3u-files.el --- Tests for M3U file discovery -*- coding: utf-8; lexical-binding: t; -*-
;;
;; Author: Craig Jennings <c@cjennings.net>
;;
;;; Commentary:
;; Unit tests for cj/music--get-m3u-files function.
;; Tests the helper that discovers M3U files in the music directory.
;;
;; Test organization:
;; - Normal Cases: Multiple M3U files, single file
;; - Boundary Cases: Empty directory, non-M3U files, various filenames
;; - 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-files-setup ()
  "Setup test environment."
  (cj/create-test-base-dir))

(defun test-music-config--get-m3u-files-teardown ()
  "Clean up test environment."
  (cj/delete-test-base-dir))

;;; Normal Cases

(ert-deftest test-music-config--get-m3u-files-normal-multiple-files-returns-list ()
  "Discover multiple M3U files returns list of (basename . fullpath) conses."
  (test-music-config--get-m3u-files-setup)
  (unwind-protect
      (let* ((test-dir (cj/create-test-subdirectory "playlists"))
             (file1 (cj/create-temp-test-file-with-content "" "playlist1.m3u"))
             (file2 (cj/create-temp-test-file-with-content "" "playlist2.m3u"))
             (file3 (cj/create-temp-test-file-with-content "" "playlist3.m3u")))
        ;; Move files to test-dir
        (rename-file file1 (expand-file-name "playlist1.m3u" test-dir))
        (rename-file file2 (expand-file-name "playlist2.m3u" test-dir))
        (rename-file file3 (expand-file-name "playlist3.m3u" test-dir))

        (let ((cj/music-m3u-root test-dir))
          (let ((result (cj/music--get-m3u-files)))
            (should (= (length result) 3))
            ;; Check structure: list of (basename . fullpath) conses
            ;; Sort for consistent comparison (directory-files order is filesystem-dependent)
            (let ((basenames (sort (mapcar #'car result) #'string<))
                  (fullpaths (sort (mapcar #'cdr result) #'string<)))
              (should (equal basenames '("playlist1.m3u" "playlist2.m3u" "playlist3.m3u")))
              (should (equal fullpaths
                            (list (expand-file-name "playlist1.m3u" test-dir)
                                  (expand-file-name "playlist2.m3u" test-dir)
                                  (expand-file-name "playlist3.m3u" test-dir))))))))
    (test-music-config--get-m3u-files-teardown)))

(ert-deftest test-music-config--get-m3u-files-normal-single-file-returns-list ()
  "Discover single M3U file returns single-item list."
  (test-music-config--get-m3u-files-setup)
  (unwind-protect
      (let* ((test-dir (cj/create-test-subdirectory "playlists"))
             (file1 (cj/create-temp-test-file-with-content "" "myplaylist.m3u")))
        (rename-file file1 (expand-file-name "myplaylist.m3u" test-dir))

        (let ((cj/music-m3u-root test-dir))
          (let ((result (cj/music--get-m3u-files)))
            (should (= (length result) 1))
            (should (equal (caar result) "myplaylist.m3u"))
            (should (equal (cdar result) (expand-file-name "myplaylist.m3u" test-dir))))))
    (test-music-config--get-m3u-files-teardown)))

;;; Boundary Cases

(ert-deftest test-music-config--get-m3u-files-boundary-empty-directory-returns-empty ()
  "Discover M3U files in empty directory returns empty list."
  (test-music-config--get-m3u-files-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-files)))
            (should (null result)))))
    (test-music-config--get-m3u-files-teardown)))

(ert-deftest test-music-config--get-m3u-files-boundary-non-m3u-files-ignored ()
  "Directory with non-M3U files returns empty list."
  (test-music-config--get-m3u-files-setup)
  (unwind-protect
      (let* ((test-dir (cj/create-test-subdirectory "mixed-files"))
             (txt-file (cj/create-temp-test-file-with-content "" "readme.txt"))
             (mp3-file (cj/create-temp-test-file-with-content "" "song.mp3"))
             (json-file (cj/create-temp-test-file-with-content "" "data.json")))
        (rename-file txt-file (expand-file-name "readme.txt" test-dir))
        (rename-file mp3-file (expand-file-name "song.mp3" test-dir))
        (rename-file json-file (expand-file-name "data.json" test-dir))

        (let ((cj/music-m3u-root test-dir))
          (let ((result (cj/music--get-m3u-files)))
            (should (null result)))))
    (test-music-config--get-m3u-files-teardown)))

(ert-deftest test-music-config--get-m3u-files-boundary-m3u-with-spaces-included ()
  "M3U files with spaces in name are discovered."
  (test-music-config--get-m3u-files-setup)
  (unwind-protect
      (let* ((test-dir (cj/create-test-subdirectory "playlists"))
             (file1 (cj/create-temp-test-file-with-content "" "my-playlist.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-files)))
            (should (= (length result) 1))
            (should (equal (caar result) "My Favorite Songs.m3u")))))
    (test-music-config--get-m3u-files-teardown)))

(ert-deftest test-music-config--get-m3u-files-boundary-mixed-m3u-and-other-files ()
  "Directory with both M3U and non-M3U files returns only M3U files."
  (test-music-config--get-m3u-files-setup)
  (unwind-protect
      (let* ((test-dir (cj/create-test-subdirectory "mixed"))
             (m3u-file (cj/create-temp-test-file-with-content "" "playlist.m3u"))
             (txt-file (cj/create-temp-test-file-with-content "" "readme.txt"))
             (mp3-file (cj/create-temp-test-file-with-content "" "song.mp3")))
        (rename-file m3u-file (expand-file-name "playlist.m3u" test-dir))
        (rename-file txt-file (expand-file-name "readme.txt" test-dir))
        (rename-file mp3-file (expand-file-name "song.mp3" test-dir))

        (let ((cj/music-m3u-root test-dir))
          (let ((result (cj/music--get-m3u-files)))
            (should (= (length result) 1))
            (should (equal (caar result) "playlist.m3u")))))
    (test-music-config--get-m3u-files-teardown)))

;;; Error Cases

(ert-deftest test-music-config--get-m3u-files-error-nonexistent-directory-signals-error ()
  "Nonexistent directory signals error."
  (let ((cj/music-m3u-root "/nonexistent/directory/path"))
    (should-error (cj/music--get-m3u-files)
                  :type 'file-error)))

(provide 'test-music-config--get-m3u-files)
;;; test-music-config--get-m3u-files.el ends here