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)