# Commerce Checkout Test Suite — Guida all'uso

## Dove si trovano i test

I file dei test esistono sul branch `main` (non su `dev`).
Per eseguirli devi essere su `main`:

```bash
git checkout main
ddev start
```

---

## Struttura

```
web/modules/custom/commerce_checkout_tests/
├── commerce_checkout_tests.info.yml
└── tests/src/
    ├── Traits/CheckoutFixtureTrait.php         ← helper condivisi
    ├── Functional/                              ← BrowserTestBase, no Chrome
    │   ├── CheckoutTestBase.php
    │   ├── AnonymousCheckoutTest.php
    │   ├── AuthenticatedCheckoutTest.php
    │   └── CheckoutEmailTest.php
    └── FunctionalJavascript/                   ← WebDriverTestBase, Chrome richiesto
        ├── OnsitePaymentCheckoutTest.php
        └── OffsitePaymentCheckoutTest.php
```

**23 test totali:**

| Tipo | N. test | Chrome | Tempo stimato |
|------|---------|--------|--------------|
| `BrowserTestBase` | 15 | No | ~2 minuti |
| `FunctionalJavascript` | 8 | Sì (Selenium) | ~5 minuti |

---

## Prerequisiti (una-tantum)

**1. Installa `drupal/core-dev`** (necessario per PHPUnit):
```bash
ddev exec composer require --dev drupal/core-dev:^11 --update-with-dependencies
```

**2. Setup Selenium** (solo per i test FunctionalJavascript):
```bash
ddev add-on get ddev/ddev-selenium-standalone-chrome
ddev restart
```

---

## Esecuzione

### Suite BrowserTestBase completa (~2 min, nessun Chrome)
```bash
ddev exec \
  env SIMPLETEST_DB="sqlite://localhost//tmp/drupal_test.sqlite" \
  SIMPLETEST_BASE_URL="https://alemilani10.ddev.site" \
  vendor/bin/phpunit \
  --configuration phpunit.xml \
  --testsuite commerce_checkout_functional \
  --testdox
```

### Suite FunctionalJavascript (richiede Selenium)
```bash
ddev exec \
  env SIMPLETEST_DB="sqlite://localhost//tmp/drupal_test_js.sqlite" \
  SIMPLETEST_BASE_URL="https://alemilani10.ddev.site" \
  vendor/bin/phpunit \
  --configuration phpunit.xml \
  --testsuite commerce_checkout_js \
  --testdox
```

### Singola classe
```bash
ddev exec \
  env SIMPLETEST_DB="sqlite://localhost//tmp/drupal_test.sqlite" \
  SIMPLETEST_BASE_URL="https://alemilani10.ddev.site" \
  vendor/bin/phpunit \
  --configuration phpunit.xml \
  web/modules/custom/commerce_checkout_tests/tests/src/Functional/AnonymousCheckoutTest.php \
  --testdox
```

### Singolo metodo
```bash
ddev exec \
  env SIMPLETEST_DB="sqlite://localhost//tmp/drupal_test.sqlite" \
  SIMPLETEST_BASE_URL="https://alemilani10.ddev.site" \
  vendor/bin/phpunit \
  --configuration phpunit.xml \
  --filter testGuestCheckoutSuccess \
  web/modules/custom/commerce_checkout_tests/tests/src/Functional/AnonymousCheckoutTest.php
```

---

## Cosa testa ogni classe

| Classe | Scenario |
|--------|----------|
| `AnonymousCheckoutTest` | Guest: pane login visibile, checkout completo, validazione email/indirizzo, carrello persistente, login nel funnel |
| `AuthenticatedCheckoutTest` | Loggato: pane login saltato, checkout completo, address book prefilled al secondo ordine, ordine nell'area cliente |
| `CheckoutEmailTest` | Email: receipt inviata (guest e loggato), body contiene prodotto, no duplicati, no email su carrello abbandonato |
| `OnsitePaymentCheckoutTest` | Carta: successo (loggato/anonimo), decline, method decline, retry dopo decline |
| `OffsitePaymentCheckoutTest` | Redirect: return success (loggato/anonimo), cancellazione |

---

## Note importanti

**SQLite invece di MariaDB:** il DDEV usa MariaDB 10.4, sotto il minimo richiesto da Drupal 11 per installare un ambiente di test. I test usano SQLite in `/tmp` — già configurato in `phpunit.xml`, non serve cambiare nulla.

**Non abilitare il modulo in produzione:** `commerce_checkout_tests.info.yml` ha `hidden: true`. Il modulo non va mai abilitato su staging o prod — serve solo per i test automatici.

**DB isolato:** i test installano Drupal da zero in un DB separato (SQLite `/tmp`). Non toccano mai il DB DDEV del progetto.

---

## Documentazione completa

Per troubleshooting, limiti noti e variabili d'ambiente:

```
web/modules/custom/commerce_checkout_tests/README.testing.md
```
(su branch `main`)