aboutsummaryrefslogtreecommitdiff
path: root/tests/test-org-config--org-follow-link-same-window.el
blob: 57caf6914c0c89466f0924763125b3e011efe97e (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
;;; test-org-config--org-follow-link-same-window.el --- same-window link follow -*- lexical-binding: t; -*-

;;; Commentary:
;; `cj/--org-follow-link-same-window' follows the Org link at point, opening
;; file: links in the *current* window instead of org's default other-window
;; (`org-link-frame-setup' file entry).  It is the kernel behind the S-mouse-1
;; and mouse-3 bindings (`cj/org-follow-link-at-mouse-same-window').  Off a
;; link it does nothing, so a right-click in empty space is a silent no-op
;; rather than org's "No link found" user-error.
;;
;; `org-open-at-point' (the visit boundary) is stubbed to record whether it
;; was called and what the file entry of `org-link-frame-setup' resolved to at
;; call time; real temp Org buffers place point on / off a link.

;;; Code:

(require 'ert)
(require 'cl-lib)
(require 'org)

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

(ert-deftest test-org-config-follow-link-same-window-file-link ()
  "Normal: on a file link, follow it with the file frame-setup as find-file."
  (with-temp-buffer
    (let ((org-mode-hook nil)
          (frame-file nil)
          (called nil))
      (insert "see [[file:/tmp/notes.org][notes]] here")
      (org-mode)
      (goto-char (point-min))
      (search-forward "notes]")
      (backward-char 2)                 ; land inside the link's description
      (cl-letf (((symbol-function 'org-open-at-point)
                 (lambda (&rest _)
                   (setq called t
                         frame-file (cdr (assq 'file org-link-frame-setup))))))
        (cj/--org-follow-link-same-window))
      (should called)
      (should (eq frame-file 'find-file)))))

(ert-deftest test-org-config-follow-link-same-window-off-link-noop ()
  "Boundary: off any link, do nothing (no error, no visit)."
  (with-temp-buffer
    (let ((org-mode-hook nil)
          (called nil))
      (insert "plain text, no link at all")
      (org-mode)
      (goto-char (point-min))
      (cl-letf (((symbol-function 'org-open-at-point)
                 (lambda (&rest _) (setq called t))))
        (cj/--org-follow-link-same-window))
      (should-not called))))

(ert-deftest test-org-config-follow-link-same-window-http-link ()
  "Boundary: on a non-file link, still follow it (frame-setup is harmless)."
  (with-temp-buffer
    (let ((org-mode-hook nil)
          (called nil))
      (insert "site [[https://example.com][example]] end")
      (org-mode)
      (goto-char (point-min))
      (search-forward "example]")
      (backward-char 2)
      (cl-letf (((symbol-function 'org-open-at-point)
                 (lambda (&rest _) (setq called t))))
        (cj/--org-follow-link-same-window))
      (should called))))

(provide 'test-org-config--org-follow-link-same-window)
;;; test-org-config--org-follow-link-same-window.el ends here