Awesome Testing

Markdown document

Podsumowanie sesji Codex

Lekcja 14: Zadanie 3 - rozwiązanie

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 dotyczyła pracy w l11 nad testami endpointów Ollama. Finalny stan kodu został następnie skopiowany do checkpointu l12.

Celem było:

  • zrozumienie, jak działają endpointy streamingowe,
  • zastosowanie standardowego workflow api-testing-skill,
  • wykonanie eksploracji przed implementacją,
  • przygotowanie planu,
  • dodanie automatycznych testów Playwright,
  • przeprowadzenie review i uproszczenie testów.

Prompty użyte w Codex

Sesję rozpoczęło pytanie o działanie endpointów Ollama i różnicę między streamingiem a zwykłymi endpointami:

POST
/api/v1/ollama/generate
Generate text using Ollama model

POST
/api/v1/ollama/chat
Chat with Ollama model (stateless endpoint)

POST
/api/v1/ollama/chat/tools
Chat with Ollama using backend function calling (legacy stateless endpoint)

GET
/api/v1/ollama/chat/tools/definitions
List tool definitions supported by /api/v1/ollama/chat/tools

../test-secure-backend, ../ollama-mock. I wish to understand how these endpoints work. I have heard from my trainer that they're doing some kind of http streaming and we have event stream on frontend side (tokens appear one by one). Can you explain me how it works? What's the difference between such endpoint and standard endpoints we already covered in the project. Work in l11

Następnie użytkownik poprosił o standardowe podejście testowe, ale tylko do etapu planu:

$api-testing-skill Now I want you to apply our standard approach to test the endpoints. Feel free to use different tool than curl, I'm not sure if it is the best. Stop after creating implementation plan. I wish to review it first

Po akceptacji planu użytkownik zlecił implementację:

Ok, continue the work, automate the tests and review the final code

Po implementacji użytkownik poprosił o uproszczenie testów:

Feels like some of the http 200 assertions can be moved outside test body, what do you think?

Potem wskazał, że statyczne dane mocka powinny być poza testami:

such static content can be moved outside to keep tests clean

Na końcu użytkownik poprosił o dalsze wydzielenie długich asercji do nazw biznesowych.

Co sprawdził Codex przed implementacją?

Codex sprawdził:

  • l11/api-test-plan.md,
  • kontrakt w api-docs.json,
  • backendowy OllamaController,
  • serwisy OllamaService i OllamaFunctionCallingService,
  • obsługę błędów w OllamaExceptionHandler,
  • scenariusze mocka w ../ollama-mock,
  • istniejące testy, klientów HTTP, typy i helpery w l11.

Codex potwierdził, że:

  • trzy endpointy POST zwracają text/event-stream,
  • backend czyta upstream jako Flux i wystawia stream do klienta,
  • GET /api/v1/ollama/chat/tools/definitions jest zwykłym endpointem JSON,
  • /chat/tools wymaga niepustej listy tools,
  • kontrolowany mock zwraca stabilne odpowiedzi dla znanych promptów,
  • brakujący model w mocku zwraca aktualnie 200, mimo że OpenAPI dokumentuje 404.

Eksploracja live API

Zgodnie z workflow api-testing-skill Codex wykonał eksploracyjne requesty curl do żywej aplikacji.

Potwierdzono:

  • GET /api/v1/ollama/chat/tools/definitions: 200 i 401,
  • POST /api/v1/ollama/generate: 200, 400, 401,
  • POST /api/v1/ollama/chat: 200, 400, 401,
  • POST /api/v1/ollama/chat/tools: 200, 400, 401.

Wyniki eksploracji zostały zapisane w l11/api-test-plan.md, a po promocji są dostępne również w l12/api-test-plan.md.

Co zaimplementował Codex?

Codex dodał w implementowanym checkpointcie, a finalnie przeniósł do l12:

  • l12/types/ollama.ts,
  • l12/httpclients/ollama-client.ts,
  • l12/support/sse.ts,
  • l12/support/ollama-test-data.ts,
  • expectEventStreamResponse w l12/support/assertions/http.ts,
  • testy w l12/tests/api/ollama.

Dodane testy obejmują:

  • definicje tooli,
  • generowanie tekstu,
  • zwykły chat,
  • chat z backendowym tool callingiem.

Jakie korekty zostały zlecone po implementacji?

Najpierw testy były poprawne funkcjonalnie, ale część asercji była zbyt nisko poziomowa i zbyt długa.

Użytkownik wskazał trzy problemy:

  • powtarzalne asercje HTTP 200 dla streamów powinny trafić do helpera,
  • statyczne prompty, odpowiedzi i definicja toola nie powinny zaśmiecać testu,
  • długie asercje strukturalne powinny mieć nazwy biznesowe.

Codex wprowadził kolejne refaktory:

  • dodał expectEventStreamResponse,
  • przeniósł dane mocka do ollama-test-data.ts,
  • wydzielił helpery takie jak expectToolChatStreamForBeautyProducts,
  • uprościł test definicji tooli przez expectSupportedCatalogToolDefinitions.

Co wyszło w review?

Review pokazało, że sama automatyzacja endpointu streamingowego to nie wszystko.

Ważne było również to, żeby testy były czytelne:

  • test ma pokazywać intencję,
  • szczegóły struktury streamu mogą być w helperach,
  • dane mocka powinny być w jednym miejscu,
  • dynamiczne pola trzeba sprawdzać strukturalnie,
  • udokumentowane, ale niepotwierdzone zachowanie 404 nie powinno zostać zamrożone jako test regresyjny.

Wynik testów

Po implementacji uruchomiono najpierw nowe testy:

npm test -- tests/api/ollama/chat-tools-definitions.get.spec.ts tests/api/ollama/generate.post.spec.ts tests/api/ollama/chat.post.spec.ts tests/api/ollama/chat-tools.post.spec.ts

Wynik:

11 passed

Następnie uruchomiono pełny suite:

npm test

Wynik:

59 passed

Po refaktorach testy uruchamiano ponownie. Ostatecznie:

  • nowe testy Ollama: 11 passed,
  • pełny suite l12: 59 passed.

Finalny efekt sesji

Finalnie l12 ma pokrycie dla endpointów Ollama i pomocniczy parser SSE.

Najważniejszy efekt sesji:

  • streaming został przetestowany jako lista zdarzeń, a nie jako surowy tekst,
  • testy używają kontrolowanych scenariuszy mocka,
  • testy zachowały standard projektu: klient HTTP, typy, fixture, given/when/then, statusy w kolejności,
  • api-test-plan.md zawiera wyniki eksploracji i status implementacji,
  • finalny kod przeszedł review czytelności.