aboutsummaryrefslogtreecommitdiff
path: root/tests/test-dev-fkeys--projectile-advice-install.el
blob: bfa9b691f01879fc1155272c402523352f79dd95 (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
;;; test-dev-fkeys--projectile-advice-install.el --- Tests for Projectile advice setup -*- lexical-binding: t -*-

;;; Commentary:
;; Smoke tests for the load-order contract between dev-fkeys.el and Projectile.
;; Requiring dev-fkeys should not force Projectile to load, but the command-cache
;; revert advice should be installed once Projectile is available.

;;; Code:

(require 'ert)
(require 'cl-lib)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
(require 'dev-fkeys)

(ert-deftest test-dev-fkeys-projectile-advice-register-defers-until-projectile-loads ()
  "When Projectile is not loaded, registration should use `eval-after-load'."
  (let (registered-feature registered-form install-called)
    (cl-letf (((symbol-function 'featurep)
               (lambda (feature) (and (not (eq feature 'projectile))
                                      (featurep feature))))
              ((symbol-function 'eval-after-load)
               (lambda (feature form)
                 (setq registered-feature feature
                       registered-form form)))
              ((symbol-function 'cj/--projectile-install-revert-advice)
               (lambda () (setq install-called t))))
      (cj/--projectile-register-revert-advice))
    (should (eq registered-feature 'projectile))
    (should (equal registered-form '(cj/--projectile-install-revert-advice)))
    (should-not install-called)))

(ert-deftest test-dev-fkeys-projectile-advice-register-installs-when-projectile-loaded ()
  "When Projectile is already loaded, registration should install immediately."
  (let (install-called eval-after-load-called)
    (cl-letf (((symbol-function 'featurep)
               (lambda (feature) (eq feature 'projectile)))
              ((symbol-function 'eval-after-load)
               (lambda (&rest _args) (setq eval-after-load-called t)))
              ((symbol-function 'cj/--projectile-install-revert-advice)
               (lambda () (setq install-called t))))
      (cj/--projectile-register-revert-advice))
    (should install-called)
    (should-not eval-after-load-called)))

(ert-deftest test-dev-fkeys-projectile-advice-install-skips-unbound-projectile-functions ()
  "The installer should not advise Projectile functions that are not bound."
  (let (advised)
    (cl-letf (((symbol-function 'fboundp)
               (lambda (symbol)
                 (and (not (memq symbol '(projectile-compile-project
                                           projectile-test-project
                                           projectile-run-project)))
                      (fboundp symbol))))
              ((symbol-function 'advice-add)
               (lambda (symbol &rest _args)
                 (push symbol advised))))
      (cj/--projectile-install-revert-advice))
    (should-not advised)))

(ert-deftest test-dev-fkeys-projectile-advice-install-advises-bound-projectile-functions ()
  "The installer should advise each available Projectile command runner."
  (let (advised)
    (cl-letf (((symbol-function 'fboundp)
               (lambda (symbol)
                 (or (memq symbol '(projectile-compile-project
                                     projectile-test-project
                                     projectile-run-project))
                     (fboundp symbol))))
              ((symbol-function 'advice-member-p)
               (lambda (&rest _args) nil))
              ((symbol-function 'advice-add)
               (lambda (symbol _where function &rest _args)
                 (push (list symbol function) advised))))
      (cj/--projectile-install-revert-advice))
    (should (member '(projectile-compile-project
                      cj/--projectile-compile-around-revert)
                    advised))
    (should (member '(projectile-test-project
                      cj/--projectile-test-around-revert)
                    advised))
    (should (member '(projectile-run-project
                      cj/--projectile-run-around-revert)
                    advised))))

(provide 'test-dev-fkeys--projectile-advice-install)
;;; test-dev-fkeys--projectile-advice-install.el ends here