Two issues are addressed in this commit:
1. Instead of only sending the predefined environment arguments, this
commit appends the arguments to the existing OS environment. Fixes#53.
2. If an argument is not found in the payload, allow the command to run
and pass in an empty string as a placeholder. Fixes#54.
Additionally, I replaced `hook.ErrInvalidPayloadSignature` with a new
`SignatureError` type so that we can embed the signature in the error.
There's a lot in this commit.
1. Add `pass-environment-to-command` option that works much like
`pass-arguments-to-command`. You can see an example usage in the
"github" test case.
2. Add a test program called "hookecho" that is used to test the
webhook package instead of relying upon a system `echo` command.
3. Move hooks_test.json to a template so that we can update the path to
hookecho on the fly.
4. Don't return an error at the end of hook.MatchRule.Evaluate(). All
tests succeed for me now.
This commit adds a testing framework modeled after the godoc tests. It builds
webhook in a temporary directory, runs it with the supplied `hooks_test.json`
configuration, and then tests different payloads. I use `/bin/echo` for the
test executable, so I've added build tags to exclude Windows.
Three minor (I hope) changes in functionality:
- I ended up moving everything from `init()` to `main()` because `init()` was
firing while trying to build the tests, and it was dying since `hooks.json`
didn't exist. I'm still not 100% sure `init()` was firing, but I didn't see
any real need for anything to be in `init()` in the first place.
- make sure logger is using `os.Stderr`
- don't send `http.StatusBadRequest` when the Hook rules don't match. "Bad
Request" is used to identify malformed requests. The request was properly
formed and processed, so I think we should send back `http.StatusOK`. For
example, if I setup a webhook rule to only execute when commits are made to
the `master` branch, we shouldn't send back `http.StatusBadRequest` when we
ingest a payload for the `development` branch.
The test payloads are pretty verbose and could probably be shortened, but I kind
of like having an example payload for each service. We can pare them down if we
want to do more focused, minimalist testing.