# 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) 6.2.5 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/6.2.x/customize.html#pytest-ini):
```ini
[pytest]
addopts = --disable-socket
```
or add this to your [`setup.cfg`](https://docs.pytest.org/en/6.2.x/customize.html#setup-cfg):
```ini
[tool:pytest]
addopts = --disable-socket
```
or update your [`conftest.py`](https://docs.pytest.org/en/6.2.x/writing_plugins.html#conftest-py-plugins) to include:
```python
from pytest_socket import disable_socket
def 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).
Raw data
{
"_id": null,
"home_page": "https://pypi.org/project/pytest-socket/",
"name": "pytest-socket",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4.0",
"maintainer_email": "",
"keywords": "",
"author": "Mike Fiedler",
"author_email": "miketheman@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/05/ff/90c7e1e746baf3d62ce864c479fd53410b534818b9437413903596f81580/pytest_socket-0.7.0.tar.gz",
"platform": null,
"description": "# pytest-socket\n\n[![PyPI current version](https://img.shields.io/pypi/v/pytest-socket.svg)](https://pypi.python.org/pypi/pytest-socket)\n[![Python Support](https://img.shields.io/pypi/pyversions/pytest-socket.svg)](https://pypi.python.org/pypi/pytest-socket)\n[![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)\n[![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)\n[![Maintainability](https://api.codeclimate.com/v1/badges/1608a75b1c3a20211992/maintainability)](https://codeclimate.com/github/miketheman/pytest-socket/maintainability)\n[![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)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\nA plugin to use with Pytest to disable or restrict `socket` calls during\ntests to ensure network calls are prevented.\n\n---\n\n## Features\n\n- Disables all network calls flowing through Python\\'s `socket` interface.\n\n## Requirements\n\n- [Pytest](https://github.com/pytest-dev/pytest) 6.2.5 or greater\n\n## Installation\n\nYou can install `pytest-socket` via [pip](https://pypi.python.org/pypi/pip/)\nfrom [PyPI](https://pypi.python.org/pypi):\n\n```console\npip install pytest-socket\n```\n\nor add to your `pyproject.toml` for [poetry](https://python-poetry.org/):\n\n```ini\n[tool.poetry.dev-dependencies]\npytest-socket = \"*\"\n```\n\n## Usage\n\nRun `pytest --disable-socket`, tests should fail on any access to `socket` or\nlibraries using socket with a `SocketBlockedError`.\n\nTo add this flag as the default behavior, add this section to your\n[`pytest.ini`](https://docs.pytest.org/en/6.2.x/customize.html#pytest-ini):\n\n```ini\n[pytest]\naddopts = --disable-socket\n```\n\nor add this to your [`setup.cfg`](https://docs.pytest.org/en/6.2.x/customize.html#setup-cfg):\n\n```ini\n[tool:pytest]\naddopts = --disable-socket\n```\n\nor update your [`conftest.py`](https://docs.pytest.org/en/6.2.x/writing_plugins.html#conftest-py-plugins) to include:\n\n```python\nfrom pytest_socket import disable_socket\n\ndef pytest_runtest_setup():\n disable_socket()\n```\n\nIf you exceptionally want to enable socket for one particular execution\npass `--force-enable-socket`. It takes precedence over `--disable-socket`.\n\nTo enable Unix sockets during the test run (e.g. for async), add this option:\n\n```ini\n[pytest]\naddopts = --disable-socket --allow-unix-socket\n```\n\nTo enable specific tests use of `socket`, pass in the fixture to the test or\nuse a marker:\n\n```python\ndef test_explicitly_enable_socket(socket_enabled):\n assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n\n\n@pytest.mark.enable_socket\ndef test_explicitly_enable_socket_with_mark():\n assert socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n```\n\nTo allow only specific hosts per-test:\n\n```python\n@pytest.mark.allow_hosts(['127.0.0.1'])\ndef test_explicitly_enable_socket_with_mark():\n assert socket.socket.connect(('127.0.0.1', 80))\n```\n\nor for whole test run\n\n```ini\n[pytest]\naddopts = --allow-hosts=127.0.0.1,127.0.1.1\n```\n\n### Frequently Asked Questions\n\nQ: Why is network access disabled in some of my tests but not others?\n\nA: pytest's default fixture scope is \"function\", which `socket_enabled` uses.\nIf you create another fixture that creates a socket usage that has a \"higher\"\ninstantiation order, such as at the module/class/session, then the higher order\nfixture will be resolved first, and won't be disabled during the tests.\nRead more in [this excellent example](https://github.com/miketheman/pytest-socket/issues/45#issue-679835420)\nand more about [pytest fixture order here](https://docs.pytest.org/en/stable/fixture.html#fixture-instantiation-order).\n\nThis behavior may change in the future, as we learn more about pytest\nfixture order, and what users expect to happen.\n\n## Contributing\n\nContributions are very welcome. Tests can be run with\n[pytest](https://github.com/pytest-dev/pytest), please ensure the\ncoverage at least stays the same before you submit a pull request.\n\n## License\n\nDistributed under the terms of the\n[MIT](http://opensource.org/licenses/MIT) license, \"pytest-socket\" is\nfree and open source software\n\n[![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)\n\n## Issues\n\nIf you encounter any problems, please [file an issue](https://github.com/miketheman/pytest-socket/issues)\nalong with a detailed description.\n\n## References\n\nThis [Pytest](https://github.com/pytest-dev/pytest) plugin was generated with\n[Cookiecutter](https://github.com/audreyr/cookiecutter) along with\n[\\@hackebrot](https://github.com/hackebrot)\\'s\n[Cookiecutter-pytest-plugin](https://github.com/pytest-dev/cookiecutter-pytest-plugin)\ntemplate.\n\nThis plugin came about due to the efforts by\n[\\@hangtwenty](https://github.com/hangtwenty) solving a [StackOverflow\nquestion](https://stackoverflow.com/a/30064664), then converted into a\npytest plugin by [\\@miketheman](https://github.com/miketheman).\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Pytest Plugin to disable socket calls during tests",
"version": "0.7.0",
"project_urls": {
"Bug Tracker": "https://github.com/miketheman/pytest-socket/issues",
"Change Log": "https://github.com/miketheman/pytest-socket/blob/main/CHANGELOG.md",
"Funding": "https://github.com/sponsors/miketheman",
"Homepage": "https://pypi.org/project/pytest-socket/",
"Repository": "https://github.com/miketheman/pytest-socket"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "19585d14cb5cb59409e491ebe816c47bf81423cd03098ea92281336320ae5681",
"md5": "9c683ed21d0fbc67baf7694715bce938",
"sha256": "7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"
},
"downloads": -1,
"filename": "pytest_socket-0.7.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9c683ed21d0fbc67baf7694715bce938",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4.0",
"size": 6754,
"upload_time": "2024-01-28T20:17:22",
"upload_time_iso_8601": "2024-01-28T20:17:22.105406Z",
"url": "https://files.pythonhosted.org/packages/19/58/5d14cb5cb59409e491ebe816c47bf81423cd03098ea92281336320ae5681/pytest_socket-0.7.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "05ff90c7e1e746baf3d62ce864c479fd53410b534818b9437413903596f81580",
"md5": "a0d2be06ec38c479a0731b79512ad61d",
"sha256": "71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"
},
"downloads": -1,
"filename": "pytest_socket-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "a0d2be06ec38c479a0731b79512ad61d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4.0",
"size": 12389,
"upload_time": "2024-01-28T20:17:23",
"upload_time_iso_8601": "2024-01-28T20:17:23.177182Z",
"url": "https://files.pythonhosted.org/packages/05/ff/90c7e1e746baf3d62ce864c479fd53410b534818b9437413903596f81580/pytest_socket-0.7.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-28 20:17:23",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "miketheman",
"github_project": "pytest-socket",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pytest-socket"
}