131 lines
4.7 KiB
Lua
131 lines
4.7 KiB
Lua
_G._TEST = true
|
|
local cjson = require("cjson")
|
|
local configuration = require("configuration")
|
|
|
|
local unmocked_ngx = _G.ngx
|
|
local certificate_data = ngx.shared.certificate_data
|
|
|
|
function get_mocked_ngx_env()
|
|
local _ngx = {}
|
|
setmetatable(_ngx, {__index = _G.ngx})
|
|
|
|
_ngx.status = 100
|
|
_ngx.var = {}
|
|
_ngx.req = {
|
|
read_body = function() end,
|
|
get_body_file = function() end,
|
|
}
|
|
return _ngx
|
|
end
|
|
|
|
describe("Configuration", function()
|
|
before_each(function()
|
|
_G.ngx = get_mocked_ngx_env()
|
|
end)
|
|
|
|
after_each(function()
|
|
_G.ngx = unmocked_ngx
|
|
end)
|
|
|
|
describe("handle_servers()", function()
|
|
it("should not accept non POST methods", function()
|
|
ngx.var.request_method = "GET"
|
|
|
|
local s = spy.on(ngx, "print")
|
|
assert.has_no.errors(configuration.handle_servers)
|
|
assert.spy(s).was_called_with("Only POST requests are allowed!")
|
|
assert.same(ngx.status, ngx.HTTP_BAD_REQUEST)
|
|
end)
|
|
|
|
it("should ignore servers that don't have hostname or pemCertKey set", function()
|
|
ngx.var.request_method = "POST"
|
|
local mock_servers = cjson.encode({
|
|
{
|
|
hostname = "hostname",
|
|
sslCert = {}
|
|
},
|
|
{
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey"
|
|
}
|
|
}
|
|
})
|
|
ngx.req.get_body_data = function() return mock_servers end
|
|
|
|
local s = spy.on(ngx, "log")
|
|
assert.has_no.errors(configuration.handle_servers)
|
|
assert.spy(s).was_called_with(ngx.WARN, "hostname or pemCertKey are not present")
|
|
assert.same(ngx.status, ngx.HTTP_CREATED)
|
|
end)
|
|
|
|
it("should successfully update certificates and keys for each host", function()
|
|
ngx.var.request_method = "POST"
|
|
local mock_servers = cjson.encode({
|
|
{
|
|
hostname = "hostname",
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey"
|
|
}
|
|
}
|
|
})
|
|
ngx.req.get_body_data = function() return mock_servers end
|
|
|
|
assert.has_no.errors(configuration.handle_servers)
|
|
assert.same(certificate_data:get("hostname"), "pemCertKey")
|
|
assert.same(ngx.status, ngx.HTTP_CREATED)
|
|
end)
|
|
|
|
it("should log an err and set status to Internal Server Error when a certificate cannot be set", function()
|
|
ngx.var.request_method = "POST"
|
|
ngx.shared.certificate_data.safe_set = function(self, data) return false, "error" end
|
|
local mock_servers = cjson.encode({
|
|
{
|
|
hostname = "hostname",
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey"
|
|
}
|
|
},
|
|
{
|
|
hostname = "hostname2",
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey2"
|
|
}
|
|
}
|
|
})
|
|
ngx.req.get_body_data = function() return mock_servers end
|
|
|
|
local s = spy.on(ngx, "log")
|
|
assert.has_no.errors(configuration.handle_servers)
|
|
assert.spy(s).was_called_with(ngx.ERR,
|
|
"error setting certificate for hostname: error\nerror setting certificate for hostname2: error\n")
|
|
assert.same(ngx.status, ngx.HTTP_INTERNAL_SERVER_ERROR)
|
|
end)
|
|
|
|
it("should log an err, set status to Internal Server Error, and short circuit when shared dictionary is full", function()
|
|
ngx.var.request_method = "POST"
|
|
ngx.shared.certificate_data.safe_set = function(self, data) return false, "no memory" end
|
|
local mock_servers = cjson.encode({
|
|
{
|
|
hostname = "hostname",
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey"
|
|
}
|
|
},
|
|
{
|
|
hostname = "hostname2",
|
|
sslCert = {
|
|
pemCertKey = "pemCertKey2"
|
|
}
|
|
}
|
|
})
|
|
ngx.req.get_body_data = function() return mock_servers end
|
|
|
|
local s1 = spy.on(ngx, "log")
|
|
local s2 = spy.on(ngx.shared.certificate_data, "safe_set")
|
|
assert.has_no.errors(configuration.handle_servers)
|
|
assert.spy(s1).was_called_with(ngx.ERR, "no memory in certificate_data dictionary")
|
|
assert.spy(s2).was_not_called_with("hostname2", "pemCertKey2")
|
|
assert.same(ngx.status, ngx.HTTP_INTERNAL_SERVER_ERROR)
|
|
end)
|
|
end)
|
|
end)
|