Gilles Filippini 60b123d249 feat: ENABLE_HTTP_ON_MISSING_CERT variable пре 1 година
..
certs 57e86561eb build: bump library/nginx from 1.26.0 to 1.27.0 (#2470) пре 1 година
requirements 8de923fd33 ci: bump requests from 2.32.2 to 2.32.3 in /test/requirements (#2472) пре 1 година
stress_tests 4464269c51 remove obsolete stress-test пре 1 година
test_acme_http_challenge_location 4bd542de99 feat: handle acme challenge location by default пре 1 година
test_custom 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_custom-error-page fb9c3a646a feat: custom default error page (#2430) пре 1 година
test_dockergen 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_fallback.data 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_headers 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_host-network-mode 35b1493e16 feat: support proxy + container in host network mode пре 2 година
test_htpasswd a9f8a9c32a htpasswd tests пре 1 година
test_http2 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_http3 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_internal 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_location-override.vhost.d 2115974e93 feat: Add ability to completely override location blocks пре 2 година
test_logs 62212186eb test: re-organize test files пре 1 година
test_multiports 1bf7eff04f test: multiport merge with legacy variable пре 1 година
test_ports 62212186eb test: re-organize test files пре 1 година
test_server-down c4cf0af373 test: fix failing tests пре 1 година
test_ssl 4bd542de99 feat: handle acme challenge location by default пре 1 година
test_trust-downstream-proxy 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_upstream-name 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_virtual-path 62212186eb test: re-organize test files пре 1 година
README.md 329b69fe76 Update test readme пре 1 година
conftest.py d6c38a0bab tests: Add tests for how Let's Encrypt ACME challenge is handled пре 1 година
pytest.ini c338a7cf22 Color terminal output пре 1 година
pytest.sh b5cac06305 ci: remove python docker-compose пре 1 година
test_DOCKER_HOST_unix_socket.py 6069bc53cd TESTS: replace old test suite with the new one пре 8 година
test_DOCKER_HOST_unix_socket.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_build.py 59d5293480 fix 'requirements' path in test/test_build.py пре 1 година
test_default-host.py 6069bc53cd TESTS: replace old test suite with the new one пре 8 година
test_default-host.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_enable_http_on_missing_cert.py 60b123d249 feat: ENABLE_HTTP_ON_MISSING_CERT variable пре 1 година
test_enable_http_on_missing_cert.yml 60b123d249 feat: ENABLE_HTTP_ON_MISSING_CERT variable пре 1 година
test_events.py c4cf0af373 test: fix failing tests пре 1 година
test_events.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_fallback.py 91652aac48 fix: constistent behavior for `HTTPS_METHOD=nohttp` пре 1 година
test_http_port.py cb59c24470 tests non standard port Host header пре 1 година
test_http_port.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_ipv6.py 6069bc53cd TESTS: replace old test suite with the new one пре 8 година
test_ipv6.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_keepalive.py 2aa35aa637 tests: keepalive auto setting пре 1 година
test_keepalive.yml 2aa35aa637 tests: keepalive auto setting пре 1 година
test_loadbalancing.py 7ca1da8358 feat: Add support for HTTP load balancing between the proxy and upstream server groups (#2173) пре 2 година
test_loadbalancing.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_location-override.py 2115974e93 feat: Add ability to completely override location blocks пре 2 година
test_location-override.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_multiple-hosts.py 6069bc53cd TESTS: replace old test suite with the new one пре 8 година
test_multiple-hosts.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_multiple-networks.py 13eb61a639 fix: Replace mDNS .local domain with .example domain пре 2 година
test_multiple-networks.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_nominal.py e22ae4a6fd tests: display container version пре 3 година
test_nominal.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_raw-ip-vhost.py ba86bc04f6 tests: check for raw IPv4/6 used as VIRTUAL_HOST пре 3 година
test_raw-ip-vhost.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_vhost-empty-string.py 8346b68a28 fix: Ignore `VIRTUAL_HOST` set to the empty string пре 2 година
test_vhost-empty-string.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_vhost-in-multiple-networks.py 13eb61a639 fix: Replace mDNS .local domain with .example domain пре 2 година
test_vhost-in-multiple-networks.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година
test_wildcard_host.py 37e85e6e8d chore(ci): :recycle: convert Python old `%` string to f-strings пре 4 година
test_wildcard_host.yml 060f09cfce ci: ensure all compose files are valid compose v2 + formatting пре 1 година

README.md

Nginx proxy test suite

Install requirements

You need Docker Compose v2, python 3.9 and pip installed. Then run the commands:

pip install -r requirements/python-requirements.txt

Prepare the nginx-proxy test image

make build-nginx-proxy-test-debian

or if you want to test the alpine flavor:

make build-nginx-proxy-test-alpine

Run the test suite

pytest

need more verbosity ?

pytest -s

Note: By default this test suite relies on Docker Compose v2 with the command docker compose. It still supports Docker Compose v1 via the DOCKER_COMPOSE environment variable:

DOCKER_COMPOSE=docker-compose pytest

Run one single test module

pytest test_nominal.py

Run the test suite from a Docker container

If you cannot (or don't want to) install pytest and its requirements on your computer. You can use the nginx-proxy-tester docker image to run the test suite from a Docker container.

make test-debian

or if you want to test the alpine flavor:

make test-alpine

Write a test module

This test suite uses pytest. The conftest.py file will be automatically loaded by pytest and will provide you with two useful pytest fixtures:

  • docker_compose
  • nginxproxy

docker_compose fixture

When using the docker_compose fixture in a test, pytest will try to find a yml file named after your test module filename. For instance, if your test module is test_example.py, then the docker_compose fixture will try to load a test_example.yml docker compose file.

Once the docker compose file found, the fixture will remove all containers, run docker compose up, and finally your test will be executed.

The fixture will run the docker compose command with the -f option to load the given compose file. So you can test your docker compose file syntax by running it yourself with:

docker compose -f test_example.yml up -d

In the case you are running pytest from within a docker container, the docker_compose fixture will make sure the container running pytest is attached to all docker networks. That way, your test will be able to reach any of them.

In your tests, you can use the docker_compose variable to query and command the docker daemon as it provides you with a client from the docker python module.

Also this fixture alters the way the python interpreter resolves domain names to IP addresses in the following ways:

Any domain name containing the substring nginx-proxy will resolve to the IP address of the container that was created from the nginxproxy/nginx-proxy:test image. So all the following domain names will resolve to the nginx-proxy container in tests:

  • nginx-proxy
  • nginx-proxy.com
  • www.nginx-proxy.com
  • www.nginx-proxy.test
  • www.nginx-proxy
  • whatever.nginx-proxyooooooo
  • ...

Any domain name ending with XXX.container.docker will resolve to the IP address of the XXX container.

  • web1.container.docker will resolve to the IP address of the web1 container
  • f00.web1.container.docker will resolve to the IP address of the web1 container
  • anything.whatever.web2.container.docker will resolve to the IP address of the web2 container

Otherwise, domain names are resoved as usual using your system DNS resolver.

nginxproxy fixture

The nginxproxy fixture will provide you with a replacement for the python requests module. This replacement will just repeat up to 30 times a requests if it receives the HTTP error 404 or 502. This error occurs when you try to send queries to nginx-proxy too early after the container creation.

Also this requests replacement is preconfigured to use the Certificate Authority root certificate certs/ca-root.crt to validate https connections.

Furthermore, the nginxproxy methods accept an additional keyword parameter: ipv6 which forces requests made against containers to use the containers IPv6 address when set to True. If IPv6 is not supported by the system or docker, that particular test will be skipped.

def test_forwards_to_web1_ipv6(docker_compose, nginxproxy):
    r = nginxproxy.get("http://web1.nginx-proxy.tld/port", ipv6=True)
    assert r.status_code == 200   
    assert r.text == "answer from port 81\n"

The web docker image

When you run the make build-webserver command, you built a web docker image which is convenient for running a small web server in a container. This image can produce containers that listens on multiple ports at the same time.

Testing TLS

If you need to create server certificates, use the certs/create_server_certificate.sh script. Pytest will be able to validate any certificate issued from this script.