Merge "Refine and add docstrings to fixture module"
This commit is contained in:
commit
fe62eb6c2b
@ -27,12 +27,30 @@ LOG = log.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
def is_fixture(obj):
|
def is_fixture(obj):
|
||||||
|
'''Returns whenever obj is a fixture or not'''
|
||||||
return (getattr(obj, '__tobiko_fixture__', False) or
|
return (getattr(obj, '__tobiko_fixture__', False) or
|
||||||
isinstance(obj, fixtures.Fixture) or
|
isinstance(obj, fixtures.Fixture) or
|
||||||
(inspect.isclass(obj) and issubclass(obj, fixtures.Fixture)))
|
(inspect.isclass(obj) and issubclass(obj, fixtures.Fixture)))
|
||||||
|
|
||||||
|
|
||||||
def get_fixture(obj, manager=None):
|
def get_fixture(obj, manager=None):
|
||||||
|
'''Returns a fixture identified by given :param obj:
|
||||||
|
|
||||||
|
It returns registered fixture for given :param obj:. If none has been
|
||||||
|
registered it creates a new one.
|
||||||
|
|
||||||
|
:param obj: can be:
|
||||||
|
- an instance of fixtures.Fixture class: on such case it would return
|
||||||
|
obj itself
|
||||||
|
- the unique fully qualified name or an object that refers to a fixture
|
||||||
|
class or an instance to a fixture.
|
||||||
|
- the class of the fixture. It must be a subclass of fixtures.Fixture
|
||||||
|
sub-class.
|
||||||
|
|
||||||
|
:returns: an instance of fixture class identified by obj, or obj itself
|
||||||
|
if it is instance of fixtures.Fixture class.
|
||||||
|
|
||||||
|
'''
|
||||||
if isinstance(obj, fixtures.Fixture):
|
if isinstance(obj, fixtures.Fixture):
|
||||||
return obj
|
return obj
|
||||||
else:
|
else:
|
||||||
@ -41,6 +59,7 @@ def get_fixture(obj, manager=None):
|
|||||||
|
|
||||||
|
|
||||||
def get_fixture_name(obj):
|
def get_fixture_name(obj):
|
||||||
|
'''Get unique fixture name'''
|
||||||
try:
|
try:
|
||||||
return obj.__tobiko_fixture_name__
|
return obj.__tobiko_fixture_name__
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
@ -49,9 +68,11 @@ def get_fixture_name(obj):
|
|||||||
obj.__tobiko_fixture__ = True
|
obj.__tobiko_fixture__ = True
|
||||||
obj.__tobiko_fixture_name__ = name
|
obj.__tobiko_fixture_name__ = name
|
||||||
return name
|
return name
|
||||||
|
raise TypeError('Object {obj!r} is not a fixture.'.format(obj=obj))
|
||||||
|
|
||||||
|
|
||||||
def get_fixture_class(obj):
|
def get_fixture_class(obj):
|
||||||
|
'''Get fixture class'''
|
||||||
if isinstance(obj, six.string_types):
|
if isinstance(obj, six.string_types):
|
||||||
obj = tobiko.load_object(obj)
|
obj = tobiko.load_object(obj)
|
||||||
|
|
||||||
@ -63,15 +84,18 @@ def get_fixture_class(obj):
|
|||||||
|
|
||||||
|
|
||||||
def get_fixture_dir(obj):
|
def get_fixture_dir(obj):
|
||||||
|
'''Get directory of fixture class source code file'''
|
||||||
return os.path.dirname(inspect.getfile(get_fixture_class(obj)))
|
return os.path.dirname(inspect.getfile(get_fixture_class(obj)))
|
||||||
|
|
||||||
|
|
||||||
def remove_fixture(obj, manager=None):
|
def remove_fixture(obj, manager=None):
|
||||||
|
'''Unregister fixture identified by given :param obj: if any'''
|
||||||
manager = manager or FIXTURES
|
manager = manager or FIXTURES
|
||||||
return manager.remove_fixture(obj)
|
return manager.remove_fixture(obj)
|
||||||
|
|
||||||
|
|
||||||
def setup_fixture(obj, manager=None):
|
def setup_fixture(obj, manager=None):
|
||||||
|
'''Get registered fixture and setup it up'''
|
||||||
fixture = get_fixture(obj, manager=manager)
|
fixture = get_fixture(obj, manager=manager)
|
||||||
LOG.debug('Set up fixture %r', get_fixture_name(fixture))
|
LOG.debug('Set up fixture %r', get_fixture_name(fixture))
|
||||||
try:
|
try:
|
||||||
@ -85,6 +109,7 @@ def setup_fixture(obj, manager=None):
|
|||||||
|
|
||||||
|
|
||||||
def cleanup_fixture(obj, manager=None):
|
def cleanup_fixture(obj, manager=None):
|
||||||
|
'''Get registered fixture and clean it up'''
|
||||||
fixture = get_fixture(obj, manager=manager)
|
fixture = get_fixture(obj, manager=manager)
|
||||||
LOG.debug('Clean up fixture %r', get_fixture_name(fixture))
|
LOG.debug('Clean up fixture %r', get_fixture_name(fixture))
|
||||||
fixture.cleanUp()
|
fixture.cleanUp()
|
||||||
@ -92,6 +117,7 @@ def cleanup_fixture(obj, manager=None):
|
|||||||
|
|
||||||
|
|
||||||
def get_name_and_object(obj):
|
def get_name_and_object(obj):
|
||||||
|
'''Get (name, obj) tuple identified by given :param obj:'''
|
||||||
if isinstance(obj, six.string_types):
|
if isinstance(obj, six.string_types):
|
||||||
return obj, tobiko.load_object(obj)
|
return obj, tobiko.load_object(obj)
|
||||||
else:
|
else:
|
||||||
@ -117,6 +143,7 @@ def visit_objects(objects):
|
|||||||
|
|
||||||
|
|
||||||
def list_required_fixtures(objects):
|
def list_required_fixtures(objects):
|
||||||
|
'''List fixture names required by given objects'''
|
||||||
result = []
|
result = []
|
||||||
objects = list(objects)
|
objects = list(objects)
|
||||||
for name, obj in visit_objects(objects):
|
for name, obj in visit_objects(objects):
|
||||||
@ -137,11 +164,13 @@ def list_required_fixtures(objects):
|
|||||||
|
|
||||||
|
|
||||||
def is_test_method(obj):
|
def is_test_method(obj):
|
||||||
|
'''Returns whenever given object is a test method'''
|
||||||
return ((inspect.isfunction(obj) or inspect.ismethod(obj)) and
|
return ((inspect.isfunction(obj) or inspect.ismethod(obj)) and
|
||||||
obj.__name__.startswith('test_'))
|
obj.__name__.startswith('test_'))
|
||||||
|
|
||||||
|
|
||||||
def get_required_fixture(obj):
|
def get_required_fixture(obj):
|
||||||
|
'''Get fixture names required by given :param obj:'''
|
||||||
required_fixtures = getattr(obj, '__tobiko_required_fixtures__', None)
|
required_fixtures = getattr(obj, '__tobiko_required_fixtures__', None)
|
||||||
if required_fixtures is None:
|
if required_fixtures is None:
|
||||||
required_fixtures = []
|
required_fixtures = []
|
||||||
@ -187,14 +216,21 @@ def init_fixture(obj, name):
|
|||||||
|
|
||||||
|
|
||||||
def required_fixture(obj):
|
def required_fixture(obj):
|
||||||
|
'''Creates a property that gets fixture identified by given :param obj:
|
||||||
|
|
||||||
|
'''
|
||||||
return RequiredFixtureProperty(obj)
|
return RequiredFixtureProperty(obj)
|
||||||
|
|
||||||
|
|
||||||
def required_setup_fixture(obj):
|
def required_setup_fixture(obj):
|
||||||
|
'''Creates a property that sets up fixture identified by given :param obj:
|
||||||
|
|
||||||
|
'''
|
||||||
return RequiredSetupFixtureProperty(obj)
|
return RequiredSetupFixtureProperty(obj)
|
||||||
|
|
||||||
|
|
||||||
def get_object_name(obj):
|
def get_object_name(obj):
|
||||||
|
'''Gets a fully qualified name for given :param obj:'''
|
||||||
if isinstance(obj, six.string_types):
|
if isinstance(obj, six.string_types):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import fixtures
|
import fixtures
|
||||||
@ -67,6 +68,9 @@ class GetFixtureTest(FixtureBaseTest):
|
|||||||
def test_by_type(self):
|
def test_by_type(self):
|
||||||
self._test_get_fixture(MyFixture)
|
self._test_get_fixture(MyFixture)
|
||||||
|
|
||||||
|
def test_by_instance(self):
|
||||||
|
self._test_get_fixture(MyFixture())
|
||||||
|
|
||||||
def _test_get_fixture(self, obj):
|
def _test_get_fixture(self, obj):
|
||||||
fixture = tobiko.get_fixture(obj)
|
fixture = tobiko.get_fixture(obj)
|
||||||
self.assertIsInstance(fixture, MyFixture)
|
self.assertIsInstance(fixture, MyFixture)
|
||||||
@ -79,9 +83,6 @@ class GetFixtureTest(FixtureBaseTest):
|
|||||||
fixture.setup_fixture.assert_not_called()
|
fixture.setup_fixture.assert_not_called()
|
||||||
fixture.cleanup_fixture.assert_not_called()
|
fixture.cleanup_fixture.assert_not_called()
|
||||||
|
|
||||||
def test_by_instance(self):
|
|
||||||
self._test_get_fixture(MyFixture())
|
|
||||||
|
|
||||||
|
|
||||||
class GetFixtureNameTest(FixtureBaseTest):
|
class GetFixtureNameTest(FixtureBaseTest):
|
||||||
|
|
||||||
@ -90,6 +91,44 @@ class GetFixtureNameTest(FixtureBaseTest):
|
|||||||
result = tobiko.get_fixture_name(fixture)
|
result = tobiko.get_fixture_name(fixture)
|
||||||
self.assertEqual(canonical_name(MyFixture), result)
|
self.assertEqual(canonical_name(MyFixture), result)
|
||||||
|
|
||||||
|
def test_with_other_type(self):
|
||||||
|
obj = object()
|
||||||
|
ex = self.assertRaises(TypeError, tobiko.get_fixture_name, obj)
|
||||||
|
self.assertEqual('Object {obj!r} is not a fixture.'.format(obj=obj),
|
||||||
|
str(ex))
|
||||||
|
|
||||||
|
|
||||||
|
class GetFixtureClassTest(FixtureBaseTest):
|
||||||
|
|
||||||
|
def test_with_name(self):
|
||||||
|
result = tobiko.get_fixture_class(canonical_name(MyFixture))
|
||||||
|
self.assertIs(MyFixture, result)
|
||||||
|
|
||||||
|
def test_with_type(self):
|
||||||
|
result = tobiko.get_fixture_class(MyFixture)
|
||||||
|
self.assertIs(MyFixture, result)
|
||||||
|
|
||||||
|
def test_with_instance(self):
|
||||||
|
result = tobiko.get_fixture_class(MyFixture())
|
||||||
|
self.assertIs(MyFixture, result)
|
||||||
|
|
||||||
|
|
||||||
|
class GetFixtureDirTest(FixtureBaseTest):
|
||||||
|
|
||||||
|
expected_dir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
def test_with_name(self):
|
||||||
|
actual_dir = tobiko.get_fixture_dir(canonical_name(MyFixture))
|
||||||
|
self.assertEqual(self.expected_dir, actual_dir)
|
||||||
|
|
||||||
|
def test_with_type(self):
|
||||||
|
actual_dir = tobiko.get_fixture_dir(MyFixture)
|
||||||
|
self.assertEqual(self.expected_dir, actual_dir)
|
||||||
|
|
||||||
|
def test_with_instance(self):
|
||||||
|
actual_dir = tobiko.get_fixture_dir(MyFixture())
|
||||||
|
self.assertEqual(self.expected_dir, actual_dir)
|
||||||
|
|
||||||
|
|
||||||
class RemoveFixtureTest(FixtureBaseTest):
|
class RemoveFixtureTest(FixtureBaseTest):
|
||||||
|
|
||||||
@ -126,6 +165,31 @@ class SetupFixtureTest(FixtureBaseTest):
|
|||||||
result.cleanup_fixture.assert_not_called()
|
result.cleanup_fixture.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
class FailingFixture(tobiko.SharedFixture):
|
||||||
|
|
||||||
|
def setup_fixture(self):
|
||||||
|
raise RuntimeError('raised by setup_fixture')
|
||||||
|
|
||||||
|
def cleanup_fixture(self):
|
||||||
|
raise RuntimeError('raised by cleanup_fixture')
|
||||||
|
|
||||||
|
|
||||||
|
class FailingSetupFixtureWhenFailingTest(FixtureBaseTest):
|
||||||
|
|
||||||
|
def test_with_name(self):
|
||||||
|
self._test_setup_fixture(canonical_name(FailingFixture))
|
||||||
|
|
||||||
|
def test_with_type(self):
|
||||||
|
self._test_setup_fixture(FailingFixture)
|
||||||
|
|
||||||
|
def test_with_instance(self):
|
||||||
|
self._test_setup_fixture(FailingFixture())
|
||||||
|
|
||||||
|
def _test_setup_fixture(self, obj):
|
||||||
|
ex = self.assertRaises(RuntimeError, tobiko.setup_fixture, obj)
|
||||||
|
self.assertEqual('raised by setup_fixture', str(ex))
|
||||||
|
|
||||||
|
|
||||||
class CleanupFixtureTest(FixtureBaseTest):
|
class CleanupFixtureTest(FixtureBaseTest):
|
||||||
|
|
||||||
def test_with_name(self):
|
def test_with_name(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user