kong/spec/03-plugins/25-oauth2/01-schema_spec.lua (186 lines of code) (raw):
local helpers = require "spec.helpers"
local utils = require "kong.tools.utils"
local schema_def = require "kong.plugins.oauth2.schema"
local v = require("spec.helpers").validate_plugin_config_schema
local fmt = string.format
for _, strategy in helpers.each_strategy() do
describe(fmt("Plugin: oauth2 [#%s] (schema)", strategy), function()
local bp, db = helpers.get_db_utils(strategy, {
"routes",
"services",
"consumers",
"plugins",
"oauth2_tokens",
"oauth2_authorization_codes",
"oauth2_credentials",
})
local oauth2_authorization_codes_schema = db.oauth2_authorization_codes.schema
local oauth2_tokens_schema = db.oauth2_tokens.schema
it("does not require `scopes` when `mandatory_scope` is false", function()
local ok, errors = v({enable_authorization_code = true, mandatory_scope = false}, schema_def)
assert.is_truthy(ok)
assert.is_falsy(errors)
end)
it("valid when both `scopes` when `mandatory_scope` are given", function()
local ok, errors = v({enable_authorization_code = true, mandatory_scope = true, scopes = {"email", "info"}}, schema_def)
assert.truthy(ok)
assert.is_falsy(errors)
end)
it("autogenerates `provision_key` when not given", function()
local t = {enable_authorization_code = true, mandatory_scope = true, scopes = {"email", "info"}}
local t2, errors = v(t, schema_def)
assert.is_falsy(errors)
assert.truthy(t2.config.provision_key)
assert.equal(32, t2.config.provision_key:len())
end)
it("does not autogenerate `provision_key` when it is given", function()
local t = {enable_authorization_code = true, mandatory_scope = true, scopes = {"email", "info"}, provision_key = "hello"}
local ok, errors = v(t, schema_def)
assert.truthy(ok)
assert.is_falsy(errors)
assert.truthy(t.provision_key)
assert.equal("hello", t.provision_key)
end)
it("sets default `auth_header_name` when not given", function()
local t = {enable_authorization_code = true, mandatory_scope = true, scopes = {"email", "info"}}
local t2, errors = v(t, schema_def)
assert.truthy(t2)
assert.is_falsy(errors)
assert.truthy(t2.config.provision_key)
assert.equal(32, t2.config.provision_key:len())
assert.equal("authorization", t2.config.auth_header_name)
end)
it("does not set default value for `auth_header_name` when it is given", function()
local t = {enable_authorization_code = true, mandatory_scope = true, scopes = {"email", "info"}, provision_key = "hello",
auth_header_name="custom_header_name"}
local t2, errors = v(t, schema_def)
assert.truthy(t2)
assert.is_falsy(errors)
assert.truthy(t2.config.provision_key)
assert.equal("hello", t2.config.provision_key)
assert.equal("custom_header_name", t2.config.auth_header_name)
end)
it("sets refresh_token_ttl to default value if not set", function()
local t = {enable_authorization_code = true, mandatory_scope = false}
local t2, errors = v(t, schema_def)
assert.truthy(t2)
assert.is_falsy(errors)
assert.equal(1209600, t2.config.refresh_token_ttl)
end)
it("defaults to non-persistent refresh tokens", function()
local t = {enable_authorization_code = true, mandatory_scope = false}
local t2, errors = v(t, schema_def)
assert.truthy(t2)
assert.is_falsy(errors)
assert.equal(false, t2.config.reuse_refresh_token)
end)
describe("errors", function()
it("requires at least one flow", function()
local ok, err = v({}, schema_def)
assert.is_falsy(ok)
assert.same("at least one of these fields must be true: enable_authorization_code, enable_implicit_grant, enable_client_credentials, enable_password_grant",
err.config)
end)
it("requires `scopes` when `mandatory_scope` is true", function()
local ok, err = v({enable_authorization_code = true, mandatory_scope = true}, schema_def)
assert.is_falsy(ok)
assert.equal("required field missing",
err.config.scopes)
end)
it("errors when given an invalid service_id on oauth tokens", function()
local ok, err_t = oauth2_tokens_schema:validate_insert({
credential = { id = "foo" },
service = { id = "bar" },
expires_in = 1,
})
assert.falsy(ok)
assert.same({
credential = { id = 'expected a valid UUID' },
service = { id = 'expected a valid UUID' },
token_type = "required field missing",
}, err_t)
local ok, err_t = oauth2_tokens_schema:validate_insert({
credential = { id = "foo" },
service = { id = utils.uuid() },
expires_in = 1,
})
assert.falsy(ok)
assert.same({
credential = { id = 'expected a valid UUID' },
token_type = "required field missing",
}, err_t)
local ok, err_t = oauth2_tokens_schema:validate_insert({
credential = { id = utils.uuid() },
service = { id = utils.uuid() },
expires_in = 1,
token_type = "bearer",
})
assert.is_truthy(ok)
assert.is_nil(err_t)
end)
it("errors when given an invalid service_id on oauth authorization codes", function()
local ok, err_t = oauth2_authorization_codes_schema:validate_insert({
credential = { id = "foo" },
service = { id = "bar" },
})
assert.falsy(ok)
assert.same({
credential = { id = 'expected a valid UUID' },
service = { id = 'expected a valid UUID' },
}, err_t)
local ok, err_t = oauth2_authorization_codes_schema:validate_insert({
credential = { id = "foo" },
service = { id = utils.uuid() },
})
assert.falsy(ok)
assert.same({
credential = { id = 'expected a valid UUID' },
}, err_t)
local ok, err_t = oauth2_authorization_codes_schema:validate_insert({
credential = { id = utils.uuid() },
service = { id = utils.uuid() },
})
assert.truthy(ok)
assert.is_nil(err_t)
end)
end)
describe("when deleting a service", function()
it("deletes associated oauth2 entities", function()
local service = bp.services:insert()
local consumer = bp.consumers:insert()
local credential = bp.oauth2_credentials:insert({
redirect_uris = { "http://example.com" },
consumer = { id = consumer.id },
})
local ok, err, err_t
local token = bp.oauth2_tokens:insert({
credential = { id = credential.id },
service = { id = service.id },
})
local code = bp.oauth2_authorization_codes:insert({
credential = { id = credential.id },
service = { id = service.id },
})
token, err = db.oauth2_tokens:select({ id = token.id })
assert.falsy(err)
assert.truthy(token)
code, err = db.oauth2_authorization_codes:select({ id = code.id })
assert.falsy(err)
assert.truthy(code)
ok, err, err_t = db.services:delete({ id = service.id })
assert.truthy(ok)
assert.is_falsy(err_t)
assert.is_falsy(err)
-- no more service
service, err = db.services:select({ id = service.id })
assert.falsy(err)
assert.falsy(service)
-- no more token
token, err = db.oauth2_tokens:select({ id = token.id })
assert.falsy(err)
assert.falsy(token)
-- no more code
code, err = db.oauth2_authorization_codes:select({ id = code.id })
assert.falsy(err)
assert.falsy(code)
end)
end)
end)
end