You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koreader/spec/unit/spore_spec.lua

125 lines
3.8 KiB
Lua

local service = [[
{
"base_url" : "http://httpbin.org",
"name" : "api",
"methods" : {
"get_info" : {
"path" : "/get",
"method" : "GET",
"required_params" : [
"user"
],
"optional_params" : [
"age"
],
},
"post_info" : {
"path" : "/post",
"method" : "POST",
"required_params" : [
"user"
],
"optional_params" : [
"age"
],
"payload" : [
"user",
"age",
],
},
}
}
]]
describe("Lua Spore modules #notest #nocov", function()
local Spore, client
setup(function()
require("commonrequire")
Spore = require("Spore")
client = Spore.new_from_string(service)
client:enable('Format.JSON')
end)
it("should complete GET request", function()
local info = {user = 'john', age = '25'}
local res = client:get_info(info)
assert.are.same(res.body.args, info)
end)
it("should complete POST request", function()
local info = {user = 'sam', age = '26'}
local res = client:post_info(info)
assert.are.same(res.body.json, info)
end)
end)
describe("Lua Spore modules with async http request #notest #nocov", function()
local client, UIManager
setup(function()
require("commonrequire")
UIManager = require("ui/uimanager")
local HTTPClient = require("httpclient")
local Spore = require("Spore")
client = Spore.new_from_string(service)
local async_http_client = HTTPClient:new()
package.loaded['Spore.Middleware.AsyncHTTP'] = {}
require('Spore.Middleware.AsyncHTTP').call = function(args, req)
req:finalize()
local result
async_http_client:request({
url = req.url,
method = req.method,
body = req.env.spore.payload,
on_headers = function(headers)
for header, value in pairs(req.headers) do
if type(header) == 'string' then
headers:add(header, value)
end
end
end,
}, function(res)
result = res
-- Turbo HTTP client uses code instead of status
-- change to status so that Spore can understand
result.status = res.code
coroutine.resume(args.thread)
UIManager.INPUT_TIMEOUT = 100 -- no need in production
end)
return coroutine.create(function() coroutine.yield(result) end)
end
end)
it("should complete GET request", function()
UIManager:quit()
local co = coroutine.create(function()
local info = {user = 'john', age = '25'}
local res = client:get_info(info)
UIManager:quit()
assert.are.same(res.body.args, info)
end)
client:reset_middlewares()
client:enable("Format.JSON")
client:enable("AsyncHTTP", {thread = co})
coroutine.resume(co)
UIManager:setRunForeverMode()
UIManager:run()
end)
it("should complete POST request", function()
UIManager:quit()
local co = coroutine.create(function()
local info = {user = 'sam', age = '26'}
local res = client:post_info(info)
UIManager:quit()
assert.are.same(res.body.json, info)
end)
client:reset_middlewares()
client:enable("Format.JSON")
client:enable("AsyncHTTP", {thread = co})
coroutine.resume(co)
UIManager:setRunForeverMode()
UIManager:run()
end)
end)