aboutsummaryrefslogtreecommitdiff
path: root/tests/test-music-config--save-helpers.el
blob: ffb0a47773181228da35060b64260ba279c15993 (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
;;; test-music-config--save-helpers.el --- save default-name + directory tests -*- coding: utf-8; lexical-binding: t; -*-
;;
;; Author: Craig Jennings <c@cjennings.net>
;;
;;; Commentary:
;; The pure helpers behind the queue-first save flow: which name the save
;; prompt pre-fills (`cj/music--save-default-name') and which directory the
;; file lands in (`cj/music--save-directory').  An all-stream queue saves into
;; the radio playlist home (`cj/music-radio-save-dir'); anything else saves
;; into `cj/music-m3u-root'.

;;; Code:

(require 'ert)

;; Stub dependencies before loading the module.
(defvar cj/custom-keymap (make-sparse-keymap)
  "Stub keymap for testing.")

(let ((emms-dir (car (file-expand-wildcards
                      (expand-file-name "elpa/emms-*" user-emacs-directory)))))
  (when emms-dir (add-to-list 'load-path emms-dir)))

(require 'emms)
(require 'music-config)

(declare-function cj/music--save-default-name "music-config" (tracks file entries))
(declare-function cj/music--save-directory "music-config" (tracks))
(declare-function cj/music-radio--station-track "music-config" (st))

;;; --------------------------- save-default-name -------------------------------

(ert-deftest test-music-save-default-name-normal-associated-file-wins ()
  "Normal: an associated playlist file names the save, station or not."
  (let ((tr (cj/music-radio--station-track '(:name "S" :url "https://s.example/x"))))
    (should (equal (cj/music--save-default-name (list tr) "/pl/jazz.m3u" nil)
                   "jazz"))))

(ert-deftest test-music-save-default-name-normal-station-title ()
  "Normal: with no file, the first url track's station name pre-fills."
  (let ((tr (cj/music-radio--station-track
             '(:name "Groove Salad" :url "https://gs.example/x"))))
    (should (equal (cj/music--save-default-name (list tr) nil nil)
                   "Groove Salad"))))

(ert-deftest test-music-save-default-name-normal-first-url-track-wins ()
  "Normal: a file track ahead of the station doesn't block the station name;
the first URL track with a name wins."
  (let ((f (emms-track 'file "/music/a.flac"))
        (tr (cj/music-radio--station-track
             '(:name "Second Pick" :url "https://sp.example/x"))))
    (should (equal (cj/music--save-default-name (list f tr) nil nil)
                   "Second Pick"))))

(ert-deftest test-music-save-default-name-normal-entries-fallback ()
  "Normal: a propertyless url track resolves its name from ENTRIES."
  (let* ((url "https://legacy.example/s")
         (tr (emms-track 'url url))
         (entries (list (list url :name "Legacy FM" :uuid nil :favicon nil))))
    (should (equal (cj/music--save-default-name (list tr) nil entries)
                   "Legacy FM"))))

(ert-deftest test-music-save-default-name-boundary-no-candidates-nil ()
  "Boundary: no file, no url tracks -> nil (caller falls back to a timestamp)."
  (should-not (cj/music--save-default-name
               (list (emms-track 'file "/music/a.flac")) nil nil))
  (should-not (cj/music--save-default-name nil nil nil)))

;;; ---------------------------- save-directory ---------------------------------

(ert-deftest test-music-save-directory-normal-all-streams-radio-dir ()
  "Normal: an all-stream queue saves into the radio playlist dir."
  (let ((u1 (emms-track 'url "https://a.example/1"))
        (u2 (emms-track 'url "https://b.example/2")))
    (should (equal (cj/music--save-directory (list u1 u2))
                   cj/music-radio-save-dir))))

(ert-deftest test-music-save-directory-normal-mixed-goes-to-m3u-root ()
  "Normal: any non-stream track routes the save to the music playlist root."
  (let ((u (emms-track 'url "https://a.example/1"))
        (f (emms-track 'file "/music/a.flac")))
    (should (equal (cj/music--save-directory (list u f))
                   cj/music-m3u-root))))

(ert-deftest test-music-save-directory-boundary-empty-goes-to-m3u-root ()
  "Boundary: an empty queue defaults to the music playlist root."
  (should (equal (cj/music--save-directory nil) cj/music-m3u-root)))

(provide 'test-music-config--save-helpers)
;;; test-music-config--save-helpers.el ends here