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/kosync_spec.lua

218 lines
6.5 KiB
Lua

local service = [[
{
"base_url" : "https://sync.koreader.rocks:443/",
"name" : "api",
"methods" : {
"register" : {
"path" : "/users/create",
"method" : "POST",
"required_params" : [
"username",
"password",
],
"payload" : [
"username",
"password",
],
"expected_status" : [201, 402]
},
"authorize" : {
"path" : "/users/auth",
"method" : "GET",
"expected_status" : [200, 401]
},
"update_progress" : {
"path" : "/syncs/progress",
"method" : "PUT",
"required_params" : [
"document",
"progress",
"percentage",
"device",
],
"payload" : [
"document",
"progress",
"percentage",
"device",
],
"expected_status" : [200, 202, 401]
},
"get_progress" : {
"path" : "/syncs/progress/:document",
"method" : "GET",
"required_params" : [
"document",
],
"expected_status" : [200, 401]
},
}
}
]]
describe("KOSync modules #notest #nocov", function()
local logger, md5, client
local username, password, doc, percentage, progress, device
setup(function()
require("commonrequire")
logger = require("logger")
md5 = require("ffi/MD5")
local Spore = require("Spore")
client = Spore.new_from_string(service)
package.loaded['Spore.Middleware.GinClient'] = {}
require('Spore.Middleware.GinClient').call = function(self, req)
req.headers['accept'] = "application/vnd.koreader.v1+json"
end
package.loaded['Spore.Middleware.KOSyncAuth'] = {}
require('Spore.Middleware.KOSyncAuth').call = function(args, req)
req.headers['x-auth-user'] = args.username
req.headers['x-auth-key'] = args.userkey
end
-- password should be hashed before submitting to server
username, password = "koreader", md5.sum("koreader")
-- fake progress data
doc, percentage, progress, device =
"41cce710f34e5ec21315e19c99821415", -- fast digest of the document
0.356, -- percentage of the progress
"69", -- page number or xpointer
"my kpw" -- device name
end)
it("should create new user", function()
client:reset_middlewares()
client:enable('Format.JSON')
client:enable("GinClient")
local ok, res = pcall(function()
return client:register({
username = username,
password = password,
})
end)
if ok then
if res.status == 200 then
logger.dbg("register successful to ", res.body.username)
elseif res.status == 402 then
logger.dbg("register unsuccessful: ", res.body.message)
end
else
logger.dbg("Please retry later", res)
end
end)
it("should authorize user", function()
client:reset_middlewares()
client:enable('Format.JSON')
client:enable("GinClient")
client:enable("KOSyncAuth", {
username = username,
userkey = password,
})
local ok, res = pcall(function()
return client:authorize()
end)
if ok then
if res.status == 200 then
assert.are.same("OK", res.body.authorized)
else
logger.dbg(res.body)
end
else
logger.dbg("Please retry later", res)
end
end)
it("should update progress", function()
client:reset_middlewares()
client:enable('Format.JSON')
client:enable("GinClient")
client:enable("KOSyncAuth", {
username = username,
userkey = password,
})
local ok, res = pcall(function()
return client:update_progress({
document = doc,
progress = progress,
percentage = percentage,
device = device,
})
end)
if ok then
if res.status == 200 then
local result = res.body
assert.are.same(progress, result.progress)
assert.are.same(percentage, result.percentage)
assert.are.same(device, result.device)
else
logger.dbg(res.body.message)
end
else
logger.dbg("Please retry later", res)
end
end)
it("should get progress", function()
client:reset_middlewares()
client:enable('Format.JSON')
client:enable("GinClient")
client:enable("KOSyncAuth", {
username = username,
userkey = password,
})
local ok, res = pcall(function()
return client:get_progress({
document = doc,
})
end)
if ok then
if res.status == 200 then
local result = res.body
assert.are.same(progress, result.progress)
assert.are.same(percentage, result.percentage)
assert.are.same(device, result.device)
else
logger.dbg(res.body.message)
end
else
logger.dbg("Please retry later", res)
end
end)
-- The response of mockKOSyncClient
local res = {
result = false,
body = {}
}
--- @todo Test kosync module
local function mockKOSyncClient() --luacheck: ignore
package.loaded["KOSyncClient"] = nil
local c = require("KOSyncClient")
c.new = function(o)
o = o or {}
setmetatable(o, self) --luacheck: ignore
self.__index = self --luacheck: ignore
return o
end
c.init = function() end
c.register = function(name, passwd)
return res.result, res.body
end
c.authorize = function(name, passwd)
return res.result, res.body
end
c.update_progress = function(name, passwd, doc, prog, percent, device, device_id, cb) --luacheck: ignore
cb(res.result, res.body)
end
c.get_progress = function(name, passwd, doc, cb) --luacheck: ignore
cb(res.result, res.body)
end
end
end)