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)