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

179 lines
4.9 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)
-- remind: final handler is the last middleware that could be used to handle errors
-- it will alwayes be executed but `err` object is not nil only when error occurs
describe("if finall handler defined, it will always be executed.", function()
it("the request has no execution", function()
local count = 1
app:use("/user", function(req, res, next)
count = 2
next()
end)
app:use("/user/123", function(req, res, next)
count = 3
next()
end)
req.path = "/user/123/create"
req.method = "get"
app:handle(req, res, function(err)
count = 111
end)
assert.is.equals(count, 111)
end)
it("404! should reach the final handler", function()
local count = 1
app:use("/user", function(req, res, next) -- won't enter
count = 2
next()
end)
app:get("/user/123", function(req, res, next) -- won't enter
count = 4
next()
end)
req.path = "/user/123/create" -- won't match app:get("/user/123", function...)
req.method = "get"
app:handle(req, res, function(err) -- 404! not found error
assert.is_truthy(err)
if err then
count = 404
end
end)
assert.is.equals(404, count)
end)
end)
describe("the request has one successful execution. final handler execs but `err` should be nil.", function()
it("test case 2", function()
local count = 1
app:use("/user", function(req, res, next)
count = 2
next()
end)
app:get("/user/123/create", function(req, res, next)
count = 4
next()
end)
req.path = "/user/123/create"
req.method = "get"
app:handle(req, res, function(err)
assert.is_falsy(err) -- err should be nil
assert.is_true(req:is_found()) -- matched app:get("/user/123/create")
count = 222 --
end)
assert.is.equals(count, 222)
end)
end)
describe("the previous error middleware pass or not pass the `err` object.", function()
it("test case 1.", function()
local count = 1
app:use("/user", function(req, res, next)
count = 2
next()
end)
app:erroruse(function(err, req, res, next)
count = 5
end)
req.path = "/user/123/create"
req.method = "get"
app:handle(req, res, function(err)
assert.is.equals(count, 5) -- not found: should match error middleware, so count is 5
count = 444
if err then
count = 333
end
assert.is.equals(count, 333)
end)
end)
it("test case 2.", function()
local count = 1
app:get("/user/123", function(req, res, next)
count = 4
error("abc")
end)
app:erroruse(function(err, req, res, next)
count = 5
assert.is.equals(true, string.find(err, "abc")>0)
next("def")
end)
app:erroruse(function(err, req, res, next)
count = 6
assert.is.equals("def", err)
next("123")
end)
req.path = "/user/123"
req.method = "get"
app:handle(req, res, function(err)
count = 333
if err then
count = 222
end
assert.is.equals(222, count)
end)
end)
it("test case 3 when error occurs in `error middleware`, the process will jump to the final handler immediately.", function()
app:get("/user/123", function(req, res, next)
error("ERROR1")
end)
-- error middleware 1
app:erroruse(function(err, req, res, next)
local test_var = 1 / tonumber("error number") -- error occurs here
next(err .. "\nERROR2") -- won't be reached
end)
-- error middleware 2
-- won't be matched because an error `in error middleware` occurs before it
app:erroruse(function(err, req, res, next)
next(err .. "\nERROR3")
end)
req.path = "/user/123"
req.method = "get"
app:handle(req, res, function(err)
assert.is.equals(true, string.find(err, "ERROR1") > 0)
assert.is.equals(nil, string.find(err, "ERROR2")) -- matched `error middleware1`, but error occured
assert.is.equals(nil, string.find(err, "ERROR3")) -- not matched `error middleware2`
assert.is.equals(true, string.find(err, "perform arithmetic on a nil value") > 0)
end)
end)
end)