kong/spec/03-plugins/18-acl/03-invalidations_spec.lua (183 lines of code) (raw):
local helpers = require "spec.helpers"
for _, strategy in helpers.each_strategy() do
describe("Plugin: ACL (invalidations) [#" .. strategy .. "]", function()
local admin_client
local proxy_client
local consumer
local acl
local db
before_each(function()
local bp
bp, db = helpers.get_db_utils(strategy, {
"routes",
"services",
"plugins",
"consumers",
"acls",
"keyauth_credentials",
})
consumer = bp.consumers:insert {
username = "consumer1"
}
bp.keyauth_credentials:insert {
key = "apikey123",
consumer = { id = consumer.id },
}
acl = bp.acls:insert {
group = "admin",
consumer = { id = consumer.id },
}
bp.acls:insert {
group = "pro",
consumer = { id = consumer.id },
}
local consumer2 = bp.consumers:insert {
username = "consumer2"
}
bp.keyauth_credentials:insert {
key = "apikey124",
consumer = { id = consumer2.id },
}
bp.acls:insert {
group = "admin",
consumer = { id = consumer2.id },
}
local route1 = bp.routes:insert {
hosts = { "acl1.com" },
}
bp.plugins:insert {
name = "key-auth",
route = { id = route1.id }
}
bp.plugins:insert {
name = "acl",
route = { id = route1.id },
config = {
allow = {"admin"}
}
}
local route2 = bp.routes:insert {
hosts = { "acl2.com" },
}
bp.plugins:insert {
name = "key-auth",
route = { id = route2.id }
}
bp.plugins:insert {
name = "acl",
route = { id = route2.id },
config = {
allow = { "ya" }
}
}
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
proxy_client = helpers.proxy_client()
admin_client = helpers.admin_client()
end)
after_each(function()
if admin_client and proxy_client then
admin_client:close()
proxy_client:close()
end
helpers.stop_kong()
end)
describe("ACL entity invalidation", function()
it("should invalidate when ACL entity is deleted", function()
-- It should work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(200, res)
-- Check that the cache is populated
local cache_key = db.acls:cache_key(consumer.id)
local res = assert(admin_client:get("/cache/" .. cache_key, {
headers = {}
}))
assert.res_status(200, res)
-- Delete ACL group (which triggers invalidation)
local res = assert(admin_client:delete("/consumers/consumer1/acls/" .. acl.id, {
headers = {}
}))
assert.res_status(204, res)
-- Wait for cache to be invalidated
helpers.wait_for_invalidation(cache_key)
-- It should not work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(403, res)
end)
it("should invalidate when ACL entity is updated", function()
-- It should work
local res = assert(proxy_client:get("/status/200?apikey=apikey123&prova=scemo", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(200, res)
-- It should not work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl2.com"
}
}))
assert.res_status(403, res)
-- Check that the cache is populated
local cache_key = db.acls:cache_key(consumer.id)
local res = assert(admin_client:get("/cache/" .. cache_key, {
headers = {}
}))
assert.res_status(200, res)
-- Update ACL group (which triggers invalidation)
local res = assert(admin_client:patch("/consumers/consumer1/acls/" .. acl.id, {
headers = {
["Content-Type"] = "application/json"
},
body = {
group = "ya"
}
}))
assert.res_status(200, res)
-- Wait for cache to be invalidated
helpers.wait_for_invalidation(cache_key)
-- It should not work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(403, res)
-- It works now
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl2.com"
}
}))
assert.res_status(200, res)
end)
end)
describe("Consumer entity invalidation", function()
it("should invalidate when Consumer entity is deleted", function()
-- It should work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(200, res)
-- Check that the cache is populated
local cache_key = db.acls:cache_key(consumer.id)
local res = assert(admin_client:get("/cache/" .. cache_key, {
headers = {}
}))
assert.res_status(200, res)
-- Delete Consumer (which triggers invalidation)
local res = assert(admin_client:delete("/consumers/consumer1", {
headers = {}
}))
assert.res_status(204, res)
-- Wait for cache to be invalidated
helpers.wait_for_invalidation(cache_key)
-- Wait for key to be invalidated
local keyauth_cache_key = db.keyauth_credentials:cache_key("apikey123")
helpers.wait_for_invalidation(keyauth_cache_key)
-- It should not work
local res = assert(proxy_client:get("/status/200?apikey=apikey123", {
headers = {
["Host"] = "acl1.com"
}
}))
assert.res_status(401, res)
end)
end)
end)
end