aboutsummaryrefslogtreecommitdiff
path: root/tests/test-pearl-fields.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-24 14:56:47 -0500
committerCraig Jennings <c@cjennings.net>2026-05-24 14:56:47 -0500
commit44b7e8e42383a0e2c7024f250c2d16de6b66c652 (patch)
tree5dd8ab04a39b3847b03dc4cf7cb1240628366832 /tests/test-pearl-fields.el
parentba58f66332e6a8692d985f4d5478c743fca9bcb7 (diff)
downloadpearl-44b7e8e42383a0e2c7024f250c2d16de6b66c652.tar.gz
pearl-44b7e8e42383a0e2c7024f250c2d16de6b66c652.zip
test: cover field-setter command failure branches
Added ERT tests that the four field setters preserve local org state when the issueUpdate mutation fails (returns :success nil): set-priority keeps the cookie, set-state keeps the TODO keyword and LINEAR-STATE drawer, set-assignee keeps the assignee drawer, set-labels keeps the labels drawer. Each test also asserts the push was attempted with the intended input, so a regression that simply stopped calling the API would still fail rather than pass silently. The commands already behave correctly — this locks it. 357 tests green.
Diffstat (limited to 'tests/test-pearl-fields.el')
-rw-r--r--tests/test-pearl-fields.el31
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/test-pearl-fields.el b/tests/test-pearl-fields.el
index 7322e4f..3722486 100644
--- a/tests/test-pearl-fields.el
+++ b/tests/test-pearl-fields.el
@@ -105,6 +105,20 @@
(test-pearl--in-org "* Plain heading\nno id\n"
(should-error (pearl-set-priority "High") :type 'user-error)))
+(ert-deftest test-pearl-set-priority-failure-preserves-cookie ()
+ "A failed priority push attempts the mutation but leaves the cookie unchanged."
+ (let (pushed)
+ (test-pearl--in-org "*** TODO [#C] Title\n:PROPERTIES:\n:LINEAR-ID: a\n:END:\n"
+ (cl-letf (((symbol-function 'pearl--update-issue-async)
+ (lambda (_id input cb) (setq pushed input) (funcall cb '(:success nil)))))
+ (re-search-forward "Title")
+ (pearl-set-priority "High")
+ ;; the push was attempted with the intended value ...
+ (should (equal 2 (cdr (assoc "priority" pushed))))
+ ;; ... but the local cookie is still #C, not #B.
+ (goto-char (point-min))
+ (should (string-match-p "^\\*\\*\\* TODO \\[#C\\] Title" (thing-at-point 'line t)))))))
+
;;; --set-heading-state
(ert-deftest test-pearl-set-heading-state-updates-keyword-and-drawer ()
@@ -149,5 +163,22 @@
(test-pearl--in-org "* Plain heading\nno id\n"
(should-error (pearl-set-state "Done") :type 'user-error)))
+(ert-deftest test-pearl-set-state-failure-preserves-keyword-and-drawer ()
+ "A failed state push attempts the mutation but leaves the keyword and drawer unchanged."
+ (let (pushed)
+ (test-pearl--in-org
+ "*** TODO [#B] Title\n:PROPERTIES:\n:LINEAR-ID: a\n:LINEAR-TEAM-ID: team-1\n:LINEAR-STATE-ID: s1\n:LINEAR-STATE-NAME: Todo\n:END:\n"
+ (cl-letf (((symbol-function 'pearl--team-states)
+ (lambda (_t) '(((id . "s1") (name . "Todo"))
+ ((id . "s2") (name . "In Progress")))))
+ ((symbol-function 'pearl--update-issue-async)
+ (lambda (_id input cb) (setq pushed input) (funcall cb '(:success nil)))))
+ (pearl-set-state "In Progress")
+ (should (string= "s2" (cdr (assoc "stateId" pushed))))
+ (goto-char (point-min))
+ (should (string-match-p "^\\*\\*\\* TODO " (thing-at-point 'line t)))
+ (should (string= "Todo" (org-entry-get nil "LINEAR-STATE-NAME")))
+ (should (string= "s1" (org-entry-get nil "LINEAR-STATE-ID")))))))
+
(provide 'test-pearl-fields)
;;; test-pearl-fields.el ends here