Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/miketheman/pytest-socket
Pytest Plugin to disable socket calls during tests
https://github.com/miketheman/pytest-socket
pytest-plugin python socket testing testing-tools
Last synced: 12 days ago
JSON representation
Pytest Plugin to disable socket calls during tests
- Host: GitHub
- URL: https://github.com/miketheman/pytest-socket
- Owner: miketheman
- License: mit
- Created: 2017-06-01T03:43:01.000Z (over 7 years ago)
- Default Branch: main
- Last Pushed: 2024-04-30T07:20:31.000Z (7 months ago)
- Last Synced: 2024-05-01T19:27:41.996Z (6 months ago)
- Topics: pytest-plugin, python, socket, testing, testing-tools
- Language: Python
- Homepage: https://pypi.org/project/pytest-socket/
- Size: 321 KB
- Stars: 264
- Watchers: 6
- Forks: 41
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: .github/SECURITY.md
Awesome Lists containing this project
- awesome-pytest - pytest-socket - Plugin to disable socket calls during tests. (Plugins)
README
# pytest-socket
[![PyPI current version](https://img.shields.io/pypi/v/pytest-socket.svg)](https://pypi.python.org/pypi/pytest-socket)
[![Python Support](https://img.shields.io/pypi/pyversions/pytest-socket.svg)](https://pypi.python.org/pypi/pytest-socket)
[![Tests](https://github.com/miketheman/pytest-socket/workflows/Python%20Tests/badge.svg)](https://github.com/miketheman/pytest-socket/actions?query=workflow%3A%22Python+Tests%22)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/miketheman/pytest-socket/main.svg)](https://results.pre-commit.ci/latest/github/miketheman/pytest-socket/main)
[![Maintainability](https://api.codeclimate.com/v1/badges/1608a75b1c3a20211992/maintainability)](https://codeclimate.com/github/miketheman/pytest-socket/maintainability)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmiketheman%2Fpytest-socket.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmiketheman%2Fpytest-socket?ref=badge_shield)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)A plugin to use with Pytest to disable or restrict `socket` calls during
tests to ensure network calls are prevented.---
## Features
- Disables all network calls flowing through Python\'s `socket` interface.
## Requirements
- [Pytest](https://github.com/pytest-dev/pytest) 7.0 or greater
## Installation
You can install `pytest-socket` via [pip](https://pypi.python.org/pypi/pip/)
from [PyPI](https://pypi.python.org/pypi):```console
pip install pytest-socket
```or add to your `pyproject.toml` for [poetry](https://python-poetry.org/):
```ini
[tool.poetry.dev-dependencies]
pytest-socket = "*"
```## Usage
Run `pytest --disable-socket`, tests should fail on any access to `socket` or
libraries using socket with a `SocketBlockedError`.To add this flag as the default behavior, add this section to your
[`pytest.ini`](https://docs.pytest.org/en/stable/reference/customize.html#pytest-ini):```ini
[pytest]
addopts = --disable-socket
```or add this to your [`setup.cfg`](https://docs.pytest.org/en/stable/reference/customize.html#setup-cfg):
```ini
[tool:pytest]
addopts = --disable-socket
```or update your [`conftest.py`](https://docs.pytest.org/en/stable/how-to/writing_plugins.html#conftest-py-local-per-directory-plugins) to include:
```python
from pytest_socket import disable_socketdef pytest_runtest_setup():
disable_socket()
```If you exceptionally want to enable socket for one particular execution
pass `--force-enable-socket`. It takes precedence over `--disable-socket`.To enable Unix sockets during the test run (e.g. for async), add this option:
```ini
[pytest]
addopts = --disable-socket --allow-unix-socket
```To enable specific tests use of `socket`, pass in the fixture to the test or
use a marker:```python
def test_explicitly_enable_socket(socket_enabled):
assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)@pytest.mark.enable_socket
def test_explicitly_enable_socket_with_mark():
assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```To allow only specific hosts per-test:
```python
@pytest.mark.allow_hosts(['127.0.0.1'])
def test_explicitly_enable_socket_with_mark():
assert socket.socket.connect(('127.0.0.1', 80))
```or for whole test run
```ini
[pytest]
addopts = --allow-hosts=127.0.0.1,127.0.1.1
```### Frequently Asked Questions
Q: Why is network access disabled in some of my tests but not others?
A: pytest's default fixture scope is "function", which `socket_enabled` uses.
If you create another fixture that creates a socket usage that has a "higher"
instantiation order, such as at the module/class/session, then the higher order
fixture will be resolved first, and won't be disabled during the tests.
Read more in [this excellent example](https://github.com/miketheman/pytest-socket/issues/45#issue-679835420)
and more about [pytest fixture order here](https://docs.pytest.org/en/stable/fixture.html#fixture-instantiation-order).This behavior may change in the future, as we learn more about pytest
fixture order, and what users expect to happen.## Contributing
Contributions are very welcome. Tests can be run with
[pytest](https://github.com/pytest-dev/pytest), please ensure the
coverage at least stays the same before you submit a pull request.## License
Distributed under the terms of the
[MIT](http://opensource.org/licenses/MIT) license, "pytest-socket" is
free and open source software[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmiketheman%2Fpytest-socket.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmiketheman%2Fpytest-socket?ref=badge_large)
## Issues
If you encounter any problems, please [file an issue](https://github.com/miketheman/pytest-socket/issues)
along with a detailed description.## References
This [Pytest](https://github.com/pytest-dev/pytest) plugin was generated with
[Cookiecutter](https://github.com/audreyr/cookiecutter) along with
[\@hackebrot](https://github.com/hackebrot)\'s
[Cookiecutter-pytest-plugin](https://github.com/pytest-dev/cookiecutter-pytest-plugin)
template.This plugin came about due to the efforts by
[\@hangtwenty](https://github.com/hangtwenty) solving a [StackOverflow
question](https://stackoverflow.com/a/30064664), then converted into a
pytest plugin by [\@miketheman](https://github.com/miketheman).## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=miketheman/pytest-socket)](https://star-history.com/#miketheman/pytest-socket&Date)