kong/spec/02-integration/04-admin_api/16-ca_certificates_routes_spec.lua (239 lines of code) (raw):

local ssl_fixtures = require "spec.fixtures.ssl" local helpers = require "spec.helpers" local cjson = require "cjson" local ca_cert = [[ -----BEGIN CERTIFICATE----- MIIEvjCCAqagAwIBAgIJALabx/Nup200MA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV BAMMCFlvbG80Mi4xMCAXDTE5MDkxNTE2Mjc1M1oYDzIxMTkwODIyMTYyNzUzWjAT MREwDwYDVQQDDAhZb2xvNDIuMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBANIW67Ay0AtTeBY2mORaGet/VPL5jnBRz0zkZ4Jt7fEq3lbxYaJBnFI8wtz3 bHLtLsxkvOFujEMY7HVd+iTqbJ7hLBtK0AdgXDjf+HMmoWM7x0PkZO+3XSqyRBbI YNoEaQvYBNIXrKKJbXIU6higQaXYszeN8r3+RIbcTIlZxy28msivEGfGTrNujQFc r/eyf+TLHbRqh0yg4Dy/U/T6fqamGhFrjupRmOMugwF/BHMH2JHhBYkkzuZLgV2u 7Yh1S5FRlh11am5vWuRSbarnx72hkJ99rUb6szOWnJKKew8RSn3CyhXbS5cb0QRc ugRc33p/fMucJ4mtCJ2Om1QQe83G1iV2IBn6XJuCvYlyWH8XU0gkRxWD7ZQsl0bB 8AFTkVsdzb94OM8Y6tWI5ybS8rwl8b3r3fjyToIWrwK4WDJQuIUx4nUHObDyw+KK +MmqwpAXQWbNeuAc27FjuJm90yr/163aGuInNY5Wiz6CM8WhFNAi/nkEY2vcxKKx irSdSTkbnrmLFAYrThaq0BWTbW2mwkOatzv4R2kZzBUOiSjRLPnbyiPhI8dHLeGs wMxiTXwyPi8iQvaIGyN4DPaSEiZ1GbexyYFdP7sJJD8tG8iccbtJYquq3cDaPTf+ qv5M6R/JuMqtUDheLSpBNK+8vIe5e3MtGFyrKqFXdynJtfHVAgMBAAGjEzARMA8G A1UdEwQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggIBAK0BmL5B1fPSMbFy8Hbc /ESEunt4HGaRWmZZSa/aOtTjhKyDXLLJZz3C4McugfOf9BvvmAOZU4uYjfHTnNH2 Z3neBkdTpQuJDvrBPNoCtJns01X/nuqFaTK/Tt9ZjAcVeQmp51RwhyiD7nqOJ/7E Hp2rC6gH2ABXeexws4BDoZPoJktS8fzGWdFBCHzf4mCJcb4XkI+7GTYpglR818L3 dMNJwXeuUsmxxKScBVH6rgbgcEC/6YwepLMTHB9VcH3X5VCfkDIyPYLWmvE0gKV7 6OU91E2Rs8PzbJ3EuyQpJLxFUQp8ohv5zaNBlnMb76UJOPR6hXfst5V+e7l5Dgwv Dh4CeO46exmkEsB+6R3pQR8uOFtubH2snA0S3JA1ji6baP5Y9Wh9bJ5McQUgbAPE sCRBFoDLXOj3EgzibohC5WrxN3KIMxlQnxPl3VdQvp4gF899mn0Z9V5dAsGPbxRd quE+DwfXkm0Sa6Ylwqrzu2OvSVgbMliF3UnWbNsDD5KcHGIaFxVC1qkwK4cT3pyS 58i/HAB2+P+O+MltQUDiuw0OSUFDC0IIjkDfxLVffbF+27ef9C5NG81QlwTz7TuN zeigcsBKooMJTszxCl6dtxSyWTj7hJWXhy9pXsm1C1QulG6uT4RwCa3m0QZoO7G+ 6Wu6lP/kodPuoNubstIuPdi2 -----END CERTIFICATE----- ]] for _, strategy in helpers.each_strategy() do describe("/ca_certificates with DB: #" .. strategy, function() local client, bp, db lazy_setup(function() bp, db = helpers.get_db_utils(strategy, { "ca_certificates", }) assert(helpers.start_kong { database = strategy, }) client = assert(helpers.admin_client(10000)) end) it("GET", function() local res = client:get("/ca_certificates") local body = assert.res_status(200, res) local json = cjson.decode(body) assert.equal(0, #json.data) res = client:post("/ca_certificates", { body = { cert = ssl_fixtures.cert_ca, }, headers = { ["Content-Type"] = "application/json" }, }) assert.res_status(201, res) res = client:get("/ca_certificates") body = assert.res_status(200, res) json = cjson.decode(body) assert.equal(1, #json.data) assert.equals(json.data[1].cert, ssl_fixtures.cert_ca) end) describe("POST", function() it("succeeds", function() local res = client:post("/ca_certificates", { body = { cert = ca_cert, }, headers = { ["Content-Type"] = "application/json" }, }) assert.res_status(201, res) end) it("missing field", function() local res = client:post("/ca_certificates", { body = { }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (cert: required field missing)", json.message) end) it("non CA cert", function() local res = client:post("/ca_certificates", { body = { cert = ssl_fixtures.cert, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate does not appear to be a CA because it is missing the \"CA\" basic constraint)", json.message) end) it("expired cert", function() local res = client:post("/ca_certificates", { body = { cert = ssl_fixtures.cert_alt, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate expired, \"Not After\" time is in the past)", json.message) end) it("multiple certs", function() local res = client:post("/ca_certificates", { body = { cert = ssl_fixtures.cert .. "\n" .. ssl_fixtures.cert, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (please submit only one certificate at a time)", json.message) end) end) describe("DELETE", function() local ca lazy_setup(function() db:truncate("ca_certificates") ca = assert(bp.ca_certificates:insert()) end) it("works", function() local res = client:delete("/ca_certificates/" .. ca.id) assert.res_status(204, res) res = client:get("/ca_certificates") local body = assert.res_status(200, res) local json = cjson.decode(body) assert.equal(0, #json.data) end) end) describe("PATCH", function() local ca lazy_setup(function() db:truncate("ca_certificates") ca = assert(bp.ca_certificates:insert()) end) it("non CA cert", function() local res = client:patch("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate does not appear to be a CA because it is missing the \"CA\" basic constraint)", json.message) end) it("expired cert", function() local res = client:patch("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert_alt, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate expired, \"Not After\" time is in the past)", json.message) end) it("works", function() local res = client:patch("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert_ca, }, headers = { ["Content-Type"] = "application/json" }, }) assert.res_status(200, res) end) end) describe("PUT", function() local ca lazy_setup(function() db:truncate("ca_certificates") ca = assert(bp.ca_certificates:insert()) end) it("missing field", function() local res = client:put("/ca_certificates/" .. ca.id, { body = { }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (cert: required field missing)", json.message) end) it("non CA cert", function() local res = client:put("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate does not appear to be a CA because it is missing the \"CA\" basic constraint)", json.message) end) it("expired cert", function() local res = client:put("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert_alt, }, headers = { ["Content-Type"] = "application/json" }, }) local body = assert.res_status(400, res) local json = cjson.decode(body) assert.equal("schema violation (certificate expired, \"Not After\" time is in the past)", json.message) end) it("updates existing cert", function() local res = client:put("/ca_certificates/" .. ca.id, { body = { cert = ssl_fixtures.cert_ca, }, headers = { ["Content-Type"] = "application/json" }, }) assert.res_status(200, res) res = client:get("/ca_certificates") local body = assert.res_status(200, res) local json = cjson.decode(body) assert.equal(1, #json.data) assert.equals(json.data[1].cert, ssl_fixtures.cert_ca) end) it("creates new cert when uuid does not exist", function() db:truncate("ca_certificates") local res = client:put("/ca_certificates/123e4567-e89b-12d3-a456-426655440000", { body = { cert = ssl_fixtures.cert_ca, }, headers = { ["Content-Type"] = "application/json" }, }) assert.res_status(200, res) local res = client:get("/ca_certificates/123e4567-e89b-12d3-a456-426655440000") local body = assert.res_status(200, res) local json = cjson.decode(body) assert.equal(ssl_fixtures.cert_ca, json.cert) end) end) lazy_teardown(function() if client then client:close() end helpers.stop_kong() end) end) end