kong/spec/03-plugins/33-serverless-functions/04-phases_spec.lua (131 lines of code) (raw):

local helpers = require "spec.helpers" local mock_one_fn = [[ local plugin_name = "%s" local filename = "/tmp/" .. plugin_name .. "_output" local text = "phase: '%s', index: '%s', plugin: '" .. plugin_name .. "'\n" local readfile = require("pl.utils").readfile local writefile = require("pl.utils").writefile return function() local file_content, err = readfile(filename) or "" file_content = file_content .. text assert(writefile(filename, file_content)) end ]] for _, plugin_name in ipairs({ "pre-function", "post-function" }) do -- This whole test is marked as pending because it relies on a side-effect (writing to a file) -- which is no longer a possibility after sandboxing pending("Plugin: " .. plugin_name, function() setup(function() local bp, db = helpers.get_db_utils() assert(db:truncate()) local service = bp.services:insert { name = "service-1", host = helpers.mock_upstream_host, port = helpers.mock_upstream_port, } bp.routes:insert { service = { id = service.id }, hosts = { "one." .. plugin_name .. ".com" }, } local config = {} for _, phase in ipairs({ "certificate", "rewrite", "access", "header_filter", "body_filter", "log"}) do config[phase] = {} for i, index in ipairs({"first", "second", "third"}) do config[phase][i] = mock_one_fn:format(plugin_name, phase, index) end end bp.plugins:insert { name = plugin_name, config = config, } assert(helpers.start_kong({ nginx_conf = "spec/fixtures/custom_nginx.template", })) end) teardown(function() helpers.stop_kong() end) it("hits all phases, with 3 functions, on 3 requests", function() local filename = "/tmp/" .. plugin_name .. "_output" os.remove(filename) for i = 1,3 do local client = helpers.proxy_ssl_client() local res = assert(client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "one." .. plugin_name .. ".com" } }) assert.response(res).has.status(200) client:close() ngx.sleep(0.1) -- wait for log-phase handler to execute end local content = require("pl.utils").readfile(filename) assert.equal(([[ phase: 'certificate', index: 'first', plugin: 'pre-function' phase: 'certificate', index: 'second', plugin: 'pre-function' phase: 'certificate', index: 'third', plugin: 'pre-function' phase: 'rewrite', index: 'first', plugin: 'pre-function' phase: 'rewrite', index: 'second', plugin: 'pre-function' phase: 'rewrite', index: 'third', plugin: 'pre-function' phase: 'access', index: 'first', plugin: 'pre-function' phase: 'access', index: 'second', plugin: 'pre-function' phase: 'access', index: 'third', plugin: 'pre-function' phase: 'header_filter', index: 'first', plugin: 'pre-function' phase: 'header_filter', index: 'second', plugin: 'pre-function' phase: 'header_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'log', index: 'first', plugin: 'pre-function' phase: 'log', index: 'second', plugin: 'pre-function' phase: 'log', index: 'third', plugin: 'pre-function' phase: 'certificate', index: 'first', plugin: 'pre-function' phase: 'certificate', index: 'second', plugin: 'pre-function' phase: 'certificate', index: 'third', plugin: 'pre-function' phase: 'rewrite', index: 'first', plugin: 'pre-function' phase: 'rewrite', index: 'second', plugin: 'pre-function' phase: 'rewrite', index: 'third', plugin: 'pre-function' phase: 'access', index: 'first', plugin: 'pre-function' phase: 'access', index: 'second', plugin: 'pre-function' phase: 'access', index: 'third', plugin: 'pre-function' phase: 'header_filter', index: 'first', plugin: 'pre-function' phase: 'header_filter', index: 'second', plugin: 'pre-function' phase: 'header_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'log', index: 'first', plugin: 'pre-function' phase: 'log', index: 'second', plugin: 'pre-function' phase: 'log', index: 'third', plugin: 'pre-function' phase: 'certificate', index: 'first', plugin: 'pre-function' phase: 'certificate', index: 'second', plugin: 'pre-function' phase: 'certificate', index: 'third', plugin: 'pre-function' phase: 'rewrite', index: 'first', plugin: 'pre-function' phase: 'rewrite', index: 'second', plugin: 'pre-function' phase: 'rewrite', index: 'third', plugin: 'pre-function' phase: 'access', index: 'first', plugin: 'pre-function' phase: 'access', index: 'second', plugin: 'pre-function' phase: 'access', index: 'third', plugin: 'pre-function' phase: 'header_filter', index: 'first', plugin: 'pre-function' phase: 'header_filter', index: 'second', plugin: 'pre-function' phase: 'header_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'body_filter', index: 'first', plugin: 'pre-function' phase: 'body_filter', index: 'second', plugin: 'pre-function' phase: 'body_filter', index: 'third', plugin: 'pre-function' phase: 'log', index: 'first', plugin: 'pre-function' phase: 'log', index: 'second', plugin: 'pre-function' phase: 'log', index: 'third', plugin: 'pre-function' ]]):gsub("pre%-function", plugin_name),content) end) end) end