Awesome Testing

Markdown document

Podsumowanie sesji Codex

Lekcja 7: Cleanup danych testowych

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 dodania cleanupu danych testowych tworzonych przez fixture authenticatedUser oraz promocji ukończonego stanu l6 do kolejnej lekcji.

W sesji powstały:

  • analiza dostępnych sposobów usuwania użytkowników testowych,
  • metoda UsersClient.forgetUser(),
  • teardown w fixture authenticatedUser,
  • refaktoryzacja fixture na kroki biznesowe registerUser, loginUser i forgetUser,
  • folder l7 utworzony z ukończonego stanu l6,
  • przywrócenie l6 do poprzedniego checkpointu po promocji.

Nie utworzono opis_lekcji.md, ponieważ pełny opis lekcji ma powstać dopiero po przygotowaniu transkrypcji.

Prompty użyte w Codex

Użytkownik najpierw zapytał o cleanup danych tworzonych przez fixture:

I have a fixture which l6/fixtures creates a test data and returns it to each test. Is there a way to do cleanup? How do I remove such users? Analyse possible options, check README.md and api-docs.json

Następnie poprosił o implementację:

New implement it and make sure it indeed worked

Po implementacji użytkownik zlecił refaktoryzację fixture:

l6/fixtures/authenticated-user.ts maybe refactor it to sound more business-like, registerUser, loginUser, forgetUser, etc, split into smaller methods

Na końcu użytkownik poprosił o obsługę kolejnej lekcji zgodnie z workflow:

$lesson-docs-pl LESSON_WORKFLOW.md handle next lesson, do not create opis_lekcji (I'd like to do that once transcript is ready)

Co sprawdził Codex przed implementacją?

Codex sprawdził:

  • główny README.md,
  • l6/README.md,
  • api-docs.json,
  • istniejący fixture l6/fixtures/authenticated-user.ts,
  • klienty AuthClient i UsersClient,
  • testy korzystające z authenticatedUser.

W api-docs.json znaleziono dwa endpointy usuwania użytkownika:

DELETE /api/v1/users/{username}
DELETE /api/v1/users/{username}/right-to-be-forgotten

Codex sprawdził live API na użytkowniku testowym. Wynik:

POST /api/v1/users/signup -> 201
POST /api/v1/users/signin -> token zwrócony
DELETE /api/v1/users/{username} -> 403
DELETE /api/v1/users/{username}/right-to-be-forgotten -> 204
POST /api/v1/users/signin po usunięciu -> 422

Na tej podstawie wybrano endpoint right-to-be-forgotten, bo działa dla świeżo utworzonego użytkownika i usuwa konto razem z danymi należącymi do użytkownika.

Co zaimplementował Codex?

Codex dodał w UsersClient metodę:

forgetUser(username: string, token: string)

Metoda wywołuje:

DELETE /api/v1/users/{username}/right-to-be-forgotten
Authorization: Bearer <token>

Następnie Codex dodał teardown w fixture authenticatedUser po await use(...).

Finalnie fixture wykonuje scenariusz:

registerUser -> loginUser -> use authenticatedUser -> forgetUser

Te kroki zostały wydzielone do małych metod pomocniczych:

  • registerUser() sprawdza status 201,
  • loginUser() sprawdza status 200, waliduje format JWT i zwraca LoginResponse,
  • forgetUser() sprawdza status 204.

Jakie korekty zostały zlecone po implementacji?

Po pierwszej implementacji użytkownik poprosił, żeby fixture brzmiał bardziej biznesowo i był podzielony na mniejsze metody.

Codex zmienił bezpośrednią sekwencję wywołań HTTP na nazwane kroki:

await registerUser(authClient, user);
const loginResponse = await loginUser(authClient, {
  username: user.username,
  password: user.password,
});

await use({
  user,
  token: loginResponse.token,
});

await forgetUser(usersClient, user.username, loginResponse.token);

Dzięki temu fixture opisuje intencję testu, a szczegóły statusów HTTP są zamknięte w helperach.

Co wyszło w review?

Najważniejszy wniosek z eksploracji był taki, że nie każdy endpoint usuwania użytkownika nadaje się do cleanupu fixture.

DELETE /api/v1/users/{username} zwrócił 403 dla zwykłego użytkownika, więc nie jest dobrym mechanizmem teardownu w testach tworzonych przez fixture.

DELETE /api/v1/users/{username}/right-to-be-forgotten zwrócił 204 i po nim ponowne logowanie tego użytkownika zwróciło 422, więc potwierdzono faktyczne usunięcie konta.

Wynik testów

Po dodaniu cleanupu uruchomiono test korzystający z fixture:

cd l6
npm test -- tests/api/users/me.spec.ts

Wynik:

3 passed

Następnie uruchomiono pełny zestaw:

cd l6
npm test

Wynik:

12 passed

Po refaktoryzacji fixture ponownie uruchomiono:

cd l6
npm test -- tests/api/users/me.spec.ts
cd l6
npm test

Wynik:

3 passed
12 passed