kong/spec/02-integration/04-admin_api/18-worker-events.lua (187 lines of code) (raw):

local helpers = require "spec.helpers" local cjson = require "cjson" local pairs = pairs local type = type local null = ngx.null local function remove_nulls(tbl) for k,v in pairs(tbl) do if v == null then tbl[k] = nil elseif type(v) == "table" then tbl[k] = remove_nulls(v) end end return tbl end local headers = { ["Content-Type"] = "application/json" } for _, strategy in helpers.each_strategy() do describe("Admin API #" .. strategy, function() local admin_client local proxy_client lazy_setup(function() local bp = helpers.get_db_utils(strategy, { "routes", "services", "plugins", }, { "worker-events", }) bp.plugins:insert({ name = "worker-events", }) bp.routes:insert({ paths = { "/" } }) assert(helpers.start_kong { database = strategy, db_update_frequency = 0.1, nginx_conf = "spec/fixtures/custom_nginx.template", plugins = "worker-events", }) end) lazy_teardown(function() helpers.stop_kong(nil, true) end) before_each(function() admin_client = helpers.admin_client() proxy_client = helpers.proxy_client() end) after_each(function() if admin_client then admin_client:close() end if proxy_client then proxy_client:close() end end) describe("worker events", function() it("triggers create event on creation", function() local res = admin_client:post("/routes", { headers = headers, body = { hosts = { "example.test", }, }, }) local body = assert.res_status(201, res) local entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "create", entity = entity, }, json) end) it("triggers update event with old entity on update", function() local res = admin_client:put("/routes/test-update", { headers = headers, body = { hosts = { "example.test", }, }, }) -- TODO: it should really be 201, but Kong's PUT has always been 200, -- we can change it later (as we now know the difference). local body = assert.res_status(200, res) local entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "create", entity = entity, }, json) local old_entity = entity res = admin_client:patch("/routes/test-update", { headers = headers, body = { hosts = { "example2.test", }, }, }) body = assert.res_status(200, res) entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "update", entity = entity, old_entity = old_entity, }, json) end) it("triggers update event with old entity on upsert", function() local res = admin_client:put("/routes/test-upsert", { headers = headers, body = { hosts = { "example.test", }, }, }) -- TODO: it should really be 201, but Kong's PUT has always been 200, -- we can change it later (as we now know the difference). local body = assert.res_status(200, res) local entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "create", entity = entity, }, json) local old_entity = entity res = admin_client:put("/routes/test-upsert", { headers = headers, body = { hosts = { "example2.test", }, }, }) body = assert.res_status(200, res) entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "update", entity = entity, old_entity = old_entity, }, json) end) it("triggers delete event on delete", function() local res = admin_client:put("/routes/test-delete", { headers = headers, body = { hosts = { "example.test", }, }, }) -- TODO: it should really be 201, but Kong's PUT has always been 200, -- we can change it later (as we now know the difference). local body = assert.res_status(200, res) local entity = remove_nulls(cjson.decode(body)) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "create", entity = entity, }, json) res = admin_client:delete("/routes/test-delete", { headers = headers, }) assert.res_status(204, res) res = proxy_client:get("/") body = assert.res_status(200, res) local json = cjson.decode(body) assert.same({ operation = "delete", entity = entity, }, json) end) end) end) end