diff --git a/moto/__init__.py b/moto/__init__.py
index 8594cedd2..7cb6d0e39 100644
--- a/moto/__init__.py
+++ b/moto/__init__.py
@@ -18,6 +18,7 @@ from .datapipeline import mock_datapipeline, mock_datapipeline_deprecated # fla
from .dynamodb import mock_dynamodb, mock_dynamodb_deprecated # flake8: noqa
from .dynamodb2 import mock_dynamodb2, mock_dynamodb2_deprecated # flake8: noqa
from .dynamodbstreams import mock_dynamodbstreams # flake8: noqa
+from .eb import mock_eb # flake8: noqa
from .ec2 import mock_ec2, mock_ec2_deprecated # flake8: noqa
from .ecr import mock_ecr, mock_ecr_deprecated # flake8: noqa
from .ecs import mock_ecs, mock_ecs_deprecated # flake8: noqa
diff --git a/moto/eb/__init__.py b/moto/eb/__init__.py
new file mode 100644
index 000000000..3e06e9595
--- /dev/null
+++ b/moto/eb/__init__.py
@@ -0,0 +1,4 @@
+from .models import eb_backends
+from moto.core.models import base_decorator
+
+mock_eb = base_decorator(eb_backends)
diff --git a/moto/eb/exceptions.py b/moto/eb/exceptions.py
new file mode 100644
index 000000000..c470d5317
--- /dev/null
+++ b/moto/eb/exceptions.py
@@ -0,0 +1,7 @@
+from moto.core.exceptions import RESTError
+
+
+class InvalidParameterValueError(RESTError):
+ def __init__(self, message):
+ super(InvalidParameterValueError, self).__init__(
+ "InvalidParameterValue", message)
diff --git a/moto/eb/models.py b/moto/eb/models.py
new file mode 100644
index 000000000..246d33cde
--- /dev/null
+++ b/moto/eb/models.py
@@ -0,0 +1,37 @@
+import boto.beanstalk
+
+from moto.core import BaseBackend, BaseModel
+from .exceptions import InvalidParameterValueError
+
+
+class FakeApplication(BaseModel):
+ def __init__(self, application_name):
+ self.application_name = application_name
+
+
+class EBBackend(BaseBackend):
+ def __init__(self, region):
+ self.region = region
+ self.applications = dict()
+
+ def reset(self):
+ # preserve region
+ region = self.region
+ self._reset_model_refs()
+ self.__dict__ = {}
+ self.__init__(region)
+
+ def create_application(self, application_name):
+ if application_name in self.applications:
+ raise InvalidParameterValueError(
+ "Application {} already exists.".format(application_name)
+ )
+ new_app = FakeApplication(
+ application_name=application_name,
+ )
+ self.applications[application_name] = new_app
+ return new_app
+
+
+eb_backends = dict((region.name, EBBackend(region.name))
+ for region in boto.beanstalk.regions())
diff --git a/moto/eb/responses.py b/moto/eb/responses.py
new file mode 100644
index 000000000..9cf8b2e47
--- /dev/null
+++ b/moto/eb/responses.py
@@ -0,0 +1,92 @@
+from moto.core.responses import BaseResponse
+from .models import eb_backends
+
+EB_CREATE_APPLICATION = """
+
+
+
+
+ 2019-09-03T13:08:29.049Z
+
+
+
+ false
+ 180
+ false
+
+
+ false
+ 200
+ false
+
+
+
+ arn:aws:elasticbeanstalk:{{ region_name }}:111122223333:application/{{ application_name }}
+ {{ application.application_name }}
+ 2019-09-03T13:08:29.049Z
+
+
+
+ 1b6173c8-13aa-4b0a-99e9-eb36a1fb2778
+
+
+"""
+
+
+EB_DESCRIBE_APPLICATIONS = """
+
+
+
+ {% for application in applications %}
+
+
+ 2019-09-03T13:08:29.049Z
+
+
+
+ 180
+ false
+ false
+
+
+ false
+ 200
+ false
+
+
+
+ arn:aws:elasticbeanstalk:{{ region_name }}:387323646340:application/{{ application.name }}
+ {{ application.application_name }}
+ 2019-09-03T13:08:29.049Z
+
+ {% endfor %}
+
+
+
+ 015a05eb-282e-4b76-bd18-663fdfaf42e4
+
+
+"""
+
+
+class EBResponse(BaseResponse):
+ @property
+ def backend(self):
+ return eb_backends[self.region]
+
+ def create_application(self):
+ app = self.backend.create_application(
+ application_name=self._get_param('ApplicationName'),
+ )
+
+ template = self.response_template(EB_CREATE_APPLICATION)
+ return template.render(
+ region_name=self.backend.region,
+ application=app,
+ )
+
+ def describe_applications(self):
+ template = self.response_template(EB_DESCRIBE_APPLICATIONS)
+ return template.render(
+ applications=self.backend.applications.values(),
+ )
diff --git a/moto/eb/urls.py b/moto/eb/urls.py
new file mode 100644
index 000000000..4cd4add13
--- /dev/null
+++ b/moto/eb/urls.py
@@ -0,0 +1,11 @@
+from __future__ import unicode_literals
+
+from .responses import EBResponse
+
+url_bases = [
+ r"https?://elasticbeanstalk.(?P[a-zA-Z0-9\-_]+).amazonaws.com",
+]
+
+url_paths = {
+ '{0}/$': EBResponse.dispatch,
+}
diff --git a/tests/test_eb/test_eb.py b/tests/test_eb/test_eb.py
index 924ed3adc..9e863e7f5 100644
--- a/tests/test_eb/test_eb.py
+++ b/tests/test_eb/test_eb.py
@@ -1,15 +1,39 @@
import boto3
+import sure # noqa
+from botocore.exceptions import ClientError
+
from moto import mock_eb
@mock_eb
-def test_application():
+def test_create_application():
# Create Elastic Beanstalk Application
- eb_client = boto3.client('elasticbeanstalk', region_name='us-east-1')
+ conn = boto3.client('elasticbeanstalk', region_name='us-east-1')
+ app = conn.create_application(
+ ApplicationName="myapp",
+ )
+ app['Application']['ApplicationName'].should.equal("myapp")
- eb_client.create_application(
+
+@mock_eb
+def test_create_application_dup():
+ conn = boto3.client('elasticbeanstalk', region_name='us-east-1')
+ conn.create_application(
+ ApplicationName="myapp",
+ )
+ conn.create_application.when.called_with(
+ ApplicationName="myapp",
+ ).should.throw(ClientError)
+
+
+@mock_eb
+def test_describe_applications():
+ # Create Elastic Beanstalk Application
+ conn = boto3.client('elasticbeanstalk', region_name='us-east-1')
+ conn.create_application(
ApplicationName="myapp",
)
- eb_apps = eb_client.describe_applications()
- eb_apps['Applications'][0]['ApplicationName'].should.equal("myapp")
+ apps = conn.describe_applications()
+ len(apps['Applications']).should.equal(1)
+ apps['Applications'][0]['ApplicationName'].should.equal('myapp')