aboutsummaryrefslogtreecommitdiff
path: root/tests/test-calibredb-epub-config--epub-mode.el
blob: a65bdabf46c2f4382c0d57f890535b1c503bdcd7 (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
;;; test-calibredb-epub-config--epub-mode.el --- Tests for epub mode resolution -*- lexical-binding: t; -*-

;;; Commentary:
;; Tests that .epub files reach nov-mode through `auto-mode-alist' alone, with
;; no advice on `set-auto-mode'.
;;
;; Background: the module used to carry an :around advice on `set-auto-mode'
;; forcing nov-mode for .epub, added to keep `magic-fallback-mode-alist' from
;; opening the zip container in archive-mode.  It was never needed.
;; `set-auto-mode' consults `auto-mode-alist' before `magic-fallback-mode-alist',
;; and nov's use-package :mode registers "\\.epub\\'" there, so the alist
;; already won.  Verified live on the daemon: a real zip-format .epub opened in
;; nov-mode both with the advice and with it removed.
;;
;; The advice was not free.  `set-auto-mode' runs on every file visit, so the
;; advice put a redundant frame and an extra failure surface on the path for
;; every file of every type.
;;
;; The second test is a regression guard: it fails if the advice is ever
;; reinstated, which is the mistake this cleanup exists to prevent.
;;
;; Test organization:
;; - Normal Cases: .epub resolves to nov-mode; no advice on set-auto-mode
;; - Boundary Cases: a path merely containing "epub", and a bare "epub" name
;; - Error Cases: an unrelated extension does not resolve to nov-mode
;;
;;; Code:

(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
(require 'calibredb-epub-config)

(defun test-epub-mode--resolve (filename)
  "Return the major mode `auto-mode-alist' assigns to FILENAME."
  (assoc-default filename auto-mode-alist 'string-match))

;;; Normal Cases

(ert-deftest test-calibredb-epub-config-epub-resolves-to-nov-mode ()
  "Normal: auto-mode-alist maps a .epub file to nov-mode on its own."
  (should (eq 'nov-mode (test-epub-mode--resolve "book.epub"))))

(ert-deftest test-calibredb-epub-config-no-set-auto-mode-advice ()
  "Normal: nothing advises set-auto-mode to force nov-mode.
Regression guard.  auto-mode-alist already wins over
magic-fallback-mode-alist, so an advice here would be redundant work on
every file visit."
  (should-not (advice-member-p 'cj/force-nov-mode-for-epub 'set-auto-mode))
  (should-not (fboundp 'cj/force-nov-mode-for-epub)))

;;; Boundary Cases

(ert-deftest test-calibredb-epub-config-epub-in-directory-name ()
  "Boundary: the extension anchors at the end, so a directory named epub
does not by itself select nov-mode."
  (should-not (eq 'nov-mode (test-epub-mode--resolve "/home/user/epub/notes.txt"))))

(ert-deftest test-calibredb-epub-config-epub-with-path ()
  "Boundary: a full path with directories still resolves on the extension."
  (should (eq 'nov-mode (test-epub-mode--resolve "/home/user/books/a b.epub"))))

;;; Error Cases

(ert-deftest test-calibredb-epub-config-other-extension-not-nov ()
  "Error: an unrelated extension must not resolve to nov-mode."
  (should-not (eq 'nov-mode (test-epub-mode--resolve "archive.zip")))
  (should-not (eq 'nov-mode (test-epub-mode--resolve "notes.org"))))

(provide 'test-calibredb-epub-config--epub-mode)
;;; test-calibredb-epub-config--epub-mode.el ends here