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

131 lines
3.3 KiB
Lua

local helpers = require "spec.helpers"
for _, strategy in helpers.each_strategy() do
describe("Plugin: bot-detection (hooks) [#" .. strategy .. "]", function()
local plugin
local proxy_client
local admin_client
lazy_setup(function()
local bp = helpers.get_db_utils(strategy, {
"routes",
"services",
"plugins",
})
local route = bp.routes:insert {
hosts = { "bot.test" },
}
plugin = bp.plugins:insert {
route = { id = route.id },
name = "bot-detection",
config = {},
}
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
end)
lazy_teardown(function()
helpers.stop_kong()
end)
before_each(function()
proxy_client = helpers.proxy_client()
admin_client = helpers.admin_client()
end)
after_each(function()
if proxy_client then
proxy_client:close()
end
if admin_client then
admin_client:close()
end
end)
it("blocks a newly entered user-agent", function()
local res = assert( proxy_client:send {
method = "GET",
path = "/request",
headers = {
host = "bot.test",
["user-agent"] = "helloworld"
}
})
assert.response(res).has.status(200)
-- Update the plugin
res = assert(admin_client:send {
method = "PATCH",
path = "/plugins/" .. plugin.id,
body = {
config = { deny = { "helloworld" } },
},
headers = {
["content-type"] = "application/json"
}
})
assert.response(res).has.status(200)
local check_status = function()
local res = assert(proxy_client:send {
mehod = "GET",
path = "/request",
headers = {
host = "bot.test",
["user-agent"] = "helloworld",
},
})
res:read_body() -- must call read_body to complete call, otherwise next iteration fails
return res.status == 403
end
helpers.wait_until(check_status, 10)
end)
it("allows a newly entered user-agent", function()
local res = assert(proxy_client:send {
method = "GET",
path = "/request",
headers = {
host = "bot.test",
["user-agent"] = "facebookexternalhit/1.1"
}
})
assert.response(res).has.status(403)
-- Update the plugin
res = assert(admin_client:send {
method = "PATCH",
path = "/plugins/" .. plugin.id,
body = {
config = { allow = { "facebookexternalhit/1.1" } },
},
headers = {
["content-type"] = "application/json",
}
})
assert.response(res).has.status(200)
local check_status = function()
local res = assert(proxy_client:send {
mehod = "GET",
path = "/request",
headers = {
host = "bot.test",
["user-agent"] = "facebookexternalhit/1.1"
}
})
res:read_body() -- must call read_body to complete call, otherwise next iteration fails
return res.status == 200
end
helpers.wait_until(check_status, 10)
end)
end)
end