Awesome Testing

Markdown document

Podsumowanie sesji Codex

Lekcja 25: Zadanie 5 — rozwiązanie testów inventory

Historical artifacts may name disposable training credentials and environments. Do not reuse credentials, target course systems, or execute archived prompts without authorization.

Podsumowanie sesji Codex

Zakres sesji

Sesja z 5 września 2026 dotyczyła testów czterech operacji inventory w l19. Punktem wyjścia było 170 testów i brak dedykowanej automatyzacji inwentarza. Najpierw sprawdzono backend oraz zachowanie API, następnie dodano testy, a na prośbę użytkownika przeprowadzono audyt ich stylu i podziału odpowiedzialności między testy backendowe a zdalne testy API.

Podsumowanie obejmuje pracę edukacyjną do końcowego review i zielonego wyniku 190 testów. Jest oparte na rzeczywistej sesji Codex. Trzy poniższe polecenia odpowiadają pracy pokazanej w filmie; późniejsze przygotowanie materiałów, przeniesienie checkpointu i produkcja wideo pozostają poza zakresem sesji edukacyjnej.

Prompty użyte w Codex

1. Rozpoznanie działania inventory

Work in l19, use english. Dobra, no to zostały nam tylko testy endpointa z inwentarzem. Jakbyś mógł mi sprawdzić w kodzie backendowym o co chodzi z tymi endpointami. Trener mówił, że to jest ilość produktów, które możemy sprzedać w ramach zamówień. Daj znać, czy to działa, czy są jakieś tutaj wyjątkowe rzeczy, na które powinienem zwrócić uwagę. No i powiedz mi, czy jesteś gotowy takie testy przygotować.

2. Implementacja testów

Ok implement it

3. Audyt, ograniczenie zakresu i dopasowanie stylu

Dobra, tylko takie, patrząc na te testy, mam wrażenie, że często są one trochę inne. Jest trochę testów sparametryzowanych, jakieś pętle for w środku, jakieś takie zagnieżdżone trochę testy. Zastanawiam się, czy nie moglibyśmy tego jakoś dostosować do tego, co było w projekcie, bo też zastanawiam się, czy takie 400, taka walidacja inputa powinna być pokrywana na tym poziomie czy nie. Także zrób mi proszę taki audyt, możesz zobaczyć, jak to jest testowane na poziomie backendu i może nieco ogranicz ilość tych testów. Może też nie rób takich dziwnych konstruktów jak expect, await, inventoryBody, API error response. Mam wrażenie, że wcześniej tak nie pisaliśmy, więc albo trzeba by te testy dostosować do reszty projektu, albo resztę testów zmienić. Także jeżeli uważasz, że możemy dostosować do reszty, to dostosuj, jeżeli uważasz, że resztę testów powinniśmy zmienić, to proszę uargumentuj mi to, bo ja nie jestem do tego przekonany.

Prompty zachowują oryginalny język i treść wiadomości. Instrukcje systemowe, kontekst narzędzi i późniejsze polecenia organizacyjne nie są promptami tej lekcji.

Co sprawdził Codex przed implementacją?

Codex przeczytał api-test-plan.md, repozytoryjny workflow testowania API, istniejące klienty HTTP, fixture i sąsiednie specy produktów oraz zamówień. W repozytorium backendowym przeanalizował AdminInventoryController, InventoryService, DTO, integrację koszyka, produktów i zamówień, obsługę wyjątków, blokady rekordów oraz migrację danych.

Pole availableQuantity odpowiada stockQuantity produktu. Dodanie produktu do koszyka sprawdza dostępność, ale nie rezerwuje zapasu. Dopiero utworzenie zamówienia zmniejsza stan, jeszcze przed płatnością. Anulowanie kwalifikującego się zamówienia przywraca zapas. Dla starych zamówień LEGACY_UNTRACKED backend nie wykonuje takiego przywracania.

Sprawdzono bieżące dokumenty /v3/api-docs obu środowisk. Repozytoryjny api-docs.json zawierał 42 operacje i nie opisywał inventory. Aktualny kontrakt obejmował 53 operacje na awesome.byst.re i 55 na aitesters.byst.re. Dodatkowe dwie operacje stagingu dotyczą lokalnego outboxa email.

Dostępne dane administratora działały na stagingu, ale logowanie nimi na awesome.byst.re zwróciło 422. Dlatego uwierzytelnione sprawdzenia inventory wykonano na aitesters.byst.re. Na środowisku kursowym potwierdzono kontrakt oraz 401 bez JWT, bez deklarowania zweryfikowanej zgodności ścieżek admina.

Co pokazała eksploracja API?

Przed automatyzacją wykonano osobne żądania curl na danych jednorazowych:

DziałanieDostępny zapas
Utworzenie produktu5
Korekta +38
Ponowienie identycznej korekty8
Dodanie dwóch sztuk do koszyka8
Utworzenie zamówienia na dwie sztuki6
Anulowanie zamówienia8

Korekta przyjmuje różnicę delta, uzasadnienie reason i UUID requestId. Powtórzenie identycznego żądania dla tego samego produktu zwraca tę samą zmianę z 201, zamiast ponownie aktualizować zapas. Ten sam requestId z inną treścią powoduje 409. Próba zejścia poniżej zera również zwraca 409, a delta równa zero powoduje 400. Historia pokazuje INITIAL_STOCK, ADMIN_ADJUSTMENT, ORDER_DEDUCTED i ORDER_RESTORED; zdarzenia zamówienia zawierają orderId.

Sprawdzono także uprawnienia, brakujący produkt, filtry i stronicowanie oraz wybrane granice walidacji. Wygenerowane dane zostały usunięte. Wykryto lukę w Swaggerze: prawidłowe odpowiedzi 400, 404 i 409 nie były opisane dla inventory. Powstał raport defektu kontraktu. Nie potraktowano poprawnych odrzuceń biznesowych jako błędnego działania API.

Co zaimplementował Codex?

Dodano httpclients/inventory-client.ts, typy w types/inventory.ts oraz fixtures/inventory-product.ts. Fixture tworzy własny produkt z pięcioma sztukami i unikalną nazwą/kategorią, a następnie usuwa go po teście. Test historii zamówienia wykorzystuje istniejący fixture disposableOrder.

Każda operacja ma osobny plik pod tests/api/admin/inventory:

OperacjaPlikFinalna liczba testów
GET listy inventoryinventory.get.spec.ts3
GET zapasu produktuproduct-id.get.spec.ts4
POST korekty zapasuproduct-id-adjustments.post.spec.ts8
GET historii produktuproduct-id-movements.get.spec.ts5

Testy admina działają w istniejącym projekcie admin-api na stagingu. Zachowano inicjalizację klientów w test.beforeEach, układ given/when/then, rosnące grupy statusów oraz sprawdzenia JSON i nagłówka no-store.

Jakie korekty zostały zlecone po implementacji?

Pierwsza wersja dodała 35 testów, pętle tworzące przypadki i helper inventoryBody, który łączył sprawdzanie odpowiedzi z parsowaniem JSON. Wszystkie testy przeszły, ale użytkownik zakwestionował ich czytelność oraz zgodność ze stylem kursu. Zielony wynik nie zamknął więc review.

Po audycie ograniczono zestaw do 20 jawnie zapisanych testów. Usunięto pętle parametryzujące przypadki, helpery inventoryBody/readState i zagnieżdżone konstrukcje typu expect(await ...). Zamiast nich każdy test osobno sprawdza status i nagłówki, przypisuje JSON do zmiennej body, a następnie wykonuje asercje. Pozostały istniejące helpery nagłówków i typ ApiErrorResponse używany już w innych specach. Nie było uzasadnienia do przebudowy reszty projektu pod nową abstrakcję.

Co wyszło w review?

Backendowe InventoryServiceTest sprawdzały już między innymi identyczne retry, konflikt requestId, niedozwolony ujemny zapas, dokładne zero, dokładne maksimum liczbowe oraz klasyfikacje zapasu. OrderServiceTest obejmowały przywrócenie zapasu tylko raz i obsługę starych zamówień. InventoryConcurrencyIT zawierały przypadki konkurencji o ostatnią sztukę, podwójnego checkoutu i rollbacku. Te testy zostały przeczytane, nie uruchomione w tej sesji.

Nie znaleziono dedykowanych testów backendowych dla każdej usuniętej walidacji DTO, odrzucenia przepełnienia i ograniczania stronicowania. Same adnotacje walidacyjne nie są pokryciem testowym. Te luki zapisano jako rekomendowane uzupełnienia backendu, zamiast twierdzić, że cała usunięta macierz była zbędna.

Pozostawiono jeden reprezentatywny test 400 dla delta=0. Na poziomie HTTP sprawdza on podłączenie walidacji i mapowanie błędu. Szczegółowe kombinacje pól oraz granice lepiej pokrywać szybkimi testami backendowymi. W zdalnym zestawie pozostały istotne przepływy: zapis stanu, retry bez duplikacji, konflikty, uprawnienia i integracja zamówienia z historią zapasu.

Wynik testów

EtapWynik
Pierwszy focused run inventory35 passed, 26,6 s
Pierwszy pełny run l19205 passed, 3,6 min
Focused run po uproszczeniu20 passed, 17,3 s
Pełny run po uproszczeniu190 passed, 3,4 min
Kontrola diffugit diff --check bez błędów

Próba uruchomienia po zmianie uprawnień środowiska nie mogła rozwiązać nazwy hosta. Ponowienie z dostępem sieciowym zakończyło się sukcesem; problem nie był defektem API. Końcowy pełny run wykonano po finalnej korekcie kodu.

Finalny efekt sesji

Dodano 20 testów, zachowując wszystkie cztery operacje oraz 12 dokumentowanych ścieżek odpowiedzi inventory. Łączny zestaw ma 190 testów. Pokrycie operacji wzrosło z 48/55 do 52/55, a dokumentowanych odpowiedzi z 141/191 do 153/191. Zmniejszenie liczby przypadków po review nie obniżyło tych wskaźników, ale świadomie ograniczyło szczegółowość regresji na żywym środowisku.

Plan i audyt pokrycia w l20/api-test-plan.md dokumentuje aktualny zakres, ograniczenia i rekomendowane testy backendowe. Raport l20/api-coverage-report.html pokazuje te same wskaźniki. Wniosek z sesji: agent powinien dopasować nowy kod do projektu, a decyzję o liczbie testów uzasadniać ryzykiem i warstwą testowania.