pytest-socket


Namepytest-socket JSON
Version 0.7.0 PyPI version JSON
download
home_pagehttps://pypi.org/project/pytest-socket/
SummaryPytest Plugin to disable socket calls during tests
upload_time2024-01-28 20:17:23
maintainer
docs_urlNone
authorMike Fiedler
requires_python>=3.8,<4.0
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.57245s