Metadata-Version: 2.1
Name: pytest-exception-script
Version: 0.1.0
Summary: Walk your code through exception script to check it's resiliency to failures.
Home-page: https://github.com/qporest/pytest-exception-script
Author: qporest
Author-email: ihor.husar@gmail.com
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 2.7
Classifier: Operating System :: OS Independent
Classifier: Framework :: Pytest
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Description-Content-Type: text/markdown
Requires-Dist: PyYAML
Requires-Dist: toml
Requires-Dist: Werkzeug
Requires-Dist: pytest

![Plugin Tests](https://github.com/qporest/pytest-exception-script/workflows/Plugin%20Tests/badge.svg?branch=master)
# pytest-exception-script
The goal of this pytest plugin is to allow quick and easy testing of your application's resiliency. This is accomplished by creating exception scripts / scenarios which allow you to inject exceptions into your code execution without having to repeatedly set-up tests.

This won't work for applications that have multiple processes, but should work with threads (need to do more testing). Under the hood it's just abusing monkeypatch.

### Structure
Scripts can be written in YAML or TOML.
Each script / scenario (these will be used interchangeably below) consists of multiple acts, each of which can have multiple actions. Scenario is successful and complete if every act in it is complete.
**To have your script detected**: make sure it starts with `chaos_` and is a toml or yaml file. It will get auto-discovered by pytest, or you can call pytest directly against the file.

#### Examples of config files:
Using `yaml`
```
entry-point: tests.fake_app_success.factory
next-point: tests.fake_app_success.process_data
acts:
  - tests.fake_app_success.get_data:
      - exc: KeyError, "Error in act I"
        next-point: 
    tests.fake_app_success.unused_method:
      - exc: OSError, "Custom message passed"
  - tests.fake_app_success.get_data:
      - exc: KeyError
```
Using `toml`
```
entry-point="tests.fake_app_success.factory"
next-point="tests.fake_app_success.process_data"
[[act]]
[[act."tests.fake_app_success.get_data"]]
exc="KeyError"
next-point="tests.fake_app_success.process_data"
[[act]]
[[act."tests.fake_app_success.get_data"]]
exc="KeyError"
[[act]]
[[act."tests.fake_app_success.get_data"]]
exc="KeyError"
```
#### What's happening here?
`entry-point` should be a factory for your application that takes no parameters.
`next-point` - can be specified globally, per act, or both. Once this method gets called script will move on to the next act.
`acts` - list of acts each of which consists of actors. Each Actor is a method and an exception that it will throw if called during execution.
`exc` - exception to raise.

So factory will be loaded and started, upon which first act starts. Every time when `get_data` will get called `KeyError` will be raised. With either a default or a custom message. Once `next-point` gets called next act starts. Once `next-point` of the last act is called the application terminates (hopefully) and all the tests get marked as complete.
