# Local Test Workflow

This project can be tested in a local virtualenv that mirrors the Python package source used by the Docker images.

## 1. Create the virtualenv

```bash
python3 -m venv .venv-test
source .venv-test/bin/activate
```

## 2. Install dependencies with the Docker mirror

### Option A: full project install

Use this when your local Python version matches Docker (`3.10`).

The development Docker image installs packages from `https://mirror-pypi.runflare.com/simple`.

```bash
source .venv-test/bin/activate
pip --isolated install \
  --prefer-binary \
  --index-url https://mirror-pypi.runflare.com/simple \
  --trusted-host mirror-pypi.runflare.com \
  -c constraints.txt \
  -r requirements.txt
```

### Option B: focused openEO test install

I used this path successfully on a host with Python `3.14`, where the pinned full requirements are not Docker-compatible because the project pins older `numpy` for Python `3.10`.

```bash
source .venv-test/bin/activate
pip --isolated install \
  --prefer-binary \
  --index-url https://mirror-pypi.runflare.com/simple \
  --trusted-host mirror-pypi.runflare.com \
  Django \
  requests \
  PySocks \
  openeo \
  python-dotenv \
  Pillow
```

If the mirror is temporarily slow in your environment, retry the same command once more before changing indexes.

## 3. Run the focused openEO test file

### Standard Django command

```bash
source .venv-test/bin/activate
python manage.py test location_data.test_openeo_service
```

### Minimal runner used on a non-Docker local setup

This avoids loading the whole project URL tree and only boots the apps needed by `location_data.test_openeo_service`.

```bash
source .venv-test/bin/activate
python - <<'PY'
import sys, types
import django
from django.conf import settings
from django.urls import path

url_module = types.ModuleType("local_test_urls")
url_module.urlpatterns = [path("__test__/", lambda request: None)]
sys.modules["local_test_urls"] = url_module

settings.configure(
    SECRET_KEY="test-secret",
    USE_TZ=True,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=[
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "location_data",
    ],
    MIDDLEWARE=[],
    ROOT_URLCONF="local_test_urls",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)

django.setup()
from django.test.utils import get_runner

runner = get_runner(settings)()
failures = runner.run_tests(["location_data.test_openeo_service"])
raise SystemExit(bool(failures))
PY
```

## 4. Run the broader location-data suite

```bash
source .venv-test/bin/activate
python manage.py test location_data
```

## 5. Run a syntax-only validation

This is useful when dependencies are still being installed or when you want a very fast sanity check.

```bash
python3 -m py_compile \
  location_data/openeo_service.py \
  location_data/tasks.py \
  location_data/test_openeo_service.py \
  config/proxy.py
```

## Notes

- The openEO request timeout is configured through `OPENEO_TIMEOUT_SECONDS`.
- The current default in code and `.env.example` is `600` seconds.
- openEO request logging is emitted from `location_data.openeo_service`, including request payloads, process graphs, downloaded batch result files, and parse failures.
