Skip to content

Module taskcat.testing.base_test

None

None

View Source
# pylint: disable=line-too-long

import uuid

from pathlib import Path

from typing import Any, Dict, Type, TypeVar

from taskcat._cli_core import GLOBAL_ARGS

from taskcat._config import Config

from ._abstract_test import Test

T = TypeVar("T", bound="BaseTest")  # pylint: disable=invalid-name

class BaseTest(Test):

    """A Generic Test Class that implements the passed

    and uid properties. Any subclass will still need to

    implement the the run and clean_up methods.

    """

    def __init__(self, config: Config):

        self.config: Config = config

        self.passed: bool = False

        self.result: Any = None

    @property

    def config(self) -> Config:

        return self._config

    @config.setter

    def config(self, config: Config) -> None:

        # It should be possible to check if config is already set

        # and if it is throw an exception. Might be needed since

        # child objects rely on the configs uid.

        self._config = config

    @property

    def passed(self) -> bool:

        return self._passed

    @passed.setter

    def passed(self, new_value: bool) -> None:

        self._passed = new_value

    @property

    def result(self) -> Any:

        return self._result

    @result.setter

    def result(self, new_value: Any) -> None:

        self._result = new_value

    def __enter__(self):

        try:

            self.run()

        except BaseException as ex:

            self.clean_up()

            raise ex

        return self.result

    def __exit__(self, exc_type, exc_val, exc_tb):

        # we could optionally call self.report() on exiting.

        self.clean_up()

    @classmethod

    def from_file(

        cls: Type[T],

        project_root: str = "./",

        input_file: str = "./.taskcat.yml",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat config file.

        Args:

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            input_file (str, optional): The name of the Taskcat confile file. Defaults to "./.taskcat.yml".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        input_file_path: Path = project_root_path / input_file

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        config = Config.create(

            project_root=project_root_path,

            project_config_path=input_file_path,

            args=args

            # TODO: detect if input file is taskcat config or CloudFormation template

        )

        return cls(config)

    @classmethod

    def from_dict(

        cls: Type[T],

        input_config: dict,

        project_root: str = "./",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat configuration in dictionary form.

        Args:

            input_config (dict): A Taskcat configuration in the form of a dict.

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        sources = [

            {"source": "Manual", "config": input_config},

            {"source": "CliArgument", "config": args},

        ]

        config = Config(

            uid=uuid.uuid4(), project_root=project_root_path, sources=sources

        )

        return cls(config)

def _build_args(enable_sig_v2, regions, default_profile):

    args: Dict[str, Any] = {}

    if enable_sig_v2:

        args["project"] = {"s3_enable_sig_v2": enable_sig_v2}

    if regions != "ALL":

        if "project" not in args:

            args["project"] = {}

        args["project"]["regions"] = regions.split(",")

    if default_profile:

        _auth_dict = {"default": default_profile}

        if not args.get("project"):

            args["project"] = {"auth": _auth_dict}

        else:

            args["project"]["auth"] = _auth_dict

    return args

Variables

T

Classes

BaseTest

class BaseTest(
    config: taskcat._config.Config
)
View Source
class BaseTest(Test):

    """A Generic Test Class that implements the passed

    and uid properties. Any subclass will still need to

    implement the the run and clean_up methods.

    """

    def __init__(self, config: Config):

        self.config: Config = config

        self.passed: bool = False

        self.result: Any = None

    @property

    def config(self) -> Config:

        return self._config

    @config.setter

    def config(self, config: Config) -> None:

        # It should be possible to check if config is already set

        # and if it is throw an exception. Might be needed since

        # child objects rely on the configs uid.

        self._config = config

    @property

    def passed(self) -> bool:

        return self._passed

    @passed.setter

    def passed(self, new_value: bool) -> None:

        self._passed = new_value

    @property

    def result(self) -> Any:

        return self._result

    @result.setter

    def result(self, new_value: Any) -> None:

        self._result = new_value

    def __enter__(self):

        try:

            self.run()

        except BaseException as ex:

            self.clean_up()

            raise ex

        return self.result

    def __exit__(self, exc_type, exc_val, exc_tb):

        # we could optionally call self.report() on exiting.

        self.clean_up()

    @classmethod

    def from_file(

        cls: Type[T],

        project_root: str = "./",

        input_file: str = "./.taskcat.yml",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat config file.

        Args:

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            input_file (str, optional): The name of the Taskcat confile file. Defaults to "./.taskcat.yml".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        input_file_path: Path = project_root_path / input_file

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        config = Config.create(

            project_root=project_root_path,

            project_config_path=input_file_path,

            args=args

            # TODO: detect if input file is taskcat config or CloudFormation template

        )

        return cls(config)

    @classmethod

    def from_dict(

        cls: Type[T],

        input_config: dict,

        project_root: str = "./",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat configuration in dictionary form.

        Args:

            input_config (dict): A Taskcat configuration in the form of a dict.

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        sources = [

            {"source": "Manual", "config": input_config},

            {"source": "CliArgument", "config": args},

        ]

        config = Config(

            uid=uuid.uuid4(), project_root=project_root_path, sources=sources

        )

        return cls(config)

Ancestors (in MRO)

  • taskcat.testing._abstract_test.Test
  • abc.ABC

Descendants

  • taskcat.testing._cfn_test.CFNTest
  • taskcat.testing._lint_test.LintTest
  • taskcat.testing._unit_test.UnitTest

Static methods

from_dict

def from_dict(
    input_config: dict,
    project_root: str = './',
    regions: str = 'ALL',
    enable_sig_v2: bool = False
) -> ~T

Creates a Test from a Taskcat configuration in dictionary form.

Parameters:

Name Type Description Default
input_config dict A Taskcat configuration in the form of a dict. None
project_root str The path to the directory with your template and config file. Defaults to "./". "./"
regions str A comma separated list of regions to test in. Defaults to "ALL". "ALL"
enable_sig_v2 bool Enable legacy sigv2 requests for auto-created buckets. Defaults to False. False

Returns:

Type Description
T Returns a Test instance.
View Source
    @classmethod

    def from_dict(

        cls: Type[T],

        input_config: dict,

        project_root: str = "./",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat configuration in dictionary form.

        Args:

            input_config (dict): A Taskcat configuration in the form of a dict.

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        sources = [

            {"source": "Manual", "config": input_config},

            {"source": "CliArgument", "config": args},

        ]

        config = Config(

            uid=uuid.uuid4(), project_root=project_root_path, sources=sources

        )

        return cls(config)

from_file

def from_file(
    project_root: str = './',
    input_file: str = './.taskcat.yml',
    regions: str = 'ALL',
    enable_sig_v2: bool = False
) -> ~T

Creates a Test from a Taskcat config file.

Parameters:

Name Type Description Default
project_root str The path to the directory with your template and config file. Defaults to "./". "./"
input_file str The name of the Taskcat confile file. Defaults to "./.taskcat.yml". "./.taskcat.yml"
regions str A comma separated list of regions to test in. Defaults to "ALL". "ALL"
enable_sig_v2 bool Enable legacy sigv2 requests for auto-created buckets. Defaults to False. False

Returns:

Type Description
T Returns a Test instance.
View Source
    @classmethod

    def from_file(

        cls: Type[T],

        project_root: str = "./",

        input_file: str = "./.taskcat.yml",

        regions: str = "ALL",

        enable_sig_v2: bool = False,

    ) -> T:

        """Creates a Test from a Taskcat config file.

        Args:

            project_root (str, optional): The path to the directory with your template and config file. Defaults to "./".

            input_file (str, optional): The name of the Taskcat confile file. Defaults to "./.taskcat.yml".

            regions (str, optional): A comma separated list of regions to test in. Defaults to "ALL".

            enable_sig_v2 (bool, optional): Enable legacy sigv2 requests for auto-created buckets. Defaults to False.

        Returns:

            T: Returns a Test instance.

        """  # noqa: B950

        project_root_path: Path = Path(project_root).expanduser().resolve()

        input_file_path: Path = project_root_path / input_file

        # pylint: disable=too-many-arguments

        args = _build_args(enable_sig_v2, regions, GLOBAL_ARGS.profile)

        config = Config.create(

            project_root=project_root_path,

            project_config_path=input_file_path,

            args=args

            # TODO: detect if input file is taskcat config or CloudFormation template

        )

        return cls(config)

Instance variables

config
passed
result

Methods

clean_up

def clean_up(
    self
) -> None

Clean up after the Test.

View Source
    @abstractmethod

    def clean_up(self) -> None:

        """Clean up after the Test."""

run

def run(
    self
) -> None

Run the Test.

View Source
    @abstractmethod

    def run(self) -> None:

        """Run the Test."""