aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test-pearl-favorites.el83
1 files changed, 61 insertions, 22 deletions
diff --git a/tests/test-pearl-favorites.el b/tests/test-pearl-favorites.el
index b6235c7..55808b3 100644
--- a/tests/test-pearl-favorites.el
+++ b/tests/test-pearl-favorites.el
@@ -186,10 +186,10 @@ For an issue node, IDENTIFIER fills the issue's user-facing key."
(cands (pearl--pick-source-candidates favs saved))
(labels (mapcar #'car cands)))
(should (equal labels
- '("[view] Alpha"
+ '("[linear] Alpha"
"[project] Bravo"
- "[saved] All bugs"
- "[saved] My open")))))
+ "[local] All bugs"
+ "[local] My open")))))
(ert-deftest test-pearl-pick-source-candidates-dispatch-from-attached-plist ()
"Dispatch reads the attached source plist, not the display string."
@@ -216,51 +216,53 @@ For an issue node, IDENTIFIER fills the issue's user-facing key."
;;; pick-source candidate builder -- synced local views (view-sync Phase 4)
(ert-deftest test-pearl-pick-source-candidates-synced-saved-query-team-scope ()
- "A team-scoped synced entry renders as `[saved \\u2192 <TeamName>] <Name>'."
+ "A team-scoped synced entry renders as `[local \\u2192 Linear:<TeamName>] <Name>'."
(let* ((teams '(((id . "team-eng-id") (key . "ENG") (name . "Engineering"))))
(saved '(("My team view" :filter (:open t)
:linear-view-id "view-uuid"
:linear-view-team-id "team-eng-id"
:linear-view-shared t)))
(cands (pearl--pick-source-candidates nil saved teams)))
- (should (assoc "[saved → Engineering] My team view" cands))))
+ (should (assoc "[local → Linear:Engineering] My team view" cands))))
(ert-deftest test-pearl-pick-source-candidates-synced-saved-query-personal-scope ()
- "A personal synced entry renders as `[saved \\u2192 Personal] <Name>'."
+ "A personal synced entry renders as `[local \\u2192 Linear:Personal] <Name>'."
(let* ((saved '(("Mine" :filter (:open t)
:linear-view-id "view-uuid"
:linear-view-team-id nil
:linear-view-shared :json-false)))
(cands (pearl--pick-source-candidates nil saved nil)))
- (should (assoc "[saved → Personal] Mine" cands))))
+ (should (assoc "[local → Linear:Personal] Mine" cands))))
(ert-deftest test-pearl-pick-source-candidates-synced-saved-query-unknown-team-renders-q ()
- "A synced entry whose team-id isn't in TEAMS renders `[saved \\u2192 ?] <Name>'."
+ "A synced entry whose team-id isn't in TEAMS renders `[local \\u2192 Linear:?] <Name>'."
(let* ((teams '(((id . "other-id") (key . "OTH") (name . "Other"))))
(saved '(("Stale" :filter (:open t)
:linear-view-id "view-uuid"
:linear-view-team-id "gone-team-id")))
(cands (pearl--pick-source-candidates nil saved teams)))
- (should (assoc "[saved → ?] Stale" cands))))
+ (should (assoc "[local → Linear:?] Stale" cands))))
(ert-deftest test-pearl-pick-source-candidates-synced-saved-query-no-teams-arg-renders-q ()
"When TEAMS is nil and an entry has a non-nil team-id, scope is `?'."
(let* ((saved '(("S" :filter (:open t)
:linear-view-id "view-uuid"
:linear-view-team-id "team-x"))))
- (should (assoc "[saved → ?] S"
+ (should (assoc "[local → Linear:?] S"
(pearl--pick-source-candidates nil saved nil)))))
-(ert-deftest test-pearl-pick-source-candidates-synced-saved-query-dispatches-as-view ()
- "A synced entry's source plist has :type view with :id = :linear-view-id."
+(ert-deftest test-pearl-pick-source-candidates-tracked-view-dispatches-as-local-filter ()
+ "Decision 16: a tracked local view dispatches as :type filter (its LOCAL
+filter), not :type view -- the local view is the source of truth."
(let* ((saved '(("S" :filter (:open t)
:linear-view-id "view-uuid-X"
:linear-view-team-id nil)))
(cands (pearl--pick-source-candidates nil saved nil))
- (source (cdr (assoc "[saved → Personal] S" cands))))
- (should (eq 'view (plist-get source :type)))
- (should (equal "view-uuid-X" (plist-get source :id)))
- (should (equal "S" (plist-get source :name)))))
+ (source (cdr (assoc "[local → Linear:Personal] S" cands))))
+ (should (eq 'filter (plist-get source :type)))
+ (should (equal '(:open t) (plist-get source :filter)))
+ (should (equal "S" (plist-get source :name)))
+ (should-not (eq 'view (plist-get source :type)))))
(ert-deftest test-pearl-pick-source-candidates-synced-source-includes-url-when-stored ()
"A synced entry carrying `:linear-view-url' surfaces it in the source plist
@@ -270,7 +272,7 @@ so `pearl-open-current-view-in-linear' can dispatch to the browser."
:linear-view-team-id nil
:linear-view-url "https://linear.app/ws/view/abc")))
(cands (pearl--pick-source-candidates nil saved nil))
- (source (cdr (assoc "[saved → Personal] S" cands))))
+ (source (cdr (assoc "[local → Linear:Personal] S" cands))))
(should (equal "https://linear.app/ws/view/abc"
(plist-get source :url)))))
@@ -281,14 +283,14 @@ source plist; the open-in-Linear command errors cleanly until the user re-syncs.
:linear-view-id "view-uuid-X"
:linear-view-team-id nil)))
(cands (pearl--pick-source-candidates nil saved nil))
- (source (cdr (assoc "[saved → Personal] S" cands))))
+ (source (cdr (assoc "[local → Linear:Personal] S" cands))))
(should-not (plist-get source :url))))
(ert-deftest test-pearl-pick-source-candidates-local-only-saved-query-keeps-saved-label ()
- "A local view without :linear-view-id still renders as `[saved] <Name>' and dispatches as filter."
+ "A local view without :linear-view-id still renders as `[local] <Name>' and dispatches as filter."
(let* ((saved '(("Local" :filter (:open t))))
(cands (pearl--pick-source-candidates nil saved '()))
- (source (cdr (assoc "[saved] Local" cands))))
+ (source (cdr (assoc "[local] Local" cands))))
(should source)
(should (eq 'filter (plist-get source :type)))
(should (equal '(:open t) (plist-get source :filter)))))
@@ -302,8 +304,8 @@ source plist; the open-in-Linear command errors cleanly until the user re-syncs.
:linear-view-team-id "team-eng-id")))
(cands (pearl--pick-source-candidates nil saved teams))
(labels (mapcar #'car cands)))
- (should (member "[saved] Local thing" labels))
- (should (member "[saved → Engineering] Synced thing" labels))))
+ (should (member "[local] Local thing" labels))
+ (should (member "[local → Linear:Engineering] Synced thing" labels))))
;;; pearl--saved-query-scope-label
@@ -356,5 +358,42 @@ source plist; the open-in-Linear command errors cleanly until the user re-syncs.
:type 'user-error)
(should-not visited))))
+;;; cross-store duplicate display (Phase 4)
+
+(ert-deftest test-pearl-pick-source-candidates-dedupes-same-id-favorite ()
+ "A Linear view favorite whose id matches a tracked local view is dropped,
+leaving the editable local entry as the only one shown."
+ (let* ((favs (list (test-pearl-fav--norm 'view "view-shared" "Shared")))
+ (saved '(("Shared local" :filter (:open t)
+ :linear-view-id "view-shared"
+ :linear-view-team-id nil)))
+ (cands (pearl--pick-source-candidates favs saved nil))
+ (labels (mapcar #'car cands)))
+ ;; the favorite is deduped away; only the local tracked entry remains
+ (should (= 1 (length cands)))
+ (should (member "[local → Linear:Personal] Shared local" labels))
+ (should-not (member "[linear] Shared" labels))))
+
+(ert-deftest test-pearl-pick-source-candidates-keeps-unmirrored-linear-favorite ()
+ "A Linear view favorite with no matching tracked local view is kept as [linear]."
+ (let* ((favs (list (test-pearl-fav--norm 'view "view-other" "Other")))
+ (saved '(("Local" :filter (:open t)
+ :linear-view-id "view-different"
+ :linear-view-team-id nil)))
+ (cands (pearl--pick-source-candidates favs saved nil))
+ (labels (mapcar #'car cands)))
+ (should (member "[linear] Other" labels))
+ (should (member "[local → Linear:Personal] Local" labels))))
+
+(ert-deftest test-pearl-pick-source-candidates-same-name-different-store-both-shown ()
+ "A local view and a Linear view favorite that merely share a name both appear."
+ (let* ((favs (list (test-pearl-fav--norm 'view "v-id" "My bugs")))
+ (saved '(("My bugs" :filter (:labels ("bug") :open t))))
+ (cands (pearl--pick-source-candidates favs saved nil))
+ (labels (mapcar #'car cands)))
+ (should (= 2 (length cands)))
+ (should (member "[linear] My bugs" labels))
+ (should (member "[local] My bugs" labels))))
+
(provide 'test-pearl-favorites)
;;; test-pearl-favorites.el ends here