Browse Source

refactoring + new tests

master
Christian Mueller 12 years ago
parent
commit
c80918f390
  1. 9
      src/notehub/api.clj
  2. 14
      src/notehub/handler.clj
  3. 22
      test/notehub/test/api.clj

9
src/notehub/api.clj

@ -46,7 +46,7 @@
(map #(+ (second %) (.get (Calendar/getInstance) (first %))) (map #(+ (second %) (.get (Calendar/getInstance) (first %)))
{Calendar/YEAR 0, Calendar/MONTH 1, Calendar/DAY_OF_MONTH 0})) {Calendar/YEAR 0, Calendar/MONTH 1, Calendar/DAY_OF_MONTH 0}))
(defn create-response (defn- create-response
([success] {:success success}) ([success] {:success success})
([success message & params] ([success message & params]
(assoc (create-response success) :message (apply format message params)))) (assoc (create-response success) :message (apply format message params))))
@ -59,6 +59,13 @@
(str domain "/" (storage/create-short-url token {:year year :month month :day day :title title})) (str domain "/" (storage/create-short-url token {:year year :month month :day day :title title}))
(str domain (url year month day title)))))) (str domain (url year month day title))))))
(defn version-manager [f params]
(if-let [version (:version params)]
(f (if (and (:noteID params) (< (Double/parseDouble version) 1.3))
(assoc params :noteID (sreplace (params :noteID) #" " "/"))
params))
(create-response false "API version expected")))
(defn get-note [{:keys [noteID]}] (defn get-note [{:keys [noteID]}]
(if (storage/note-exists? noteID) (if (storage/note-exists? noteID)
(let [note (storage/get-note noteID)] (let [note (storage/get-note noteID)]

14
src/notehub/handler.clj

@ -90,27 +90,19 @@
{:headers {"Content-Type" ctype} {:headers {"Content-Type" ctype}
:body content}) :body content})
(defn version-manager [f params]
(generate-string
(if-let [version (:version params)]
(f (if (and (:noteID params) (< (Float/parseFloat version) 1.3))
(assoc params :noteID (sreplace (params :noteID) #" " "/"))
params))
(api/create-response false "API version expected"))))
(defroutes api-routes (defroutes api-routes
(GET "/" [] (layout (get-message :api-title) (GET "/" [] (layout (get-message :api-title)
(md-node :article (slurp "API.md")))) (md-node :article (slurp "API.md"))))
(GET "/note" {params :params} (GET "/note" {params :params}
(version-manager api/get-note params)) (generate-string (api/version-manager api/get-note params)))
(POST "/note" {params :params} (POST "/note" {params :params}
(version-manager api/post-note params)) (generate-string (api/version-manager api/post-note params)))
(PUT "/note" {params :params} (PUT "/note" {params :params}
(version-manager api/update-note params))) (generate-string (api/version-manager api/update-note params))))
(defroutes app-routes (defroutes app-routes
(context "/api" [] api-routes) (context "/api" [] api-routes)

22
test/notehub/test/api.clj

@ -19,8 +19,8 @@
(defn send-request (defn send-request
([resource] (send-request resource {})) ([resource] (send-request resource {}))
([resource params] ([resource params]
(let [[method url] (if (vector? resource) resource [:get resource])] (let [[method url] (if (vector? resource) resource [:get resource])]
(app-routes {:request-method method :uri url :params params})))) (app-routes {:request-method method :uri url :params params}))))
(defn has-status [input status] (defn has-status [input status]
(= status (:status input))) (= status (:status input)))
@ -59,9 +59,9 @@
(let [su (last (clojure.string/split (:shortURL get-response) #"/"))] (let [su (last (clojure.string/split (:shortURL get-response) #"/"))]
(is (= su (storage/create-short-url (:noteID post-response) (storage/resolve-url su))))) (is (= su (storage/create-short-url (:noteID post-response) (storage/resolve-url su)))))
(let [resp (send-request (let [resp (send-request
(clojure.string/replace (:shortURL get-response) domain "")) (clojure.string/replace (:shortURL get-response) domain ""))
resp (send-request ((:headers resp) "Location"))] resp (send-request ((:headers resp) "Location"))]
(is (substring? "hello world"(:body resp)))) (is (substring? "hello world"(:body resp))))
(is (= (:publisher get-response) pid)) (is (= (:publisher get-response) pid))
(is (= (:title get-response) (derive-title note))) (is (= (:title get-response) (derive-title note)))
(is (= "1" (get-in get-response [:statistics :views]))) (is (= "1" (get-in get-response [:statistics :views])))
@ -95,13 +95,13 @@
(is (= "signature invalid" (:message (:status update-response))))) (is (= "signature invalid" (:message (:status update-response)))))
(is (= note (:note (get-note {:noteID note-id})))) (is (= note (:note (get-note {:noteID note-id}))))
(let [update-response (update-note {:noteID note-id :note new-note :pid pid (let [update-response (update-note {:noteID note-id :note new-note :pid pid
:signature (storage/sign pid psk note-id new-note "passwd") :signature (storage/sign pid psk note-id new-note "passwd")
:password "passwd"})] :password "passwd"})]
(is (= { :success true } (:status update-response))) (is (= { :success true } (:status update-response)))
(isnt (= nil (get-in (get-note {:noteID note-id}) [:statistics :edited]))) (isnt (= nil (get-in (get-note {:noteID note-id}) [:statistics :edited])))
(is (= new-note (:note (get-note {:noteID note-id}))))) (is (= new-note (:note (get-note {:noteID note-id})))))
(let [update-response (update-note {:noteID note-id :note "aaa" :pid pid (let [update-response (update-note {:noteID note-id :note "aaa" :pid pid
:signature (storage/sign pid psk note-id "aaa" "pass") :signature (storage/sign pid psk note-id "aaa" "pass")
:password "pass"})] :password "pass"})]
(isnt (:success (:status update-response))) (isnt (:success (:status update-response)))
(is (= "password invalid" (:message (:status update-response))))) (is (= "password invalid" (:message (:status update-response)))))
@ -121,6 +121,14 @@
(is (get-in body ["status" "success"])) (is (get-in body ["status" "success"]))
(is (= note ((parse-string (is (= note ((parse-string
(:body (send-request [:get "/api/note"] {:version "1.0" :noteID noteID}))) "note"))) (:body (send-request [:get "/api/note"] {:version "1.0" :noteID noteID}))) "note")))
(is (= "API version expected" ((parse-string
(:body (send-request [:get "/api/note"] {:noteID noteID}))) "message")))
(is (= note ((parse-string
(:body (send-request [:get "/api/note"] {:version "1.1"
:noteID (clojure.string/replace noteID #"/" " ")}))) "note")))
(isnt (= note ((parse-string
(:body (send-request [:get "/api/note"] {:version "1.3"
:noteID (clojure.string/replace noteID #"/" " ")}))) "note")))
(is (do (is (do
(storage/delete-note noteID) (storage/delete-note noteID)
(not (storage/note-exists? noteID))))))) (not (storage/note-exists? noteID)))))))

Loading…
Cancel
Save