blob: 2794972c64d71e650669209e5fbf01c6133c796e (
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
|
;;; test-pearl-default-view.el --- Tests for the configurable default view -*- lexical-binding: t; -*-
;; Copyright (C) 2026 Craig Jennings
;; Author: Craig Jennings <c@cjennings.net>
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Unit tests for the default-view resolver and the `pearl-open-default-view'
;; dispatcher (phase 1 of docs/default-view-spec.org). The resolver returns
;; the active scope's default -- `pearl-default-view' in legacy mode, the
;; active account's `:default-view' in accounts mode. The open command
;; dispatches nil -> my open issues, a known local-view name -> that view, and
;; a stale name -> my open issues with a message (never an error). The two
;; fetch commands are stubbed so no network is touched.
;;; Code:
(require 'test-bootstrap (expand-file-name "test-bootstrap.el"))
;;; pearl--resolve-default-view -- scope resolution
(ert-deftest test-pearl-resolve-default-view-legacy-nil ()
"Legacy mode, no default set: the resolver returns nil."
(let ((pearl-accounts nil)
(pearl-default-view nil))
(should-not (pearl--resolve-default-view))))
(ert-deftest test-pearl-resolve-default-view-legacy-name ()
"Legacy mode with a default set: the resolver returns the local-view name."
(let ((pearl-accounts nil)
(pearl-default-view "My active work"))
(should (string-equal "My active work" (pearl--resolve-default-view)))))
(ert-deftest test-pearl-resolve-default-view-accounts-reads-active ()
"Accounts mode: the resolver returns the *active* account's :default-view."
(let ((pearl-accounts
'(("work" :api-key-source (:literal "kw") :org-file "/tmp/w.org"
:default-view "Work board")
("home" :api-key-source (:literal "kh") :org-file "/tmp/h.org"
:default-view "Home triage")))
(pearl-default-account nil)
(pearl-active-account "work"))
(should (string-equal "Work board" (pearl--resolve-default-view)))))
(ert-deftest test-pearl-resolve-default-view-accounts-switch ()
"Accounts mode: switching the active account switches the resolved default."
(let ((pearl-accounts
'(("work" :api-key-source (:literal "kw") :org-file "/tmp/w.org"
:default-view "Work board")
("home" :api-key-source (:literal "kh") :org-file "/tmp/h.org"
:default-view "Home triage")))
(pearl-default-account nil)
(pearl-active-account "home"))
(should (string-equal "Home triage" (pearl--resolve-default-view)))))
(ert-deftest test-pearl-resolve-default-view-accounts-unset ()
"Accounts mode, active account has no :default-view: the resolver returns nil.
The legacy `pearl-default-view' does not leak in when accounts are configured."
(let ((pearl-accounts
'(("work" :api-key-source (:literal "kw") :org-file "/tmp/w.org")))
(pearl-default-account nil)
(pearl-active-account "work")
(pearl-default-view "Legacy default"))
(should-not (pearl--resolve-default-view))))
(ert-deftest test-pearl-resolve-account-carries-default-view ()
"`pearl--resolve-account' surfaces the account's :default-view in its context."
(let ((pearl-accounts
'(("work" :api-key-source (:literal "kw") :org-file "/tmp/w.org"
:default-view "Work board"))))
(should (string-equal "Work board"
(plist-get (pearl--resolve-account "work") :default-view)))))
;;; pearl-open-default-view -- dispatch
(ert-deftest test-pearl-open-default-view-nil-runs-my-open-issues ()
"An unset default dispatches to `pearl-list-issues' (my open issues)."
(let ((pearl-accounts nil)
(pearl-default-view nil)
(calls nil))
(cl-letf (((symbol-function 'pearl-list-issues)
(lambda (&rest args) (push (cons 'list args) calls)))
((symbol-function 'pearl-run-local-view)
(lambda (name) (push (cons 'view name) calls))))
(pearl-open-default-view)
(should (equal calls '((list)))))))
(ert-deftest test-pearl-open-default-view-name-runs-local-view ()
"A default naming an existing local view dispatches to `pearl-run-local-view'."
(let ((pearl-accounts nil)
(pearl-default-view "My active work")
(pearl-local-views '(("My active work" :filter (:assignee :me :open t))))
(calls nil))
(cl-letf (((symbol-function 'pearl-list-issues)
(lambda (&rest args) (push (cons 'list args) calls)))
((symbol-function 'pearl-run-local-view)
(lambda (name) (push (cons 'view name) calls))))
(pearl-open-default-view)
(should (equal calls '((view . "My active work")))))))
(ert-deftest test-pearl-open-default-view-stale-name-falls-back ()
"A default naming a deleted local view falls back to my open issues, no error.
It dispatches to `pearl-list-issues' and never calls `pearl-run-local-view'."
(let ((pearl-accounts nil)
(pearl-default-view "Deleted view")
(pearl-local-views '(("Some other view" :filter (:open t))))
(calls nil)
(messaged nil))
(cl-letf (((symbol-function 'pearl-list-issues)
(lambda (&rest args) (push (cons 'list args) calls)))
((symbol-function 'pearl-run-local-view)
(lambda (name) (push (cons 'view name) calls)))
((symbol-function 'message)
(lambda (&rest args) (setq messaged (or messaged args)))))
(pearl-open-default-view)
(should (equal calls '((list))))
(should messaged))))
(provide 'test-pearl-default-view)
;;; test-pearl-default-view.el ends here
|