Skip to main content

pytest-docker-apache-fixtures

pypi version build status coverage status python versions linting code style license

Overview

Pytest fixtures to instantiate and utilize local apache (httpd) docker containers, using lovely-pytest-docker and docker-py, for testing.

Getting Started

Update setup.py to include:

from distutils.core import setup

setup(
	tests_require=["pytest-docker-apache-fixtures"]
)

All fixtures should be automatically included via the pytest11 entry point.

import requests
import pytest
from pytest_docker_apache_fixtures import ApacheInsecure, ApacheSecure  # Optional, for typing

def test_apache_secure(apache_secure: ApacheSecure):
    response = requests.head(f"https://{apache_secure.endpoint}/",
        headers=apache_secure.auth_header,
        verify=str(apache_secure.cacerts),
    )
    assert response.status_code == 200

def test_apache_insecure(apache_insecure: ApacheInsecure):
    response = requests.head(f"http://{apache_insecure.endpoint}/")
    assert response.status_code == 200

The push_image mark can optionally be added to stage images in the apache prior to testing. See Markers for details.

Installation

From pypi.org

$ pip install pytest_docker_apache_fixtures

From source code

$ git clone https://github.com/crashvb/pytest-docker-apache-fixtures
$ cd pytest-docker-apache-fixtures
$ virtualenv env
$ source env/bin/activate
$ python -m pip install --editable .[dev]

Fixtures

apache_auth_header

Retrieves an HTTP basic authentication header that is populated with credentials that can access the secure apache service. The credentials are retrieved from the apache_password and apache_username fixtures. This fixture is used to replicate docker images into the secure apache service.

apache_cacerts

Locates a user-defined CA trust store (tests/cacerts) to use to verify connections to the secure apache service. If one cannot be located, a temporary trust store is created containing certificates from certifi and the apache_certs fixture. This fixture is used to instantiate the secure apache service.

apache_certs

Returns the paths of the self-signed certificate authority certificate, certificate, and private key that are used by the secure apache service. This fixture is used to instantiate the secure apache service.

NamedTuple Fields

The following fields are defined in the tuple provided by this fixture:

  • ca_certificate - Path to the self-signed certificate authority certificate.
  • ca_private_key - Path to the self-signed certificate authority private key.
  • certificate - Path to the certificate.
  • private_key - Path to the private key.

Typing is provided by pytest_docker_apache_fixtures.ApacheCerts.

apache_htpasswd

Provides the path to a htpasswd file that is used by the secure apache service. If a user-defined htpasswd file (tests/htpasswd) can be located, it is used. Otherwise, a temporary htpasswd file is created using credentials from the apache_password and apache_username fixtures. This fixture is used to instantiate the secure apache ervice.

apache_apachecfg_insecure

Provides the path to an insecure apache.cfg file that is used by the insecure apache service. If a user-defined apache.cfg file (tests/apache.insecure.cfg) can be located, it is used. Otherwise, an embedded configuration is copied to a temporary location and returned. This fixture is used to instantiate the insecure apache service.

apache_apachecfg_secure

Provides the path to a secure apache.cfg file that is used by the secure apache service. If a user-defined apache.cfg file (tests/apache.secure.cfg) can be located, it is used. Otherwise, an embedded configuration is copied to a temporary location and returned. This fixture is used to instantiate the secure apache service.

apache_insecure

Configures and instantiates a apache service without TLS or authentication.

import requests
from pytest_docker_apache_fixtures import ApacheInsecure  # Optional, for typing

def test_apache_insecure(apache_insecure: ApacheInsecure):
    response = requests.head(f"http://{apache_insecure.endpoint}/")
    assert response.status_code == 200

NamedTuple Fields

The following fields are defined in the tuple provided by this fixture:

  • docker_compose - Path to the fully instantiated docker-compose configuration.
  • endpoint - Endpoint of the insecure apache service.
  • endpoint_name - Endpoint of the insecure apache service, by service name.
  • service_name - Name of the service within the docker-compose configuration.

Typing is provided by pytest_docker_apache_fixtures.ApacheInsecure.

apache_password

Provides a generated password to use for authentication to the secure apache service. This fixture is used to replicate docker images into the secure apache service.

apache_secure

Configures and instantiates a TLS enabled apache service with HTTP basic authorization.

import requests
from pytest_docker_apache_fixtures import ApacheSecure  # Optional, for typing

def test_apache_secure(apache_secure: ApacheSecure):
    response = requests.head(
        f"https://{apache_secure.endpoint}/",
        headers=apache_secure.auth_header,
        verify=str(apache_secure.cacerts),
    )
    assert response.status_code == 200

NamedTuple Fields

The following fields are defined in the tuple provided by this fixture:

Typing is provided by pytest_docker_apache_fixtures.ApacheSecure.

apache_ssl_context

Provides an SSL context containing the CA trust store from the apache_cacerts fixture. This fixture is used to instantiate the secure apache service.

apache_username

Provides a generated username to use for authentication to the secure apache service. This fixture is used to replicate docker images into the secure apache service.

pdaf_docker_compose_insecure

This fixture uses the docker_compose_files fixture to locate a user-defined docker-compose configuration file (typically tests/docker-compose.yml) that contains the pytest-docker-apache-insecure service. If one cannot be located, an embedded configuration is copied to a temporary location and returned. This fixture is used to instantiate the insecure apache service. The configuration will be treated as a template; the $PATH_APACHECFG token will be populated with the absolute path provided by the apache_apachecfg fixture.

pdaf_docker_compose_secure

This fixture uses the docker_compose_files fixture to locate a user-defined docker-compose configuration file (typically tests/docker-compose.yml) that contains the pytest-docker-apache-secure service. If one cannot be located, an embedded configuration is copied to a temporary location and returned. This fixture is used to instantiate the secure apache service. The configuration will be treated as a template; the $PATH_CERTIFICATE, $PATH_HTPASSWD, $PATH_KEY, and $PATH_APACHECFG tokens will be populated with the absolute paths provided by the apache_certs, apache_htpasswd, and apache_apachecfg fixtures, as appropriate.

Enumerated Fixtures

It is possible to instantiate multiple apache instances using the corresponding enumerated fixtures. All fixtures listed above have _*list (e.g. apache_secure -> apache_secure_list) versions that will return enumerated lists of corresponding data type.

For example:

import requests
from typing import List  # Optional, for typing
from pytest_docker_apache_fixtures import ApacheSecure  # Optional, for typing

def test_apache_secure_list(apache_secure_list: List[ApacheSecure]):
    for apache_secure in apache_secure_list:
        response = requests.head(
            f"https://{apache_secure.endpoint}/",
            headers=apache_secure.auth_header,
            verify=str(apache_secure.cacerts),
        )
        assert response.status_code == 200

It is possible to use both singular and enumerated fixtures within the same test context; however, the same values will be returned for the singular fixture as the first enumerated list value (i.e. apache_secure == apache_secure_list[0]). To avoid complications with lower layers, mainly docker-compose, and to allow for this interchangeability, caching is used internally.

By default, the scale factor of the enumerated instances is set to one (n=1). This value can be changed by overriding the pdaf_scale_factor fixture, as follows:

import pytest

@pytest.fixture(scope="session")
def pdaf_scale_factor() -> int:
    return 4

This fixture will be used to scale both the insecure and secure docker registries.

Limitations

  1. All the fixtures provided by this package are session scoped; and will only be executed once per test execution.
  2. At most 10 insecure and 10 secure apache instances are supported using the embedded docker compose.

Development

Source Control

Metadata

Release files for pytest-docker-apache-fixtures 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-docker-apache-fixtures 1.0.0
File Size Uploaded
pytest_docker_apache_fixtures-1.0.0.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-docker-apache-fixtures 1.0.0
File Interpreter ABI Platform
pytest_docker_apache_fixtures-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 44.9 kB

Release files / pytest_docker_apache_fixtures-1.0.0.tar.gz

Download URL pytest_docker_apache_fixtures-1.0.0.tar.gz
Size 21.2 kB
Tags Source
SHA-256 checksum
How to use checksums
566f48851ccec36abcf2068d905ae1602ab570ea108a174f1925b9eb797db671
BLAKE2b-256 checksum
How to use checksums
2b1e52d668adfad8c27fd9fb7198855dedec791874b0312dfbcaf621dd246eaa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.4

Release files / pytest_docker_apache_fixtures-1.0.0-py3-none-any.whl

Download URL pytest_docker_apache_fixtures-1.0.0-py3-none-any.whl
Size 23.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2d0c3efc244f6774e45b978221f02c57b6efcf004cf7c4263240797a64f38a57
BLAKE2b-256 checksum
How to use checksums
4ef85826ba4743f28879b8fddd9fe4235a10d83be02946c5d7a915a9deb9ae60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.4

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page