Mercurial > prosody-modules
view mod_auth_token/mock.lua @ 5787:e79f9dec35c0
mod_c2s_conn_throttle: Reduce log level from error->info
Our general policy is that "error" should never be triggerable by remote
entities, and that it is always about something that requires admin
intervention. This satisfies neither condition.
The "warn" level can be used for unexpected events/behaviour triggered by
remote entities, and this could qualify. However I don't think failed auth
attempts are unexpected enough.
I selected "info" because it is what is also used for other notable session
lifecycle events.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 07 Dec 2023 15:46:50 +0000 |
| parents | d0ca211e1b0e |
| children |
line wrap: on
line source
-- Source code taken from https://github.com/britzl/deftest -- Released under the MIT License. Copyright (c) 2009-2012 Norman Clarke. --- Provides the ability to mock any module. -- @usage -- -- mock.mock(sys) -- -- -- specifying return values -- sys.get_sys_info.returns({my_data}) -- ... -- local sys_info = sys.get_sys_info() -- will be my_data -- assert(sys.get_sys_info.calls == 1) -- call counting -- ... -- local sys_info = sys.get_sys_info() -- original response as we are now out of mocked answers -- assert(sys.get_sys_info.calls == 2) -- call counting -- ... -- -- -- specifying a replacement function -- sys.get_sys_info.replace(function () return my_data end) -- -- ... -- local sys_info = sys.get_sys_info() -- will be my_data -- assert(sys.get_sys_info.calls == 3) -- call counting -- ... -- local sys_info = sys.get_sys_info() -- will still be my_data -- assert(sys.get_sys_info.calls == 4) -- call counting -- ... -- -- -- cleaning up -- mock.unmock(sys) -- restore the sys library again local mock = {} --- Mock the specified module. -- Mocking the module extends the functions it contains with the ability to have their logic overridden. -- @param module module to mock -- @usage -- -- -- mock module x -- mock.mock(x) -- -- -- make x.f return 1, 2 then the original value -- x.f.returns({1, 2}) -- print(x.f()) -- prints 1 -- -- -- make x.f return 1 forever -- x.f.replace(function () return 1 end) -- while true do print(x.f()) end -- prints 1 forever -- -- -- counting calls -- assert(x.f.calls > 0) -- -- -- return to original state of module x -- mock.unmock(x) -- function mock.mock(module) assert(module, "You must provide a module to mock") for k,v in pairs(module) do if type(v) == "function" then local mock_fn = { calls = 0, answers = {}, repl_fn = nil, orig_fn = v, params = {} } function mock_fn.returns(...) local arg_length = select("#", ...) assert(arg_length > 0, "You must provide some answers") local args = { ... } if arg_length == 1 then mock_fn.answers = args[1] else mock_fn.answers = args end end function mock_fn.always_returns(answer) mock_fn.repl_fn = function() return answer end end function mock_fn.replace(repl_fn) mock_fn.repl_fn = repl_fn end function mock_fn.original(...) return mock_fn.orig_fn(...) end function mock_fn.restore() mock_fn.repl_fn = nil end local mt = { __call = function (mock_fn, ...) mock_fn.calls = mock_fn.calls + 1 local arg = {...} if #arg > 0 then for i=1,#arg do mock_fn.params[i] = arg[i] end end if mock_fn.answers[1] then local result = mock_fn.answers[1] table.remove(mock_fn.answers, 1) return result elseif mock_fn.repl_fn then return mock_fn.repl_fn(...) else return v(...) end end } setmetatable(mock_fn, mt) module[k] = mock_fn end end end --- Remove the mocking capabilities from a module. -- @param module module to remove mocking from function mock.unmock(module) assert(module, "You must provide a module to unmock") for k,v in pairs(module) do if type(v) == "table" then if v.orig_fn then module[k] = v.orig_fn end end end end return mock
