summaryrefslogtreecommitdiff
path: root/test/weepinbell/retriever_test.clj
blob: 72a5bf79c5ec9eefff405649c3bf38df2905246e (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
(ns weepinbell.retriever-test
  (:require [clojure.test :refer [deftest testing is]]
            [weepinbell.utils.digest :refer [digest]]
            [weepinbell.webserver.retriever :as ret]))

(def page-size 1)

(defn- make-bare-wm [number]
  {:webmention {:source (str number) :target (str number)
                :id (digest (str number)) 
                :modified (System/currentTimeMillis)}})
(defn- make-typed-wm [type number]
  (-> (make-bare-wm number)
      (assoc :jf2 {:wm-property type})))

(deftest retrieve-by-domain-test
  (testing "by-domain list paging"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-data (mapv make-bare-wm (range 2))
            mock-store {:get-by-domain (fn [& _] mock-data)}
            resp0 (ret/by-domain "" 0 mock-store {})
            resp1 (ret/by-domain "" 1 mock-store {})]
        (is (= page-size (count (:body resp0))))
        (is (= page-size (count (:body resp1)))))))
  (testing "by-domain return 404 when list is empty"
    (let [mock-store {:get-by-domain (fn [& _] [])}
          resp (ret/by-domain "" nil mock-store {})]
      (is (= 404 (:status resp)))
      (is (= "The requested webmention list does not exist."
             (get-in resp [:body :message]))))))

(deftest retrieve-by-url-test
  (testing "by-url list paging"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-data (mapv make-bare-wm (range 2))
            mock-store {:get-by-domain (fn [& _] mock-data)}
            resp0 (ret/by-url "2" 0 mock-store {})
            resp1 (ret/by-url "2" 1 mock-store {})]
        (is (= page-size (count (:body resp0))))
        (is (= page-size (count (:body resp1)))))))
  (testing "by-url with no url provieded"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-store {:get-by-domain (fn [& _])}
            resp (ret/by-url nil 0 mock-store {})]
        (is (= 400 (:status resp)))
        (is (= "Missing URL. Specify target URL whose webmentions you are querying."
               (get-in resp [:body :message]))))))
  (testing "by-url return 404 when list is empty"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-store {:get-by-domain (fn [& _])}
            resp (ret/by-url "" nil mock-store {})]
        (is (= 404 (:status resp)))
        (is (= "The requested webmention list does not exist."
               (get-in resp [:body :message])))))))

(defn- should-404 [data]
  (let [mock-store {:get (fn [& _] data)}
          resp (ret/by-id "" mock-store)]
      (is (= 404 (:status resp)))
      (is (= "The requested webmention does not exist."
             (get-in resp [:body :message])))))
(deftest retrieve-by-id-test
  (testing "by-id return 404 when no webmention is matched"
    (doseq [no-data [{} [] nil]]
      (should-404 no-data))))

(deftest filter-by-jf2type-test
  (testing "by-domain ?jf2type filter"
    (let [like-wms (mapv (partial make-typed-wm :like-of) (range 2))
          reply-wms (mapv (partial make-typed-wm :in-reply-to) (range 3))
          mock-data (reduce into [] [like-wms reply-wms])
          mock-store {:get-by-domain (fn [& _] mock-data)}
          ;; responses
          resp-like (ret/by-domain "" 0 mock-store {:type :like-of})
          resp-reply (ret/by-domain "" 0 mock-store {:type :in-reply-to})]
      (is (= reply-wms (:body resp-reply)))
      (is (= like-wms (:body resp-like)))))
  (testing "by-url ?jf2type filter"
    (let [like-wms (mapv (partial make-typed-wm :like-of) (range 2))
          reply-wms (mapv (partial make-typed-wm :in-reply-to) (range 3))
          mock-data (reduce into [] [like-wms reply-wms])
          mock-store {:get-by-domain (fn [& _] mock-data)}
          ;; responses
          resp-like (ret/by-url "" 0 mock-store {:type :like-of})
          resp-reply (ret/by-url "" 0 mock-store {:type :in-reply-to})]
      (is (= reply-wms (:body resp-reply)))
      (is (= like-wms (:body resp-like))))))

(deftest paging-edge-cases-test
  (testing "if page is a string that can be parsed to number, it should work"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-data (mapv make-bare-wm (range 2))
            mock-store {:get-by-domain (fn [& _] mock-data)}
            resp0 (ret/by-domain "" "0" mock-store {})
            resp1 (ret/by-domain "" 0 mock-store {})]
        (is (= resp0 resp1)))))
  (testing "if page is not number, return the last page frame"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-data (mapv make-bare-wm (range 2))
            mock-store {:get-by-domain (fn [& _] mock-data)}
            resp (ret/by-domain "" true mock-store {})]
        (is (= 200 (:status resp)))
        (is (= (-> mock-data last :webmention)
               (-> resp :body last :webmention))))))
  (testing "if page is larger than total amount of pages, return error"
    (with-redefs [weepinbell.webserver.retriever/default-page-size page-size]
      (let [mock-data [(make-bare-wm page-size)]
            mock-store {:get-by-domain (fn [& _] mock-data)}
            resp (ret/by-domain "" (inc page-size) mock-store {})]
        (is (= 400 (:status resp)))))))