aboutsummaryrefslogtreecommitdiff
path: root/tests/test-duet-backend.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-duet-backend.el')
-rw-r--r--tests/test-duet-backend.el39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/test-duet-backend.el b/tests/test-duet-backend.el
index f0a999c..629d2eb 100644
--- a/tests/test-duet-backend.el
+++ b/tests/test-duet-backend.el
@@ -188,6 +188,45 @@ value for a duplicated keyword."
(n (duet--normalize-failure backend '(:exit 1 :stderr "API rate exceeded"))))
(should (eq 'rate-limited (plist-get n :class)))))
+(ert-deftest test-duet-normalize-failure-minimal-branches ()
+ "The minimal normalizer maps each generic failure context to its class."
+ (let ((b (test-duet-backend--fake 'x 1)))
+ (should (eq 'missing-executable
+ (plist-get (duet--normalize-failure b '(:executable-missing t)) :class)))
+ (should (eq 'stalled
+ (plist-get (duet--normalize-failure b '(:timeout t)) :class)))
+ (should (eq 'cancelled
+ (plist-get (duet--normalize-failure b '(:signal 9)) :class)))
+ (should (eq 'backend-unknown-failure
+ (plist-get (duet--normalize-failure b '(:stderr "no exit code")) :class)))))
+
+(ert-deftest test-duet-failure-patterns-predicate-match ()
+ "A :match predicate (not a regexp) is called with the whole context."
+ (let* ((norm (duet-define-cli-failure-patterns
+ (list (list :match (lambda (ctx) (eq 99 (plist-get ctx :exit)))
+ :class 'special :cause "x" :next-actions '(retry)))))
+ (n (funcall norm '(:exit 99 :stderr ""))))
+ (should (eq 'special (plist-get n :class)))))
+
+(ert-deftest test-duet-redact-whole-match-without-group ()
+ "A pattern with no capture group redacts the whole match."
+ (should (equal "<redacted>" (duet--redact "secretvalue" '("secret[a-z]+")))))
+
+(ert-deftest test-duet-backend-check-capability-flags-undeclared ()
+ "A capability asserted but absent from `capabilities' is flagged."
+ (let ((b (test-duet-backend--fake
+ 'cap 10 :cleanup :none
+ :normalizer (duet-define-cli-failure-patterns nil))))
+ (should (cl-some (lambda (s) (string-match-p "resume" s))
+ (duet-backend-check-capability b :resume)))))
+
+(ert-deftest test-duet-backend-check-capability-passes-declared ()
+ "A declared capability on an otherwise-publishable backend passes."
+ (let ((b (test-duet-backend--fake
+ 'cap 10 :cleanup :none :capabilities '(:resume t)
+ :normalizer (duet-define-cli-failure-patterns nil))))
+ (should (null (duet-backend-check-capability b :resume)))))
+
;;; Contract checks — tiered
(ert-deftest test-duet-backend-check-minimum-passes-clean-backend ()