add test suite
This commit is contained in:
parent
06924d10f6
commit
5d21c975ea
5 changed files with 160 additions and 45 deletions
|
@ -11,3 +11,11 @@ on top of ActivityPub implementations.
|
|||
- write test suite
|
||||
- create install instructions
|
||||
|
||||
## Testing
|
||||
|
||||
```
|
||||
luarocks-5.1 install --local luaunit
|
||||
luarocks-5.1 install --local lrexlib-PCRE2
|
||||
eval (luarocks-5.1 path --bin)
|
||||
lua5.1 test.lua
|
||||
```
|
||||
|
|
48
ctx.lua
Normal file
48
ctx.lua
Normal file
|
@ -0,0 +1,48 @@
|
|||
function log(msg)
|
||||
ngx.log(ngx.STDERR, tostring(msg))
|
||||
end
|
||||
|
||||
local ctx = {}
|
||||
|
||||
function ctx:setWantedScripts(graph)
|
||||
self._wanted_scripts = graph
|
||||
end
|
||||
|
||||
function ctx:loadChain()
|
||||
self.compiled_chain = {}
|
||||
for module_name, module_config in pairs(self._wanted_scripts) do
|
||||
local module = require(module_name)
|
||||
local module_state = module.init(module_config)
|
||||
-- TODO is it possible to make module_config readonly?
|
||||
table.insert(self.compiled_chain, {module, module_config, module_state})
|
||||
end
|
||||
end
|
||||
|
||||
function ctx:onRequest()
|
||||
local request_uri = ngx.var.uri
|
||||
|
||||
-- find out which modules to call based on their regexes
|
||||
local callbacks_to_call = {}
|
||||
for _, filter in ipairs(self.compiled_chain) do
|
||||
local module, module_config, state = unpack(filter)
|
||||
|
||||
for callback_regex, callback_function in pairs(module.callbacks) do
|
||||
local match, error = ngx.re.match(request_uri, callback_regex)
|
||||
if match then
|
||||
table.insert(callbacks_to_call, {callback_function, module_config, state})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _,tuple in ipairs(callbacks_to_call) do
|
||||
local callback_function, config, state = unpack(tuple)
|
||||
local status_code, body = callback_function(config, state)
|
||||
if status_code ~= nil then
|
||||
ngx.status = status_code
|
||||
ngx.say(body or "request denied")
|
||||
ngx.exit(status_code)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return ctx
|
49
main.lua
49
main.lua
|
@ -7,50 +7,9 @@ local CONFIG_PATH = ".;/etc/aproxy"
|
|||
--
|
||||
-- local config = loadConfig()
|
||||
|
||||
function log(msg)
|
||||
ngx.log(ngx.STDERR, tostring(msg))
|
||||
end
|
||||
|
||||
local WANTED_SCRIPTS = {
|
||||
local ctx = require('ctx')
|
||||
ctx.setWantedScripts({
|
||||
['scripts.webfinger_allowlist'] = {accounts = {"example@example.com"}}
|
||||
}
|
||||
})
|
||||
|
||||
local compiled_chain = {}
|
||||
|
||||
for module_name, module_config in pairs(WANTED_SCRIPTS) do
|
||||
local module = require(module_name)
|
||||
local module_state = module.init(module_config)
|
||||
-- TODO is it possible to make module_config readonly?
|
||||
table.insert(compiled_chain, {module, module_config, module_state})
|
||||
end
|
||||
|
||||
local function onRequest()
|
||||
local request_uri = ngx.var.uri
|
||||
|
||||
-- find out which modules to call based on their regexes
|
||||
local callbacks_to_call = {}
|
||||
for _, filter in ipairs(compiled_chain) do
|
||||
local module, module_config, state = unpack(filter)
|
||||
|
||||
for callback_regex, callback_function in pairs(module.callbacks) do
|
||||
local match, error = ngx.re.match(request_uri, callback_regex)
|
||||
if match then
|
||||
table.insert(callbacks_to_call, {callback_function, module_config, state})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
log('AWOOOOGA')
|
||||
|
||||
for _,tuple in ipairs(callbacks_to_call) do
|
||||
local callback_function, config, state = unpack(tuple)
|
||||
local status_code, body = callback_function(config, state)
|
||||
if status_code ~= nil then
|
||||
ngx.status = status_code
|
||||
ngx.say(body or "request denied")
|
||||
ngx.exit(status_code)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return onRequest
|
||||
return ctx:onRequest
|
||||
|
|
77
test.lua
Normal file
77
test.lua
Normal file
|
@ -0,0 +1,77 @@
|
|||
lu = require('luaunit')
|
||||
local rex = require('rex_pcre2')
|
||||
|
||||
function createNgx()
|
||||
local ngx = {
|
||||
status = nil
|
||||
}
|
||||
|
||||
local function mockedThing(self, property)
|
||||
return function(value)
|
||||
self['_'..property] = value
|
||||
end
|
||||
end
|
||||
|
||||
ngx.say = mockedThing(ngx, "say")
|
||||
ngx.exit = mockedThing(ngx, "exit")
|
||||
|
||||
ngx.log = function (_, msg)
|
||||
print(msg)
|
||||
end
|
||||
|
||||
-- only hold data here
|
||||
ngx.var = {}
|
||||
|
||||
-- request params api
|
||||
ngx.req = {}
|
||||
|
||||
ngx.req.get_uri_args = function ()
|
||||
return ngx._uri_args
|
||||
end
|
||||
|
||||
ngx.req.set_uri_args = function (val)
|
||||
ngx._uri_args = val
|
||||
end
|
||||
|
||||
-- regex api
|
||||
ngx.re = {}
|
||||
ngx.re.match = rex.match
|
||||
ngx.re.search = rex.find
|
||||
|
||||
return ngx
|
||||
end
|
||||
|
||||
function resetNgx()
|
||||
ngx = createNgx()
|
||||
end
|
||||
teardownNgx = resetNgx
|
||||
|
||||
function setupFakeRequest(path, options)
|
||||
ngx.var.uri = path
|
||||
if options.params then
|
||||
ngx.req.set_uri_args(options.params)
|
||||
end
|
||||
end
|
||||
|
||||
local ctx = require('ctx')
|
||||
function setupTest(module_require_path, config)
|
||||
resetNgx()
|
||||
local module = require(module_require_path)
|
||||
state = module.init(config)
|
||||
ctx.compiled_chain = {
|
||||
{module, config, state}
|
||||
}
|
||||
return module
|
||||
end
|
||||
|
||||
|
||||
function onRequest()
|
||||
ctx:setWantedScripts()
|
||||
local ctx = require('ctx')
|
||||
do
|
||||
ctx:onRequest()
|
||||
end
|
||||
end
|
||||
|
||||
require('tests.webfinger_allowlist')
|
||||
os.exit(lu.LuaUnit.run())
|
23
tests/webfinger_allowlist.lua
Normal file
23
tests/webfinger_allowlist.lua
Normal file
|
@ -0,0 +1,23 @@
|
|||
TestWebfinger = {}
|
||||
|
||||
function TestWebfinger:setup()
|
||||
self.mod = setupTest('scripts.webfinger_allowlist', {accounts = {'correct@example.org'}})
|
||||
end
|
||||
|
||||
local WEBFINGER_PATH = '/.well-known/webfinger'
|
||||
|
||||
function TestWebfinger:testCorrectAccount()
|
||||
setupFakeRequest(WEBFINGER_PATH, { params = {resource = 'acct:correct@example.org'} })
|
||||
onRequest()
|
||||
lu.assertIs(ngx.status, nil)
|
||||
end
|
||||
|
||||
function TestWebfinger:testWrongAccount()
|
||||
setupFakeRequest(WEBFINGER_PATH, { params = {resource = 'acct:wrong@example.org'} })
|
||||
onRequest()
|
||||
lu.assertIs(ngx.status, 404)
|
||||
end
|
||||
|
||||
function TestWebfinger:teardown()
|
||||
teardownNgx()
|
||||
end
|
Loading…
Reference in a new issue