Adding basic skeleton for testing controllers. (stole from melange)
* Built out the functional tests (db sync) * Built out the actual database controller test get call
This commit is contained in:
parent
d48e0e66d9
commit
9a9001da5b
1
.gitignore
vendored
1
.gitignore
vendored
@ -7,3 +7,4 @@ run_tests.log
|
|||||||
guest-agent-files.txt
|
guest-agent-files.txt
|
||||||
reddwarf.egg*
|
reddwarf.egg*
|
||||||
reddwarf/vcsversion.py
|
reddwarf/vcsversion.py
|
||||||
|
*py*.egg
|
||||||
|
@ -113,18 +113,9 @@ def db_downgrade(options, version, repo_path=None):
|
|||||||
def db_reset(options, *plugins):
|
def db_reset(options, *plugins):
|
||||||
drop_db(options)
|
drop_db(options)
|
||||||
db_sync(options)
|
db_sync(options)
|
||||||
db_reset_for_plugins(options, *plugins)
|
|
||||||
configure_db(options)
|
configure_db(options)
|
||||||
|
|
||||||
|
|
||||||
def db_reset_for_plugins(options, *plugins):
|
|
||||||
for plugin in plugins:
|
|
||||||
repo_path = plugin.migrate_repo_path()
|
|
||||||
if repo_path:
|
|
||||||
db_sync(options, repo_path=repo_path)
|
|
||||||
configure_db(options, *plugins)
|
|
||||||
|
|
||||||
|
|
||||||
def _base_query(cls):
|
def _base_query(cls):
|
||||||
return session.get_session().query(cls)
|
return session.get_session().query(cls)
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import urlparse
|
|||||||
import mox
|
import mox
|
||||||
|
|
||||||
from reddwarf.db import db_api
|
from reddwarf.db import db_api
|
||||||
|
from reddwarf.common import config
|
||||||
from reddwarf.common import utils
|
from reddwarf.common import utils
|
||||||
|
|
||||||
|
|
||||||
@ -55,6 +56,9 @@ class BaseTest(unittest.TestCase):
|
|||||||
self.maxDiff = None
|
self.maxDiff = None
|
||||||
|
|
||||||
self.mock = mox.Mox()
|
self.mock = mox.Mox()
|
||||||
|
conf, reddwarf_app = config.Config.load_paste_app('reddwarfapp',
|
||||||
|
{"config_file": test_config_file()}, None)
|
||||||
|
db_api.configure_db(conf)
|
||||||
db_api.clean_db()
|
db_api.clean_db()
|
||||||
super(BaseTest, self).setUp()
|
super(BaseTest, self).setUp()
|
||||||
|
|
||||||
|
65
reddwarf/tests/functional/__init__.py
Normal file
65
reddwarf/tests/functional/__init__.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2011 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
from reddwarf import tests
|
||||||
|
from reddwarf.common import config
|
||||||
|
from reddwarf.db import db_api
|
||||||
|
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
options = dict(config_file=tests.test_config_file())
|
||||||
|
conf = config.Config.load_paste_config("reddwarf", options, None)
|
||||||
|
|
||||||
|
db_api.db_reset(conf)
|
||||||
|
|
||||||
|
|
||||||
|
def execute(cmd, raise_error=True):
|
||||||
|
"""Executes a command in a subprocess.
|
||||||
|
Returns a tuple of (exitcode, out, err), where out is the string output
|
||||||
|
from stdout and err is the string output from stderr when
|
||||||
|
executing the command.
|
||||||
|
|
||||||
|
:param cmd: Command string to execute
|
||||||
|
:param raise_error: If returncode is not 0 (success), then
|
||||||
|
raise a RuntimeError? Default: True)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
env = os.environ.copy()
|
||||||
|
|
||||||
|
# Make sure that we use the programs in the
|
||||||
|
# current source directory's bin/ directory.
|
||||||
|
env['PATH'] = tests.reddwarf_bin_path() + ':' + env['PATH']
|
||||||
|
process = subprocess.Popen(cmd,
|
||||||
|
shell=True,
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
env=env)
|
||||||
|
result = process.communicate()
|
||||||
|
(out, err) = result
|
||||||
|
exitcode = process.returncode
|
||||||
|
if process.returncode != 0 and raise_error:
|
||||||
|
msg = "Command %(cmd)s did not succeed. Returned an exit "\
|
||||||
|
"code of %(exitcode)d."\
|
||||||
|
"\n\nSTDOUT: %(out)s"\
|
||||||
|
"\n\nSTDERR: %(err)s" % locals()
|
||||||
|
raise RuntimeError(msg)
|
||||||
|
return exitcode, out, err
|
44
reddwarf/tests/functional/test_cli.py
Normal file
44
reddwarf/tests/functional/test_cli.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2011 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
import reddwarf
|
||||||
|
from reddwarf import tests
|
||||||
|
from reddwarf.common import config
|
||||||
|
from reddwarf.tests import functional
|
||||||
|
|
||||||
|
|
||||||
|
def run_reddwarf_manage(command):
|
||||||
|
reddwarf_manage = tests.reddwarf_bin_path('reddwarf-manage')
|
||||||
|
config_file = tests.test_config_file()
|
||||||
|
return functional.execute("%(reddwarf_manage)s %(command)s "
|
||||||
|
"--config-file=%(config_file)s" % locals())
|
||||||
|
|
||||||
|
|
||||||
|
class TestDBSyncCLI(tests.BaseTest):
|
||||||
|
|
||||||
|
def test_db_sync_executes(self):
|
||||||
|
exitcode, out, err = run_reddwarf_manage("db_sync")
|
||||||
|
self.assertEqual(exitcode, 0)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDBUpgradeCLI(tests.BaseTest):
|
||||||
|
|
||||||
|
def test_db_upgrade_executes(self):
|
||||||
|
exitcode, out, err = run_reddwarf_manage("db_upgrade")
|
||||||
|
self.assertEqual(exitcode, 0)
|
@ -1 +1,76 @@
|
|||||||
__author__ = 'mbasnight'
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright 2011 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import json
|
||||||
|
import webtest
|
||||||
|
|
||||||
|
from reddwarf import tests
|
||||||
|
from reddwarf.common import config
|
||||||
|
from reddwarf.common import utils
|
||||||
|
from reddwarf.common import wsgi
|
||||||
|
from reddwarf.db import db_api
|
||||||
|
|
||||||
|
|
||||||
|
def sanitize(data):
|
||||||
|
serializer = wsgi.JSONDictSerializer()
|
||||||
|
return json.loads(serializer.serialize(data))
|
||||||
|
|
||||||
|
|
||||||
|
class StubConfig():
|
||||||
|
|
||||||
|
def __init__(self, **options):
|
||||||
|
self.options = options
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.actual_config = config.Config.instance
|
||||||
|
temp_config = self.actual_config.copy()
|
||||||
|
temp_config.update(self.options)
|
||||||
|
config.Config.instance = temp_config
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
|
config.Config.instance = self.actual_config
|
||||||
|
|
||||||
|
|
||||||
|
class StubTime(object):
|
||||||
|
|
||||||
|
def __init__(self, time):
|
||||||
|
self.time = time
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.actual_provider = utils.utcnow
|
||||||
|
utils.utcnow = lambda: self.time
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
|
utils.utcnow = self.actual_provider
|
||||||
|
|
||||||
|
|
||||||
|
class TestApp(webtest.TestApp):
|
||||||
|
|
||||||
|
def post_json(self, url, body=None, **kwargs):
|
||||||
|
kwargs['content_type'] = "application/json"
|
||||||
|
return self.post(url, json.dumps(body), **kwargs)
|
||||||
|
|
||||||
|
def put_json(self, url, body=None, **kwargs):
|
||||||
|
kwargs['content_type'] = "application/json"
|
||||||
|
return self.put(url, json.dumps(body), **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
options = {"config_file": tests.test_config_file()}
|
||||||
|
conf = config.Config.load_paste_config("reddwarfapp", options, None)
|
||||||
|
|
||||||
|
db_api.db_reset(conf)
|
||||||
|
72
reddwarf/tests/unit/test_database_service.py
Normal file
72
reddwarf/tests/unit/test_database_service.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
# Copyright 2011 OpenStack LLC.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import mox
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from reddwarf import tests
|
||||||
|
from reddwarf.common import config
|
||||||
|
from reddwarf.common import wsgi
|
||||||
|
from reddwarf.database import models
|
||||||
|
from reddwarf.database import service
|
||||||
|
from reddwarf.tests import unit
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class ControllerTestBase(tests.BaseTest):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(ControllerTestBase, self).setUp()
|
||||||
|
conf, reddwarf_app = config.Config.load_paste_app('reddwarfapp',
|
||||||
|
{"config_file": tests.test_config_file()}, None)
|
||||||
|
self.app = unit.TestApp(reddwarf_app)
|
||||||
|
|
||||||
|
|
||||||
|
class DummyApp(wsgi.Router):
|
||||||
|
|
||||||
|
def __init__(self, controller):
|
||||||
|
mapper = routes.Mapper()
|
||||||
|
mapper.resource("resource", "/resources",
|
||||||
|
controller=controller.create_resource())
|
||||||
|
super(DummyApp, self).__init__(mapper)
|
||||||
|
|
||||||
|
|
||||||
|
class TestInstanceController(ControllerTestBase):
|
||||||
|
|
||||||
|
DUMMY_INSTANCE_ID = "123"
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.instances_path = "/tenant/instances"
|
||||||
|
super(TestInstanceController, self).setUp()
|
||||||
|
|
||||||
|
def test_show(self):
|
||||||
|
# block = factory_models.IpBlockFactory()
|
||||||
|
instance = mox.MockAnything()
|
||||||
|
self.mock.StubOutWithMock(models.Instance, 'data')
|
||||||
|
models.Instance.data().AndReturn({"id": self.DUMMY_INSTANCE_ID,
|
||||||
|
"name": "DUMMY_NAME",
|
||||||
|
"status": "BUILD"})
|
||||||
|
self.mock.StubOutWithMock(models.Instance, '__init__')
|
||||||
|
models.Instance.__init__(context=mox.IgnoreArg(), uuid=mox.IgnoreArg())
|
||||||
|
self.mock.ReplayAll()
|
||||||
|
|
||||||
|
response = self.app.get("%s/%s" % (self.instances_path,
|
||||||
|
self.DUMMY_INSTANCE_ID),
|
||||||
|
headers={'X-Auth-Token': '123'})
|
||||||
|
|
||||||
|
self.assertEqual(response.status_int, 201)
|
Loading…
x
Reference in New Issue
Block a user