kong/spec/03-plugins/09-key-auth/03-invalidations_spec.lua (158 lines of code) (raw):
local helpers = require "spec.helpers"
local cjson = require "cjson"
for _, strategy in helpers.each_strategy() do
describe("Plugin: key-auth (invalidations) [#" .. strategy .. "]", function()
local admin_client, proxy_client
local db
before_each(function()
local bp
bp, db = helpers.get_db_utils(strategy, {
"routes",
"services",
"plugins",
"consumers",
"keyauth_credentials",
})
local route = bp.routes:insert {
hosts = { "key-auth.com" },
}
bp.plugins:insert {
name = "key-auth",
route = { id = route.id },
}
local consumer = bp.consumers:insert {
username = "bob",
}
bp.keyauth_credentials:insert {
key = "kong",
consumer = { id = consumer.id },
}
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)
it("invalidates credentials when the Consumer is deleted", function()
-- populate cache
local res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(200, res)
-- ensure cache is populated
local cache_key = db.keyauth_credentials:cache_key("kong")
res = assert(admin_client:send {
method = "GET",
path = "/cache/" .. cache_key
})
assert.res_status(200, res)
-- delete Consumer entity
res = assert(admin_client:send {
method = "DELETE",
path = "/consumers/bob"
})
assert.res_status(204, res)
-- ensure cache is invalidated
helpers.wait_for_invalidation(cache_key)
res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(401, res)
end)
it("invalidates credentials from cache when deleted", function()
-- populate cache
local res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(200, res)
-- ensure cache is populated
local cache_key = db.keyauth_credentials:cache_key("kong")
res = assert(admin_client:send {
method = "GET",
path = "/cache/" .. cache_key
})
local body = assert.res_status(200, res)
local credential = cjson.decode(body)
-- delete credential entity
res = assert(admin_client:send {
method = "DELETE",
path = "/consumers/bob/key-auth/" .. credential.id
})
assert.res_status(204, res)
-- ensure cache is invalidated
helpers.wait_for_invalidation(cache_key)
res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(401, res)
end)
it("invalidated credentials from cache when updated", function()
-- populate cache
local res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(200, res)
-- ensure cache is populated
local cache_key = db.keyauth_credentials:cache_key("kong")
res = assert(admin_client:send {
method = "GET",
path = "/cache/" .. cache_key
})
local body = assert.res_status(200, res)
local credential = cjson.decode(body)
-- delete credential entity
res = assert(admin_client:send {
method = "PATCH",
path = "/consumers/bob/key-auth/" .. credential.id,
body = {
key = "kong-updated"
},
headers = {
["Content-Type"] = "application/json"
}
})
assert.res_status(200, res)
-- ensure cache is invalidated
helpers.wait_for_invalidation(cache_key)
res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong"
}
})
assert.res_status(401, res)
res = assert(proxy_client:send {
method = "GET",
path = "/",
headers = {
["Host"] = "key-auth.com",
["apikey"] = "kong-updated"
}
})
assert.res_status(200, res)
end)
end)
end