All Projects → derekkraan → walkman

derekkraan / walkman

Licence: other
Isolate tests from the real world, inspired by Ruby's VCR.

Programming Languages

elixir
2628 projects

Projects that are alternatives of or similar to walkman

cli
Do not program API integrations! Install them.
Stars: ✭ 14 (-72.55%)
Mutual labels:  integration
contentful-wizard
Add walkthrough of contentful blocks to your application
Stars: ✭ 33 (-35.29%)
Mutual labels:  integration
HTTPCalloutFramework
HTTP Callout Framework - A light weight callout framework for apex HTTP callouts in Salesforce
Stars: ✭ 43 (-15.69%)
Mutual labels:  integration
PlexKodiConnect
Plex integration in Kodi done right
Stars: ✭ 917 (+1698.04%)
Mutual labels:  integration
wordpress-vanilla
Official WordPress plugin for Vanilla Forums integration.
Stars: ✭ 18 (-64.71%)
Mutual labels:  integration
openintegrationhub
Open Integration Hub
Stars: ✭ 128 (+150.98%)
Mutual labels:  integration
camel-k-examples
Apache Camel K Examples
Stars: ✭ 48 (-5.88%)
Mutual labels:  integration
roadrunner-laravel
Simple bridge between Symfony and RoadRunner.
Stars: ✭ 43 (-15.69%)
Mutual labels:  integration
knime-deeplearning
KNIME Deep Learning Integration
Stars: ✭ 19 (-62.75%)
Mutual labels:  integration
pods-beaver-builder-themer-add-on
Integration of Beaver Themer plugin for WordPress (https://pods.io/beaver-themer/)
Stars: ✭ 37 (-27.45%)
Mutual labels:  integration
slack-robot
Simple robot for your slack integration
Stars: ✭ 29 (-43.14%)
Mutual labels:  integration
StreamLinkerino
Twitch.tv client using only StreamLink, MPV, and Chatterino
Stars: ✭ 26 (-49.02%)
Mutual labels:  integration
magento2-pimcore-bridge
Magento 2 module for Pimcore integration.
Stars: ✭ 28 (-45.1%)
Mutual labels:  integration
panasonic smart app
Panasonic Smart App integration for Home Assistant.
Stars: ✭ 22 (-56.86%)
Mutual labels:  integration
emacs-run-command
Efficient and ergonomic external command invocation for Emacs
Stars: ✭ 64 (+25.49%)
Mutual labels:  integration
mimesis-factory
Mimesis integration with factory_boy
Stars: ✭ 42 (-17.65%)
Mutual labels:  integration
bearer
Bearer provides all of the tools to build, run and manage API integrations.
Stars: ✭ 22 (-56.86%)
Mutual labels:  integration
hilo
Hilo integration for Home Assistant
Stars: ✭ 26 (-49.02%)
Mutual labels:  integration
logzio-python-handler
Python logging handler that sends your logs to Logz.io using the https bulk input
Stars: ✭ 32 (-37.25%)
Mutual labels:  integration
lennoxs30
Home Assistant Lennox S30 / E30 / M30 integration
Stars: ✭ 31 (-39.22%)
Mutual labels:  integration

Walkman

Hex pm CircleCI badge

Walkman was inspired by Ruby's VCR. While VCR deals explicitely with HTTP requests, Walkman is useful for performing automated mocking of any module.

Walkman wraps modules instead of modifying them directly, which means there is less funny business going on, so less chance newer versions of Elixir will break the package. Walkman is more explicit and less magical, and as a result you will have to write a tiny bit more boilerplate than you're maybe used to.

Getting started

Somewhere in your application you've got a module, MyModule, that communicates with the outside world. Perhaps it is an SSH driver, or it makes an HTTP request.

Make the location of this module configurable

# config/config.exs

config :my_app, my_module: MyModule
# config/test.exs

config :my_app, my_module: MyModuleWrapper

Replace MyModule in your application with Application.get_env(:my_app, :my_module).

Wrap MyModule with MyModuleWrapper.

# test/support/my_module_wrapper.ex

require Walkman

Walkman.def_stub(MyModuleWrapper, for: MyModule)

Lastly, in mix.exs, add test/support/ to the paths that need to be compiled in :test.

def project do
  [
    # Everything that usually goes here
    elixirc_paths: elixirc_paths(Mix.env())
  ]
end

defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]

Now you can use "tapes" in your tests.

test "MyModule" do
  Walkman.use_tape "my wrapper tape" do
    # test code that uses `MyModule` underwater
  end
end

Add the fixtures that Walkman creates to your repository.

Generating fresh fixtures

To generate new fixtures, just remove the "tapes" you want to regenerate and re-run the tests. Like VCR, if Walkman doesn't find an existing fixture, it will create one.

Fixture file format

Fixtures are saved in Erlang's binary External Term Format, which most editors won't be able to open correctly. If you want to see what exactly has been recorded, you can use :erlang.binary_to_term() to parse the file contents back into readable Elixir terms.

File.read!("path/to/fixture") |> :erlang.binary_to_term()

Changing default tape mode

By default, all Walkman tapes are only available in the scope of the current process. To make the tape available to other processes you have to set global: true:

test "MyModule" do
  Walkman.use_tape "my wrapper tape", global: true do
    # test code that uses `MyModule` underwater
  end
end

The default behaviour can be changed in config/test.exs:

config :walkman, global: true

Disabling module md5 checks

By default Walkman re-record tapes every time the wrapped module changes and this is done by storing the md5 of the module on the tape.

To change this behaviour the option module_changes should be set to :ignore or :warn which can be done per tape as in the example below:

test "MyModule" do
  Walkman.use_tape "my wrapper tape", module_changes: :warn do
    # test code that uses `MyModule` underwater
  end
end

The module_changes option accepts the following values:

  • :rerecord - if the recorded module changes the tape is automatically re-recorded.
  • :warn - if the recorded module changes a warning is logged.
  • :ignore - It ignores any changes in the recorded module

The default behaviour can also be changed in config/test.exs:

config :walkman, module_changes: :ignore

Running "integration" specs

If you set Walkman to :integration mode then it will pass all function calls through to the wrapped module (instead of using the fixtures).

Walkman.set_mode(:integration)

Limitations

o Walkman cannot run specs in parallel. Walkman sets the "tape" globally and would have no way of knowing from which test a particular call originates.

Installation

If available in Hex, the package can be installed by adding walkman to your list of dependencies in mix.exs:

def deps do
  [
    {:walkman, "~> 0.3.0", only: :test}
  ]
end

Contributing

Note that if you want to run Walkman's tests locally, you'll need to be running Elixir v1.9.1 and Erlang v22.1.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].