summaryrefslogtreecommitdiff
path: root/test/weepinbell/webhook_test.clj
blob: f7530cc32b5dd136231c4b1ea0cf096e72ddeeac (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(ns weepinbell.webhook-test
  (:require [clojure.test :refer [testing is deftest]]
            [org.httpkit.server :refer [run-server]]
            [ring.middleware.params :refer [wrap-params]]
            [weepinbell.webhook :as webhook]))

(def test-wm-data {:webmention {:target "https://target.net/"
                                :source "https://source.net/"}
                   :extra {:proxied-photo "https://test.com/photo.png"}})

(deftest webhook-test
  (testing "Test webhooks triggers with bark request"
    (let [received (promise)
          payload-ok (promise)
          handler  (fn [req]
                     (deliver received true)
                     (let [params (:form-params req)
                           title (get params "title")
                           icon (get params "icon")
                           url (get params "url")]
                       (when (and (= title "source.net mentioned you!")
                                  (= url "https://source.net/")
                                  (= icon "https://test.com/photo.png"))
                         (deliver payload-ok true)))
                     {:status 200 :headers {} :body "ok"})
          server   (run-server (wrap-params handler) {:port 18888 :join? false})]
      (webhook/trigger :on-create
                       [{:url "http://127.0.0.1:18888/webhook-test"
                         :request-fn :bark}]
                       test-wm-data)
      (is (deref received 2000 nil))
      (is (deref payload-ok 2000 nil))
      (server)))
  (testing "Test webhooks triggers with ntfy request"
    (let [received (promise)
          payload-ok (promise)
          handler  (fn [req]
                     (deliver received true)
                     (let [headers (:headers req)
                           title (get headers "title")
                           icon (get headers "icon")
                           click (get headers "click")]
                       (when (and (= title "source.net mentioned you!")
                                  (= click "https://source.net/")
                                  (= icon "https://test.com/photo.png"))
                         (deliver payload-ok true)))
                     {:status 200 :headers {} :body "ok"})
          server   (run-server handler {:port 18888 :join? false})]
      (webhook/trigger :on-create
                       [{:url "http://127.0.0.1:18888/webhook-test"
                         :request-fn :ntfy}]
                       test-wm-data)
      (is (deref received 2000 nil))
      (is (deref payload-ok 2000 nil))
      (server)))
  (testing "Webhook handle invalid URLs"
    (let [received (promise)
          handler (fn [_] (deliver received true))
          server (run-server handler {:port 18888 :join? false})]
      (webhook/trigger :on-update ["test"] test-wm-data)
      (is (not (deref received 100 false)))
      (server))))

(def test-make (partial webhook/make-url :on-create test-wm-data))
(def test-make-empty (partial webhook/make-url :on-delete {}))
(deftest make-url-test
  (testing "Test webhook replacing dynamic parameters in URL"
    (is (= (test-make "https://webhook.test/{event}")
           "https://webhook.test/on-create"))
    (is (= (test-make "https://webhook.test/{source-domain}_mentioned_you")
           "https://webhook.test/source.net_mentioned_you"))
    (is (= (test-make "https://webhook.test/{source-encoded}/{target-encoded}")
           "https://webhook.test/https%3A%2F%2Fsource.net%2F/https%3A%2F%2Ftarget.net%2F"))
    (is (= (test-make "https://hook.{target-domain}/update")
           "https://hook.target.net/update"))
    (is (= (test-make "https://webhook.test?=source={source}&target={target}")
           "https://webhook.test?=source=https://source.net/&target=https://target.net/")))
  (testing "Dynamic URL parameters with empty data"
    (is (= (test-make-empty "{source}{target}{source-encoded}{target-encoded}{source-domain}{target-domain}{photo}{event}")
           "on-delete"))))

(deftest make-request-test
  (testing "Webhook constructing request options dynamically with presets"
    (is (= (webhook/make-request :on-create test-wm-data :ntfy)
           {:body "from https://source.net/\nto https://target.net/"
            :headers {"Title" "source.net mentioned you!"
                      "Click" "https://source.net/"
                      "Icon" "https://test.com/photo.png"}})))
  (testing "Webhook constructing request options with custom functions"
    (let [custom-map {:body "customized!"}]
      (is (= (webhook/make-request :on-receive test-wm-data (fn [& _] custom-map))
             custom-map))))
  (testing "Unknown request-fn type"
    (is (nil? (webhook/make-request :on-delete test-wm-data "I am a function")))))

(deftest make-actions-test
  (testing "Constructing action map"
    (is (= (webhook/make-actions :default ["https://test.com"
                                           {:url "https://test.net" :request-fn :test-fn}])
           [{:url "https://test.com" :request-fn :default}
            {:url "https://test.net" :request-fn :test-fn}])))
  (testing "Constructing action map with empty data"
    (is (= (webhook/make-actions nil nil) []))
    (is (= (webhook/make-actions :default []) []))))

(deftest make-hooks-test
  (testing "Still need all four event keys even if config has less than four. (:on-create, :on-delete, :on-receive, :on-update)"
    (let [config {:webhook {:on-create ["https://test.url/"]}}
          hooks (webhook/make-hooks config)
          hook-keys (set (keys hooks))
          expected (set [:on-create :on-delete :on-receive :on-update])]
      (is (= hook-keys expected))
      (is (every? fn? (vals hooks))))))