diff --git a/.gitea/workflows/bandit.yml b/.gitea/workflows/bandit.yml index 3290eed..1ef602e 100644 --- a/.gitea/workflows/bandit.yml +++ b/.gitea/workflows/bandit.yml @@ -28,8 +28,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade bandit pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Analyse code with Bandit run: | diff --git a/.gitea/workflows/flake8.yml b/.gitea/workflows/flake8.yml index 48396fc..69ec686 100644 --- a/.gitea/workflows/flake8.yml +++ b/.gitea/workflows/flake8.yml @@ -28,8 +28,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade flake8 pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Analyse code with Flake8 run: | flake8 $(git ls-files '*.py') diff --git a/.gitea/workflows/mypy.yml b/.gitea/workflows/mypy.yml index ac3438f..0409561 100644 --- a/.gitea/workflows/mypy.yml +++ b/.gitea/workflows/mypy.yml @@ -28,8 +28,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade mypy pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Analyse code with Mypy run: | diff --git a/.gitea/workflows/pip-audit.yml b/.gitea/workflows/pip-audit.yml index 47b1db0..7f41fb1 100644 --- a/.gitea/workflows/pip-audit.yml +++ b/.gitea/workflows/pip-audit.yml @@ -30,8 +30,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade pip-audit pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Check vulnerable components with pip-audit run: | diff --git a/.gitea/workflows/pylint.yml b/.gitea/workflows/pylint.yml index ee4e8de..e43b69c 100644 --- a/.gitea/workflows/pylint.yml +++ b/.gitea/workflows/pylint.yml @@ -28,8 +28,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install --upgrade pylint pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Analyse code with Pylint run: | pylint $(git ls-files '*.py') diff --git a/.gitea/workflows/python-coverage.yml b/.gitea/workflows/python-coverage.yml index a138770..92435a9 100644 --- a/.gitea/workflows/python-coverage.yml +++ b/.gitea/workflows/python-coverage.yml @@ -29,11 +29,11 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - python -m pip install --upgrade pytest-cov + pip install -r requirements-dev.txt - name: Run tests with coverage run: | - pytest --cov=./ --cov-report=term --cov-report=xml --cov-report=html --junitxml=report.xml + pytest --cov=./ --cov-report=term --cov-report=xml --cov-report=html --junitxml=report.xml app - name: Upload coverage artifacts uses: actions/upload-artifact@v3 diff --git a/.gitignore b/.gitignore index 5170c57..35995e6 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ +report.xml # Translations *.mo diff --git a/app/test_iplookup.py b/app/test_iplookup.py new file mode 100644 index 0000000..139aaff --- /dev/null +++ b/app/test_iplookup.py @@ -0,0 +1,91 @@ +''' +Test ismijnverweg geolookup api +''' +import logging +import random +import re +from operator import itemgetter + +from faker import Faker +from fastapi.testclient import TestClient + +from .main import app + +# Set up logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Initialize Faker for generating test data +fake = Faker() + +# Create test client +fake_ipv6 = fake.ipv6() +client = TestClient(app, client=(fake_ipv6, 31337)) + + +def test_no_query(): + """Test searching without a query parameter""" + + response = client.get("/") + + assert response.status_code == 200 + results = response.json() + logging.info(results) + assert results['ip'] == fake_ipv6 + assert len(results) > 0 + + +def test_single_query(): + """Test searching with an ip address""" + fake_ipv4 = fake.ipv4_public() + + response = client.get(f"/{fake_ipv4}") + + assert response.status_code == 200 + results = response.json() + logging.info(results) + assert results['ip'] == fake_ipv4 + assert len(results) > 0 + + +def test_multi_query(): + """Test searching with an ip address""" + fake_ips = [{'ip': fake.ipv6() if random.random() > 0.5 else fake.ipv4()} + for _ in range(16)] + + response = client.post("/", json=fake_ips) + + assert response.status_code == 200 + results = response.json() + logging.info(results) + + for ip in map(itemgetter('ip'), results): + assert ip in map(itemgetter('ip'), fake_ips) + + assert len(results) > 0 + + +def test_invalid_query(): + """Test searching with an invalid ip address""" + invalid_ip = '500.312.77.31337' + test_pattern = 'Input is not a valid IPv[46] address' + + response = client.get(f"/{invalid_ip}") + + assert response.status_code == 422 + results = response.json() + logging.info(results) + assert all(map(lambda x: x == invalid_ip, ( + map(itemgetter('input'), results['detail'])))) + assert all(map(lambda x: re.match(test_pattern, x), ( + map(itemgetter('msg'), results['detail'])))) + assert len(results) > 0 + + +if __name__ == "__main__": + # Run tests + test_no_query() + test_single_query() + test_invalid_query() + test_multi_query() + print("All tests passed!") diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..dc4504d --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +faker==40.11.0 +flake8==7.3.0 +mypy==1.19.1 +pylint==4.0.5 +pytest-cov==7.0.0