moto/README.md

173 lines
5.0 KiB
Markdown
Raw Normal View History

2013-02-18 21:16:15 +00:00
# Moto - Mock Boto
2013-02-16 03:15:43 +00:00
2013-03-01 03:36:23 +00:00
[![Build Status](https://travis-ci.org/spulec/moto.png?branch=master)](https://travis-ci.org/spulec/moto)
2013-03-11 04:13:28 +00:00
[![Coverage Status](https://coveralls.io/repos/spulec/moto/badge.png?branch=master)](https://coveralls.io/r/spulec/moto)
2013-03-01 03:36:23 +00:00
2013-02-18 21:10:56 +00:00
# WARNING: Moto is still in active development
2013-02-16 03:15:43 +00:00
# In a nutshell
2013-03-01 03:45:41 +00:00
Moto is a library that allows your python tests to easily mock out the boto library.
2013-02-16 03:15:43 +00:00
Imagine you have the following code that you want to test:
```python
import boto
from boto.s3.key import Key
class MyModel(object):
def __init__(self, name, value):
self.name = name
self.value = value
def save(self):
2013-02-18 21:09:40 +00:00
conn = boto.connect_s3()
2013-02-16 03:15:43 +00:00
bucket = conn.get_bucket('mybucket')
k = Key(bucket)
k.key = self.name
k.set_contents_from_string(self.value)
```
Take a minute to think how you would have tested that in the past.
2013-03-01 03:45:41 +00:00
Now see how you could test it with Moto:
2013-02-16 03:15:43 +00:00
```python
import boto
from moto import mock_s3
from mymodule import MyModel
@mock_s3
def test_my_model_save():
model_instance = MyModel('steve', 'is awesome')
model_instance.save()
conn = boto.connect_s3()
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
```
With the decorator wrapping the test, all the calls to s3 are automatically mocked out. The mock keeps the state of the buckets and keys.
2013-02-28 05:09:58 +00:00
It gets even better! Moto isn't just S3. Here's the status of the other AWS services implemented.
2013-02-16 03:15:43 +00:00
2013-03-07 04:08:29 +00:00
```gherkin
2013-03-07 03:53:22 +00:00
|---------------------------------------------------------------------------|
| Service Name | Decorator | Development Status |
|---------------------------------------------------------------------------|
| DynamoDB | @mock_dynamodb | Table actions core done |
|---------------------------------------------------------------------------|
2013-03-08 03:47:57 +00:00
| EC2 | @mock_ec2 | core endpoints done |
| - AMI | | core endpoints done |
| - EBS | | core endpoints done |
| - Instances | | all endpoints done |
| - Security Groups | | core endpoints done |
| - Tags | | all endpoints done |
2013-03-07 03:53:22 +00:00
|---------------------------------------------------------------------------|
2013-03-08 03:47:57 +00:00
| S3 | @mock_s3 | core endpoints done |
2013-03-07 03:53:22 +00:00
|---------------------------------------------------------------------------|
2013-03-08 03:47:57 +00:00
| SES | @mock_ses | core endpoints done |
2013-03-07 03:53:22 +00:00
|---------------------------------------------------------------------------|
2013-03-08 03:47:57 +00:00
| SQS | @mock_sqs | core endpoints done |
2013-03-07 03:53:22 +00:00
|---------------------------------------------------------------------------|
2013-03-07 04:08:29 +00:00
```
2013-02-16 03:15:43 +00:00
2013-03-05 13:16:54 +00:00
### Another Example
Imagine you have a function that you use to launch new ec2 instances:
2013-03-05 13:14:43 +00:00
```python
import boto
def add_servers(ami_id, count):
conn = boto.connect_ec2('the_key', 'the_secret')
for index in range(count):
conn.run_instances(ami_id)
```
To test it:
```python
from . import add_servers
@mock_ec2
def test_add_servers():
add_servers('ami-1234abcd', 2)
conn = boto.connect_ec2('the_key', 'the_secret')
reservations = conn.get_all_instances()
assert len(reservations) == 2
instance1 = reservations[0].instances[0]
assert instance1.image_id == 'ami-1234abcd'
```
2013-02-28 03:25:15 +00:00
## Usage
All of the services can be used as a decorator, context manager, or in a raw form.
### Decorator
```python
@mock_s3
def test_my_model_save():
model_instance = MyModel('steve', 'is awesome')
model_instance.save()
conn = boto.connect_s3()
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
```
### Context Manager
```python
def test_my_model_save():
with mock_s3():
model_instance = MyModel('steve', 'is awesome')
model_instance.save()
conn = boto.connect_s3()
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
```
### Raw use
```python
def test_my_model_save():
mock = mock_s3()
mock.start()
model_instance = MyModel('steve', 'is awesome')
model_instance.save()
conn = boto.connect_s3()
assert conn.get_bucket('mybucket').get_key('steve') == 'is awesome'
mock.stop()
```
2013-02-28 05:09:58 +00:00
2013-03-05 13:14:43 +00:00
## Stand-alone Server Mode
Moto also comes with a stand-alone server mode. This allows you to utilize the backend structure of Moto even if you don't use Python.
To run a service:
```console
$ moto_server ec2
* Running on http://127.0.0.1:5000/
```
Then go to [localhost](http://localhost:5000/?Action=DescribeInstances) to see a list of running instances (it will be empty since you haven't added any yet).
2013-02-28 05:16:16 +00:00
## Install
2013-02-28 05:09:58 +00:00
```console
2013-02-28 05:15:46 +00:00
$ pip install moto
2013-02-28 05:09:58 +00:00
```
2013-03-05 13:14:43 +00:00
This library has been tested on boto v2.5+.
## Thanks
A huge thanks to [Gabriel Falcão](https://github.com/gabrielfalcao) and his [HTTPretty](https://github.com/gabrielfalcao/HTTPretty) library. Moto would not exist without it.