diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-pearl-favorites.el | 83 |
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 |
