test/http_api.nim
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 115 116 117 118 119 120 121 122 123 124 |
import unittest, json, httpclient, strutils, os
suite "LiteStore HTTP API":
var contents = newSeq[JsonNode](0)
for i in 1..8:
contents.add parseFile("data/$1.json" % i.intToStr)
const srv = "http://localhost:9500/"
let cli = newHttpClient()
cli.headers = newHttpHeaders({ "Content-Type": "application/json" })
proc jget(url: string): Response =
return cli.request(srv & url, HttpGet)
proc jhead(url: string): Response =
return cli.request(srv & url, HttpHead)
proc jpost(url: string, body: JsonNode): Response {.discardable.} =
return cli.request(srv & url, HttpPost, $body)
proc jput(url: string, body: JsonNode): Response {.discardable.} =
return cli.request(srv & url, HttpPut, $body)
proc jpatch(url: string, body: JsonNode): Response =
return cli.request(srv & url, HttpPatch, $body)
proc jdelete(url: string): Response {.discardable.} =
return cli.request(srv & url, HttpDelete)
proc info(prop: string): JsonNode =
return jget("info").body.parseJson[prop]
test "GET info":
check(info("datastore_version") == %1)
test "POST/GET/DELETE document":
var rpost = jpost("docs", contents[0])
var id = rpost.body.parseJson["id"].getStr
check(rpost.body.parseJson["data"]["_id"] == %"5a6c566020d0d4ba242d6501")
var rget = jget("docs/$1" % id)
check(rget.body.parseJson["_id"] == %"5a6c566020d0d4ba242d6501")
var rdel = jdelete("docs/$1" % id)
check(rdel.status == "204 No Content")
check(info("total_documents") == %0)
rpost = jpost("docs/f1/f2/", contents[0])
id = rpost.body.parseJson["id"].getStr
check(id.startsWith("f1/f2/"))
check(rpost.body.parseJson["data"]["_id"] == %"5a6c566020d0d4ba242d6501")
rget = jget("docs/$1" % id)
check(rget.body.parseJson["_id"] == %"5a6c566020d0d4ba242d6501")
rdel = jdelete("docs/$1" % id)
check(rdel.status == "204 No Content")
check(info("total_documents") == %0)
test "PUT/PATCH/GET/DELETE document":
var rput = jput("docs/1", contents[0])
var id = rput.body.parseJson["id"].getStr
check(id == "1")
var rget = jget("docs/1")
check(rget.body.parseJson["_id"] == %"5a6c566020d0d4ba242d6501")
rget = jget("docs?tags=t1")
check(rget.status == "404 Not Found")
var ops = """
[
{"op": "add", "path": "/tags/3", "value": "t1"},
{"op": "add", "path": "/tags/4", "value": "t2"},
{"op": "add", "path": "/tags/5", "value": "t3"}
]
"""
var rpatch = jpatch("docs/1", ops.parseJson)
check(rpatch.status == "200 OK")
rget = jget("docs/?tags=t1")
check(rget.body.parseJson["total"] == %1)
rput = jput("docs/2", contents[1])
ops = """
[
{"op": "add", "path": "/tags/3", "value": "t1"},
{"op": "add", "path": "/tags/4", "value": "t3"}
]
"""
rpatch = jpatch("docs/2", ops.parseJson)
check(rpatch.status == "200 OK")
rput = jput("docs/test/3", contents[2])
rget = jget("docs/test/3")
check(rget.body.parseJson["_id"] == %"5a6c5660d613e4c504bbf860")
ops = """
[
{"op": "add", "path": "/tags/3", "value": "t2"},
{"op": "add", "path": "/tags/4", "value": "t3"}
]
"""
rpatch = jpatch("docs/test/3", ops.parseJson)
check(rpatch.status == "200 OK")
ops = """
[
{"op": "replace", "path": "/tags/3", "value": "t4"},
{"op": "remove", "path": "/tags/4"}
]
"""
rpatch = jpatch("docs/1", ops.parseJson)
check(rpatch.status == "200 OK")
rget = jget("docs/?tags=t2,t3")
check(rget.body.parseJson["total"] == %1)
jdelete("docs/1")
jdelete("docs/2")
jdelete("docs/test/3")
check(info("total_documents") == %0)
test "HEAD/GET documents":
var ids = newSeq[string](0)
var rpost: Response;
for c in contents:
rpost = jpost("docs/test/", c)
ids.add(rpost.body.parseJson["id"].getStr)
var rhead = jhead("docs/invalid/")
check(rhead.status == "404 Not Found")
rhead = jhead("docs/test/")
check(rhead.status == "200 OK")
var rget = jget("docs/?search=Lorem&contents=false")
check(rget.body.parseJson["total"] == %5)
for i in ids:
jdelete("docs/$1" % i)
check(info("total_documents") == %0)
|