Files
api_test/bruno_test_scenario.md
T
2026-09-14 23:42:04 +02:00

247 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧪 PotterAPI – Testovací scénáře, tipy a rady pro Bruno API Client
Tento dokument obsahuje přehled testovacích scénářů, tipů, triků a automatizovaných testů v aplikaci **Bruno** pro testování REST API **PotterAPI**.
---
## ⚙️ 1. Nastavení Bruno (Environment & Kolekce)
### Vytvoření prostředí (Environment)
V aplikaci Bruno si vytvořte nové prostředí (např. `Local`) s následujícími proměnnými:
| Název proměnné | Hodnota | Popis |
| :--- | :--- | :--- |
| `baseUrl` | `http://localhost:3000` | Základní URL lokálního serveru |
| `username` | `****` | Přihlašovací jméno pro Basic Auth |
| `password` | `*****` | Heslo pro Basic Auth |
| `createdSpellId` | *(dynamicky)* | Ukládá ID nově vytvořeného kouzla |
| `createdCharacterId` | *(dynamicky)* | Ukládá ID nově vytvořené postavy |
> [!TIP]
> V Bruno můžete v URL i v těle požadavku používat proměnné pomocí zápisu `{{baseUrl}}/spells`.
---
## 🔑 2. Autentizace v Bruno
Aplikace používá dva druhy autentizace:
1. **Basic Auth (`****` / `*****`)**:
- Vyžadováno pro **`/characters`** a **`/login`**.
- **Nastavení v Bruno**: Na záložce **Auth** zvolte `Basic Auth` a zadejte `Username: {{username}}` a `Password: {{password}}`.
2. **Content-Type Header Check (`application/json`)**:
- Vyžadováno pro `POST` a `PUT` u **`/spells`** (middleware `checkHeader`).
- **Nastavení v Bruno**: Na záložce **Headers** přidejte `Content-Type: application/json`.
---
## 📋 3. Přehled testovacích scénářů
### 🪄 A. Kouzla (`/spells`)
#### 🟢 Pozitivní scénáře (Happy Path)
1. **Získání všech kouzel**
- **Metoda:** `GET {{baseUrl}}/spells`
- **Očekávaný stav:** `200 OK`
- **Kontrola:** Vrátí pole objektů, kde každý objekt má `id`, `spell`, `type`, `effect`, `isUnforgivable`.
2. **Filtrování kouzel podle typu**
- **Metoda:** `GET {{baseUrl}}/spells?type=Curse`
- **Očekávaný stav:** `200 OK`
- **Kontrola:** Každá položka v poli má `"type": "Curse"`.
3. **Vytvoření nového kouzla**
- **Metoda:** `POST {{baseUrl}}/spells`
- **Headers:** `Content-Type: application/json`
- **Body (JSON):**
```json
{
"spell": "Expelliarmus",
"type": "Charm",
"effect": "Disarms your opponent",
"isUnforgivable": "false"
}
```
- **Očekávaný stav:** `201 Created`
- **Kontrola:** Vrátí `{ message: "Spell created", spell: { id: "..." } }`. Hodnota `isUnforgivable` v `spells.json` bude `false` (boolean).
4. **Získání konkrétního kouzla podle ID**
- **Metoda:** `GET {{baseUrl}}/spells/{{createdSpellId}}`
- **Očekávaný stav:** `200 OK`
- **Kontrola:** Vrátí objekt kouzla s odpovídajícím ID.
5. **Úprava kouzla**
- **Metoda:** `PUT {{baseUrl}}/spells/{{createdSpellId}}`
- **Headers:** `Content-Type: application/json`
- **Body (JSON):**
```json
{
"spell": "Expelliarmus Maxima",
"type": "Charm",
"effect": "Strongly disarms opponent",
"isUnforgivable": false
}
```
- **Očekávaný stav:** `201 Created`
6. **Smazání kouzla podle ID**
- **Metoda:** `DELETE {{baseUrl}}/spells/{{createdSpellId}}`
- **Očekávaný stav:** `200 OK`
- **Kontrola:** Vrátí `{ message: "spell deleted" }`.
---
#### 🔴 Negativní a Hraniční scénáře
1. **Chybějící hlavička Content-Type (POST / PUT)**
- **Metoda:** `POST {{baseUrl}}/spells` (bez `Content-Type: application/json`)
- **Očekávaný stav:** `400 Bad Request`
- **Očekávaná zpráva:** `"Sorry Nick you dont have HEADer"`
2. **Pokus o vytvoření duplicitního kouzla**
- **Metoda:** `POST {{baseUrl}}/spells` s národem kouzla, které již existuje (např. `"spell": "Alohomora"`)
- **Očekávaný stav:** `400 Bad Request`
- **Očekávaná zpráva:** `"Spell Alohomora already exists"`
3. **Neplatná data (Joi validation failure)**
- **Metoda:** `POST {{baseUrl}}/spells`
- **Body (JSON):** (příliš krátký název, neplatný typ)
```json
{
"spell": "Ab",
"type": "SuperPower",
"isUnforgivable": true
}
```
- **Očekávaný stav:** `422 Unprocessable Entity`
4. **Vyhledání neexistujícího kouzla**
- **Metoda:** `GET {{baseUrl}}/spells/non-existing-id-999`
- **Očekávaný stav:** `404 Not Found`
---
### 🧙 B. Postavy (`/characters`)
> [!IMPORTANT]
> Všechny požadavky na `/characters` vyžadují **Basic Auth** (`****` / `*****`).
#### 🟢 Pozitivní scénáře
1. **Získání všech postav**
- **Metoda:** `GET {{baseUrl}}/characters`
- **Auth:** Basic Auth
- **Očekávaný stav:** `200 OK`
2. **Filtrování postav podle koleje a role**
- **Metoda:** `GET {{baseUrl}}/characters?house=Gryffindor&role=student`
- **Auth:** Basic Auth
- **Očekávaný stav:** `200 OK`
3. **Vytvoření nové postavy**
- **Metoda:** `POST {{baseUrl}}/characters`
- **Auth:** Basic Auth
- **Headers:** `Content-Type: application/json`
- **Body (JSON):**
```json
{
"name": "Hermione Granger",
"role": "student",
"house": "Gryffindor",
"school": "Hogwarts School of Witchcraft and Wizardry",
"dumbledoresArmy": true,
"bloodStatus": "muggle-born",
"species": "human"
}
```
- **Očekávaný stav:** `201 Created`
4. **Smazání postavy podle ID**
- **Metoda:** `DELETE {{baseUrl}}/characters/{{createdCharacterId}}`
- **Auth:** Basic Auth
- **Očekávaný stav:** `200 OK`
---
#### 🔴 Negativní scénáře
1. **Přístup bez přihlášení (Neplatné/Chybějící Basic Auth)**
- **Metoda:** `GET {{baseUrl}}/characters` (bez Auth)
- **Očekávaný stav:** `401 Unauthorized`
- **Očekávané tělo:** `{ "message": "Sorry Wizard, can't let you in." }`
2. **Duplicitní jméno postavy**
- **Metoda:** `POST {{baseUrl}}/characters` se jménem, které již v databázi je (např. `"name": "Hannah Abbott"`)
- **Očekávaný stav:** `400 Bad Request`
---
### 🏰 C. Koleje, Moudrý klobouk & Citáty (`/houses`, `/sortingHat`, `/quote`)
1. **Seznam kolejí**: `GET {{baseUrl}}/houses` -> `200 OK` (Vrátí 4 koleje)
2. **Detail koleje**: `GET {{baseUrl}}/houses/5a05e2b252f039152b96b5a7` -> `200 OK` (Gryffindor)
3. **Moudrý klobouk**: `GET {{baseUrl}}/sortingHat` -> `200 OK` (Vrátí náhodnou kolej)
4. **Náhodný citát**: `GET {{baseUrl}}/quote` -> `200 OK` (Vrátí citát)
---
## ⚡ 4. Testovací skripty & Asertace v Bruno
V Bruno můžete psát testy v záložce **Tests** (používá knihovnu Chai / JavaScript).
### Příklady asertací:
#### Test 1: Kontrola stavového kódu a struktury odpovědi při vytvoření kouzla
*(Záložka Tests u requestu `POST /spells`)*:
```javascript
test("Status code is 201 Created", function() {
expect(res.getStatus()).to.equal(201);
});
test("Response contains success message and spell ID", function() {
const data = res.getBody();
expect(data).to.have.property("message", "Spell created");
expect(data.spell).to.have.property("id");
});
```
#### Test 2: Uložení vytvořeného ID do proměnné prostředí (Post-response Script)
*(Záložka Script -> Post Response)*:
```javascript
if (res.getStatus() === 201) {
const body = res.getBody();
bru.setEnvVar("createdSpellId", body.spell.id);
}
```
---
## 🔗 5. Řetězení testů (Workflow v Bruno)
Díky skriptování můžete vytvořit automatizovaný řetězec testů:
```mermaid
flowchart LR
A["1. POST /spells<br/>(Vytvořit kouzlo)"] -->|"Uloží ID do env"| B["2. GET /spells/:id<br/>(Ověřit vytvoření)"]
B --> C["3. PUT /spells/:id<br/>(Upravit kouzlo)"]
C --> D["4. DELETE /spells/:id<br/>(Smazat kouzlo)"]
D --> E["5. GET /spells/:id<br/>(Ověřit 404)"]
```
1. **Krok 1 (`POST /spells`)**: Vytvoří kouzlo a v `Post Response` skriptu uloží `createdSpellId`.
2. **Krok 2 (`GET /spells/{{createdSpellId}}`)**: Ověří, že kouzlo existuje.
3. **Krok 3 (`PUT /spells/{{createdSpellId}}`)**: Upraví vlastnosti kouzla.
4. **Krok 4 (`DELETE /spells/{{createdSpellId}}`)**: Smaže kouzlo.
5. **Krok 5 (`GET /spells/{{createdSpellId}}`)**: Ověří navrácení kódů `404 Not Found`.
---
## 💡 Tipy a doporučení pro Bruno
1. **Používejte Bruno Runner**:
- V levém panelu můžete kliknout na menu kolekce a zvolit **Run**. Bruno spustí všechny testy v kolekci za sebou a zobrazí zelené/červené výsledky.
2. **Ukládání kolekce do Gitu**:
- Bruno ukládá kolekce jako čisté `.bru` soubory přímo ve vaší složce projektu. Můžete je verzovat v Gitu spolu s kódem backendu!
3. **Reset databáze před testy**:
- Na začátku testovací sady doporučujeme zavolat `GET {{baseUrl}}/spells/actions/reset`, aby byl stav `spells.json` vždy předvídatelný.