blob: cff7f7394ae6db23acd1c2bd7e83532779704e40 (
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
|
;;; test-signel-notify-function.el --- Tests for signel's notify-function dispatch -*- lexical-binding: t -*-
;;; Commentary:
;; signel's receive handler (signel.el in the fork at ~/code/signel)
;; raised notifications through a hardwired `notifications-notify'
;; call. The notification slice (docs/design/signal-client.org,
;; "Notification slice" addendum) replaces that with
;; `signel-notify-function', a customization point called with
;; CHAT-ID, SENDER, and BODY so a config layer can add suppression or
;; route through an external notifier. These tests cover the
;; dispatch: text, sticker, and attachment bodies reach the function
;; with the right arguments, and the default preserves the plain
;; `notifications-notify' behavior.
;;
;; `signel--handle-receive' is exercised directly with synthetic
;; envelope alists; buffer/dashboard side effects are stubbed. No
;; live process needed.
;;; Code:
(require 'ert)
(require 'cl-lib)
(eval-and-compile
(add-to-list 'load-path (expand-file-name "~/code/signel")))
(require 'signel)
(defun test-signel-notify--receive (envelope)
"Run `signel--handle-receive' on ENVELOPE, capturing notify calls.
Returns the list of (CHAT-ID SENDER BODY) argument lists the handler
passed to `signel-notify-function', oldest first. Buffer and
dashboard side effects are stubbed out."
(let (calls)
(cl-letf (((symbol-function 'signel--insert-msg) (lambda (&rest _) nil))
((symbol-function 'signel--dashboard-refresh) (lambda () nil))
((symbol-function 'signel--get-buffer)
(lambda (_) (current-buffer))))
(let ((signel-notify-function
(lambda (chat-id sender body)
(push (list chat-id sender body) calls)))
(signel-auto-open-buffer nil))
(signel--handle-receive `((envelope . ,envelope)))))
(nreverse calls)))
(ert-deftest test-signel-notify-function-text-message ()
"Normal: a text dataMessage calls the function with chat-id, sender, text."
(should (equal (test-signel-notify--receive
'((sourceNumber . "+15551234567")
(sourceName . "Alice")
(dataMessage . ((message . "hi there")))))
'(("+15551234567" "Alice" "hi there")))))
(ert-deftest test-signel-notify-function-sticker-placeholder ()
"Boundary: a sticker with no text gets the [Sticker] placeholder body."
(should (equal (test-signel-notify--receive
'((sourceNumber . "+15551234567")
(sourceName . "Alice")
(dataMessage . ((sticker . ((packId . "p1")))))))
'(("+15551234567" "Alice" "[Sticker]")))))
(ert-deftest test-signel-notify-function-attachment-placeholder ()
"Boundary: an attachment with no text gets the [Attachment] placeholder."
(should (equal (test-signel-notify--receive
'((sourceNumber . "+15551234567")
(sourceName . "Alice")
(dataMessage . ((attachments . [((id . "a1"))])))))
'(("+15551234567" "Alice" "[Attachment]")))))
(ert-deftest test-signel-notify-function-no-data-no-call ()
"Boundary: an envelope with no dataMessage never calls the function."
(should-not (test-signel-notify--receive
'((sourceNumber . "+15551234567")
(sourceName . "Alice")
(typingMessage . ((action . "STARTED")))))))
(ert-deftest test-signel-notify-function-default-preserves-behavior ()
"Normal: the default value raises a plain notifications-notify toast."
(should (eq signel-notify-function #'signel--notify-default))
(let (calls)
(cl-letf (((symbol-function 'notifications-notify)
(lambda (&rest args) (push args calls) nil)))
(signel--notify-default "+15551234567" "Alice" "hi"))
(should (= (length calls) 1))
(let ((args (car calls)))
(should (equal (plist-get args :title) "Signel: Alice"))
(should (equal (plist-get args :body) "hi")))))
(provide 'test-signel-notify-function)
;;; test-signel-notify-function.el ends here
|