test.lua 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. local https = require "https"
  2. local json
  3. -- Helper
  4. local function hexencode(c)
  5. return string.format("%%%02x", string.byte(c))
  6. end
  7. local function escape(s)
  8. return (string.gsub(s, "([^A-Za-z0-9_])", hexencode))
  9. end
  10. local function urlencode(list)
  11. local result = {}
  12. for k, v in pairs(list) do
  13. result[#result + 1] = escape(k).."="..escape(v)
  14. end
  15. return table.concat(result, "&")
  16. end
  17. math.randomseed(os.time())
  18. -- Tests function
  19. local function test_download_json()
  20. local code, response = https.request("https://raw.githubusercontent.com/rxi/json.lua/master/json.lua")
  21. assert(code == 200, "expected code 200, got "..code)
  22. json = assert(loadstring(response, "=json.lua"))()
  23. end
  24. local function test_head()
  25. local code, response = https.request("https://httpbin.org/get", {method = "HEAD"})
  26. assert(code == 200, "expected code 200, got "..code)
  27. assert(#response == 0, "expected empty response")
  28. end
  29. local function test_custom_header()
  30. local headerName = "RandomNumber"
  31. local random = math.random(1, 1000)
  32. local code, response = https.request("https://httpbin.org/get", {
  33. headers = {
  34. [headerName] = tostring(random)
  35. }
  36. })
  37. assert(code == 200, "expected code 200, got "..code)
  38. local root = json.decode(response)
  39. -- Headers are case-insensitive
  40. local found = false
  41. for k, v in pairs(root.headers) do
  42. if k:lower() == headerName:lower() then
  43. assert(tonumber(v) == random, "random number does not match, expected "..random..", got "..v)
  44. found = true
  45. end
  46. end
  47. assert(found, "custom header RandomNumber not found")
  48. end
  49. local function test_send(method, kind)
  50. local data = {Foo = "Bar", Key = "Value"}
  51. local input, contentType
  52. if kind == "json" then
  53. input = json.encode
  54. contentType = "application/json"
  55. else
  56. input = urlencode
  57. contentType = "application/x-www-form-urlencoded"
  58. end
  59. local code, response = https.request("https://httpbin.org/"..method:lower(), {
  60. headers = {["Content-Type"] = contentType},
  61. data = input(data),
  62. method = method
  63. })
  64. assert(code == 200, "expected code 200, got "..code)
  65. local root = json.decode(response)
  66. for k, v in pairs(data) do
  67. local v0 = assert(root[kind][k], "Missing key "..k.." for "..kind)
  68. assert(v0 == v, "Key "..k.." value mismatch, expected '"..v.."' got '"..v0.."'")
  69. end
  70. end
  71. -- Tests call
  72. print("test downloading json library") test_download_json()
  73. print("test custom header") test_custom_header()
  74. for _, method in ipairs({"POST", "PUT", "PATCH", "DELETE"}) do
  75. for _, kind in ipairs({"form", "json"}) do
  76. print("test "..method.." with data send as "..kind)
  77. test_send(method, kind)
  78. end
  79. end
  80. print("Test successful!")