docs: Add documentation for openstack.test.fakes

This is quite a nifty utility so let users know about it. Note that some
imports had to be changed to avoid them appearing in the documentation.

Change-Id: Ifbdfe24126651fd35296a239eb559f5272b316d8
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane
2023-07-26 13:19:10 +01:00
parent 56804e9889
commit 738d5f1802
4 changed files with 63 additions and 13 deletions

View File

@@ -42,6 +42,16 @@ approach, this is where you'll want to begin.
Orchestration <guides/orchestration> Orchestration <guides/orchestration>
Shared File System <guides/shared_file_system> Shared File System <guides/shared_file_system>
Testing
-------
The SDK provides a number of utilities to help you test your applications.
.. toctree::
:maxdepth: 1
testing/index
API Documentation API Documentation
----------------- -----------------

View File

@@ -0,0 +1,5 @@
Fakes
=====
.. automodule:: openstack.test.fakes
:members:

View File

@@ -0,0 +1,8 @@
========================================
Testing applications using OpenStack SDK
========================================
.. toctree::
:maxdepth: 1
fakes

View File

@@ -10,10 +10,18 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
"""
The :mod:`~openstack.test.fakes` module exists to help application developers
using the OpenStack SDK to unit test their applications. It provides a number
of helper utilities to generate fake :class:`~openstack.resource.Resource` and
:class:`~openstack.proxy.Proxy` instances. These fakes do not require an
established connection and allow you to validate that your application using
valid attributes and methods for both :class:`~openstack.resource.Resource` and
:class:`~openstack.proxy.Proxy` instances.
"""
import inspect import inspect
from random import choice import random
from random import randint
from random import random
import uuid import uuid
from openstack import format as _format from openstack import format as _format
@@ -21,13 +29,23 @@ from openstack import resource
def generate_fake_resource(resource_type, **attrs): def generate_fake_resource(resource_type, **attrs):
"""Generate fake resource """Generate a fake resource
Example usage:
.. code-block:: python
>>> from openstack.compute.v2 import server
>>> from openstack.test import fakes
>>> fakes.generate_fake_resource(server.Server)
openstack.compute.v2.server.Server(...)
:param type resource_type: Object class :param type resource_type: Object class
:param dict attrs: Optional attributes to be set on resource :param dict attrs: Optional attributes to be set on resource
:return: Instance of ``resource_type`` class populated with fake
:return: Instance of `resource_type` class populated with fake values of expected types
values of expected types. :raises NotImplementedError: If a resource attribute specifies a ``type``
or ``list_type`` that cannot be automatically generated
""" """
base_attrs = dict() base_attrs = dict()
for name, value in inspect.getmembers( for name, value in inspect.getmembers(
@@ -78,15 +96,15 @@ def generate_fake_resource(resource_type, **attrs):
base_attrs[name] = uuid.uuid4().hex base_attrs[name] = uuid.uuid4().hex
elif issubclass(target_type, int): elif issubclass(target_type, int):
# int # int
base_attrs[name] = randint(1, 100) base_attrs[name] = random.randint(1, 100)
elif issubclass(target_type, float): elif issubclass(target_type, float):
# float # float
base_attrs[name] = random() base_attrs[name] = random.random()
elif issubclass(target_type, bool) or issubclass( elif issubclass(target_type, bool) or issubclass(
target_type, _format.BoolStr target_type, _format.BoolStr
): ):
# bool # bool
base_attrs[name] = choice([True, False]) base_attrs[name] = random.choice([True, False])
elif issubclass(target_type, dict): elif issubclass(target_type, dict):
# some dict - without further details leave it empty # some dict - without further details leave it empty
base_attrs[name] = dict() base_attrs[name] = dict()
@@ -97,6 +115,7 @@ def generate_fake_resource(resource_type, **attrs):
name, name,
) )
raise NotImplementedError(msg) raise NotImplementedError(msg)
if isinstance(value, resource.URI): if isinstance(value, resource.URI):
# For URI we just generate something # For URI we just generate something
base_attrs[name] = uuid.uuid4().hex base_attrs[name] = uuid.uuid4().hex
@@ -107,13 +126,21 @@ def generate_fake_resource(resource_type, **attrs):
def generate_fake_resources(resource_type, count=1, attrs=None): def generate_fake_resources(resource_type, count=1, attrs=None):
"""Generate given number of fake resource entities """Generate a given number of fake resource entities
Example usage:
.. code-block:: python
>>> from openstack.compute.v2 import server
>>> from openstack.test import fakes
>>> fakes.generate_fake_resources(server.Server, count=3)
<generator object generate_fake_resources at 0x7f075dc65040>
:param type resource_type: Object class :param type resource_type: Object class
:param int count: Number of objects to return :param int count: Number of objects to return
:param dict attrs: Attribute values to set into each instance :param dict attrs: Attribute values to set into each instance
:return: Generator of ``resource_type`` class instances populated with fake
:return: Array of `resource_type` class instances populated with fake
values of expected types. values of expected types.
""" """
if not attrs: if not attrs: