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.
zeus/website/backend/lor/spec/cases/group_router_spec.lua

262 lines
7.1 KiB
Lua

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

before_each(function()
lor = _G.lor
app = lor({
debug = true
})
Request = _G.request
Response = _G.response
req = Request:new()
res = Response:new()
end)
after_each(function()
lor = nil
app = nil
Request = nil
Response = nil
req = nil
res = nil
end)
describe("single group router middleware", function()
it("basic usage", function()
local count = 0
local userRouter = lor:Router()
userRouter:get("/find/:id", function(req, res, next)
count = 1
next()
end)
userRouter:post("/create/:id", function(req, res, next)
count = 2
next()
end)
app:use("/user", userRouter())
-- should not be reached, because `next` has no params and no error occurs
app:erroruse(function(err, req, res, next)
count = 3
end)
req.path = "/user/create/123"
req.method = "post"
app:handle(req, res)
assert.is.equals(2, count)
req.path = "/user/find/123"
req.method = "get"
app:handle(req, res)
assert.is.equals(1, count)
end)
it("error middleware should work as normal", function()
local count = 0
local errorMsg = "an error occurs."
local userRouter = lor:Router()
userRouter:get("/find/:id", function(req, res, next)
count = 1
error(errorMsg)
end)
userRouter:post("/create/:id", function(req, res, next)
count = 2
next(errorMsg) -- has one param, so this will pass to an error middleware
end)
userRouter:post("/edit/:id", function(req, res, next)
count = 3
end)
app:use("/user", userRouter())
app:erroruse(function(err, req, res, next)
if err then -- double check
count = err
req.params.id = "11111111"
end
end)
req.path = "/user/find/456"
req.method = "get"
app:handle(req, res)
assert.is.truthy(string.match(count, errorMsg))
req.path = "/user/create/123"
req.method = "post"
app:handle(req, res)
assert.is.truthy(string.match(count, errorMsg)) -- count contains errorMsg
req.path = "/user/edit/987"
req.method = "post"
app:handle(req, res)
assert.is.equals(3, count) -- no error occurs
end)
it("path variable parser should work", function()
local count = 0
local errorMsg = "an error occurs."
local userRouter = lor:Router()
userRouter:get("/find/:id", function(req, res, next)
count = 1
error(errorMsg)
end)
userRouter:post("/create/:id", function(req, res, next)
count = 2
next(errorMsg) -- has one param, so this will pass to an error middleware
end)
userRouter:post("/edit/:id", function(req, res, next)
count = 3
end)
app:use("/user", userRouter())
app:erroruse("/user", function(err, req, res, next)
--print("user error middleware", err)
--if err then -- double check
count = err
req.params.id = "22222"
--end
next(err) -- 继续传递只会被下一个erroruse覆盖
end)
app:erroruse(function(err, req, res, next)
--print("common error middleware", err)
if err then -- double check
count = err
req.params.id = "11111111"
end
end)
req.path = "/user/find/456"
req.method = "get"
app:handle(req, res)
assert.is.equals("11111111", req.params.id)
assert.is.truthy(string.match(count, errorMsg))
req.path = "/user/create/123"
req.method = "post"
app:handle(req, res)
assert.is.equals("11111111", req.params.id)
assert.is.truthy(string.match(count, errorMsg)) -- count contains errorMsg
req.path = "/user/edit/987"
req.method = "post"
app:handle(req, res)
assert.is.equals("987", req.params.id)
assert.is.equals(3, count)
end)
end)
describe("multi group router middleware", function()
it("basic usage", function()
local flag = ""
local userRouter = lor:Router()
local bookRouter = lor:Router()
app:use(function(req, res, next)
flag = "first use"
req.params.flag = "origin value"
next()
end)
userRouter:get("/find/:id", function(req, res, next)
flag = 1
req.params.flag = 1
next("error occurs")
end)
userRouter:post("/create/:id", function(req, res, next)
flag = 2
req.params.flag = 2
next()
end)
bookRouter:get("/view/:id", function(req, res, next)
flag = 3
req.params.flag = 3
error("common error")
req.params.flag = 33
end)
app:use("/user", userRouter()) -- must invoke before `erroruse`
app:use("/book", bookRouter()) -- must invoke before `erroruse`
app:erroruse("/user", function(err, req, res, next)
--print("------------- user error m", err)
assert.is.truthy(err)
flag = "user_error_middleware"
req.params.flag = 111
end)
app:erroruse(function(err, req, res, next)
--print("------------- common error m", err)
flag = "common_error_middleware"
req.params.flag = 333
assert.is.truthy(err)
end)
req.path = "/user/create/123"
req.method = "post"
app:handle(req, res)
assert.is.equals(2, flag)
assert.is.equals(2, req.params.flag)
req.path = "/user/find/123"
req.method = "get"
app:handle(req, res)
assert.is.equals("user_error_middleware", flag)
assert.is.equals(111, req.params.flag)
req.path = "/book/view/999"
req.method = "get"
app:handle(req, res, function(err)
if err then
print(err)
end
-- not found path will be here
-- not processed error will be here
end)
assert.is.equals("common_error_middleware", flag)
assert.is.equals(333, req.params.flag)
end)
end)
describe("'use' the same group router middleware", function()
it("basic usage", function()
local userRouter = lor:Router()
local reach_first = false
local reach_second = false
userRouter:get("/get", function(req, res, next)
reach_first = true
reach_second = true
end)
app:use("/user", userRouter())
app:use("/u", userRouter())
req.path = "/user/get"
req.method = "get"
app:handle(req, res)
assert.is.equals(true, reach_first)
-- reset values
reach_first = false
reach_second = false
req.path = "/u/get"
req.method = "get"
app:handle(req, res)
assert.is.equals(true, reach_second)
end)
end)