# Tester - HTTP Contract Test Runner

Web UI for discovering and running contract tests.

## Quick Start

```bash
# Sync tests from production repo (local dev)
/home/mariano/wdir/ama/core_nest/pawprint/ctrl/sync-tests.sh

# Run locally
cd /home/mariano/wdir/ama/pawprint/ward
python -m tools.tester

# Open in browser
http://localhost:12003/tester
```

## Architecture

**Test Definitions** → **Tester (Runner + UI)** → **Target API**

```
amar_django_back_contracts/
└── tests/contracts/          ← Test definitions (source of truth)
    ├── mascotas/
    ├── productos/
    └── workflows/

ward/tools/tester/
├── tests/                    ← Synced from contracts (deployment)
│   ├── mascotas/
│   ├── productos/
│   └── workflows/
├── base.py                   ← HTTP test base class
├── core.py                   ← Test discovery & execution
├── api.py                    ← FastAPI endpoints
└── templates/                ← Web UI

```

## Strategy: Separation of Concerns

1. **Tests live in production repo** (`amar_django_back_contracts`)
   - Developers write tests alongside code
   - Tests are versioned with the API
   - PR reviews include test changes

2. **Tester consumes tests** (`ward/tools/tester`)
   - Provides web UI for visibility
   - Runs tests against any target (dev, stage, prod)
   - Shows test coverage to product team

3. **Deployment syncs tests**
   - `sync-tests.sh` copies tests from contracts to tester
   - Deployment script includes test sync
   - Server always has latest tests

## Configuration

### Single Environment (.env)

```env
CONTRACT_TEST_URL=https://demo.amarmascotas.ar
CONTRACT_TEST_API_KEY=your-api-key-here
```

### Multiple Environments (environments.json)

Configure multiple target environments with individual tokens:

```json
[
  {
    "id": "demo",
    "name": "Demo",
    "url": "https://demo.amarmascotas.ar",
    "api_key": "",
    "description": "Demo environment for testing",
    "default": true
  },
  {
    "id": "dev",
    "name": "Development",
    "url": "https://dev.amarmascotas.ar",
    "api_key": "dev-token-here",
    "description": "Development environment"
  },
  {
    "id": "prod",
    "name": "Production",
    "url": "https://amarmascotas.ar",
    "api_key": "prod-token-here",
    "description": "Production (use with caution!)"
  }
]
```

**Environment Selector**: Available in UI header on both Runner and Filters pages. Selection persists via localStorage.

## Web UI Features

- **Filters**: Advanced filtering by domain, module, status, and search
- **Runner**: Execute tests with real-time progress tracking
- **Multi-Environment**: Switch between dev/stage/prod with per-environment tokens
- **URL State**: Filter state persists via URL when running tests
- **Real-time Status**: See test results as they run

## API Endpoints

```
GET  /tools/tester/                        # Runner UI
GET  /tools/tester/filters                 # Filters UI
GET  /tools/tester/api/tests               # List all tests
GET  /tools/tester/api/environments        # List environments
POST /tools/tester/api/environment/select  # Switch environment
POST /tools/tester/api/run                 # Start test run
GET  /tools/tester/api/run/{run_id}        # Get run status (polling)
GET  /tools/tester/api/runs                # List all runs
```

## Usage Flow

### From Filters to Runner

1. Go to `/tools/tester/filters`
2. Filter tests (domain, module, search)
3. Select tests to run
4. Click "Run Selected"
5. → Redirects to Runner with filters applied and auto-starts execution

### URL Parameters

Runner accepts URL params for deep linking:

```
/tools/tester/?run=abc123&domains=mascotas&search=owner
```

- `run` - Auto-load results for this run ID
- `domains` - Filter by domains (comma-separated)
- `modules` - Filter by modules (comma-separated)
- `search` - Search term for test names
- `status` - Filter by status (passed,failed,skipped)

## Deployment

Tests are synced during deployment:

```bash
# Full deployment (includes test sync)
cd /home/mariano/wdir/ama/pawprint/deploy
./deploy.sh

# Or sync tests only
/home/mariano/wdir/ama/core_nest/pawprint/ctrl/sync-tests.sh
```

## Why This Design?

**Problem**: Tests scattered, no visibility, hard to demonstrate value

**Solution**:
- Tests in production repo (developer workflow)
- Tester provides visibility (product team, demos)
- Separation allows independent evolution

**Benefits**:
- Product team sees test coverage
- Demos show "quality dashboard"
- Tests protect marketplace automation work
- Non-devs can run tests via UI

## Related

- Production tests: `/home/mariano/wdir/ama/amar_django_back_contracts/tests/contracts/`
- Sync script: `/home/mariano/wdir/ama/core_nest/pawprint/ctrl/sync-tests.sh`
- Ward system: `/home/mariano/wdir/ama/pawprint/ward/`
