Skip to content

Commit dcc1562

Browse files
committed
Use a mock http server for test
1 parent 4d5a7ab commit dcc1562

File tree

5 files changed

+152
-12
lines changed

5 files changed

+152
-12
lines changed

circle.yml

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ machine:
44

55
test:
66
override:
7+
- lein run -m re-crud.mock-http-server:
8+
background: true
9+
- for i in `seq 120`; do nc -v -w 1 localhost 8000 && break ; sleep 1; done
710
- make test

project.clj

+8-4
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
[camel-snake-kebab "0.4.0"]
2222
[cljsjs/reactable "0.14.1-0"]]
2323

24+
:profiles {:dev {:dependencies [[http-kit "2.2.0"]
25+
[bidi "2.0.13"]
26+
[ring/ring-core "1.5.0"]
27+
[ring/ring-devel "1.5.0"]
28+
[ring/ring-json "0.4.0"]]}}
2429
:plugins [[lein-cljsbuild "1.1.4"]
2530
[lein-doo "0.1.7"]]
26-
:hooks [leiningen.cljsbuild]
27-
:min-lein-version "2.5.3"
2831

32+
:min-lein-version "2.5.3"
2933
:doo {:paths {:phantom "phantomjs --web-security=false"}}
3034

31-
:source-paths ["src/cljs"]
35+
:source-paths ["test/clj"]
3236

3337
:clean-targets ^{:protect false} ["resources/public/js/compiled" "target"]
3438

@@ -43,7 +47,7 @@
4347
:closure-defines {goog.DEBUG false}}}
4448
{:id "test"
4549
:source-paths ["src/cljs" "test/cljs"]
46-
:compiler {:output-dir ".cljsbuild/re-crud"
50+
:compiler {:output-dir ".cljsbuild/re-crud-test"
4751
:output-to "re-crud-test.js"
4852
:main re-crud.test-runner
4953
:pretty-print true}}]})

test/clj/re_crud/mock_http_server.clj

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
(ns re-crud.mock-http-server
2+
(:require [org.httpkit.server :as http-server]
3+
[bidi.ring :as bidi]
4+
[ring.middleware.json :refer [wrap-json-body wrap-json-response]]
5+
[ring.util.response :as response]
6+
[re-crud.test-data :as data]))
7+
8+
(def server-instance (atom nil))
9+
10+
(defn swagger [_]
11+
(response/response data/swagger))
12+
13+
(defn get-user [_]
14+
(response/response data/user))
15+
16+
(defn update-user [_]
17+
(response/response data/user))
18+
19+
(def handler
20+
(bidi/make-handler
21+
["/" [["swagger.json" swagger]
22+
["users" [[true {:get get-user
23+
:patch update-user}]]]]]))
24+
25+
(def server
26+
(-> handler
27+
(wrap-json-body {:keywords? true :bigdecimals? true})
28+
(wrap-json-response)))
29+
30+
(defn start-server []
31+
(when-not (some? @server-instance)
32+
(reset! server-instance (http-server/run-server #'server {:port 8000}))
33+
(println "Web server started at port" 8000)))
34+
35+
(defn stop-server []
36+
(when-not (nil? @server-instance)
37+
(@server-instance :timeout 100)
38+
(reset! server-instance nil)))
39+
40+
(defn -main [& args]
41+
(start-server))

test/clj/re_crud/test_data.clj

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
(ns re-crud.test-data
2+
(:import [java.sql Timestamp]))
3+
4+
(defn timestamp []
5+
(Timestamp. (System/currentTimeMillis)))
6+
7+
(def swagger
8+
{"swagger" "2.0"
9+
"info"
10+
{"title" "re-crud-example API"
11+
"description" "This is a regular CRUD app for demo purposes"
12+
"version" "1.0.0"}
13+
"host" "localhost:8000"
14+
"schemes" ["https"]
15+
"basePath" "/"
16+
"produces" ["application/json"]
17+
"paths"
18+
{"/users"
19+
{"get"
20+
{"operationId" "listUsers"
21+
"summary" "List all Users"
22+
"responses"
23+
{"200"
24+
{"description" "An array of users"
25+
"schema" {"type" "array"
26+
"items" {"$ref" "#/definitions/User"}}}}}
27+
"post"
28+
{"summary" "Create a user"
29+
"operationId" "createUser"
30+
"responses" {"200" {"description" "Create A user"
31+
"schema" {"$ref" "#/definitions/User"}}}
32+
"parameters" [{"name" "body"
33+
"in" "body"
34+
"required" true
35+
"schema" {"$ref" "#/definitions/UserParam"}}]}}
36+
"/users/{user-id}"
37+
{"get"
38+
{"summary" "Get a user"
39+
"operationId" "getUser"
40+
"responses" {"200" {"description" "A user"
41+
"schema" {"$ref" "#/definitions/User"}}}
42+
"parameters" [{"name" "user-id"
43+
"in" "path"
44+
"required" true
45+
"type" "number"
46+
"format" "integer"}]}
47+
"patch"
48+
{"summary" "Update a user info"
49+
"operationId" "updateUser"
50+
"responses" {"200" {"description" "Update A user"
51+
"schema" {"$ref" "#/definitions/User"}}}
52+
"parameters"
53+
[{"name" "user-id"
54+
"in" "path"
55+
"required" true
56+
"type" "number"
57+
"format" "integer"}
58+
{"name" "UserParam"
59+
"in" "body"
60+
"required" true
61+
"schema" {"$ref" "#/definitions/UserParam"}}]}
62+
"delete"
63+
{"summary" "Delete a user"
64+
"operationId" "deleteUser"
65+
"responses" {"204" {"description" "User deleted empty response"}}
66+
"parameters" [{"name" "user-id"
67+
"in" "path"
68+
"required" true
69+
"type" "number"
70+
"format" "integer"}]}}}
71+
"definitions"
72+
{"User"
73+
{"type" "object"
74+
"properties"
75+
{"id" {"type" "integer"}
76+
"first_name" {"type" "string"}
77+
"last_name" {"type" "string"}
78+
"email" {"type" "string"}
79+
"created_at" {"type" "string"}
80+
"updated_at" {"type" "string"}}}
81+
"UserParam"
82+
{"type" "object"
83+
"properties" {"first_name" {"type" "string"}
84+
"last_name" {"type" "string"}
85+
"email" {"type" "string"}}}}})
86+
87+
(def user
88+
{:id 1
89+
:first_name "Foo"
90+
:last_name "Bar"
91+
92+
:created_at (timestamp)
93+
:updated_at (timestamp)
94+
:url "/user/1"})

test/cljs/re_crud/core_test.cljs

+6-8
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313

1414
(defn init []
1515
(crud/init
16-
{"test-service" {:service-host "https://re-crud-example.herokuapp.com"
17-
:swagger-url "https://re-crud-example.herokuapp.com/api/swagger.json"
16+
{"test-service" {:service-host "http://localhost:8000"
17+
:swagger-url "http://localhost:8000/swagger.json"
1818
:dispatch-on-ready [:on-ready]}}))
1919

2020
(defn create-components [{:keys [db]} _]
@@ -28,23 +28,21 @@
2828
:after (u/create-fx (fn [response]
2929
(re-frame/dispatch [:assert! :perform response])))}
3030
:config {:service-name "test-service"}})]
31-
(prn (dissoc component :reagent-component))
32-
{:dispatch-n [[:crud-load-component component {:fetch {:user-id 23}
33-
:form {:user-id 23}}]
31+
{:dispatch-n [[:crud-load-component component {:fetch {:user-id 1}
32+
:form {:user-id 1}}]
3433
[:assert! :create-components]]}))
3534

3635
(defn invoke-perform [{:keys [db]} _]
3736
(let [data (-> (get-in db (u/resource-path :user.update))
38-
(assoc :user-id 23))]
37+
(assoc :user-id 1))]
3938
{:db (assoc-in db (u/user-input-path :user.update) data)
4039
:dispatch [:crud-perform-user.update]}))
4140

42-
4341
(defn create-components-assertions []
4442
(is (some? (registrar/get-handler :event :crud-fetch-user.update)))
4543
(is (some? (registrar/get-handler :event :crud-perform-user.update))))
4644

47-
(defn assert! [{:keys [db]} [_ thing-to-test test-data]]
45+
(defn assert! [{:keys [db]} [_ thing-to-test]]
4846
(swap! things-to-test disj thing-to-test)
4947
(case thing-to-test
5048
:create-components (create-components-assertions)

0 commit comments

Comments
 (0)