Files
2026-07-13 12:32:21 +08:00

143 lines
4.4 KiB
Lua

local helpers = require "spec.helpers"
local conf_loader = require "kong.conf_loader"
local insert = table.insert
local factories = require "spec.fixtures.factories.plugins"
local PluginFactory = factories.PluginFactory
local EntitiesFactory = factories.EntitiesFactory
for _, strategy in helpers.each_strategy() do
describe("Plugins Iterator - Ensure correctness #" .. strategy, function()
local proxy_client, expected_header, must_not_have_headers, n_entities
lazy_teardown(function()
helpers.stop_kong()
helpers.kill_all()
assert(conf_loader(nil, {}))
end)
lazy_setup(function()
proxy_client = helpers.proxy_client
helpers.stop_kong()
helpers.kill_all()
assert(conf_loader(nil, {}))
n_entities = 10
local ef = EntitiesFactory:setup(strategy)
ef.bp.plugins:insert(
{
name = "response-transformer",
-- scope to default route
route = { id = ef.route_id },
config = {
add = {
headers = { "response-transformed:true" }
}
}
}
)
ef.bp.plugins:insert(
{
name = "correlation-id",
-- scope to default route
route = { id = ef.route_id },
config = {
header_name = "correlation-id-added"
}
}
)
for i = 0, n_entities do
local service = ef.bp.services:insert {
path = "/anything/service-" .. i
}
ef.bp.routes:insert {
hosts = { "route.bar." .. i },
service = { id = service.id }
}
ef.bp.plugins:insert(
{
name = "correlation-id",
service = { id = service.id },
config = {
header_name = "correlation-id-added-service" .. i
}
}
)
ef.bp.plugins:insert(
{
name = "response-transformer",
service = { id = service.id },
config = {
add = {
headers = { "response-transformed-" .. i .. ":true" }
}
}
}
)
end
local pf = PluginFactory:setup(ef)
-- add a plugin scoped to Consumer, Route and Service
expected_header = pf:consumer_route_service()
must_not_have_headers = {}
-- scoped to Consumer, Route
insert(must_not_have_headers, (pf:consumer_route()))
-- assure we don't iterate over #{}
assert.is_equal(#must_not_have_headers, 1)
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
end)
it("ensure no cross-contamination", function()
-- meaning that we don't run plugins that are scoped to a specific service
for i = 0, n_entities do
local r = proxy_client():get("/anything/service-" .. i, {
headers = {
host = "route.bar." .. i,
-- authenticate as `alice`
apikey = "alice",
},
})
assert.response(r).has.status(200)
-- The plugin for _THIS_ service is executed
assert.request(r).has_header("correlation-id-added-service" .. i)
assert.response(r).has_header("response-transformed-" .. i)
-- check that no header of any other service is present
for j = 0, n_entities do
if j ~= i then
assert.request(r).has_no_header("correlation-id-added-service"..j)
assert.response(r).has_no_header("response-transformed-" .. j)
end
end
end
end)
it("runs plugins in various phases", function()
local r = proxy_client():get("/anything", {
headers = {
host = "route.test",
-- authenticate as `alice`
apikey = "alice",
},
})
assert.response(r).has.status(200)
-- assert that request-termination was executed
assert.request(r).has_header(expected_header)
-- assert that no other `request-transformer` plugin was executed that had lesser scopes configured
for _, header in pairs(must_not_have_headers) do
assert.request(r).has_no_header(header)
end
-- assert that the `response-transformer` plugin was executed
assert.response(r).has_header("response-transformed")
-- assert that the `correlation-id` plugin was executed
assert.request(r).has_header("correlation-id-added")
end)
end)
end