Custom Plug.Parsers body_reader not called in test environment

I’ve got code to verify webhook signatures that’s similar to the code examples in this Dashbit article. In the dev environment, it works fine - the request body is read into conn.assigns[:raw_body]. In the test environment, however, the custom body_reader isn’t being called; the request body is not read into assigns.

Has anyone seen something like this or have some ideas? I’ve found similar posts related to Plug.Parsers and custom body_reader, but nothing specifically about testing differences. I’ve tried a number of things with Plug.Conn in the test environment, to no avail so far. Thanks!

Are you sure whatever you do in your tests does actually hit Plug.Parsers? Can you show your setup?

In dev, an IO.puts from inside the function called by Plug.Parsers body_reader gets written to stdout. In test, it does not, and conn.assigns is an empty map instead of containing the request body, as it does in dev. Since this is a proprietary app, I’ll see if I can replicate the problem in a minimal Phoenix app and share that code here.

1 Like

Make sure you pass in the request body as a string inside your tests. If you pass in a map, Plug takes some shortcuts that bypass Plug.Parsers

2 Likes

Thank you @voltone and @LostKobrakai for your responses. I didn’t realize Plug.Parsers was being bypassed by design. Got it working by posting the body as a JSON encoded string.

I just hit the same wall, and it was a surprise, mainly because this is not something explicit as most things from Plug/Phoenix.

Where is the best place to document that? Adding a note to Plug.Parser enough or it’s a broader thing that should be highlighted elsewhere?