Files
api_test/backends/potter-api/bruno_test_scenario.md
T
2026-09-15 22:45:30 +02:00

12 KiB
Raw Blame History

🧪 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.

📋 Stručné shrnutí toho, co v dokumentu najdete:

  1. Spouštění aplikace (Backend & Frontend): • Spuštění backend serveru na portu 3000. • Spuštění frontend aplikace.

  2. Nastavení prostředí (Environment v Bruno): • Nastavení proměnných baseUrl (http://localhost:3000), username ( admin ), password ( supersecret ).

  3. Testovací scénáře pro všechny API služby:

    • 🪄 Kouzla (/spells): Pozitivní testy (seznam, detail, nový záznam, úprava, smazání) a negativní testy (duplicity, chybějící Content-Type: application/json hlavička, 422 Joi validace, 404).

    • 🧙 Postavy (/characters): Testy s Basic Auth, filtrování podle koleje/role, přidávání, úprava a mazání postav, chybové stavy pro 401 Unauthorized a duplicity.

    • 🏰 Koleje, Klobouk a Citáty (/houses, /sortingHat, /quote): Testy pro získání kolejí a citátů.

  4. Asertace a Automatizace (Tests & Scripts):

    • Příklady JavaScript testů pro záložku Tests v Bruno (kontrola stavových kódů 200, 201, 400, 401, 422, kontrola JSON struktury).

    • Skript pro záložku Post Response v Bruno pro automatické uložení vygenerovaného ID z odpovídajícího POST požadavku do proměnné prostředí (bru.setEnvVar("createdSpellId", body. spell.id)).

  5. Workflow & Řetězení testů (Chaining):

    • Postup, jak nastavit kompletní CRUD cyklus: POST ➡️ GET detail ➡️ PUT ➡️ DELETE ➡️ GET 404.


🚀 Spouštění aplikace

Před spuštěním testů je nutné spustit backend server a případně i frontend aplikaci.

Backend (API Server)

Backend je Express.js aplikace běžící na portu 3000.

Spuštění z kořenové složky projektu:

cd backends/potter-api
npm install   # Nainstaluje závislosti (pokud ještě nejsou nainstalovány)
npm start    # Spustí server pomocí nodemon (automaticky restartuje při změnách)

Přímé spuštění bez nodemon:

cd backends/potter-api
node app.js

Server bude dostupný na http://localhost:3000.

Tip

Pokud je port 3000 obsazen, je nutné jej uvolnit nebo změnit port přímo v souboru backends/potter-api/app.js (řádek 9: const port = 3000).

Frontend (Vue.js Aplikace)

Frontend je Vue.js aplikace, kterou lze spustit pro vývojové účely.

Spuštění z kořenové složky projektu:

cd backends/potter-api/frontend
npm install   # Nainstaluje závislosti (pokud ještě nejsou nainstalovány)
npm run serve # Spustí vývojový server (obvykle na portu 8080)
# nebo
npm start     # Stejné jako npm run serve

Frontend bude dostupný na http://localhost:8080.

Note

Pro samotné testování API pomocí Bruno není spuštění frontend nutné. Stačí mít běžící backend server.


⚙️ 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 admin Přihlašovací jméno pro Basic Auth
password supersecret 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 (admin / supersecret):

    • 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):
      {
        "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):
      {
        "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)
      {
        "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):
      {
        "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):

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):

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ů:

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ý.
  4. Záloha dat:
    • Zálohuj si veškerá data před testováním i po testování dle potřeby ať o ně nepříjdeš.