/fake_sns

A fake implementation of AWS SNS to test against.

Primary LanguageRubyMIT LicenseMIT

Fake SNS

A small web app for local SNS development.

It contains a small store to inspect, and some methods to inspect and change the contents, so you can create scenarios.

Noteworthy differences:

  • No checking of access keys.
  • Returns all topics, not just 100, no support for NextToken parameter.

Implemented:

  • CreateTopic
  • ListTopics
  • DeleteTopic
  • GetTopicAttributes
  • SetTopicAttributes
  • ListSubscriptions
  • ListSubscriptionsByTopic

Under Construction

  • Subscribe
  • Publish

Actions to be implemented:

  • AddPermission
  • ConfirmSubscription
  • CreatePlatformApplication
  • CreatePlatformEndpoint
  • DeleteEndpoint
  • DeletePlatformApplication
  • GetEndpointAttributes
  • GetPlatformApplicationAttributes
  • GetSubscriptionAttributes
  • ListEndpointsByPlatformApplication
  • ListPlatformApplications
  • RemovePermission
  • SetEndpointAttributes
  • SetPlatformApplicationAttributes
  • SetSubscriptionAttributes
  • Unsubscribe

Usage

There are 2 ways of running FakeSNS, as a gem, or as plain Rack app. The first is easy, the latter is more flexible.

As a gem:

$ gem install fake_sns
$ fake_sns -p 9292

To configure AWS-SDK to send messages here:

AWS.config(
  use_ssl:       false,
  sns_endpoint:  "0.0.0.0",
  sns_port:      9292,
)

Command line options

Get help by running fake_sns --help. These options are basically the same as Sinatra's options. Here are the SNS specific options:

  • Store the database somewhere else: --database FILENAME or specify an in memory database that will be lost: --database :memory:

Extra endpoints

To get a YAML representation of all the data known to FakeSNS, do a GET request to the root path:

curl -X GET http://localhost:9292/

To change the database, submit the contents you got from the previous step, augment it and submit it as the body of a PUT request:

curl -X GET http://localhost:9292/ -o my-data.yml
vim my-data.yml
curl -X PUT --data @my-data.yml http://localhost:9292/

To reset the entire database, send a DELETE request:

curl -X DELETE http://localhost:9292/

To send ALL the messages stored in the queue, you can send a post request:

curl -X POST http://localhost:9292/drain

You can also just send a single message:

curl -X POST http://localhost:9292/drain/:message_id

Currently, only HTTP/HTTPS and SQS endpoints are working. You'll need to pass AWS config (in JSON format) for the SQS integration to work. See [FakeSNS] [fake_sns] for more information.

curl \
       -X POST \
       --data '{"aws_config": {"use_ssl": false, "sqs_endpoint": "localhost", "sqs_port": 4789, "secret_access_key": "xxx", "access_key_id": "yyy"}}' \
       http://localhost:9292/drain

Test Integration

When making integration tests for your app, you can easily include Fake SNS.

Here are the methods you need to run FakeSNS programmatically.

require "fake_sns/test_integration"

# globally, before the test suite starts:
AWS.config(
  use_ssl:            false,
  sns_endpoint:       "localhost",
  sns_port:           4568,
  access_key_id:      "fake access key",
  secret_access_key:  "fake secret key",
)
fake_sns = FakeSNS::TestIntegration.new

# before each test that requires SNS:
fake_sns.start

# at the end of the suite:
at_exit {
  fake_sns.stop
}

# for debugging, get everything FakeSNS knows:
puts fake_sns.data.inspect

# if you have SQS configured in the AWS config, you can also do:
fake_sns.drain

See spec/spec_helper.rb in this project for an example on how to load it in your test suite.

More information