Skip to content

Commit

Permalink
✨ Request logger
Browse files Browse the repository at this point in the history
Introduce a request logger, useful for debugging
  • Loading branch information
AndreMiras committed Jun 8, 2023
1 parent cd98146 commit f5148b0
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 1 deletion.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,17 @@ Delete:
database:from("todos"):delete():filter{id = 4}:execute()
```

## Logger

It's possible to log the requests to the REST API by using a logger callback.

```lua
function request_logger(method, url, payload, headers)
print("method: " .. method .. " url: " .. url)
end
database.request_logger = request_logger
```

## Development

### Tests
Expand Down
4 changes: 4 additions & 0 deletions postgrest/filter_builder.lua
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ end

function FilterBuilder:execute()
local json_implementation = self.database:get_json_implementation_or_error()
local request_logger = self.database.request_logger
local api_base_url = self.database.api_base_url
local auth_headers = self.database.auth_headers
local table_name = self.table_name
Expand All @@ -91,6 +92,9 @@ function FilterBuilder:execute()
if utils.table_length(payload) > 0 then
request:set_body(json_implementation.encode(payload));
end
if request_logger then
request_logger(method, url, payload, request.headers)
end
local headers, stream = assert(request:go())
local _, body = self.raise_for_status(headers, stream)
return #body > 0 and json_implementation.decode(body)
Expand Down
68 changes: 67 additions & 1 deletion postgrest/filter_builder_spec.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
local Database = require "postgrest.database"
local FilterBuilder = require "postgrest.filter_builder"
local http_request = require "http.request"
local utils = require "postgrest.utils"
local match = require("luassert.match")

local mock_request = function(http_request, status, body)
local json = utils.require_json()
mock(http_request, true)
local upsert = function() end
local headers = {upsert = upsert}
local get = function() return status end
local response_headers = {get = get}
local get_body_as_string = function() return json.encode(body) end
local stream = {get_body_as_string = get_body_as_string}
local go = function() return response_headers, stream end
local request = {headers = headers, go = go}
local new_from_uri = spy.new(function() return request end)
http_request.new_from_uri = new_from_uri
end

describe("filter_builder", function()

Expand Down Expand Up @@ -38,6 +55,7 @@ describe("filter_builder", function()
describe("add_headers", function()

it("should work no headers", function()
local http_request = require "http.request"
local url = "http://localhost"
local request = http_request.new_from_uri(url)
local default_len = request.headers:len()
Expand All @@ -48,6 +66,7 @@ describe("filter_builder", function()
end)

it("should upsert headers", function()
local http_request = require "http.request"
local url = "http://localhost"
local request = http_request.new_from_uri(url)
local default_len = request.headers:len()
Expand Down Expand Up @@ -112,5 +131,52 @@ describe("filter_builder", function()

end)

describe("execute", function()
local http_request
before_each(function() http_request = require "http.request" end)

after_each(function() mock.revert(http_request) end)

it("should return the response body", function()
local status = 200
local expected_response_body = "body"
mock_request(http_request, status, expected_response_body)
local api_base_url = "api_base_url"
local database = mock(Database:new(api_base_url), true)
local table_name = "table_name"
local method = "GET"
local query_parameters = {}
local payload = {}
local filter_builder = FilterBuilder:new(database, table_name,
method, query_parameters,
payload)
local response_body = filter_builder:execute()
assert.same(expected_response_body, response_body)
end)

it("should log the request", function()
local status = 200
local expected_response_body = "body"
mock_request(http_request, status, expected_response_body)
local api_base_url = "api_base_url"
local database = mock(Database:new(api_base_url), true)
local request_logger = spy.new(function() end)
database.request_logger = request_logger
local table_name = "table_name"
local url = api_base_url .. "/" .. table_name
local method = "GET"
local query_parameters = {}
local payload = {}
local any = match._
local filter_builder = FilterBuilder:new(database, table_name,
method, query_parameters,
payload)
local response_body = filter_builder:execute()
assert.same(expected_response_body, response_body)
assert.spy(request_logger).was.called_with(method, url, any, any)
end)

end)

end)

0 comments on commit f5148b0

Please sign in to comment.