Refactor and update tests

Lots of refactoring, updates the tests to run again (still fails 2 tests), and adds support to pass the options hash through in post requests.