A fake Pusher server for development and testing.
When run, an entire fake service is started on two random open ports. Connections can then be made to the service without needing a Pusher account. The host and port for the socket and web servers can be found by checking the configuration.
The project is intended to fully replace the Pusher service with a local version for testing and development purposes. It is not intended to be a replacement for production usage!
- Using a remote API for testing is slow.
- Working offline is currently impossible.
- Wasting connections and messages in development is unreasonable.
- Stubbing the JavaScript, such as with pusher-test-stub, is suboptimal and tedious for integration tests.
<script>
<% if defined?(PusherFake) %>
// Test environment.
//
// Note: Ensure output is not HTML escaped, such as with the raw helper in Rails.
var instance = <%= PusherFake.javascript %>;
<% else %>
// Other environments, such as production.
var instance = new Pusher(...);
<% end %>
</script>require "pusher-fake/support/rspec"require "pusher-fake/support/cucumber"A custom plan is required. See an example plan for the configuration necessary.
require "pusher-fake/support/base"
# Reset the channels after each test:
PusherFake::Channel.resetIn a Rails initializer, or any file executed during loading:
# Ensure it's only run in a development environment if it's a global file.
if Rails.env.development?
# Ensure Pusher configuration is set if you're not doing so elsewhere.
Pusher.app_id = "MY_TEST_ID"
Pusher.key = "MY_TEST_KEY"
Pusher.secret = "MY_TEST_SECRET"
# Require the base file, which immediately starts the socket and web servers.
#
# If you're including this file in multiple processes, you may want to add an
# additional check or even possibly hard code the socket and web ports.
require "pusher-fake/support/base"
endIf you're using Foreman, or something similar, you'll only want to run the fake for a single process:
if ENV["PUSHER_FAKE"]
require "pusher-fake/support/base"
endweb: PUSHER_FAKE=1 bundle exec unicorn ...
worker: bundle exec ...
If you're creating a Pusher::Client instance and wish to use the fake, you need to provide the options.
Pusher::Client.new({
key: Pusher.key,
app_id: Pusher.app_id,
secret: Pusher.secret
}.merge(PusherFake.configuration.web_options))Note that the application ID, API key, and token are automatically set to the Pusher values when using an included support file.
| Setting | Description |
|---|---|
| app_id | The Pusher application ID. |
| key | The Pusher API key. |
| logger | An IO instance for verbose logging. |
| secret | The Pusher API token. |
| socket_options | Socket server options. See EventMachine::WebSocket.start for options. |
| verbose | Enable verbose logging. |
| web_options | Web server options. See Thin::Server for options. |
| webhooks | Array of webhook URLs. |
# Single setting.
PusherFake.configuration.verbose = true
# Multiple settings.
PusherFake.configure do |configuration|
configuration.logger = Rails.logger
configuration.verbose = true
endThe WebSocket server is provided all socket_options, allowing you to set the secure and tls_options options to create a secure server.
The web server passes all web_options, besides host and port, to the Thin backend via attribute writers, allowing you to set the ssl and ssl_options options.
- pusher-fake-example - An example of using pusher-fake with RSpec to test a Rails application.
pusher-fake uses the MIT license. See LICENSE for more details.